:root{--navy:#1b2a41;--navy-deep:#16233a;--background:#f6f7f9;--foreground:#1b2a41;--card:#fff;--primary:#1b2a41;--primary-soft:#edf1f7;--primary-ink:#1b2a41;--accent:#e1b946;--accent-gold:#c9a227;--accent-soft:#fbf3db;--accent-deep:#8a6a08;--border:#e4e7ec;--muted:#edf1f7;--muted-fg:#5c697a;--sidebar-bg:#1b2a41;--sidebar-fg:#c6d0dd;--sidebar-accent:#243652;--sidebar-primary:#e1b946;--danger:#db2424;--danger-soft:#fdecec;--success:#298e5f;--success-soft:#e8f7f0;--warn:#cb720b;--warn-soft:#fef3dc;--radius:.75rem;color:var(--foreground);background:var(--background);font-family:Figtree,Noto Sans TC,PingFang TC,Microsoft JhengHei,system-ui,sans-serif;font-size:15px;line-height:1.6}*{box-sizing:border-box}html,body,#root{min-height:100%}body{background:var(--background);text-align:left;margin:0}h1,h2,h3{letter-spacing:0;margin:0}h1{font-size:26px;font-weight:700}h2{font-size:18px;font-weight:700}button,input,select{font:inherit;color:inherit}.num{font-variant-numeric:tabular-nums}.shell{grid-template-columns:210px 1fr;min-height:100vh;display:grid}.sidebar{background:var(--sidebar-bg);color:var(--sidebar-fg);flex-direction:column;height:100vh;padding:16px 12px;display:flex;position:sticky;top:0}.brand{align-items:center;gap:10px;padding:4px 6px 18px;display:flex}.brand-mark{background:var(--accent);width:34px;height:34px;color:var(--sidebar-bg);border-radius:50%;flex:none;place-items:center;font-weight:800;display:grid}.brand-text{line-height:1.15}.brand-text b{color:var(--accent);letter-spacing:.14em;font-size:13px;font-weight:700;display:block}.brand-text span{letter-spacing:.12em;color:#8f99a3;font-size:9.5px}.nav-label{color:#818c98;padding:12px 10px 6px;font-size:11px}.nav-item{width:100%;color:var(--sidebar-fg);cursor:pointer;text-align:left;background:0 0;border:0;border-radius:8px;align-items:center;gap:10px;padding:9px 10px;font-size:14px;display:flex}.nav-item:hover{background:var(--sidebar-accent)}.nav-item.active{background:var(--sidebar-accent);color:var(--sidebar-primary);font-weight:600}.nav-item .badge{background:var(--sidebar-primary);color:var(--sidebar-bg);border-radius:999px;margin-left:auto;padding:0 7px;font-size:11px;font-weight:700}.sidebar-foot{border-top:1px solid var(--sidebar-accent);margin-top:auto;padding-top:10px}.who{padding:6px 10px 8px;font-size:13px}.who b{color:#fff;font-weight:600;display:block}.who span{color:#8f99a3;font-size:12px}.content{width:100%;min-width:0;max-width:1560px;padding:32px 40px 64px}.page-head{margin-bottom:22px}.page-head p{color:var(--muted-fg);margin:2px 0 0;font-size:14px}.back{color:var(--muted-fg);cursor:pointer;background:0 0;border:0;align-items:center;gap:6px;margin-bottom:14px;padding:0;font-size:14px;display:inline-flex}.back:hover{color:var(--foreground)}.card{background:var(--card);border:1px solid var(--border);border-radius:var(--radius);padding:20px 24px}.stack>*+*{margin-top:16px}.grid>*{margin-top:0!important}.grid{gap:16px;display:grid}.grid.c4{grid-template-columns:repeat(4,1fr)}.grid.c5{grid-template-columns:repeat(5,1fr)}.grid.c3{grid-template-columns:repeat(3,1fr)}.grid.c2{grid-template-columns:1fr 1fr}.stat{align-items:center;gap:14px;display:flex}.stat .ic{background:var(--accent-soft);width:44px;height:44px;color:var(--accent-gold);border-radius:50%;flex:none;place-items:center;display:grid}.stat .lb{color:var(--muted-fg);font-size:12.5px}.stat .v{white-space:nowrap;font-size:24px;font-weight:700;line-height:1.2}.stat .sub{color:var(--muted-fg);margin-top:2px;font-size:12.5px}.stat.hl{border-color:var(--accent-gold);box-shadow:0 0 0 1px var(--accent-gold) inset}.pos{color:var(--success)}.neg{color:var(--danger)}.pill{background:var(--muted);color:var(--muted-fg);white-space:nowrap;border-radius:6px;align-items:center;gap:5px;padding:1px 8px;font-size:12px;font-weight:600;display:inline-flex}.pill.gold{background:var(--accent-soft);color:var(--accent-deep)}.pill.red{background:var(--danger-soft);color:var(--danger)}.pill.green{background:var(--success-soft);color:var(--success)}.pill.warn{background:var(--warn-soft);color:var(--warn)}.pill.blue{background:var(--primary-soft);color:var(--navy)}.dot{background:currentColor;border-radius:50%;width:7px;height:7px}.btn{border:1px solid var(--border);background:var(--card);cursor:pointer;border-radius:8px;justify-content:center;align-items:center;gap:6px;padding:7px 14px;font-size:14px;font-weight:600;display:inline-flex}.btn:hover{background:var(--muted)}.btn.primary{background:var(--accent);border-color:var(--accent);color:var(--navy)}.btn.primary:hover{filter:brightness(.96)}.btn:disabled.primary{background:var(--accent-soft);border-color:var(--accent-soft);color:var(--accent-deep)}.btn.sm{padding:4px 10px;font-size:13px}.btn:disabled{opacity:.5;cursor:not-allowed}.note{color:var(--muted-fg);font-size:13px}.banner{border-radius:10px;flex-wrap:wrap;align-items:center;gap:10px;padding:10px 14px;font-size:14px;display:flex}.banner.warn{background:var(--warn-soft);color:var(--warn)}.banner.info{background:var(--primary-soft);color:var(--navy)}.banner.red{background:var(--danger-soft);color:var(--danger);border:1px solid #f6cbcb}.avatar{background:var(--accent-soft);width:38px;height:38px;color:var(--accent-deep);border-radius:50%;flex:none;place-items:center;font-weight:700;display:grid}.avatar.lg{width:56px;height:56px;font-size:20px}.tabs{flex-wrap:wrap;gap:8px;display:flex}.tab{background:var(--muted);color:var(--muted-fg);cursor:pointer;border:0;border-radius:999px;padding:5px 14px;font-size:13px;font-weight:600}.tab.on{background:var(--accent);color:var(--navy)}table.t{border-collapse:collapse;width:100%;font-size:14px}table.t th{text-align:left;color:var(--muted-fg);border-bottom:1px solid var(--border);padding:8px 6px;font-size:12.5px;font-weight:600}table.t td{border-bottom:1px solid var(--border);vertical-align:middle;padding:10px 6px}table.t tr:last-child td{border-bottom:0}.r{text-align:right}input[type=email],input[type=password],input[type=month]{border:1px solid var(--border);background:#fff;border-radius:8px;width:100%;padding:9px 12px}input:focus{outline:2px solid var(--navy);outline-offset:1px;border-color:#0000}.dropzone{border:2px dashed var(--border);border-radius:var(--radius);text-align:center;color:var(--muted-fg);background:#fff;padding:26px}.dropzone input{margin-top:10px}.file::file-selector-button{border:1px solid var(--border);background:var(--card);cursor:pointer;border-radius:8px;margin-right:10px;padding:6px 14px;font-weight:600}.dropzone input::file-selector-button{border:1px solid var(--border);background:var(--card);cursor:pointer;border-radius:8px;margin-right:10px;padding:6px 14px;font-weight:600}.file::file-selector-button{background:var(--muted)}.dropzone input::file-selector-button:hover{background:var(--muted)}.student-card{cursor:pointer;transition:box-shadow .15s}.student-card:hover{box-shadow:0 4px 16px #00000014}.student-card.alert{border-width:1.5px;border-color:#e87d7d}.login-wrap{background:var(--sidebar-bg);place-items:center;min-height:100vh;padding:24px;display:grid}.login-card{background:#fff;border-radius:16px;gap:14px;width:100%;max-width:380px;padding:32px 30px;display:grid}.login-card .brand{text-align:center;flex-direction:column;justify-content:center;gap:8px;padding:0 0 6px}.login-card .brand-mark{width:52px;height:52px;font-size:22px}.login-card .brand-text b{font-size:15px}.login-card .brand-text span{color:var(--muted-fg)}@media (width<=900px){.shell{grid-template-columns:1fr}.sidebar{flex-flow:wrap;align-items:center;gap:4px;height:auto;padding:10px;position:static}.brand{padding:0 8px 0 0}.nav-label,.brand-text span{display:none}.nav-item{width:auto}.sidebar-foot{border:0;align-items:center;gap:8px;margin:0 0 0 auto;padding:0;display:flex}.content{padding:20px 16px 48px}.grid.c4,.grid.c5,.grid.c3{grid-template-columns:repeat(2,1fr)}.grid.c2{grid-template-columns:1fr}}input.file{max-width:100%;font-size:13px}.file::file-selector-button:hover{background:var(--muted)}body{-webkit-user-select:none;user-select:none;-webkit-touch-callout:none}input,textarea,select,[contenteditable=true]{-webkit-user-select:text;user-select:text}img,svg{-webkit-user-drag:none}@media print{body{display:none!important}}
