/* Unified type scale: all copy uses relative semantic sizes rather than isolated pixels. */
:root{--text-2xs:.5625rem;--text-xs:.625rem;--text-meta:.6875rem;--text-sm:.75rem;--text-control:.8125rem;--text-body:.875rem;--text-lead:.9375rem;--text-icon:1.125rem;--text-icon-lg:1.25rem;--text-heading:1.5rem;--text-title:1.75rem;--text-display:2.875rem;--text-display-compact:2.375rem;--paper:#f7f7fb;--surface:#fff;--sunk:#f4f3f8;--ink:#1a1c24;--muted:#6b7080;--faint:#9aa0b0;--line:#ecebf3;--line-strong:#dedce9;--accent:#6d5efc;--accent-hi:#5c4cf3;--accent-soft:#f0efff;--run:#169f69;--run-soft:#e5f7ed;--warm:#ba7c17;--warm-soft:#fdf2df;--fail:#d9534f;--fail-soft:#fbeceb;--idle:#8991a0;--mono:ui-monospace,"SF Mono",Menlo,Consolas,monospace;--sans:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Microsoft YaHei",sans-serif;--space-1:4px;--space-2:8px;--space-3:12px;--space-4:16px;--space-5:20px;--space-6:24px;--space-7:32px}*{box-sizing:border-box}html{min-height:100%;background:var(--paper);font-size:100%;-webkit-text-size-adjust:100%;text-size-adjust:100%}body{min-height:100%;margin:0;background:var(--paper);color:var(--ink);font:var(--text-body)/1.5 var(--sans)}button,input{font:inherit}button{cursor:pointer}.hidden{display:none!important}.eyebrow{margin:0;color:var(--faint);font-size:var(--text-xs);font-weight:600;letter-spacing:.12em}.wordmark{display:inline-flex;align-items:center;gap:10px;color:var(--ink);text-decoration:none}.wordmark strong{font-size:var(--text-lead);letter-spacing:-.03em}.wordmark-mark{display:grid;place-items:center;width:27px;height:27px;border-radius:8px;background:var(--accent);color:#fff;font-size:var(--text-control);font-weight:650}.site-head{display:flex;align-items:center;justify-content:space-between;max-width:1140px;margin:auto;padding:23px 28px}.head-note{color:var(--muted);font-size:var(--text-sm)}.login-page{min-height:100vh}.signin-layout{display:grid;grid-template-columns:minmax(300px,1.08fr) minmax(360px,.92fr);gap:120px;align-items:center;max-width:1030px;margin:70px auto 0;padding:0 28px}.signin-copy{padding:22px 20px}.signin-copy h1{margin:13px 0 16px;font-size:var(--text-display);line-height:1.13;letter-spacing:-.065em}.signin-copy>p:not(.eyebrow){max-width:390px;margin:0;color:var(--muted);font-size:var(--text-lead);line-height:1.8}.copy-rule{width:42px;height:3px;margin:44px 0 25px;border-radius:999px;background:var(--accent)}.signin-copy dl{display:flex;gap:45px;margin:0}.signin-copy dl div{display:grid;gap:3px}.signin-copy dt{font-size:var(--text-sm);font-weight:600}.signin-copy dd{margin:0;color:var(--muted);font-size:var(--text-sm)}.signin-card{padding:36px;border:1px solid var(--line);border-radius:14px;background:var(--surface);box-shadow:0 14px 36px #27223a0d}.card-heading h2{margin:5px 0 3px;font-size:var(--text-title);letter-spacing:-.05em}.card-heading>p:last-child{margin:0 0 28px;color:var(--muted);font-size:var(--text-control)}.signin-card form{display:grid;gap:17px}.signin-card label{display:grid;gap:7px;color:#444958;font-size:var(--text-sm);font-weight:600}.signin-card input{width:100%;height:42px;border:1px solid var(--line-strong);border-radius:8px;padding:0 12px;outline:0;background:#fff;transition:border .15s,box-shadow .15s}.signin-card input:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft)}.signin-card button[type=submit]{display:flex;align-items:center;justify-content:space-between;border:0;border-radius:8px;margin-top:6px;padding:11px 14px;background:var(--accent);color:#fff;font-size:var(--text-control);font-weight:600}.signin-card button[type=submit]:hover,.primary-button:hover{background:var(--accent-hi)}.signin-card button[disabled]{opacity:.65;cursor:wait}.signin-card button span{font-size:var(--text-icon)}.signin-foot{margin:19px 0 0;color:var(--faint);font-size:var(--text-meta)}.alert{margin:0 0 18px;border:1px solid #f1c9c7;border-radius:8px;padding:10px 11px;background:#fff6f5;color:#a4443f;font-size:var(--text-sm);line-height:1.6}.consent-dialog{width:min(550px,calc(100% - 28px));border:1px solid var(--line-strong);border-radius:13px;padding:0;background:var(--surface);color:var(--ink);box-shadow:0 24px 90px #17152b55}.consent-dialog::backdrop{background:#17152280;backdrop-filter:blur(3px)}.dialog-title-row{padding:25px 27px 16px;border-bottom:1px solid var(--line)}.dialog-title-row h2{margin:5px 0 0;font-size:var(--text-heading);letter-spacing:-.04em}.consent-body{padding:20px 27px 7px;color:#4f5565;font-size:var(--text-control);line-height:1.75}.consent-body p{margin:0 0 13px}.consent-body hr{height:1px;margin:18px 0;border:0;background:var(--line)}.consent-body a{color:var(--accent);text-decoration:none}.consent-body a:hover{text-decoration:underline}.consent-actions{display:flex;justify-content:flex-end;gap:10px;padding:17px 27px 25px}.plain-button,.primary-button{border:0;border-radius:8px;padding:10px 13px;font-size:var(--text-sm);font-weight:600}.plain-button{background:var(--sunk);color:var(--muted)}.plain-button:hover{background:#e9e7f0}.primary-button{background:var(--accent);color:#fff}.app-shell{display:grid;grid-template-columns:224px minmax(0,1fr);min-height:100vh}.sidebar{display:flex;flex-direction:column;border-right:1px solid var(--line);padding:23px 14px;background:var(--surface)}.side-nav{margin-top:39px}.side-nav a{display:flex;align-items:center;gap:10px;border-radius:8px;padding:9px 10px;color:var(--muted);font-size:var(--text-control);text-decoration:none}.side-nav a.active{background:var(--accent-soft);color:var(--accent);font-weight:600}.side-foot{display:flex;align-items:center;gap:8px;margin-top:auto;padding:10px;color:var(--faint);font-size:var(--text-meta)}.secure-dot,.live-dot i{display:inline-block;width:7px;height:7px;border-radius:50%;background:var(--run)}.content{max-width:1380px;width:100%;margin:0 auto;padding:42px 48px}.topbar{display:flex;align-items:flex-start;justify-content:space-between;gap:24px;margin-bottom:29px}.topbar h1{margin:4px 0 0;font-size:var(--text-title);line-height:1.2;letter-spacing:-.05em}.header-actions{display:flex;align-items:center;gap:13px}.live-dot{display:flex;align-items:center;gap:7px;color:var(--muted);font-size:var(--text-meta)}.live-dot i{box-shadow:0 0 0 4px var(--run-soft)}.logout-button{border:1px solid var(--line-strong);border-radius:7px;padding:7px 10px;background:var(--surface);color:var(--muted);font-size:var(--text-sm)}.logout-button:hover{border-color:#c5c2d2;color:var(--ink)}.notice{display:flex;align-items:flex-start;gap:13px;margin-bottom:22px;border:1px solid #e5e1ff;border-radius:10px;padding:15px 17px;background:#faf9ff}.notice-mark{display:grid;place-items:center;width:24px;height:24px;border-radius:7px;background:var(--accent-soft);color:var(--accent)}.notice strong{font-size:var(--text-control)}.notice p{margin:2px 0 0;color:var(--muted);font-size:var(--text-sm)}.stats{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px;margin-bottom:22px}.stat-card{position:relative;overflow:hidden;border:1px solid var(--line);border-radius:10px;padding:17px;background:var(--surface)}.stat-card p{margin:0;color:var(--muted);font-size:var(--text-meta)}.stat-card strong{display:block;margin-top:4px;font-size:var(--text-heading);letter-spacing:-.04em}.stat-card span{position:absolute;right:-12px;bottom:-12px;width:48px;height:48px;border-radius:50%;opacity:.8}.stat-card.accent span{background:var(--accent-soft)}.stat-card.run span{background:var(--run-soft)}.stat-card.warm span{background:var(--warm-soft)}.stat-card.fail span{background:var(--fail-soft)}.stat-card.idle span{background:#eef0f4}.panel{border:1px solid var(--line);border-radius:11px;background:var(--surface)}.panel-heading{display:flex;align-items:flex-start;justify-content:space-between;gap:20px;padding:20px 21px 17px;border-bottom:1px solid var(--line)}.panel-heading h2{margin:0;font-size:var(--text-lead);letter-spacing:-.025em}.muted{color:var(--muted)}.panel-heading p{margin:3px 0 0;font-size:var(--text-sm)}.table-wrap{overflow:auto}table{width:100%;min-width:760px;border-collapse:collapse;text-align:left}th{padding:11px 20px;color:var(--faint);font-size:var(--text-xs);font-weight:600;letter-spacing:.06em}td{border-top:1px solid var(--line);padding:14px 20px;color:#444958;font-size:var(--text-sm);vertical-align:middle}tbody tr.mine{background:#fcfbff}td strong{color:var(--ink);font-size:var(--text-sm)}td small{color:var(--muted);font-size:var(--text-meta)}code,.mono{font-family:var(--mono);font-size:var(--text-meta)}.mine-tag{margin-left:7px;border-radius:4px;padding:2px 4px;background:var(--accent-soft);color:var(--accent);font-size:var(--text-2xs);font-style:normal}.status{display:inline-flex;align-items:center;gap:6px;color:var(--warm);white-space:nowrap}.status i{width:6px;height:6px;border-radius:50%;background:var(--warm)}.status.run{color:var(--run)}.status.run i{background:var(--run)}.status.fail{color:var(--fail)}.status.fail i{background:var(--fail)}.status.idle{color:var(--idle)}.status.idle i{background:var(--idle)}.result{max-width:290px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--muted)}.actions{white-space:nowrap}.actions button{border:0;border-radius:6px;margin-right:4px;padding:6px 8px;background:var(--accent-soft);color:#5e53d1;font-size:var(--text-meta)}.actions button:hover{background:#e7e4ff}.actions .danger{background:var(--fail-soft);color:var(--fail)}dialog:not(.consent-dialog){width:min(760px,calc(100% - 28px));border:1px solid var(--line-strong);border-radius:12px;padding:20px;box-shadow:0 20px 60px #17152b45}dialog:not(.consent-dialog)::backdrop{background:#17152270}.dialog-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:15px}.icon-button{border:0;border-radius:6px;width:30px;height:30px;background:var(--sunk);font-size:var(--text-icon-lg);line-height:1;color:var(--muted)}dialog pre{max-height:55vh;overflow:auto;margin:0;border-radius:8px;padding:14px;background:#191821;color:#e9e7f5;font:var(--text-sm)/1.7 var(--mono);white-space:pre-wrap;word-break:break-word}@media(max-width:800px){.signin-layout{grid-template-columns:1fr;gap:20px;margin-top:20px}.signin-copy{padding:18px 3px}.signin-copy h1{font-size:var(--text-display-compact)}.signin-copy dl{gap:25px}.app-shell{grid-template-columns:1fr}.sidebar{flex-direction:row;align-items:center;padding:15px 18px}.side-nav{display:none}.side-foot{margin:0 0 0 auto;padding:0}.content{padding:28px 18px}.stats{grid-template-columns:repeat(2,minmax(0,1fr))}.topbar{margin-bottom:22px}.header-actions .live-dot{display:none}}@media(max-width:430px){.site-head{padding:18px}.signin-layout{padding:0 17px}.signin-card{padding:28px 21px}.consent-actions{flex-direction:column-reverse}.consent-actions button{width:100%}.topbar h1{font-size:var(--text-heading)}.logout-button{padding:6px 8px}.notice{padding:13px}.stats{gap:8px}.stat-card{padding:14px}}

/* Minimal sign-in view. The disclosure remains a separate modal shown before credentials can be submitted. */
.login-page{display:grid;place-items:center;min-height:100vh;background:var(--paper)}
.login-page .minimal-login{width:min(360px,calc(100% - 36px))}
.minimal-login-card{border:1px solid var(--line);border-radius:11px;padding:24px;background:var(--surface);box-shadow:0 12px 32px #2520380d}
.minimal-login-card form{display:grid;gap:10px}
.minimal-login-card input{width:100%;height:43px;border:1px solid var(--line-strong);border-radius:7px;padding:0 12px;outline:0;background:#fff;color:var(--ink)}
.minimal-login-card input:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft)}
.minimal-login-card button{height:42px;border:0;border-radius:7px;background:var(--accent);color:#fff;font-size:var(--text-control);font-weight:600}
.minimal-login-card button:hover{background:var(--accent-hi)}
.minimal-login-card button[disabled]{opacity:.65;cursor:wait}
.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}

/* Invite-only account flow and dashboard controls. */
.auth-link{display:block;margin-top:15px;text-align:center;color:var(--accent);font-size:var(--text-sm);text-decoration:none}.auth-link:hover{text-decoration:underline}.primary-small{border:0;border-radius:7px;padding:8px 11px;background:var(--accent);color:#fff;font-size:var(--text-sm);font-weight:600;white-space:nowrap}.primary-small:disabled{opacity:.55;cursor:not-allowed}.admin-area{display:grid;gap:22px;margin-top:22px}.hidden{display:none!important}.modal-form{display:grid;gap:14px}.modal-form .dialog-head{margin-bottom:2px}.dialog-head p{margin:3px 0 0;color:var(--muted);font-size:var(--text-sm);font-weight:400}.modal-form label{display:grid;gap:6px;color:#45495a;font-size:var(--text-sm);font-weight:600}.modal-form input{height:40px;border:1px solid var(--line-strong);border-radius:7px;padding:0 11px;outline:0;color:var(--ink)}.modal-form input:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft)}.dialog-actions{display:flex;justify-content:flex-end;gap:9px;margin-top:4px}.toast{position:fixed;z-index:20;left:50%;bottom:25px;max-width:calc(100% - 32px);transform:translateX(-50%);padding:10px 13px;border-radius:8px;background:#252238;color:#fff;box-shadow:0 10px 30px #1512223b;font-size:var(--text-sm)}@media(max-width:650px){.panel-heading{flex-direction:column}.actions{min-width:190px}.dialog-actions{flex-direction:column-reverse}.dialog-actions button{width:100%}}
.form-error{margin:-2px 0 0;color:var(--fail);font-size:var(--text-sm);line-height:1.45}
.consent-check{display:flex;align-items:center;gap:8px;margin:14px 0 0;color:var(--ink);font-size:var(--text-control);font-weight:600}.consent-check input{width:16px;height:16px;accent-color:var(--accent)}.consent-actions .primary-button:disabled{opacity:.5;cursor:not-allowed}#log-dialog{width:min(1120px,calc(100% - 28px))}.log-retention{margin:-8px 0 14px;color:var(--faint);font-size:var(--text-meta)}.log-columns{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:14px}.log-columns section{min-width:0}.log-columns h3{margin:0 0 8px;font-size:var(--text-control)}#log-dialog pre{height:460px;max-height:460px}@media(max-width:760px){.log-columns{grid-template-columns:1fr}#log-dialog pre{height:300px;max-height:300px}}

/* Lightweight dashboard navigation and account settings. */
strong{font-weight:600}.wordmark strong{font-weight:600;letter-spacing:-.02em}.topbar h1,.panel-heading h2{font-weight:600}.side-nav{margin-top:34px}.side-nav a{gap:0;font-weight:500}.side-nav a.active{font-weight:600}.nav-label{margin:20px 10px 7px;color:var(--faint);font-size:var(--text-xs);font-weight:600;letter-spacing:.1em}.nav-label:first-child{margin-top:0}.system-panel{margin-top:22px}.system-info-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:0}.system-info-grid div{display:grid;gap:4px;padding:16px 20px;border-right:1px solid var(--line);border-top:1px solid var(--line)}.system-info-grid div:nth-child(3n){border-right:0}.system-info-grid span{color:var(--faint);font-size:var(--text-meta)}.system-info-grid strong{color:var(--ink);font-size:var(--text-control)}.account-settings{margin-top:22px}.settings-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:0}.settings-form{display:grid;gap:12px;padding:20px;border-right:1px solid var(--line)}.settings-form:last-child{border-right:0}.settings-form h3{margin:0 0 2px;font-size:var(--text-control);font-weight:600}.settings-form label{display:grid;gap:6px;color:#45495a;font-size:var(--text-sm);font-weight:600}.settings-form input{height:40px;border:1px solid var(--line-strong);border-radius:7px;padding:0 11px;outline:0;color:var(--ink);background:#fff}.settings-form input[readonly]{background:var(--sunk);color:var(--muted)}.settings-form input:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft)}.settings-help{margin:0;color:var(--muted);font-size:var(--text-meta);line-height:1.65}.admin-password-note{border-right:0}.admin-password-note code{font-family:var(--mono);font-size:var(--text-meta)}@media(max-width:800px){.system-info-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.system-info-grid div:nth-child(3n){border-right:1px solid var(--line)}.system-info-grid div:nth-child(2n){border-right:0}.settings-grid{grid-template-columns:1fr}.settings-form{border-right:0;border-bottom:1px solid var(--line)}.settings-form:last-child{border-bottom:0}} 

/* Stable sidebar rhythm and client-side route changes without reload flicker. */
html{scrollbar-gutter:stable}.sidebar{padding:24px 16px}.side-nav{display:flex;flex-direction:column;gap:4px;margin-top:32px}.side-nav a{height:36px;padding:0 10px;line-height:36px}.nav-label{height:16px;margin:20px 10px 2px;line-height:16px}.nav-label:first-child{margin-top:0}.nav-admin:not(.hidden){display:grid;gap:4px}.nav-admin .nav-label{margin-top:20px}@media(max-width:800px){.sidebar{padding:15px 18px}.side-nav{display:none}}

/* Administrator account details are expanded inline to keep account and task ownership together. */
.account-detail-row>td{padding:0!important;background:#fbfbfe}.account-detail{padding:18px 20px 20px;border-top:1px solid var(--line);box-shadow:inset 3px 0 0 var(--accent-soft)}.account-detail-summary{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:1px;border:1px solid var(--line);border-radius:8px;overflow:hidden;background:var(--line)}.account-detail-summary>div{display:grid;gap:4px;min-width:0;padding:12px 14px;background:#fff}.account-detail-summary span,.account-detail-summary small{color:var(--faint);font-size:var(--text-meta);font-weight:400}.account-detail-summary strong{overflow-wrap:anywhere;font-size:var(--text-sm);font-weight:600}.account-detail-summary .account-student-ids{line-height:1.65}.account-student-ids code{font-family:var(--mono);font-size:var(--text-meta)}.account-task-heading{display:flex;align-items:end;justify-content:space-between;margin:18px 0 9px}.account-task-heading strong{font-size:var(--text-control)}.account-task-heading p{margin:3px 0 0;color:var(--faint);font-size:var(--text-meta)}.account-task-wrap{overflow:auto;border:1px solid var(--line);border-radius:8px}.account-task-table{width:100%;min-width:760px;border-collapse:collapse}.account-task-table th,.account-task-table td{padding:10px 12px;border-bottom:1px solid var(--line);text-align:left;vertical-align:middle;font-size:var(--text-sm)}.account-task-table th{background:var(--sunk);color:var(--faint);font-size:var(--text-xs);font-weight:600;letter-spacing:.04em}.account-task-table tr:last-child td{border-bottom:0}.account-task-table button,.revealed-password button{border:1px solid var(--line-strong);border-radius:5px;padding:4px 7px;background:#fff;color:var(--ink);font-size:var(--text-meta);white-space:nowrap}.revealed-password{display:flex;align-items:center;gap:7px}.revealed-password code{max-width:180px;overflow:auto;padding:4px 6px;border-radius:4px;background:#fff4dc;color:#76551c;font-family:var(--mono);font-size:var(--text-meta)}@media(max-width:800px){.account-detail-summary{grid-template-columns:1fr}.account-task-heading{align-items:start;flex-direction:column}}

.system-default-form{display:grid;grid-template-columns:minmax(0,1fr) 150px auto;align-items:end;gap:14px;padding:18px 20px;border-top:1px solid var(--line)}.system-default-form h3{margin:0 0 4px;font-size:var(--text-control);font-weight:600}.system-default-form p{margin:0;color:var(--muted);font-size:var(--text-meta);line-height:1.6}.system-default-form label{display:grid;gap:6px;color:#45495a;font-size:var(--text-sm);font-weight:600}.system-default-form input,.account-task-limit input{height:34px;border:1px solid var(--line-strong);border-radius:6px;padding:0 9px;outline:0;background:#fff;color:var(--ink)}.system-default-form input:focus,.account-task-limit input:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft)}.system-default-form .form-error{grid-column:1/-1}.account-task-limit>div{display:flex;align-items:center;gap:6px}.account-task-limit input{width:62px}.account-task-limit button{border:1px solid var(--line-strong);border-radius:5px;padding:5px 7px;background:#fff;color:var(--ink);font-size:var(--text-meta);white-space:nowrap}@media(max-width:800px){.system-default-form{grid-template-columns:1fr;align-items:stretch}.system-default-form .primary-small{justify-self:start}}

.login-security-note{margin:14px 2px 0;color:var(--faint);font-size:var(--text-meta);line-height:1.65;text-align:center}

/* Keep action controls on a consistent vertical rhythm. */
.primary-small,
.plain-button,
.primary-button,
.logout-button{
  display:inline-flex;
  align-items:center;
  justify-content:center;
  height:36px;
  padding:0 13px;
}

/* Compact controls used inside tables and inline management rows. */
.actions button,
.account-task-limit button,
.account-task-table button,
.revealed-password button{
  display:inline-flex;
  align-items:center;
  justify-content:center;
  height:30px;
  padding:0 8px;
}


/* Account settings use the same three-column alignment for each row. */
.settings-list{display:grid;padding:4px 20px}
.settings-row{display:grid;grid-template-columns:96px minmax(0,1fr) auto;align-items:center;gap:18px;min-height:68px;border-bottom:1px solid var(--line)}
.settings-row:last-child{border-bottom:0}
.settings-row>span{color:var(--muted);font-size:var(--text-sm)}
.settings-row>strong{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--text-control);font-weight:500}
.settings-row .primary-small{min-width:72px}
.settings-row.admin-password-note{grid-template-columns:96px minmax(0,1fr);gap:18px}
.settings-row.admin-password-note small{color:var(--muted);font-size:var(--text-meta);line-height:1.6}
.settings-row.admin-password-note code{font-family:var(--mono);font-size:var(--text-meta)}
@media(max-width:650px){.settings-list{padding:4px 16px}.settings-row{grid-template-columns:68px minmax(0,1fr) auto;gap:10px}.settings-row .primary-small{min-width:64px}.settings-row.admin-password-note{grid-template-columns:68px minmax(0,1fr);gap:10px}}


/* Per-task sign-in choices. */
.task-settings-fields{display:grid;gap:10px;margin:2px 0 0;border:0;padding:0}
.task-settings-fields legend{margin:0 0 2px;padding:0;color:var(--muted);font-size:var(--text-sm)}
.modal-form .task-settings-fields .check-choice{display:flex;align-items:center;gap:8px;margin:0;color:var(--ink);font-size:var(--text-control);font-weight:500}
.modal-form .task-settings-fields .check-choice input{width:16px;height:16px;margin:0;accent-color:var(--accent)}
.modal-form .task-settings-fields .task-setting-select{display:grid;gap:6px;color:var(--muted);font-size:var(--text-sm);font-weight:500}
.modal-form .task-settings-fields select{width:100%;height:40px;border:1px solid var(--line-strong);border-radius:7px;padding:0 10px;background:#fff;color:var(--ink);font:inherit}

/* Mobile keeps every workspace section reachable as a scrollable top navigation. */
@media (max-width:800px){
  .app-shell{display:block}
  .sidebar{
    position:sticky;
    top:0;
    z-index:30;
    display:block;
    padding:12px 14px 0;
    border-right:0;
    border-bottom:1px solid var(--line);
    background:var(--surface);
  }
  .wordmark{min-height:28px}
  .side-nav{
    display:flex;
    flex-direction:row;
    gap:4px;
    margin-top:10px;
    overflow-x:auto;
    overscroll-behavior-x:contain;
    padding:0 0 10px;
    white-space:nowrap;
    scrollbar-width:none;
    -webkit-overflow-scrolling:touch;
  }
  .side-nav::-webkit-scrollbar{display:none}
  .side-nav .nav-label{display:none}
  .side-nav a{
    flex:0 0 auto;
    height:34px;
    padding:0 10px;
    line-height:34px;
  }
  .side-nav .nav-admin:not(.hidden){display:contents}
  .side-foot{display:none}
  .content{min-width:0;padding:18px 14px 30px}
}


/* Unified spacing rhythm: shared tokens rather than one-off per-element margins. */
.content > section + section{margin-top:var(--space-5)}
.admin-area{display:grid;gap:var(--space-5)}
.admin-area>.panel+.panel{margin-top:0}
.panel-heading{gap:var(--space-4)}
.panel-heading>div{display:grid;gap:var(--space-1)}
.panel-heading h2,.panel-heading p{margin:0}
.system-panel{margin-top:var(--space-5)}
.system-default-form{gap:var(--space-4)}
.modal-form{gap:var(--space-4)}
.modal-form>label{gap:var(--space-2)}
.modal-form .task-settings-fields{gap:var(--space-3);margin:0}
.modal-form .task-settings-fields legend{margin:0 0 var(--space-3);padding:0}
.modal-form .task-settings-fields .task-setting-select{gap:var(--space-2)}
.dialog-head{gap:var(--space-4)}
.dialog-actions,.consent-actions{gap:var(--space-3)}
@media(max-width:800px){.content>section+section{margin-top:var(--space-4)}.admin-area{gap:var(--space-4)}.system-panel{margin-top:var(--space-4)}}


/* System metrics form a real table: a closed outer border and consistent cell rules. */
.system-info-grid{grid-template-columns:repeat(3,minmax(0,1fr));border:1px solid var(--line);border-radius:0;overflow:hidden}
.system-info-grid>div{min-width:0;gap:var(--space-1);padding:var(--space-4) var(--space-5);border:0;border-right:1px solid var(--line);border-bottom:1px solid var(--line)}
.system-info-grid>div:nth-child(3n){border-right:0}
.system-info-grid>div:nth-last-child(-n+3){border-bottom:0}
.system-info-grid>div strong{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.admin-password-instruction{display:grid;min-width:0;gap:var(--space-1)}
.settings-row.admin-password-note{grid-template-columns:96px minmax(0,1fr);align-items:start;padding:var(--space-4) 0}
.settings-row.admin-password-note strong{overflow:visible;text-overflow:clip;white-space:normal}
.settings-row.admin-password-note small{min-width:0;overflow-wrap:anywhere}
@media(max-width:900px){
  .system-info-grid{grid-template-columns:repeat(2,minmax(0,1fr))}
  .system-info-grid>div:nth-child(3n){border-right:1px solid var(--line)}
  .system-info-grid>div:nth-child(2n){border-right:0}
  .system-info-grid>div:nth-last-child(-n+3){border-bottom:1px solid var(--line)}
  .system-info-grid>div:nth-last-child(-n+2){border-bottom:0}
}
@media(max-width:560px){
  .system-info-grid{grid-template-columns:1fr}
  .system-info-grid>div{border-right:0}
  .system-info-grid>div:nth-last-child(-n+2){border-bottom:1px solid var(--line)}
  .system-info-grid>div:last-child{border-bottom:0}
  .settings-row.admin-password-note{grid-template-columns:68px minmax(0,1fr);gap:var(--space-2)}
}

/* Desktop workspace keeps navigation visible while the content scrolls. */
@media(min-width:801px){
  .app-shell{display:block}
  .sidebar{position:fixed;inset:0 auto 0 0;width:224px;overflow-y:auto}
  .content{width:auto;max-width:none;margin:0 0 0 224px}
}

/* A future odd final system metric spans the full tablet row instead of leaving a blank half-cell. */
@media(min-width:561px) and (max-width:900px){
  .system-info-grid>div:last-child:nth-child(odd){grid-column:1/-1;border-right:0}
  .system-info-grid:has(>div:last-child:nth-child(odd))>div:nth-last-child(2){border-bottom:1px solid var(--line)}
}

/* Columns retain stable proportions, shrink down to a readable minimum, then scroll horizontally. */
.table-wrap{
  width:100%;
  overflow-x:auto;
  overflow-y:hidden;
  overscroll-behavior-inline:contain;
  -webkit-overflow-scrolling:touch;
}
.table-wrap>table{
  table-layout:fixed;
  width:100%;
}
.jobs-table{min-width:960px}
.invite-table{min-width:720px}
.users-table{min-width:780px}
.issues-table{min-width:940px}
.audit-table{min-width:860px}
.table-wrap>table th,
.table-wrap>table td{overflow:hidden}
.table-wrap>table th{white-space:nowrap;text-overflow:ellipsis}

/* Appearance control stays at the lower-left of the desktop sidebar. */
.side-foot{align-items:stretch;flex-direction:column;gap:var(--space-3);padding:10px}
.connection-status{display:flex;align-items:center;gap:var(--space-2);color:var(--faint);font-size:var(--text-meta)}
.theme-switch{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:3px;padding:3px;border:1px solid var(--line);border-radius:8px;background:var(--sunk)}
.theme-switch button{min-width:0;height:27px;border:0;border-radius:5px;padding:0 3px;background:transparent;color:var(--muted);font-size:var(--text-xs);white-space:nowrap}
.theme-switch button:hover{color:var(--ink)}
.theme-switch button.active{background:var(--surface);box-shadow:0 1px 2px #17152b1c;color:var(--ink);font-weight:600}

/* The selected appearance is local to this browser. “System” follows the OS automatically. */
:root{color-scheme:light}
:root[data-theme="dark"]{color-scheme:dark;--paper:#12141b;--surface:#1b1e28;--sunk:#252936;--ink:#eef0f7;--muted:#aeb5c5;--faint:#7f889b;--line:#343949;--line-strong:#4a5164;--accent:#9c91ff;--accent-hi:#b1a9ff;--accent-soft:#302d55;--run:#56c995;--run-soft:#183f33;--warm:#ebb45d;--warm-soft:#483717;--fail:#ff8581;--fail-soft:#4a292c;--idle:#9ba4b5}
@media(prefers-color-scheme:dark){:root[data-theme="system"]{color-scheme:dark;--paper:#12141b;--surface:#1b1e28;--sunk:#252936;--ink:#eef0f7;--muted:#aeb5c5;--faint:#7f889b;--line:#343949;--line-strong:#4a5164;--accent:#9c91ff;--accent-hi:#b1a9ff;--accent-soft:#302d55;--run:#56c995;--run-soft:#183f33;--warm:#ebb45d;--warm-soft:#483717;--fail:#ff8581;--fail-soft:#4a292c;--idle:#9ba4b5}}
:root[data-theme="dark"] .signin-card input,
:root[data-theme="dark"] .minimal-login-card input,
:root[data-theme="dark"] .settings-form input,
:root[data-theme="dark"] .modal-form input,
:root[data-theme="dark"] .system-default-form input,
:root[data-theme="dark"] .account-task-limit input,
:root[data-theme="dark"] .account-detail-summary>div,
:root[data-theme="dark"] .account-task-table button,
:root[data-theme="dark"] .revealed-password button,
:root[data-theme="dark"] .account-task-limit button{background:var(--surface);color:var(--ink)}
:root[data-theme="dark"] .notice{background:var(--accent-soft);border-color:#575187}
:root[data-theme="dark"] tbody tr.mine,:root[data-theme="dark"] .account-detail-row>td{background:#202332}
:root[data-theme="dark"] .actions button{color:#c9c4ff}
:root[data-theme="dark"] .plain-button:hover{background:#303545}
:root[data-theme="dark"] .theme-switch button.active{box-shadow:0 1px 2px #0008}
@media(prefers-color-scheme:dark){
  :root[data-theme="system"] .signin-card input,
  :root[data-theme="system"] .minimal-login-card input,
  :root[data-theme="system"] .settings-form input,
  :root[data-theme="system"] .modal-form input,
  :root[data-theme="system"] .system-default-form input,
  :root[data-theme="system"] .account-task-limit input,
  :root[data-theme="system"] .account-detail-summary>div,
  :root[data-theme="system"] .account-task-table button,
  :root[data-theme="system"] .revealed-password button,
  :root[data-theme="system"] .account-task-limit button{background:var(--surface);color:var(--ink)}
  :root[data-theme="system"] .notice{background:var(--accent-soft);border-color:#575187}
  :root[data-theme="system"] tbody tr.mine,:root[data-theme="system"] .account-detail-row>td{background:#202332}
  :root[data-theme="system"] .actions button{color:#c9c4ff}
  :root[data-theme="system"] .plain-button:hover{background:#303545}
  :root[data-theme="system"] .theme-switch button.active{box-shadow:0 1px 2px #0008}
}

/* Table geometry is deliberately immutable: panels centre the table; a narrower panel scrolls it internally. */
.table-wrap>table{width:var(--table-width);min-width:0;margin-inline:auto}
.jobs-table{--table-width:1305px}
.invite-table{--table-width:800px}
.users-table{--table-width:690px}
.issues-table{--table-width:970px}
.audit-table{--table-width:870px}
.account-task-wrap{overflow-x:auto;overflow-y:hidden;overscroll-behavior-inline:contain;-webkit-overflow-scrolling:touch}
.account-task-table{width:510px;min-width:0;table-layout:fixed;margin-inline:auto}
.jobs-table{--table-width:1482px}
.jobs-table.admin-jobs-table{--table-width:1570px}

/* Job table: fixed widths requested for the task list. */
.jobs-table:not(.admin-jobs-table) th:nth-child(1),
.jobs-table:not(.admin-jobs-table) td:nth-child(1){width:85px}
.jobs-table:not(.admin-jobs-table) th:nth-child(2),
.jobs-table:not(.admin-jobs-table) td:nth-child(2){width:90px}
.jobs-table:not(.admin-jobs-table) th:nth-child(3),
.jobs-table:not(.admin-jobs-table) td:nth-child(3){width:90px}
.jobs-table:not(.admin-jobs-table) th:nth-child(4),
.jobs-table:not(.admin-jobs-table) td:nth-child(4){width:150px}
.jobs-table:not(.admin-jobs-table) th:nth-child(5),
.jobs-table:not(.admin-jobs-table) td:nth-child(5){width:75px}
.jobs-table:not(.admin-jobs-table) th:nth-child(6),
.jobs-table:not(.admin-jobs-table) td:nth-child(6){width:85px}
.jobs-table:not(.admin-jobs-table) th:nth-child(7),
.jobs-table:not(.admin-jobs-table) td:nth-child(7){width:170px}
.jobs-table:not(.admin-jobs-table) th:nth-child(8),
.jobs-table:not(.admin-jobs-table) td:nth-child(8){width:250px}

.jobs-table.admin-jobs-table th:nth-child(1),
.jobs-table.admin-jobs-table td:nth-child(1){width:85px}
.jobs-table.admin-jobs-table th:nth-child(2),
.jobs-table.admin-jobs-table td:nth-child(2){width:90px}
.jobs-table.admin-jobs-table th:nth-child(3),
.jobs-table.admin-jobs-table td:nth-child(3){width:105px}
.jobs-table.admin-jobs-table th:nth-child(4),
.jobs-table.admin-jobs-table td:nth-child(4){width:90px}
.jobs-table.admin-jobs-table th:nth-child(5),
.jobs-table.admin-jobs-table td:nth-child(5){width:150px}
.jobs-table.admin-jobs-table th:nth-child(6),
.jobs-table.admin-jobs-table td:nth-child(6){width:75px}
.jobs-table.admin-jobs-table th:nth-child(7),
.jobs-table.admin-jobs-table td:nth-child(7){width:85px}
.jobs-table.admin-jobs-table th:nth-child(8),
.jobs-table.admin-jobs-table td:nth-child(8){width:170px}
.jobs-table.admin-jobs-table th:nth-child(9),
.jobs-table.admin-jobs-table td:nth-child(9){width:250px}
.jobs-table{--table-width:995px}
.jobs-table.admin-jobs-table{--table-width:1100px}

/* Static management tables use the same real fixed-column rule as the task table. */
.invite-table,.users-table,.issues-table,.audit-table{table-layout:fixed!important}
.invite-table th:nth-child(1),.invite-table td:nth-child(1){width:135px!important}
.invite-table th:nth-child(2),.invite-table td:nth-child(2){width:75px!important}
.invite-table th:nth-child(3),.invite-table td:nth-child(3),
.invite-table th:nth-child(4),.invite-table td:nth-child(4){width:170px!important}
.invite-table th:nth-child(5),.invite-table td:nth-child(5){width:250px!important}
.users-table th:nth-child(1),.users-table td:nth-child(1){width:105px!important}
.users-table th:nth-child(2),.users-table td:nth-child(2){width:75px!important}
.users-table th:nth-child(3),.users-table td:nth-child(3){width:90px!important}
.users-table th:nth-child(4),.users-table td:nth-child(4){width:170px!important}
.users-table th:nth-child(5),.users-table td:nth-child(5){width:250px!important}
.issues-table th:nth-child(1),.issues-table td:nth-child(1){width:85px!important}
.issues-table th:nth-child(2),.issues-table td:nth-child(2){width:105px!important}
.issues-table th:nth-child(3),.issues-table td:nth-child(3){width:90px!important}
.issues-table th:nth-child(5),.issues-table td:nth-child(5){width:170px!important}
.issues-table th:nth-child(6),.issues-table td:nth-child(6){width:250px!important}
.audit-table th:nth-child(1),.audit-table td:nth-child(1){width:170px!important}

/* Mobile navigation is an explicit touch-scroll region, including when a finger starts on a link. */
@media(max-width:800px){
  .sidebar{overflow:hidden}
  .side-nav{
    display:flex!important;
    width:100%;
    max-width:100%;
    min-width:0;
    overflow-x:scroll!important;
    overflow-y:hidden;
    touch-action:pan-x;
    -webkit-overflow-scrolling:touch;
    overscroll-behavior-x:contain;
    scrollbar-width:auto;
  }
  .side-nav>a{flex:0 0 auto}
}

/* Invitation code remains visible only in the administrator table. */
.invite-table{--table-width:960px}
.invite-table th:nth-child(1),.invite-table td:nth-child(1){width:135px!important}
.invite-table th:nth-child(2),.invite-table td:nth-child(2){width:160px!important}
.invite-table th:nth-child(3),.invite-table td:nth-child(3){width:75px!important}
.invite-table th:nth-child(4),.invite-table td:nth-child(4),
.invite-table th:nth-child(5),.invite-table td:nth-child(5){width:170px!important}
.invite-table th:nth-child(6),.invite-table td:nth-child(6){width:250px!important}

/* Align the sidebar title with navigation labels. */
.sidebar .wordmark{margin-left:10px}
@media(max-width:800px){.sidebar .wordmark{margin-left:0}}

/* Keep table scrolling affordances consistent across every management table. */
.table-wrap{
  overflow-x:scroll;
  scrollbar-gutter:stable;
  touch-action:pan-x pan-y;
}

/* Keep the task-limit explanation secondary on every viewport. */
.account-task-limit small{
  display:block;
  margin-top:5px;
  color:var(--faint);
  font-size:var(--text-meta);
  line-height:1.5;
  font-weight:400;
}
@media(max-width:650px){.account-task-limit small{font-size:var(--text-xs)}}

/* Account-detail labels must not inherit the mobile body font size. */
.account-detail-summary>div>span,
.account-task-limit>span{
  display:block;
  color:var(--faint);
  font-size:var(--text-meta);
  line-height:1.45;
  font-weight:400;
}
@media(max-width:650px){
  .account-detail-summary>div>span,
  .account-task-limit>span{font-size:var(--text-xs)}
}

/* Use one real overflow threshold for every management table, not only jobs. */
.invite-table,
.users-table,
.issues-table,
.audit-table{--table-width:1100px}
.account-task-table{width:760px}


/* One compact mobile scale. All semantic sizes above are rem-based, so this adjusts
   labels, tables, forms and helper copy together without per-panel exceptions. */
@media(max-width:650px){html{font-size:93.75%}}

/* Every administrator list uses the same actual horizontal scroll viewport.
   Static tables are deliberately kept wider than that viewport, including the
   short account table, so they never silently collapse into non-scrollable columns. */
.admin-area .table-wrap{
  inline-size:min(100%,820px);
  margin-inline:auto;
  overflow-x:scroll!important;
  overflow-y:hidden;
  overscroll-behavior-inline:contain;
  -webkit-overflow-scrolling:touch;
  touch-action:pan-x pan-y;
  scrollbar-gutter:stable both-edges;
}
.admin-area .table-wrap>.invite-table,
.admin-area .table-wrap>.users-table,
.admin-area .table-wrap>.issues-table,
.admin-area .table-wrap>.audit-table{
  inline-size:1100px!important;
  min-inline-size:1100px!important;
}

/* Admin tables follow the task-table model: the panel itself stays full width;
   only a viewport narrower than the fixed table scrolls horizontally. */
.admin-area .table-wrap{
  inline-size:100%;
  max-inline-size:none;
  margin-inline:0;
}

/* Grid children otherwise inherit the table's min-content width and push the panel past
   the page edge. Permit the admin panel to shrink exactly like the task panel. */
.admin-area,
.admin-area>.panel,
.admin-area .table-wrap{
  min-inline-size:0;
  max-inline-size:100%;
}
.admin-area .table-wrap{
  inline-size:100%;
  box-sizing:border-box;
  overflow-x:auto!important;
  overflow-y:hidden;
}

/* Restore each management table to its requested inner column geometry. */
.admin-area .table-wrap>.invite-table{inline-size:960px!important;min-inline-size:960px!important}
.admin-area .table-wrap>.users-table{inline-size:690px!important;min-inline-size:690px!important}
.admin-area .table-wrap>.issues-table{inline-size:970px!important;min-inline-size:970px!important}
.admin-area .table-wrap>.audit-table{inline-size:875px!important;min-inline-size:875px!important}

/* Audit log keeps the time column readable; the remaining columns stay compact. */
.admin-area .table-wrap>.audit-table{inline-size:755px!important;min-inline-size:755px!important}

/* System information is a CSS Grid, not a native table. Draw its separators with
   the grid gap so the panel border is the only outer edge at every breakpoint. */
.system-info-grid{
  gap:1px;
  border:0;
  border-radius:0;
  background:var(--line);
}
.system-info-grid>div{
  border:0!important;
  background:var(--surface);
}

/* Let the browser resolve a diagonal gesture natively between the horizontal table
   scroller and the page's vertical scroller; do not pre-lock either axis. */
.table-wrap{touch-action:auto}
