:root{
  --bg:#0f172a;--panel:#1e293b;--line:#334155;--ink:#e2e8f0;--mut:#94a3b8;
  --accent:#38bdf8;--accent2:#0ea5e9;--ok:#22c55e;--warn:#f59e0b;
}
*{box-sizing:border-box}
body{margin:0;font:14px/1.4 system-ui,Segoe UI,Roboto,sans-serif;color:var(--ink);background:var(--bg)}
header{display:flex;align-items:center;gap:18px;padding:10px 18px;background:var(--panel);border-bottom:1px solid var(--line);position:sticky;top:0;z-index:10}
header h1{font-size:16px;margin:0;font-weight:600}
.school{font-size:12px;color:var(--mut);display:flex;gap:6px;align-items:center}
.school select,select{background:#0b1220;color:var(--ink);border:1px solid var(--line);border-radius:7px;padding:6px 8px;font-size:13px}
.views{display:inline-flex;gap:4px;margin-left:6px}
.views button{padding:7px 12px;background:transparent;color:var(--ink);border:1px solid var(--line);border-radius:8px;cursor:pointer;font-size:13px}
.views button.active{background:var(--accent2);border-color:var(--accent2);color:#001018;font-weight:600}
.sync-btn{margin-left:auto;padding:8px 12px;border:1px solid var(--line);border-radius:8px;background:transparent;color:var(--ink);cursor:pointer;font-size:13px}
.sync-btn:hover{border-color:var(--accent)}
.sync-btn:disabled{opacity:.6;cursor:default}
.export{padding:8px 14px;border:0;border-radius:8px;background:var(--ok);color:#04210f;font-weight:600;cursor:pointer;font-size:13px}
.export:hover{filter:brightness(1.08)}
.export:disabled{opacity:.6;cursor:default}
.status{font-size:12px;color:var(--mut);min-width:120px}
.user{display:inline-flex;align-items:center;gap:8px;font-size:12px}
.user .uname{color:var(--ink);font-weight:600}
.user .urole{color:var(--mut);border:1px solid var(--line);border-radius:10px;padding:1px 8px;font-size:11px}
.logout{padding:5px 10px;border:1px solid var(--line);border-radius:7px;background:transparent;color:var(--ink);cursor:pointer;font-size:12px}
.logout:hover{border-color:#ef4444;color:#ef4444}
/* login */
.login{max-width:320px;margin:60px auto;background:var(--panel);border:1px solid var(--line);border-radius:14px;padding:26px}
.login h2{margin:0 0 16px;font-size:18px}
.login form{display:flex;flex-direction:column;gap:10px}
.login input{padding:10px;border:1px solid var(--line);border-radius:8px;background:#0b1220;color:var(--ink);font-size:14px}
.login button{padding:10px;border:0;border-radius:8px;background:var(--accent2);color:#001018;font-weight:700;cursor:pointer;font-size:14px}
.login button:hover{filter:brightness(1.08)}
.loginerr{color:#ef4444;font-size:12px;min-height:16px}
.status.saving{color:var(--warn)}
.status.saved{color:var(--ok)}
.classbar{display:flex;gap:6px;padding:10px 18px;border-bottom:1px solid var(--line);background:#172033;position:sticky;top:51px;z-index:9}
.classbar button{padding:6px 14px;background:transparent;color:var(--ink);border:1px solid var(--line);border-radius:8px;cursor:pointer;font-size:13px}
.classbar button.active{background:var(--accent);border-color:var(--accent);color:#001018;font-weight:600}
main{padding:16px 18px;overflow:auto}
.spin,.empty{color:var(--mut);padding:30px;text-align:center}

/* tables */
.tablewrap{border:1px solid var(--line);border-radius:10px;overflow:auto;max-height:calc(100vh - 150px)}
table{border-collapse:collapse;width:100%;font-size:13px}
th,td{padding:6px 9px;border-bottom:1px solid var(--line);white-space:nowrap;text-align:left}
thead th{position:sticky;top:0;background:#172033;z-index:1}
tbody tr:hover{background:#172033}
td.num,th.num{text-align:right;font-variant-numeric:tabular-nums}
.grade{font-weight:700}
.g-A{color:#22c55e}.g-B{color:#84cc16}.g-C{color:#eab308}.g-D{color:#f97316}.g-F{color:#ef4444}
.div-0{color:#ef4444}.div-INC,.div-ABS{color:var(--mut)}

/* editable grid */
.grid-table input{width:38px;background:#0b1220;color:var(--ink);border:1px solid var(--line);
  border-radius:5px;padding:3px 4px;font-size:12px;text-align:center;font-variant-numeric:tabular-nums;transition:border-color .25s,background .25s}
.grid-table input:focus{outline:2px solid var(--accent);border-color:var(--accent)}
.grid-table input.dirty{border-color:var(--warn)}
.grid-table input.saved{border-color:var(--ok);background:#10231a}
.grid-table input.invalid{border-color:#ef4444;background:#3f1d1d}
.gridhint{color:var(--mut);font-size:12px;margin-bottom:10px}
.gridhint kbd{background:#0b1220;border:1px solid var(--line);border-radius:4px;padding:1px 5px;font-size:11px}
.grid-table th.subj{text-align:center;border-left:1px solid var(--line)}
.grid-table td.subj{border-left:1px solid var(--line);padding:3px 5px}
.grid-table td.subj .pair{display:flex;gap:3px;align-items:center}
.grid-table .gb{display:inline-block;width:14px;text-align:center;font-size:11px;font-weight:700}
.grid-table td.sum{font-variant-numeric:tabular-nums;text-align:right;background:#141d2e}
.grid-table th.sum{background:#141d2e;text-align:right}
.sub2{font-size:10px;color:var(--mut)}
.frozen{position:sticky;left:0;background:var(--bg);z-index:2}
thead .frozen{z-index:3;background:#172033}

/* editable roster */
.rtoolbar{display:flex;align-items:center;gap:12px;margin-bottom:12px}
.addbtn{padding:7px 12px;border:1px solid var(--line);border-radius:8px;background:transparent;color:var(--ink);cursor:pointer;font-size:13px}
.addbtn:hover{border-color:var(--ok);color:var(--ok)}
.muted{color:var(--mut);font-size:12px}
.roster-table input,.roster-table select{background:#0b1220;color:var(--ink);border:1px solid var(--line);border-radius:6px;padding:5px 7px;font-size:13px;width:100%;min-width:90px}
.roster-table input.sm{min-width:48px;width:60px}
.roster-table input:focus,.roster-table select:focus{outline:2px solid var(--accent);border-color:var(--accent)}
.roster-table td{padding:5px 8px}
.del{background:transparent;border:1px solid var(--line);color:#ef4444;border-radius:6px;cursor:pointer;padding:3px 8px;font-size:12px}
.del:hover{background:#3f1d1d;border-color:#ef4444}
.save-new{background:var(--ok);border:0;color:#04210f;border-radius:6px;cursor:pointer;padding:4px 9px;font-weight:700}
tr.newrow td{background:#14241c}

/* dashboard */
.cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:12px;margin-bottom:18px}
.card{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:14px 16px}
.card .k{font-size:11px;text-transform:uppercase;letter-spacing:.05em;color:var(--mut)}
.card .v{font-size:26px;font-weight:700;margin-top:4px}
.card .s{font-size:12px;color:var(--mut);margin-top:2px}
.panel{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:14px 16px;margin-bottom:18px}
.panel h3{margin:0 0 12px;font-size:14px}
.grid2{display:grid;grid-template-columns:1fr 1fr;gap:18px}
@media(max-width:900px){.grid2{grid-template-columns:1fr}}
.bar{display:flex;align-items:center;gap:10px;margin:6px 0}
.bar .lab{width:70px;color:var(--mut);font-size:12px;text-align:right}
.bar .track{flex:1;background:#0b1220;border-radius:6px;overflow:hidden;height:18px}
.bar .fill{height:100%;background:linear-gradient(90deg,var(--accent2),var(--accent))}
.bar .n{width:42px;font-variant-numeric:tabular-nums}
table.mini{border-collapse:collapse;width:100%;font-size:13px}
table.mini th,table.mini td{padding:6px 9px;border-bottom:1px solid var(--line);text-align:left;white-space:nowrap}
.rank{color:var(--mut);width:26px}
.cls-h{font-size:15px;margin:22px 0 10px;color:var(--accent);border-bottom:1px solid var(--line);padding-bottom:6px}
.filterbar{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:12px;color:var(--mut);font-size:12px}
.filterbar .count{margin-left:auto}
