:root{--bg: #0F1720;--surface: #16212D;--surface-2: #1D2A38;--line: #2A3B4C;--line-soft: #223141;--ink: #EAF1F6;--ink-soft: #9DB0BF;--ink-mute: #6B8298;--teal: #3BA9B4;--teal-dim: #1E4C54;--teal-wash: #14323A;--risk-high: #E5544B;--risk-high-wash: #3A1E1E;--risk-watch: #E0A43B;--risk-watch-wash: #382C17;--ok: #4CB782;--ok-wash: #163027;--sans: "IBM Plex Sans Thai", system-ui, sans-serif;--mono: "IBM Plex Mono", ui-monospace, monospace;--r: 12px;--r-sm: 8px}*{box-sizing:border-box;margin:0;padding:0}body{font-family:var(--sans);background:var(--bg);color:var(--ink);font-size:14.5px;line-height:1.6;-webkit-font-smoothing:antialiased}body:before{content:"";position:fixed;top:0;right:0;bottom:0;left:0;background-image:linear-gradient(var(--line-soft) 1px,transparent 1px),linear-gradient(90deg,var(--line-soft) 1px,transparent 1px);background-size:44px 44px;opacity:.35;pointer-events:none;z-index:0}.app{position:relative;z-index:1;max-width:1240px;margin:0 auto;padding:26px 30px 90px}.topbar{display:flex;align-items:flex-end;gap:20px;flex-wrap:wrap;padding-bottom:18px;border-bottom:1px solid var(--line)}.brand{display:flex;align-items:center;gap:14px}.brand .mark{width:42px;height:42px;border-radius:10px;flex-shrink:0;background:linear-gradient(150deg,var(--teal),var(--teal-dim));display:grid;place-items:center;font-weight:700;font-size:19px;color:#fff;box-shadow:0 0 0 1px var(--line),0 6px 18px -8px var(--teal)}.brand h1{font-size:20px;font-weight:700;line-height:1.2;letter-spacing:-.01em}.brand .tag{font-size:12.5px;color:var(--ink-soft)}.topbar .spacer{margin-left:auto}.term-select{font-family:var(--sans);font-size:13.5px;color:var(--ink);background:var(--surface-2);border:1px solid var(--line);border-radius:var(--r-sm);padding:8px 13px}.scope{font-size:12px;color:var(--teal);border:1px solid var(--teal-dim);background:var(--teal-wash);border-radius:20px;padding:5px 15px;font-weight:600}.section{background:var(--surface);border:1px solid var(--line);border-radius:var(--r);padding:20px 22px;margin-top:18px}.section>header{margin-bottom:14px}.section h2{font-size:16px;font-weight:700;display:flex;align-items:center;gap:10px}.section .sub{font-size:12.5px;color:var(--ink-soft);margin-top:3px}.eyebrow{font-family:var(--mono);font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:var(--ink-mute)}.kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:14px;margin-top:18px}.kpi{background:var(--surface);border:1px solid var(--line);border-radius:var(--r);padding:16px 18px;position:relative;overflow:hidden}.kpi .cap{font-size:12px;color:var(--ink-soft);min-height:2.4em}.kpi .big{font-family:var(--mono);font-size:30px;font-weight:600;line-height:1.15;margin-top:4px}.kpi .big small{font-size:15px;color:var(--ink-soft);font-weight:500}.kpi .foot{font-size:11.5px;color:var(--ink-mute);margin-top:5px}.kpi:after{content:"";position:absolute;left:0;top:0;bottom:0;width:3px;background:var(--accent, var(--teal))}.kpi.risk{--accent: var(--risk-high)}.kpi.watch{--accent: var(--risk-watch)}.kpi.ok{--accent: var(--ok)}.risk-list{display:flex;flex-direction:column;gap:2px}.risk-row{display:grid;grid-template-columns:1fr 150px 130px 96px auto;gap:14px;align-items:center;padding:11px 12px;border-radius:var(--r-sm);cursor:pointer;transition:background .14s;border:1px solid transparent}.risk-row:hover{background:var(--surface-2)}.risk-row.open{background:var(--surface-2);border-color:var(--line)}.stu-id{font-family:var(--mono);font-size:12px;color:var(--ink-mute)}.stu-name{font-weight:600;font-size:14px}.stu-meta{font-size:11.5px;color:var(--ink-soft)}.streak{display:flex;align-items:center;gap:4px}.streak .dot{width:11px;height:11px;border-radius:50%;background:var(--risk-high)}.streak .dot:nth-child(1){opacity:1}.streak .dot:nth-child(2){opacity:.82}.streak .dot:nth-child(3){opacity:.64}.streak .dot:nth-child(4){opacity:.46}.streak .dot:nth-child(n+5){opacity:.3}.streak .num{font-family:var(--mono);font-size:13px;color:var(--risk-high);font-weight:600;margin-left:3px}.streak.zero .num{color:var(--ink-mute)}.absbar-wrap{display:flex;align-items:center;gap:8px}.absbar{flex:1;height:6px;background:var(--line);border-radius:3px;overflow:hidden}.absbar>i{display:block;height:100%;background:var(--risk-high)}.absbar-val{font-family:var(--mono);font-size:12.5px;color:var(--ink-soft);min-width:42px;text-align:right}.badge{font-size:11.5px;font-weight:600;border-radius:20px;padding:3px 12px;white-space:nowrap;justify-self:end}.badge.high{background:var(--risk-high-wash);color:var(--risk-high)}.badge.watch{background:var(--risk-watch-wash);color:var(--risk-watch)}.drill{grid-column:1 / -1;margin-top:6px;padding:10px 12px 4px;border-top:1px dashed var(--line)}.drill table{width:100%;border-collapse:collapse;font-size:12.5px}.drill th{text-align:left;color:var(--ink-mute);font-weight:500;padding:4px 8px;font-size:11px}.drill td{padding:5px 8px;border-top:1px solid var(--line-soft)}.fac-row{display:grid;grid-template-columns:200px 1fr 116px;gap:14px;align-items:center;padding:9px 10px;border-radius:var(--r-sm);cursor:pointer;transition:background .14s}.fac-row:hover,.fac-row.active{background:var(--surface-2)}.fac-row.active{outline:1px solid var(--teal-dim)}.fac-name{font-size:13.5px;font-weight:600}.fac-name small{display:block;font-weight:400;color:var(--ink-mute);font-size:11.5px}.stack{display:flex;height:20px;border-radius:5px;overflow:hidden;background:var(--line)}.stack>i{height:100%}.stack .s-ok{background:var(--ok)}.stack .s-warn{background:var(--risk-watch)}.stack .s-bad{background:var(--risk-high)}.fac-pct{text-align:right;font-family:var(--mono);font-weight:600;font-size:15px}.fac-pct small{display:block;font-family:var(--sans);font-weight:400;font-size:10.5px;color:var(--ink-mute)}.legend{display:flex;gap:16px;font-size:11.5px;color:var(--ink-soft);margin-bottom:10px;flex-wrap:wrap}.legend i{width:10px;height:10px;border-radius:3px;display:inline-block;margin-right:6px;vertical-align:-1px}table.data{width:100%;border-collapse:collapse;font-size:13.5px}table.data th{text-align:left;font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--ink-mute);font-weight:600;padding:8px 10px;border-bottom:1px solid var(--line)}table.data td{padding:9px 10px;border-bottom:1px solid var(--line-soft)}table.data tr:hover td{background:var(--surface-2)}.num{font-family:var(--mono);text-align:right}.mono{font-family:var(--mono)}.tabs{display:flex;gap:6px}.tab{font-size:12.5px;color:var(--ink-soft);background:transparent;border:1px solid var(--line);border-radius:20px;padding:5px 14px;cursor:pointer}.tab.active{background:var(--teal-wash);border-color:var(--teal-dim);color:var(--teal);font-weight:600}.grid2{display:grid;grid-template-columns:1fr 1fr;gap:18px;margin-top:18px}.empty{color:var(--ink-mute);font-size:13px;padding:20px 4px;text-align:center}.loading{color:var(--ink-mute);font-size:13px;padding:30px 4px;text-align:center}.err{color:var(--risk-high);font-size:13px;padding:16px;background:var(--risk-high-wash);border-radius:var(--r-sm)}footer{margin-top:40px;padding-top:16px;border-top:1px solid var(--line);font-size:12px;color:var(--ink-mute);line-height:1.9}footer b{color:var(--ink-soft)}@media (max-width: 920px){.grid2{grid-template-columns:1fr}.risk-row{grid-template-columns:1fr auto;row-gap:8px}.risk-row .absbar-wrap,.risk-row .streak{grid-column:1 / -1}.fac-row{grid-template-columns:130px 1fr 80px}}@media (prefers-reduced-motion: reduce){*{transition:none!important}}.risk-row.course{grid-template-columns:1fr 240px 128px 70px auto}.course-count{display:flex;flex-wrap:wrap;gap:4px;align-items:center}.chip{font-size:11px;font-weight:600;border-radius:5px;padding:2px 8px;white-space:nowrap}.chip.crit{background:var(--risk-high-wash);color:var(--risk-high)}.chip.warn{background:var(--risk-watch-wash);color:var(--risk-watch)}.chip.watch{background:var(--teal-wash);color:var(--teal)}.chip-plain{font-size:11px;color:var(--ink-mute)}.badge.crit{background:var(--risk-high-wash);color:var(--risk-high)}.badge.warn{background:var(--risk-watch-wash);color:var(--risk-watch)}.badge.watch{background:var(--teal-wash);color:var(--teal)}.badge.ok{background:var(--ok-wash);color:var(--ok)}.badge.sm{font-size:10.5px;padding:1px 8px}.risk-row.course .streak{justify-content:flex-end}@media (max-width: 920px){.risk-row.course{grid-template-columns:1fr auto}.risk-row.course .course-count,.risk-row.course .absbar-wrap,.risk-row.course .streak{grid-column:1 / -1;justify-content:flex-start}}
