:root{--brand:#14284b;--brand-strong:#0d1c37;--brand-soft:#e7ecf5;--accent:#c99a2e;--accent-soft:#f7efd9;--ink:#17202b;--muted:#55616f;--line:#d8dee6;--bg:#f4f6f9;--surface:#fff;--ok:#1b6b3a;--ok-bg:#e3f4ea;--warn:#7a4b00;--warn-bg:#fff1d6;--bad:#9b1c1c;--bad-bg:#fde8e8;--info:#1f4e8c;--info-bg:#e4eef9;--light-on:#1e8e3e;--light-off:#d32f2f;--lecture:#1f3a68;--lecture-text:#fff;--tutorial:#e6edf7;--tutorial-text:#14284b;--tutorial-line:#8fa6c9;--lab:#f7efd9;--lab-text:#5c430c;--lab-line:#c99a2e;--other:#eef0f3;--other-text:#3b4652;--radius:8px;--font:system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;--mono:ui-monospace, "SF Mono", Menlo, Consolas, monospace;--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}*{box-sizing:border-box}html,body{margin:0}body{background:var(--bg);color:var(--ink);font:15px/1.5 var(--font);-webkit-text-size-adjust:100%}a{color:var(--brand)}h1,h2,h3{text-wrap:balance;margin:0;line-height:1.2}h1{font-size:24px;font-weight:650}h2{font-size:17px;font-weight:650}h3{font-size:15px;font-weight:650}p{margin:0}button,input,select{font:inherit}:focus-visible{outline:3px solid var(--accent);outline-offset:2px}.num{font-variant-numeric:tabular-nums}.muted{color:var(--muted)}.small{font-size:13px}.mono{font-family:var(--mono);font-size:13px}.sr-only{clip:rect(0 0 0 0);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}.topbar{z-index:20;padding:10px max(16px, env(safe-area-inset-right)) 10px max(16px, env(safe-area-inset-left));padding-top:max(10px, env(safe-area-inset-top));background:var(--surface);border-bottom:3px solid var(--brand);align-items:center;gap:16px;display:flex;position:sticky;top:0}.brand{color:var(--brand);align-items:center;gap:10px;min-width:0;text-decoration:none;display:flex}.brand-logo{width:auto;height:40px;display:block}.brand-wordmark{border-left:4px solid var(--accent);letter-spacing:.02em;height:40px;color:var(--brand);flex-direction:column;justify-content:center;padding:0 10px;font-weight:750;line-height:1.05;display:flex}.brand-wordmark small{letter-spacing:.06em;text-transform:uppercase;color:var(--muted);font-size:11px;font-weight:500}.app-name{white-space:nowrap;font-size:15px;font-weight:650;line-height:1.15}.app-name small{color:var(--muted);font-size:12px;font-weight:400;display:block}.mainnav{scrollbar-width:thin;flex:auto;gap:2px;min-width:0;margin-left:8px;display:flex;overflow-x:auto}.mainnav a{color:var(--ink);white-space:nowrap;border-radius:6px;padding:8px 10px;font-weight:550;text-decoration:none}.mainnav a:hover{background:var(--brand-soft)}.mainnav a.active{background:var(--brand);color:#fff}.userbox{align-items:center;gap:10px;min-width:0;margin-left:auto;display:flex}.userbox .who{text-align:right;min-width:0;font-size:13px;line-height:1.25}.userbox .who b{white-space:nowrap;text-overflow:ellipsis;max-width:220px;font-weight:600;display:block;overflow:hidden}.page{max-width:1180px;padding:22px max(16px, env(safe-area-inset-right)) 96px max(16px, env(safe-area-inset-left));flex-direction:column;gap:18px;margin:0 auto;display:flex}.tabbar{display:none}@media (width<=1440px){.app-name small{display:none}}.brand{flex-shrink:0}@media (width<=760px){.mainnav,.userbox .who,.app-name small{display:none}.tabbar{z-index:20;background:var(--surface);border-top:1px solid var(--line);padding:6px max(8px, env(safe-area-inset-right)) max(6px, env(safe-area-inset-bottom)) max(8px, env(safe-area-inset-left));scrollbar-width:none;display:flex;position:fixed;bottom:0;left:0;right:0;overflow-x:auto}.tabbar a{color:var(--muted);border-radius:6px;flex-direction:column;flex:1 0 62px;justify-content:center;align-items:center;gap:2px;min-height:48px;padding:6px 2px;font-size:11px;text-decoration:none;display:flex}.tabbar a.active{color:var(--brand);background:var(--brand-soft);font-weight:650}.page{padding-top:16px}h1{font-size:21px}}.page-head{flex-wrap:wrap;justify-content:space-between;align-items:flex-end;gap:10px 20px;display:flex}.page-head .lede{color:var(--muted);max-width:70ch;margin-top:4px}.card{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);min-width:0;padding:16px 18px}.card>h2+*,.card>h3+*{margin-top:10px}.grid{grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:16px;display:grid}.row{flex-wrap:wrap;align-items:center;gap:10px;display:flex}.stack{flex-direction:column;gap:10px;display:flex}.spacer{flex:auto}.btn{border:1px solid var(--brand);background:var(--surface);min-height:40px;color:var(--brand);cursor:pointer;white-space:nowrap;border-radius:6px;justify-content:center;align-items:center;gap:8px;padding:8px 16px;font-weight:600;text-decoration:none;display:inline-flex}.btn:hover{background:var(--brand-soft)}.btn.primary{background:var(--brand);color:#fff}.btn.primary:hover{background:var(--brand-strong)}.btn.danger{border-color:var(--bad);color:var(--bad)}.btn.danger:hover{background:var(--bad-bg)}.btn.quiet{border-color:var(--line);color:var(--ink)}.btn:disabled{opacity:.55;cursor:not-allowed}.btn.small{min-height:32px;padding:4px 10px;font-size:13px}.field{flex-direction:column;gap:4px;min-width:0;display:flex}.field label{font-size:13px;font-weight:600}.field .hint{color:var(--muted);font-size:12px}.input,select.input{background:var(--surface);width:100%;min-height:40px;color:var(--ink);border:1px solid #8a97a5;border-radius:6px;padding:8px 10px}.search{position:relative}.search .input{border-radius:10px;min-height:48px;padding-left:42px;font-size:16px}.search svg{color:var(--muted);position:absolute;top:50%;left:13px;transform:translateY(-50%)}.badge{white-space:nowrap;border-radius:4px;align-items:center;gap:4px;padding:2px 8px;font-size:12px;font-weight:600;line-height:1.5;display:inline-flex}.badge.ok{background:var(--ok-bg);color:var(--ok)}.badge.warn{background:var(--warn-bg);color:var(--warn)}.badge.bad{background:var(--bad-bg);color:var(--bad)}.badge.info{background:var(--info-bg);color:var(--info)}.badge.plain{background:var(--other);color:var(--other-text)}.badge.Lecture{background:var(--lecture);color:var(--lecture-text)}.badge.Tutorial{background:var(--tutorial);color:var(--tutorial-text);box-shadow:inset 0 0 0 1px var(--tutorial-line)}.badge.Lab{background:var(--lab);color:var(--lab-text);box-shadow:inset 0 0 0 1px var(--lab-line)}.badge.Other{background:var(--other);color:var(--other-text)}.notice{border-radius:var(--radius);gap:10px;padding:12px 14px;font-size:14px;display:flex}.notice.info{background:var(--info-bg);color:var(--info)}.notice.warn{background:var(--warn-bg);color:var(--warn)}.notice.bad{background:var(--bad-bg);color:var(--bad)}.notice.ok{background:var(--ok-bg);color:var(--ok)}.notice b{font-weight:650}.list{flex-direction:column;display:flex}.list>a,.list>div.item{border-top:1px solid var(--line);color:var(--ink);align-items:center;gap:12px;min-height:48px;padding:11px 4px;text-decoration:none;display:flex}.list>a:first-child,.list>div.item:first-child{border-top:0}.list>a:hover{background:var(--brand-soft)}.list .grow{flex:auto;min-width:0}.list .grow b{font-weight:600}.tablewrap{overflow-x:auto}table.data{border-collapse:collapse;width:100%;font-size:14px}table.data th{text-align:left;color:var(--muted);border-bottom:1px solid var(--line);white-space:nowrap;padding:8px 10px;font-size:12px;font-weight:650}table.data td{border-bottom:1px solid var(--line);vertical-align:top;padding:9px 10px}table.data td.num,table.data th.num{text-align:right}table.data tr:last-child td{border-bottom:0}.tabs{border-bottom:1px solid var(--line);gap:4px;display:flex;overflow-x:auto}.tabs button{color:var(--muted);cursor:pointer;white-space:nowrap;background:0 0;border:0;border-bottom:3px solid #0000;padding:10px 14px;font-weight:600}.tabs button.active{color:var(--brand);border-bottom-color:var(--accent)}.tabs a{color:var(--muted);white-space:nowrap;border-bottom:3px solid #0000;padding:10px 14px;font-weight:600;text-decoration:none}.tabs a.active{color:var(--brand);border-bottom-color:var(--accent)}.rank{counter-reset:rank;margin:8px 0 0;padding:0;list-style:none}.rank li{border-bottom:1px solid var(--line);counter-increment:rank;align-items:baseline;gap:8px;padding:6px 0;display:flex}.rank li:last-child{border-bottom:0}.rank li:before{content:counter(rank);min-width:1.6em;color:var(--muted);font-variant-numeric:tabular-nums;font-size:13px}.rank li a{flex:1}.sortbtn{font:inherit;color:inherit;cursor:pointer;font-weight:inherit;white-space:nowrap;background:0 0;border:0;padding:0}.stat{flex-direction:column;gap:2px;display:flex}.stat b{font-variant-numeric:tabular-nums;font-size:26px;font-weight:650;line-height:1.1}.stat span{color:var(--muted);font-size:13px}button.card{color:inherit}button.card:hover:not(:disabled){border-color:var(--warn)}button.card[aria-pressed=true]{border-color:var(--warn);box-shadow:inset 0 0 0 1px var(--warn)}.linkbtn{color:var(--link,var(--brand));cursor:pointer;font:inherit;background:0 0;border:0;padding:0;text-decoration:underline}details>summary{cursor:pointer;padding:6px 0;font-weight:600}details ul{margin:6px 0 0;padding-left:20px;font-size:14px}.week{border:1px solid var(--line);border-radius:var(--radius);background:var(--surface);display:grid;position:relative;overflow:hidden}.week .hdr{text-align:center;border-bottom:1px solid var(--line);border-left:1px solid var(--line);background:#f8f9fb;padding:8px 4px;font-size:12px;font-weight:650}.week .hdr:first-child{border-left:0}.week .times{position:relative}.week .times span{color:var(--muted);font-variant-numeric:tabular-nums;font-size:11px;position:absolute;right:6px;transform:translateY(-50%)}.week .col{border-left:1px solid var(--line);background-image:repeating-linear-gradient(to bottom, transparent 0, transparent calc(var(--hour) - 1px), #eef1f4 calc(var(--hour) - 1px), #eef1f4 var(--hour));position:relative}.week .blk{border-radius:5px;padding:4px 6px;font-size:12px;line-height:1.3;position:absolute;left:3px;right:3px;overflow:hidden}.week .blk b{white-space:nowrap;text-overflow:ellipsis;font-weight:650;display:block;overflow:hidden}.week .blk span{white-space:nowrap;text-overflow:ellipsis;display:block;overflow:hidden}.blk.Lecture{background:var(--lecture);color:var(--lecture-text)}.blk.Tutorial{background:var(--tutorial);color:var(--tutorial-text);border:1px solid var(--tutorial-line)}.blk.Lab{background:var(--lab);color:var(--lab-text);border:1px solid var(--lab-line)}.blk.Other{background:var(--other);color:var(--other-text);border:1px solid var(--line)}.blk.split{left:3px;right:50%}.blk.split+.blk.split{left:50%;right:3px}.daylist{display:none}.daylist.force{flex-direction:column;gap:12px;display:flex}.daylist .day{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius)}.daylist .day h3{border-bottom:1px solid var(--line);border-radius:var(--radius) var(--radius) 0 0;background:#f8f9fb;padding:10px 14px}.sess{border-top:1px solid var(--line);grid-template-columns:74px 1fr;gap:4px 12px;padding:12px 14px;display:grid}.sess:first-of-type{border-top:0}.sess .t{font-variant-numeric:tabular-nums;font-size:14px;font-weight:650}.sess .t small{color:var(--muted);font-weight:400;display:block}.sess .what b{font-weight:650}.sess .meta{color:var(--muted);flex-wrap:wrap;gap:4px 12px;margin-top:3px;font-size:13px;display:flex}@media (width<=760px){.week{display:none}.daylist{flex-direction:column;gap:12px;display:flex}}.ltps-in{width:100%;min-width:48px;font:inherit;background:var(--surface);border:1px solid #b8c2cc;border-radius:4px;padding:3px 5px}.ltps-in.num{text-align:right;width:56px;min-width:0}.ltps-table td,.ltps-table th{vertical-align:middle;padding:4px 6px}.ltps-diff,td.ltps-diff,tr.ltps-diff td{background:var(--warn-bg)}.badge.info{color:#1d3f78;background:#e3ecfa}.print-only{display:none}@media print{.topbar,.tabbar,.noprint{display:none!important}.print-only{display:block!important}.page{max-width:none;padding:0}body{background:#fff}.card{border:0;padding:0}@page{size:legal landscape;margin:8mm}.ltps-print{color:#000;font:9px/1.25 Arial,sans-serif;position:relative}.ltps-print h1{text-align:center;margin:0;font-size:14px}.ltps-print .small,.ltps-print p{font-size:8px}.ltps-print h2{text-align:center;margin:2px 0 6px;font-size:12px}.ltps-print table{border-collapse:collapse;width:100%;margin-bottom:6px}.ltps-print .ltps-grid th,.ltps-print .ltps-grid td,.ltps-print .ltps-sum th,.ltps-print .ltps-sum td,.ltps-print .ltps-sign td,.ltps-print .ltps-sign thead th{text-align:center;border:1px solid #000;padding:2px 3px}.ltps-print .ltps-grid thead th,.ltps-print .ltps-sum thead th{background:#ccf;font-size:8px}.ltps-print .ltps-term{writing-mode:vertical-rl;background:#99e;font-size:8px;transform:rotate(180deg)}.ltps-print .ltps-sum th{background:#f8cbad}.ltps-print .ltps-head th{text-align:right;width:12%;padding-right:4px}.ltps-print .ltps-sum,.ltps-print .ltps-sign{width:60%}.ltps-print .ltps-sign tbody th{text-align:right;border:0}.ltps-watermark{color:#00000014;pointer-events:none;font-size:120px;position:fixed;top:35%;left:25%;transform:rotate(-20deg)}}.bell{padding:4px 8px;position:relative}.bell-count{background:var(--bad);color:#fff;text-align:center;border-radius:9px;min-width:18px;height:18px;padding:0 4px;font-size:11px;font-weight:700;line-height:18px;position:absolute;top:-6px;right:-6px}.data tfoot th,.data tfoot td{border-top:2px solid var(--line);font-weight:650}@media print{.claim-print{color:#000;font:9px/1.3 Arial,sans-serif;position:relative}.claim-print h1{text-align:center;margin:0;font-size:12px;font-weight:400}.claim-print h2{text-align:center;margin:0;font-size:11px}.claim-print .claim-ticks{text-align:center;margin:2px 0 8px}.claim-print table{border-collapse:collapse;width:100%;margin-bottom:8px}.claim-print .claim-head th{text-align:right;white-space:nowrap;width:1%;padding:2px 4px;font-weight:700}.claim-print .claim-head td{border-bottom:1px solid #000;padding:2px 4px}.claim-print .claim-grid th,.claim-print .claim-grid td{text-align:center;vertical-align:top;border:1px solid #000;padding:3px 4px}.claim-print .claim-grid .left{text-align:left}.claim-print .claim-grid .right{text-align:right}.claim-print .claim-sign td{vertical-align:top;width:33%;padding:6px 8px}.claim-print .claim-foot{margin-top:6px;font-size:7px}}.signin .btn.provider{border:2px solid var(--line);width:100%;min-height:48px;color:var(--ink);background:var(--surface);border-radius:999px;gap:12px;font-size:16px;font-weight:700}.signin .btn.provider:hover{background:var(--brand-soft)}.filelight{align-items:flex-start;gap:10px;line-height:1.45;display:flex}.filelight>.light{border-radius:50%;flex:none;width:14px;height:14px;margin-top:3px}.light.on{background:var(--light-on);box-shadow:0 0 0 3px var(--ok-bg)}.light.off{background:var(--light-off);box-shadow:0 0 0 3px var(--bad-bg)}.scrollbox{overscroll-behavior:contain;max-height:min(70vh,900px);overflow:auto}.scrollbox table.data thead th{z-index:1;background:var(--surface);box-shadow:inset 0 -1px 0 var(--line);position:sticky;top:0}table.data tr.flag td{background:var(--warn-bg)}.check{cursor:pointer;align-items:center;gap:6px;min-height:40px;font-size:14px;display:inline-flex}.check input{width:18px;height:18px}.linkish{color:var(--info);cursor:pointer;font:inherit;background:0 0;border:0;padding:0;text-decoration:underline}.filters .search .input{min-height:40px;font-size:15px}table.data.wide{min-width:1280px}table.data.wide-listing{min-width:900px}table.data td.wrapcell{white-space:normal;min-width:170px;max-width:280px}:root{--series-1:#2a78d6;--series-2:#eb6834;--proj:#86b6ef;--claim:#256abf;--heat-1:#cde2fb;--heat-2:#9ec5f4;--heat-3:#6da7ec;--heat-4:#256abf;--heat-5:#104281;--grid:#e8ebef;--axis:#b9c1cc}.kpis{grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:12px;display:grid}.kpis .stat b{font-variant-numeric:normal}.legend{color:var(--muted);flex-wrap:wrap;gap:6px 16px;margin:0;padding:0;font-size:13px;list-style:none;display:flex}.legend li{align-items:center;gap:6px;display:inline-flex}.legend .sw{border-radius:3px;flex:none;width:12px;height:12px;display:inline-block}.segbar{gap:2px;height:28px;display:flex}.segbar>span{white-space:nowrap;border-radius:4px;align-items:center;min-width:0;padding:0 8px;font-size:13px;font-weight:600;display:flex}.rankbars{gap:8px;margin:0;padding:0;list-style:none;display:grid}.rankbars li{grid-template-columns:minmax(0,15em) minmax(0,1fr);align-items:center;gap:2px 12px;font-size:14px;display:grid}.rankbars .lab{overflow-wrap:anywhere}.rankbars .track{align-items:center;gap:8px;min-width:0;display:flex}.rankbars .bar{background:var(--series-1);border-radius:0 4px 4px 0;flex:none;height:12px}.rankbars .val{font-variant-numeric:tabular-nums;white-space:nowrap;font-size:13px}@media (width<=560px){.rankbars li{grid-template-columns:1fr}}.chart{position:relative}.chart svg{display:block;overflow:visible}.chart text.axis{fill:var(--muted);font-variant-numeric:tabular-nums;font-size:12px}.chart g.col{cursor:default;outline:none}.chart g.col:hover path,.chart g.col:focus-visible path{filter:brightness(1.12)}.chart g.col:focus-visible rect.hit{stroke:var(--accent);stroke-width:2px}.chart .tip{pointer-events:none;background:var(--surface);border:1px solid var(--line);color:var(--muted);white-space:nowrap;z-index:2;border-radius:6px;padding:6px 8px;font-size:13px;position:absolute;transform:translate(-50%,calc(-100% - 8px));box-shadow:0 2px 8px #0000001f}.chart .tip b{color:var(--ink);font-size:15px;display:block}.chart .tip .key{vertical-align:middle;width:12px;height:2px;margin-right:6px;display:inline-block}table.data tfoot.totals th,table.data tfoot.totals td{border-top:2px solid var(--line);border-bottom:0;font-weight:650}.scrollbox table.data tfoot.totals th,.scrollbox table.data tfoot.totals td{background:var(--surface);position:sticky;bottom:0}.scrollbox table.data tfoot.totals tr:not(:last-child) th,.scrollbox table.data tfoot.totals tr:not(:last-child) td{position:static}table.heat td.cell{text-align:center;font-variant-numeric:tabular-nums;border:2px solid var(--surface);border-radius:4px;min-width:44px;padding:6px 4px;font-size:13px}table.heat th{white-space:nowrap}.heat0{background:#f4f6f9}.heat1{background:var(--heat-1);color:var(--ink)}.heat2{background:var(--heat-2);color:var(--ink)}.heat3{background:var(--heat-3);color:var(--ink)}.heat4{background:var(--heat-4);color:#fff}.heat5{background:var(--heat-5);color:#fff}@media (forced-colors:active){.rankbars .bar,.segbar>span,.legend .sw{forced-color-adjust:none}}.plan table.data tbody th{color:var(--ink);vertical-align:top;padding:9px 10px;font-size:14px;font-weight:600}.plan table.data tr:last-child th{border-bottom:0}.plan table.data tfoot.totals th{color:var(--ink);font-size:14px}table.data td.nowrap{white-space:nowrap}
