:root{color-scheme:light;--navy-900: #0b1f4b;--navy-800: #12305f;--navy: #163973;--navy-600: #1c4788;--navy-400: #3c6cc0;--navy-100: #e7edf8;--navy-050: #f1f5fc;--gold: #c3952b;--gold-600: #a87d1c;--gold-300: #e0b855;--gold-wash: rgba(195, 149, 43, .14);--page: #edf1f8;--surface-1: #ffffff;--surface-2: #f6f8fc;--raised: #ffffff;--text-primary: #101a33;--text-secondary: #46536b;--text-muted: #6b7689;--grid: #e4e9f2;--axis: #b6c0d2;--border: rgba(16, 26, 51, .1);--border-strong: rgba(16, 26, 51, .18);--series-1: #1c5cab;--series-2: #eb6834;--series-3: #1baf7a;--seq-100: #cde2fb;--seq-250: #86b6ef;--seq-400: #3987e5;--seq-550: #1c5cab;--seq-700: #163973;--on-seq-550: #ffffff;--on-seq-250: #0b1f4b;--status-good: #16a34a;--status-warning: #d97706;--status-serious: #ec835a;--status-critical: #c41e3a;--success-text: #046a38;--accent: #163973;--accent-hover: #12305f;--accent-wash: rgba(22, 57, 115, .08);--accent-ring: rgba(22, 57, 115, .3);--ghost: rgba(16, 26, 51, .045);--radius: 12px;--radius-sm: 8px;--radius-lg: 16px;--shadow-sm: 0 1px 2px rgba(11, 31, 75, .06);--shadow: 0 1px 3px rgba(11, 31, 75, .07), 0 10px 26px -14px rgba(11, 31, 75, .16);--shadow-lg: 0 20px 50px -16px rgba(11, 31, 75, .3);--sans: "Inter", system-ui, -apple-system, "Segoe UI", sans-serif;--display: "Plus Jakarta Sans", "Inter", system-ui, -apple-system, sans-serif;--mono: ui-monospace, SFMono-Regular, Menlo, monospace;--rail-bg: #0f2a57;--rail-bg-deep: #0b1f4b;--rail-text: rgba(255, 255, 255, .74);--rail-text-strong: #ffffff;--rail-muted: rgba(255, 255, 255, .5);--rail-hover: rgba(255, 255, 255, .08);--rail-active: rgba(255, 255, 255, .13);--rail-border: rgba(255, 255, 255, .11)}@media(prefers-color-scheme:dark){:root:not([data-theme=light]){color-scheme:dark;--page: #080d18;--surface-1: #111827;--surface-2: #161e30;--raised: #1a2336;--text-primary: #f4f7fc;--text-secondary: #aab4c8;--text-muted: #7d879b;--grid: #232c40;--axis: #3a465e;--border: rgba(255, 255, 255, .1);--border-strong: rgba(255, 255, 255, .18);--series-1: #3987e5;--series-2: #d95926;--series-3: #199e70;--seq-100: #163973;--seq-250: #1c5cab;--seq-400: #3987e5;--seq-550: #6da7ec;--seq-700: #b7d3f6;--on-seq-550: #0b1f4b;--on-seq-250: #eaf1fd;--status-critical: #f2707f;--success-text: #3ecb75;--gold: #d9ad45;--gold-600: #e0b855;--gold-300: #eccb7c;--gold-wash: rgba(217, 173, 69, .16);--accent: #6fa2f0;--accent-hover: #8ab6f5;--accent-wash: rgba(111, 162, 240, .16);--accent-ring: rgba(111, 162, 240, .45);--ghost: rgba(255, 255, 255, .06);--shadow-sm: 0 1px 2px rgba(0, 0, 0, .4);--shadow: 0 1px 3px rgba(0, 0, 0, .45), 0 10px 26px -14px rgba(0, 0, 0, .6);--shadow-lg: 0 20px 50px -16px rgba(0, 0, 0, .7);--rail-bg: #0b1730;--rail-bg-deep: #070f21}}:root[data-theme=dark]{color-scheme:dark;--page: #080d18;--surface-1: #111827;--surface-2: #161e30;--raised: #1a2336;--text-primary: #f4f7fc;--text-secondary: #aab4c8;--text-muted: #7d879b;--grid: #232c40;--axis: #3a465e;--border: rgba(255, 255, 255, .1);--border-strong: rgba(255, 255, 255, .18);--series-1: #3987e5;--series-2: #d95926;--series-3: #199e70;--seq-100: #163973;--seq-250: #1c5cab;--seq-400: #3987e5;--seq-550: #6da7ec;--seq-700: #b7d3f6;--on-seq-550: #0b1f4b;--on-seq-250: #eaf1fd;--status-critical: #f2707f;--success-text: #3ecb75;--gold: #d9ad45;--gold-600: #e0b855;--gold-300: #eccb7c;--gold-wash: rgba(217, 173, 69, .16);--accent: #6fa2f0;--accent-hover: #8ab6f5;--accent-wash: rgba(111, 162, 240, .16);--accent-ring: rgba(111, 162, 240, .45);--ghost: rgba(255, 255, 255, .06);--shadow-sm: 0 1px 2px rgba(0, 0, 0, .4);--shadow: 0 1px 3px rgba(0, 0, 0, .45), 0 10px 26px -14px rgba(0, 0, 0, .6);--shadow-lg: 0 20px 50px -16px rgba(0, 0, 0, .7);--rail-bg: #0b1730;--rail-bg-deep: #070f21}*{box-sizing:border-box}html,body,#root{height:100%}body{margin:0;font-family:var(--sans);font-size:14px;line-height:1.5;color:var(--text-primary);background:var(--page);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}a{color:inherit;text-decoration:none}button{font:inherit;color:inherit}:focus-visible{outline:2px solid var(--accent);outline-offset:2px;border-radius:4px}::selection{background:var(--accent-wash)}.shell{display:grid;grid-template-columns:248px 1fr;min-height:100%}.sidebar{background:linear-gradient(180deg,var(--rail-bg) 0%,var(--rail-bg-deep) 100%);color:var(--rail-text);border-right:1px solid var(--rail-border);padding:14px 10px 10px;display:flex;flex-direction:column;gap:2px;position:sticky;top:0;height:100vh;overflow-y:auto;scrollbar-width:thin;scrollbar-color:rgba(255,255,255,.2) transparent}.sidebar::-webkit-scrollbar{width:8px}.sidebar::-webkit-scrollbar-thumb{background:#ffffff2e;border-radius:4px}.brand-plate{background:#fff;border-radius:var(--radius-sm);padding:12px 12px 10px;margin:2px 2px 8px;box-shadow:0 1px #ffffff1f;display:flex;flex-direction:column;gap:8px}.brand-plate:after{content:"";display:block;height:2px;border-radius:1px;background:var(--gold);opacity:.85}.brand{display:flex;align-items:center;gap:9px;padding:6px 8px 16px}.brand-mark{width:26px;height:26px;border-radius:7px;background:var(--accent);display:grid;place-items:center;color:#fff;font-weight:700;font-size:12px;flex-shrink:0}.brand-name{font-family:var(--display);font-weight:700;letter-spacing:-.01em}.brand-sub{font-size:11px;color:var(--text-muted)}.sidebar .brand-sub{color:var(--rail-muted);font-size:10.5px;font-weight:500;letter-spacing:.06em;text-transform:uppercase;padding:0 4px 10px}.nav-group-label{font-size:10px;font-weight:700;letter-spacing:.09em;text-transform:uppercase;color:var(--rail-muted);padding:15px 10px 6px}.nav-item{position:relative;display:flex;align-items:center;gap:10px;padding:8px 10px;border-radius:var(--radius-sm);color:var(--rail-text);font-size:13.5px;cursor:pointer;transition:background .12s ease,color .12s ease}.nav-item:hover{background:var(--rail-hover);color:var(--rail-text-strong)}.nav-item.active{background:var(--rail-active);color:var(--rail-text-strong);font-weight:600}.nav-item.active:before{content:"";position:absolute;left:0;top:50%;transform:translateY(-50%);width:3px;height:17px;border-radius:0 2px 2px 0;background:var(--gold)}.nav-item .ico{width:15px;text-align:center;flex-shrink:0;opacity:.8}.nav-item.active .ico{opacity:1;color:var(--gold-300)}.nav-item:focus-visible{outline-color:var(--gold-300)}.rail-foot{margin-top:auto;padding-top:18px}.rail-user{border-top:1px solid var(--rail-border);padding:12px 10px 10px}.rail-user-name{color:var(--rail-text-strong);font-size:13px;font-weight:600;letter-spacing:-.01em}.rail-user-meta{color:var(--rail-muted);font-size:11.5px;line-height:1.45;margin-top:2px;word-break:break-word}.rail-role{display:inline-flex;align-items:center;gap:5px;margin-top:7px;font-size:10px;font-weight:700;letter-spacing:.07em;text-transform:uppercase;padding:3px 8px;border-radius:20px;color:var(--gold-300);background:#ffffff12;border:1px solid rgba(255,255,255,.14)}.rail-warn{margin-top:9px;padding:8px 9px;border-radius:var(--radius-sm);background:#d9ad4524;border:1px solid rgba(217,173,69,.38);color:#f6e4b4;font-size:11.5px;line-height:1.45}.rail-signout{width:100%;margin-top:10px;display:flex;align-items:center;gap:8px;padding:8px 10px;border-radius:var(--radius-sm);border:1px solid var(--rail-border);background:#ffffff0d;color:var(--rail-text);font-size:13px;font-weight:550;cursor:pointer;text-align:left}.rail-signout:hover{background:#ffffff1f;color:var(--rail-text-strong)}.main{min-width:0;display:flex;flex-direction:column}.topbar{display:flex;align-items:center;gap:12px;padding:0 24px;min-height:58px;border-bottom:1px solid var(--border);background:color-mix(in srgb,var(--surface-1) 88%,transparent);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);position:sticky;top:0;z-index:10}.crumbs{font-size:13px;color:var(--text-muted);min-width:0}.crumbs strong{display:block;font-family:var(--display);color:var(--text-primary);font-weight:700;font-size:15px;letter-spacing:-.015em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.topbar-right{margin-left:auto;display:flex;align-items:center;gap:8px}.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}.school-switcher select{min-width:150px;max-width:260px;padding-block:6px;font-size:13px}@media(max-width:640px){.school-switcher select{min-width:110px}}.content{padding:24px 24px 64px;width:100%}.notice>div,.page-sub,.empty{max-width:108ch}.page-head{margin-bottom:20px}.page-title{font-family:var(--display);font-size:23px;font-weight:700;letter-spacing:-.025em;margin:0 0 4px}.page-sub{color:var(--text-secondary);font-size:13.5px;margin:0}.chip{display:inline-flex;align-items:center;gap:6px;font-size:12px;padding:4px 10px;border-radius:20px;border:1px solid var(--border);color:var(--text-secondary);background:var(--surface-1);font-variant-numeric:tabular-nums}.chip .dot{width:6px;height:6px;border-radius:50%;background:var(--status-good)}.chip.warn{border-color:color-mix(in srgb,var(--status-warning) 55%,transparent);color:var(--text-primary)}.chip.warn .dot{background:var(--status-warning)}.chip.bad{border-color:color-mix(in srgb,var(--status-critical) 50%,transparent);color:var(--status-critical)}.chip.bad .dot{background:var(--status-critical)}.card{background:var(--surface-1);border:1px solid var(--border);border-radius:var(--radius);padding:17px;box-shadow:var(--shadow-sm)}.card-head{display:flex;align-items:baseline;gap:10px;margin-bottom:14px}.card-title{font-family:var(--display);font-size:14px;font-weight:700;margin:0;letter-spacing:-.01em}.card-note{font-size:12px;color:var(--text-muted);margin-left:auto}.grid{display:grid;gap:14px}.grid-4{grid-template-columns:repeat(4,1fr)}.grid-3{grid-template-columns:repeat(3,1fr)}.grid-2{grid-template-columns:repeat(2,1fr)}@media(max-width:1100px){.grid-4{grid-template-columns:repeat(2,1fr)}.grid-3,.grid-2{grid-template-columns:1fr}}.tile{display:flex;flex-direction:column;gap:3px;position:relative;overflow:hidden}.tile-label{font-size:11px;color:var(--text-secondary);font-weight:600;letter-spacing:.05em;text-transform:uppercase}.tile-value{font-family:var(--display);font-size:29px;font-weight:700;letter-spacing:-.03em;line-height:1.12;font-variant-numeric:tabular-nums}.tile-foot{font-size:11.5px;color:var(--text-muted)}.tile-foot .good{color:var(--success-text);font-weight:600}.tile-foot .bad{color:var(--status-critical);font-weight:600}.table-wrap{overflow-x:auto;border-radius:var(--radius);border:1px solid var(--border);background:var(--surface-1)}.card .table-wrap{border:none;border-radius:0;background:transparent}table{border-collapse:collapse;width:100%;font-size:13px}thead th{text-align:left;font-weight:700;font-size:11px;letter-spacing:.055em;text-transform:uppercase;color:var(--text-secondary);padding:10px;border-bottom:1px solid var(--border-strong);white-space:nowrap;background:var(--surface-2)}tbody td{padding:10px;border-bottom:1px solid var(--grid);vertical-align:middle}tbody tr:last-child td{border-bottom:none}tbody tr:hover{background:var(--accent-wash)}td.num,th.num{text-align:right;font-variant-numeric:tabular-nums}.cell-strong{font-weight:600}.cell-dim{color:var(--text-muted);font-size:12px}.badge{display:inline-flex;align-items:center;gap:5px;font-size:11.5px;font-weight:600;padding:3px 9px;border-radius:20px;border:1px solid var(--border);color:var(--text-secondary);background:var(--surface-2);white-space:nowrap}.badge .ico{font-size:10px}.badge.good{color:var(--success-text);border-color:color-mix(in srgb,var(--status-good) 40%,transparent);background:color-mix(in srgb,var(--status-good) 9%,var(--surface-1))}.badge.warning{color:var(--text-primary);border-color:color-mix(in srgb,var(--status-warning) 55%,transparent);background:color-mix(in srgb,var(--status-warning) 12%,var(--surface-1))}.badge.serious{color:var(--text-primary);border-color:color-mix(in srgb,var(--status-serious) 55%,transparent);background:color-mix(in srgb,var(--status-serious) 14%,var(--surface-1))}.badge.critical{color:var(--status-critical);border-color:color-mix(in srgb,var(--status-critical) 45%,transparent);background:color-mix(in srgb,var(--status-critical) 9%,var(--surface-1))}.badge.live{color:var(--accent);border-color:color-mix(in srgb,var(--accent) 45%,transparent);background:var(--accent-wash)}.badge.live .ico{animation:pulse 1.8s ease-in-out infinite}@keyframes pulse{0%,to{opacity:1}50%{opacity:.35}}@media(prefers-reduced-motion:reduce){.badge.live .ico,.skeleton{animation:none}.nav-item,.btn,.sidebar{transition:none}}.controls{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-bottom:16px}.input,.select{font:inherit;font-size:13px;padding:7px 11px;border:1px solid var(--border-strong);border-radius:var(--radius-sm);background:var(--surface-1);color:var(--text-primary);min-width:0;transition:border-color .12s ease,box-shadow .12s ease}.input:hover,.select:hover{border-color:color-mix(in srgb,var(--accent) 45%,var(--border-strong))}.input:focus,.select:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-ring)}.input{min-width:220px}.input::placeholder{color:var(--text-muted)}.btn{display:inline-flex;align-items:center;justify-content:center;gap:7px;font-size:13px;font-weight:600;padding:7px 13px;border-radius:var(--radius-sm);border:1px solid var(--border-strong);background:var(--surface-1);color:var(--text-primary);cursor:pointer;transition:background .12s ease,border-color .12s ease,box-shadow .12s ease}.btn:hover{background:var(--surface-2);border-color:color-mix(in srgb,var(--accent) 40%,var(--border-strong))}.btn.primary{background:var(--accent);border-color:var(--accent);color:#fff;box-shadow:var(--shadow-sm)}.btn.primary:hover{background:var(--accent-hover);border-color:var(--accent-hover)}.btn.ghost{border-color:transparent;background:transparent;color:var(--text-secondary)}.btn.ghost:hover{background:var(--ghost);color:var(--text-primary)}.btn:disabled{opacity:.45;cursor:not-allowed}.btn:disabled:hover{background:var(--surface-1);border-color:var(--border-strong)}.seg{display:inline-flex;border:1px solid var(--border-strong);border-radius:var(--radius-sm);overflow:hidden;background:var(--surface-1)}.seg button{padding:6px 12px;font-size:12.5px;background:transparent;border:none;cursor:pointer;color:var(--text-secondary);font-weight:550}.seg button:hover{background:var(--ghost);color:var(--text-primary)}.seg button+button{border-left:1px solid var(--border)}.seg button.on{background:var(--accent);color:#fff;font-weight:650}.register{border-collapse:separate;border-spacing:0;font-size:12px}.register th,.register td{padding:0}.register .student-col{position:sticky;left:0;z-index:2;background:var(--surface-1);border-right:1px solid var(--border-strong);padding:6px 10px;min-width:190px;max-width:190px;text-align:left}.register thead .student-col{z-index:3;background:var(--surface-2)}.register tbody tr:hover .student-col{background:var(--surface-1)}.register .sess-col{width:30px;min-width:30px;text-align:center;font-size:10px;color:var(--text-muted);padding:6px 0;border-bottom:1px solid var(--border);font-variant-numeric:tabular-nums}.register .pct-col{position:sticky;right:0;z-index:2;background:var(--surface-1);border-left:1px solid var(--border-strong);padding:6px 10px;min-width:108px;text-align:right;font-variant-numeric:tabular-nums}.register thead .pct-col{background:var(--surface-2)}.cellbox{width:22px;height:22px;margin:2px auto;border-radius:4px;display:grid;place-items:center;font-size:10px;font-weight:700;box-shadow:0 0 0 2px var(--surface-1)}.cell-present{background:var(--seq-550);color:var(--on-seq-550)}.cell-present_corrected{background:var(--seq-250);color:var(--on-seq-250)}.cell-absent{background:color-mix(in srgb,var(--status-critical) 16%,var(--surface-1));color:var(--status-critical)}.cell-present_overridden{background:color-mix(in srgb,var(--status-serious) 26%,var(--surface-1));color:var(--text-primary)}.cell-excused{background:var(--ghost);color:var(--text-muted)}.cell-not_enrolled{background:transparent;color:var(--text-muted);opacity:.5}.legend{display:flex;flex-wrap:wrap;gap:14px;margin-top:12px;font-size:12px;color:var(--text-secondary)}.legend-item{display:inline-flex;align-items:center;gap:6px}.legend-swatch{width:12px;height:12px;border-radius:3px}.chart-wrap{width:100%}.recharts-cartesian-axis-tick text{fill:var(--text-muted);font-size:11px}.recharts-cartesian-grid line{stroke:var(--grid)}.tooltip{background:var(--raised);border:1px solid var(--border-strong);border-radius:var(--radius-sm);padding:9px 11px;font-size:12px;box-shadow:var(--shadow)}.tooltip-title{font-weight:700;margin-bottom:5px}.tooltip-row{display:flex;align-items:center;gap:7px;color:var(--text-secondary)}.tooltip-row .sw{width:8px;height:8px;border-radius:2px;flex-shrink:0}.tooltip-row .v{margin-left:auto;font-variant-numeric:tabular-nums;color:var(--text-primary);font-weight:600}.chart-legend{display:flex;gap:14px;flex-wrap:wrap;font-size:12px;color:var(--text-secondary);margin-bottom:8px}.empty{padding:44px 20px;text-align:center;color:var(--text-muted);border:1px dashed var(--border-strong);border-radius:var(--radius);background:var(--surface-2)}.empty-title{font-family:var(--display);font-weight:700;font-size:14px;color:var(--text-primary);margin-bottom:5px}.notice{display:flex;gap:11px;align-items:flex-start;padding:12px 14px;border-radius:var(--radius);border:1px solid var(--border-strong);border-left:3px solid var(--accent);background:var(--surface-1);font-size:13px;color:var(--text-secondary);margin-bottom:16px;box-shadow:var(--shadow-sm)}.notice .ico{flex-shrink:0;color:var(--accent)}.notice strong{color:var(--text-primary)}.notice.warn{border-color:color-mix(in srgb,var(--status-warning) 50%,transparent);border-left-color:var(--status-warning);background:color-mix(in srgb,var(--status-warning) 7%,var(--surface-1))}.notice.warn .ico{color:var(--status-warning)}.bar-track{height:7px;border-radius:4px;background:var(--ghost);overflow:hidden;min-width:60px}.bar-fill{height:100%;border-radius:4px}.stack{display:flex;flex-direction:column;gap:14px}.row{display:flex;align-items:center;gap:10px}.muted{color:var(--text-muted)}.tabular{font-variant-numeric:tabular-nums}.mono{font-family:var(--mono);font-size:12px}.login-shell{display:grid;place-items:center;min-height:100vh;padding:24px;background:radial-gradient(1100px 620px at 15% -10%,rgba(195,149,43,.16),transparent 60%),linear-gradient(160deg,#163973,#0f2a57 45%,#0b1f4b)}.login-card{width:100%;max-width:408px;background:var(--surface-1);border:1px solid var(--border);border-radius:var(--radius-lg);padding:30px 28px;display:flex;flex-direction:column;gap:15px;box-shadow:var(--shadow-lg)}.login-brand{display:flex;flex-direction:column;align-items:center;gap:10px;padding-bottom:4px}.login-brand .brand-sub{font-size:10.5px;font-weight:600;letter-spacing:.1em;text-transform:uppercase;color:var(--text-secondary)}.login-rule{width:46px;height:2px;border-radius:1px;background:var(--gold)}.field{display:flex;flex-direction:column;gap:6px;font-size:13px}.field>span{color:var(--text-secondary);font-weight:600}.field .input{width:100%;min-width:0}.skeleton{height:14px;border-radius:4px;background:linear-gradient(90deg,var(--ghost) 25%,var(--grid) 50%,var(--ghost) 75%);background-size:200% 100%;animation:shimmer 1.3s infinite}@keyframes shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}.err{border:1px solid color-mix(in srgb,var(--status-critical) 45%,transparent);border-left:3px solid var(--status-critical);border-radius:var(--radius);padding:15px 17px;color:var(--text-primary);background:color-mix(in srgb,var(--status-critical) 6%,var(--surface-1))}.err-title{font-family:var(--display);font-weight:700;color:var(--status-critical);margin-bottom:5px}.kv-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:14px 20px}.kv-label{font-size:10.5px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--text-muted);margin-bottom:3px}.kv-value{font-size:13.5px;word-break:break-word}.kv-hint{font-size:11.5px;color:var(--text-muted);margin-top:3px;line-height:1.4}.photo-pair{display:flex;gap:16px;flex-wrap:wrap}.photo-fig{margin:0;width:190px}.photo-frame{width:190px;height:190px;border:1px solid var(--border-strong);border-radius:var(--radius);overflow:hidden;background:var(--surface-2);display:grid;place-items:center}.photo-frame img{width:100%;height:100%;object-fit:cover;display:block}.photo-missing{font-size:12px;color:var(--text-muted)}.photo-caption{font-size:12.5px;font-weight:600;margin-top:8px}.photo-path{font-size:10.5px;color:var(--text-muted);margin-top:4px;word-break:break-all;line-height:1.35}.score{display:inline-flex;align-items:baseline;gap:6px;padding:4px 10px;border-radius:8px;font-variant-numeric:tabular-nums;border:1px solid var(--border)}.score strong{font-family:var(--display);font-size:15px;font-weight:700;letter-spacing:-.02em}.score-status{font-size:10.5px;text-transform:uppercase;letter-spacing:.05em;opacity:.8}.score-good{background:color-mix(in srgb,var(--status-good) 12%,var(--surface-1));border-color:color-mix(in srgb,var(--status-good) 40%,transparent);color:var(--success-text)}.score-bad{background:color-mix(in srgb,var(--status-critical) 12%,var(--surface-1));border-color:color-mix(in srgb,var(--status-critical) 45%,transparent);color:var(--status-critical)}.score-warn{background:color-mix(in srgb,var(--status-warning) 14%,var(--surface-1));border-color:color-mix(in srgb,var(--status-warning) 50%,transparent);color:var(--text-primary)}.score-none{color:var(--text-muted);font-size:12px;border-color:transparent}.thumbs{display:flex;gap:5px}.thumb{width:46px;height:46px;border-radius:6px;overflow:hidden;border:1px solid var(--border-strong);background:var(--surface-2);display:grid;place-items:center;flex-shrink:0}.thumb img{width:100%;height:100%;object-fit:cover;display:block}.thumb-none{font-size:8.5px;color:var(--text-muted);text-align:center;line-height:1.2;padding:2px}.lb{position:fixed;top:0;right:0;bottom:0;left:0;z-index:100;background:#070f21eb;display:flex;flex-direction:column;padding:14px;overscroll-behavior:contain}.lb-bar{display:flex;align-items:center;gap:12px;color:#fff;flex-shrink:0;padding-bottom:12px}.lb-bar .lb-hint{margin-left:auto}.lb-hint{font-size:12px;color:#ffffff9e}.lb-btn{color:#fff;border-color:#ffffff47!important;background:#ffffff0f}.lb-btn:hover{background:#ffffff24}.lb-stage{flex:1;min-height:0;display:flex;align-items:center;justify-content:center;gap:20px;flex-wrap:nowrap}.lb-fig{margin:0;min-width:0;min-height:0;display:flex;flex-direction:column;align-items:center;max-height:100%;flex:0 1 auto}.lb-fig img{max-width:100%;max-height:calc(100vh - 168px);object-fit:contain;border-radius:8px;background:#0b1f4b}.lb-missing{width:260px;height:260px;border-radius:8px;display:grid;place-items:center;background:#ffffff0f;color:#ffffff80;font-size:13px}.lb-fig figcaption{text-align:center;padding-top:10px;max-width:460px}.lb-caption{color:#fff;font-size:13.5px;font-weight:600}.lb-sub{color:#fff9;font-size:12px;margin-top:2px}.lb-path{color:#ffffff6b;font-size:10.5px;margin-top:5px;word-break:break-all;line-height:1.35}.lb-nav{display:flex;align-items:center;justify-content:center;gap:14px;padding-top:12px;flex-shrink:0}@media(max-width:760px){.lb-stage{flex-direction:column;gap:12px;overflow-y:auto}.lb-fig img{max-height:42vh}.lb-bar .lb-hint{display:none}}.zoomable{cursor:zoom-in}.zoomable:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.nav-toggle,.sidebar-scrim{display:none}@media(max-width:1000px){.grid-4,.grid-3{grid-template-columns:repeat(2,1fr)}}@media(max-width:900px){.shell{grid-template-columns:1fr}.sidebar{position:fixed;top:0;left:0;bottom:0;width:262px;z-index:60;transform:translate(-100%);transition:transform .18s ease;box-shadow:var(--shadow-lg)}.shell.nav-open .sidebar{transform:translate(0)}.sidebar-scrim{display:block;position:fixed;top:0;right:0;bottom:0;left:0;z-index:50;background:#070f2180;opacity:0;pointer-events:none;transition:opacity .18s ease}.shell.nav-open .sidebar-scrim{opacity:1;pointer-events:auto}.nav-toggle{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;flex-shrink:0;border:1px solid var(--border-strong);border-radius:var(--radius-sm);background:var(--surface-1);color:var(--text-primary);cursor:pointer}.nav-toggle:hover{background:var(--surface-2)}.content{padding:16px 14px 56px}.topbar{padding:0 14px;min-height:54px}.page-title{font-size:20px}.grid-4,.grid-3,.grid-2{grid-template-columns:1fr}.tile-value{font-size:25px}.controls{gap:6px}.controls .input{min-width:0;flex:1 1 100%}.seg{flex-wrap:wrap}.table-wrap{-webkit-overflow-scrolling:touch}.register .student-col{min-width:140px;max-width:140px}.register .pct-col{min-width:92px}.photo-fig,.photo-frame{width:150px}.photo-frame{height:150px}.kv-grid{grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:12px 14px}}@media(max-width:560px){.content{padding:14px 11px 48px}.card{padding:14px}.page-title{font-size:19px}.tile-value{font-size:23px}.photo-pair{gap:10px}.photo-fig,.photo-frame{width:132px}.photo-frame{height:132px}.kv-grid{grid-template-columns:1fr 1fr}.login-card{padding:24px 20px}thead th{font-size:10.5px;padding:8px}tbody td{padding:9px 8px}.btn{padding:9px 14px}.nav-item{padding:10px}}@media(min-width:1700px){.content{padding:28px 34px 72px}.grid-4{grid-template-columns:repeat(4,minmax(0,1fr))}.card{padding:19px}}@media(min-width:2100px){.content{padding:32px 42px 80px}.register .sess-col{width:34px;min-width:34px}.cellbox{width:26px;height:26px}.thumb{width:56px;height:56px}.photo-fig,.photo-frame{width:230px}.photo-frame{height:230px}}.daynav{display:flex;align-items:center;gap:6px;flex-wrap:wrap}.daynav .btn{padding:7px 12px}.daynav-date{min-width:0;width:auto;font-variant-numeric:tabular-nums}.form-row{display:flex;gap:12px;flex-wrap:wrap}.form-row .field{min-width:0}.check{display:flex;align-items:flex-start;gap:8px;font-size:13px;cursor:pointer}.check input{margin-top:3px;flex-shrink:0;accent-color:var(--accent)}.check-hint{display:block;font-style:normal;font-size:11.5px;color:var(--text-muted);margin-top:2px;line-height:1.4}.setup-link{display:flex;align-items:center;gap:8px;margin-top:8px;padding:9px 11px;border:1px solid var(--border-strong);border-radius:var(--radius-sm);background:var(--surface-2)}.setup-link code{flex:1;min-width:0;font-family:var(--mono);font-size:11px;word-break:break-all;line-height:1.4;color:var(--text-secondary)}.setup-link .btn{flex-shrink:0}.logo{display:inline-flex;align-items:center}.logo-text{justify-content:center;text-align:center;font-family:var(--display);font-weight:800;letter-spacing:-.01em;line-height:1.15;overflow-wrap:anywhere}.logo img{display:block;width:100%;height:auto}.logo.logo-uploaded{flex-direction:column;justify-content:center;gap:8px;text-align:center}.logo.logo-uploaded img{width:auto;max-width:100%}.logo-name{font-family:var(--display);font-weight:700;line-height:1.2;overflow-wrap:anywhere}.logo img.logo-dark{display:none}@media(prefers-color-scheme:dark){:root:not([data-theme=light]) .logo img.logo-light{display:none}:root:not([data-theme=light]) .logo img.logo-dark{display:block}}:root[data-theme=dark] .logo img.logo-light{display:none}:root[data-theme=dark] .logo img.logo-dark{display:block}.logo img.logo-dark{border-radius:6px}.school-logo{display:inline-flex;align-items:center}.school-logo img{display:block;width:auto;max-width:100%}.school-logo img.logo-dark{display:none}@media(prefers-color-scheme:dark){:root:not([data-theme=light]) .school-logo img.logo-light{display:none}:root:not([data-theme=light]) .school-logo img.logo-dark{display:block}}:root[data-theme=dark] .school-logo img.logo-light{display:none}:root[data-theme=dark] .school-logo img.logo-dark{display:block}.school-brand{display:inline-flex;align-items:center}.school-brand img{display:block;width:100%;height:auto;max-height:68px;object-fit:contain;object-position:left center}.brand-logo{display:flex;flex-direction:column;gap:8px;padding:4px 8px 16px}.brand-logo .brand-sub{font-size:11px;color:var(--text-muted);letter-spacing:.02em}.login-card .logo{align-self:center}.btn.danger{color:var(--status-critical);border-color:color-mix(in srgb,var(--status-critical) 45%,transparent);background:var(--surface-1)}.btn.danger:hover{background:color-mix(in srgb,var(--status-critical) 10%,var(--surface-1));border-color:var(--status-critical)}.btn.danger.solid{background:var(--status-critical);border-color:var(--status-critical);color:#fff}.btn.danger.solid:hover{filter:brightness(1.08);background:var(--status-critical)}
