:root{--bg:#f7f5ef;--surface:#fff;--surface-2:#f1eee6;--text:#14201e;--muted:#5c6b67;--faint:#8b9793;--border:#e2ddd1;--border-strong:#cfc8b8;--accent:#0f5c4a;--accent-ink:#fff;--good:#186541;--warn:#8a5a12;--bad:#9b2c2c;--paid-bg:#d6f0e1;--paid-fg:#186541;--late-bg:#fbebd2;--late-fg:#8a5a12;--absent-bg:#f7dada;--absent-fg:#9b2c2c;--r:10px;--shadow:0 1px 2px rgba(20,32,30,.06),0 8px 24px rgba(20,32,30,.05)}@media (prefers-color-scheme:dark){:root:not([data-theme=light]){--bg:#0e1614;--surface:#151f1d;--surface-2:#1b2725;--text:#eaf0ee;--muted:#9daca8;--faint:#7a8884;--border:#26332f;--border-strong:#37453f;--accent:#4fb795;--accent-ink:#08201a;--paid-bg:#0f3527;--paid-fg:#7fd6a6;--late-bg:#3a2b10;--late-fg:#e5b86a;--absent-bg:#3b1a1a;--absent-fg:#f0a0a0}}*{box-sizing:border-box}body{margin:0;background:var(--bg);color:var(--text);font:15px/1.5 Public Sans,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif}h1,h2,h3{font-family:Newsreader,Georgia,serif;letter-spacing:-.2px;margin:0}a{color:inherit}.shell{display:grid;grid-template-columns:230px 1fr;min-height:100vh}@media (max-width:760px){.shell{grid-template-columns:1fr}.rail{position:static!important}}.rail{background:var(--accent);color:var(--accent-ink);padding:20px 16px;display:flex;flex-direction:column;gap:22px;position:-webkit-sticky;position:sticky;top:0;height:100vh}.rail .mark{font-family:Newsreader,Georgia,serif;font-size:21px;line-height:1.15}.rail .sub{font-size:10.5px;text-transform:uppercase;letter-spacing:.1em;opacity:.72;margin-top:3px}.rail nav{display:flex;flex-direction:column;gap:2px}.rail nav a{display:block;padding:9px 11px;border-radius:7px;text-decoration:none;font-size:13.5px;font-weight:500;color:inherit;opacity:.85}.rail nav a:hover{background:hsla(0,0%,100%,.1);opacity:1}.rail nav a[aria-current=page]{background:hsla(0,0%,100%,.16);opacity:1;font-weight:600}.rail .foot{margin-top:auto;font-size:11.5px;opacity:.75;line-height:1.45}main{padding:26px 30px 60px;max-width:1180px}.topbar{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;margin-bottom:22px}.topbar h1{font-size:29px}.lede{color:var(--muted);font-size:13.5px;margin-top:4px;max-width:62ch}.card{border:1px solid var(--border);border-radius:var(--r);box-shadow:var(--shadow)}.btn,.card{background:var(--surface)}.btn{border:1px solid var(--border-strong);color:var(--text);padding:8px 14px;border-radius:7px;cursor:pointer;font:inherit;font-size:13px;font-weight:500}.btn.primary,.btn:hover{border-color:var(--accent)}.btn.primary{background:var(--accent);color:var(--accent-ink);font-weight:600}.btn.sm{padding:5px 10px;font-size:12.5px}.field{display:block;margin-bottom:14px}.field label{display:block;font-size:12px;font-weight:600;color:var(--muted);margin-bottom:5px}.field input,.field select{width:100%;padding:9px 11px;border:1px solid var(--border-strong);border-radius:7px;background:var(--surface);color:var(--text);font:inherit;font-size:14px}.field input:focus,.field select:focus{outline:2px solid var(--accent);outline-offset:-1px}.note{font-size:12.5px;color:var(--muted)}.bad{color:var(--bad)}.banner{padding:11px 14px;border-radius:var(--r);font-size:13px;margin-bottom:16px;background:var(--absent-bg);color:var(--absent-fg);border:1px solid}.calbar{display:flex;align-items:center;gap:8px;padding:13px 15px;border-bottom:1px solid var(--border);flex-wrap:wrap}.calbar h2{font-size:20px;margin-right:auto}.calgrid{display:grid;grid-template-columns:repeat(7,minmax(0,1fr))}.dow{padding:8px 10px;font-size:10.5px;text-transform:uppercase;letter-spacing:.07em;color:var(--muted);font-weight:600}.cell,.dow{border-bottom:1px solid var(--border)}.cell{min-height:104px;border-right:1px solid var(--border);padding:6px 7px;display:flex;flex-direction:column;gap:4px;min-width:0}.cell:nth-child(7n){border-right:0}.cell.out{background:var(--surface-2)}.cell .dn{font-size:12px;font-weight:600;color:var(--muted)}.cell.today .dn{background:var(--accent);color:var(--accent-ink);border-radius:999px;padding:1px 7px;align-self:flex-start}.sess{display:block;border:1px solid var(--border-strong);background:var(--surface);border-radius:6px;padding:4px 6px;font-size:11.5px;text-decoration:none;line-height:1.3}.sess:hover{border-color:var(--accent)}.sess b{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sess span{color:var(--muted);font-size:10.5px}.sess.done{border-color:var(--paid-fg);background:var(--paid-bg)}.sess.done b,.sess.done span{color:var(--paid-fg)}.rows{padding:4px 18px 18px}.row{padding:12px 0;border-bottom:1px solid var(--border)}.row:last-child{border-bottom:0}.chip{font-size:10.5px;font-weight:600;padding:2px 8px;border-radius:999px;white-space:nowrap}.chip.y{background:var(--paid-bg);color:var(--paid-fg)}.chip.n{background:var(--absent-bg);color:var(--absent-fg)}.chip.u{background:var(--surface-2)}.chip.u,.tally{color:var(--muted)}.tally{display:flex;gap:16px;flex-wrap:wrap;font-size:12.5px;padding:14px 18px 0}.tally b{color:var(--text)}.reg{--namecol:minmax(190px,1.3fr);--markcol:minmax(300px,340px);--notecol:minmax(150px,1fr)}.reghead{padding:10px 18px;border-bottom:1px solid var(--border-strong);font-size:10.5px;text-transform:uppercase;letter-spacing:.07em;color:var(--muted);font-weight:600}.reghead,.regrow{display:grid;grid-template-columns:var(--namecol) var(--markcol) var(--notecol);grid-gap:16px;gap:16px}.regrow{align-items:center;padding:9px 18px 9px 14px;border-bottom:1px solid var(--border);border-left:4px solid transparent}.regrow:last-child{border-bottom:0}.regrow:hover{background:var(--surface-2)}.regrow[data-marked=no]{border-left-color:var(--border-strong)}.regwho{min-width:0}.regname{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}.regname .nm{font-weight:600;font-size:14.5px}.regname .yrs{color:var(--muted);font-size:12px;font-feature-settings:"tnum";font-variant-numeric:tabular-nums}.regcollect{margin:3px 0 0;padding:0;border:0;background:none;text-align:left;font:inherit;font-size:11.5px;color:var(--muted);cursor:pointer;display:block;max-width:100%}.regcollect:hover{color:var(--text)}.regcollect .one{display:inline-block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:bottom}.regcollect .more{color:var(--accent);font-weight:600;margin-left:4px;white-space:nowrap}.regcollect[aria-expanded=true] .one{white-space:normal;overflow:visible}.regmarks{display:flex;border:1px solid var(--border-strong);border-radius:7px;overflow:hidden}.regmarks button{flex:1 1;border:0;border-right:1px solid var(--border);background:var(--surface);padding:10px 4px;font:inherit;font-size:12.5px;font-weight:500;color:var(--muted);cursor:pointer;white-space:nowrap}.regmarks button:last-child{border-right:0}.regmarks button:hover{background:var(--surface-2);color:var(--text)}.regmarks button[aria-pressed=true]{background:var(--accent);color:var(--accent-ink);font-weight:600}.regmarks button[aria-pressed=true][data-m=late]{background:var(--late-fg);color:#fff}.regmarks button[aria-pressed=true][data-m=excused]{background:var(--muted);color:var(--surface)}.regmarks button[aria-pressed=true][data-m=absent]{background:var(--bad);color:#fff}.regnote{width:100%;padding:8px 10px;font:inherit;font-size:13px;border:1px solid var(--border);border-radius:7px;background:var(--surface);color:var(--text)}.regnote:hover{border-color:var(--border-strong)}.regnote:focus{outline:2px solid var(--accent);outline-offset:-1px;border-color:var(--accent)}.regnote[data-filled=yes]{background:var(--surface-2);border-color:var(--border-strong)}@media (max-width:1024px){.reghead{display:none}.regrow{grid-template-columns:1fr;gap:9px;padding:13px 14px 14px;align-items:stretch}.regmarks button{padding:13px 4px;font-size:13px}}table{width:100%;border-collapse:collapse}td,th{text-align:left;padding:10px 14px;border-bottom:1px solid var(--border);font-size:13.5px}th{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--muted);font-weight:600}tbody tr:last-child td{border-bottom:0}.filters{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:14px;align-items:center}.filters .search{flex:1 1 280px}.filters input,.filters select{padding:9px 11px;border:1px solid var(--border-strong);border-radius:7px;background:var(--surface);color:var(--text);font:inherit;font-size:14px}.tabs{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:14px}.tab{border:1px solid var(--border-strong);background:var(--surface);color:var(--muted);padding:6px 13px;border-radius:999px;font-size:12.5px;font-weight:600;text-decoration:none;cursor:pointer}.tab:hover{color:var(--text);border-color:var(--accent)}.tab[aria-pressed=true]{background:var(--accent);border-color:var(--accent);color:var(--accent-ink)}.tab .b{font-feature-settings:"tnum";font-variant-numeric:tabular-nums;opacity:.85;margin-left:5px}.mono{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px}.empty,.mono{color:var(--muted)}.empty{padding:26px;text-align:center;font-size:13.5px}.pill{font-size:11px;font-weight:600;padding:3px 9px;border-radius:999px;white-space:nowrap;background:var(--surface-2);color:var(--muted)}.pill.paid{background:var(--paid-bg);color:var(--paid-fg)}.pill.waiting{background:var(--late-bg);color:var(--late-fg)}.pill.withdrawn{background:var(--absent-bg);color:var(--absent-fg)}.pill.followup{background:var(--late-bg);color:var(--late-fg)}.grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));grid-gap:0 14px;gap:0 14px}.grid .span{grid-column:1/-1}.addgrid{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));grid-gap:0 14px;gap:0 14px}.addgrid .span{grid-column:1/-1}.field textarea{width:100%;padding:9px 11px;border:1px solid var(--border-strong);border-radius:7px;background:var(--surface);color:var(--text);font:inherit;font-size:14px;resize:vertical}.field .hint{display:block;font-size:11.5px;color:var(--muted);font-style:normal;margin-top:4px}h2.sect,h3.sect{font-size:12px;text-transform:uppercase;letter-spacing:.08em;color:var(--muted);font-family:Public Sans,sans-serif;font-weight:600;margin-bottom:14px}.savebar{position:-webkit-sticky;position:sticky;bottom:0;background:var(--bg);padding:14px 0 4px;display:flex;align-items:center;gap:12px;border-top:1px solid var(--border)}.twocol{display:grid;grid-template-columns:minmax(0,1fr) 300px;grid-gap:20px;gap:20px;align-items:start}@media (max-width:900px){.twocol{grid-template-columns:1fr}}.side .card{position:-webkit-sticky;position:sticky;top:20px}.kv{display:grid;grid-template-columns:1fr auto;grid-gap:5px 12px;gap:5px 12px;font-size:13px}.kv span{color:var(--muted)}.kv b{font-feature-settings:"tnum";font-variant-numeric:tabular-nums}ul.plain{list-style:none;margin:0;padding:0;font-size:13px}ul.plain li{padding:5px 0;border-bottom:1px solid var(--border)}ul.plain li:last-child{border-bottom:0}.clsgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));grid-gap:14px;gap:14px}.clscard{display:block;text-decoration:none;background:var(--surface);border:1px solid var(--border);border-radius:var(--r);box-shadow:var(--shadow);overflow:hidden}.clscard:hover{border-color:var(--accent)}.clscard .top{padding:15px 16px 13px;border-bottom:1px solid var(--border)}.clscard h3{font-family:Newsreader,Georgia,serif;font-size:20px}.clscard .teacher{font-size:13px;margin-top:3px;font-weight:500}.clscard .teacher.none{color:var(--faint);font-weight:400;font-style:italic}.clscard .where{font-size:12px;color:var(--muted);margin-top:1px}.clscard .rule{display:inline-block;margin-top:8px;font-size:11px;padding:3px 9px;border-radius:999px;background:var(--surface-2);color:var(--muted);font-weight:600}.clscard .fill{padding:11px 16px;display:flex;align-items:center;justify-content:space-between;gap:10px}.clscard .fill .n{font-size:19px;font-weight:600;font-feature-settings:"tnum";font-variant-numeric:tabular-nums}.clscard .fill .cap{font-size:11.5px;color:var(--muted)}.clscard .fill .cap.over{color:var(--bad);font-weight:600}.clscard .gauge{height:4px;background:var(--surface-2)}.clscard .gauge i{display:block;height:100%;background:var(--accent)}.clscard .gauge i.over{background:var(--bad)}.clscard .clsnames{padding:11px 16px 14px;font-size:12px;color:var(--muted);line-height:1.5}ul.roster{list-style:none;margin:0;padding:0}ul.roster li{display:flex;align-items:center;gap:10px;padding:9px 0;border-bottom:1px solid var(--border);font-size:13.5px}ul.roster li:last-child{border-bottom:0}ul.roster .nm{flex:1 1 auto;font-weight:600}ul.roster .mt{color:var(--muted);font-size:12px}.lock{margin-left:7px;font-size:10.5px;font-weight:600;padding:2px 7px;border-radius:999px;background:var(--surface-2);color:var(--muted)}.daypick{display:flex;gap:5px;flex-wrap:wrap}.daypick button{border:1px solid var(--border-strong);background:var(--surface);color:var(--muted);border-radius:7px;padding:8px 12px;cursor:pointer;font:inherit;font-size:12.5px;font-weight:600}.daypick button[aria-pressed=true]{background:var(--accent);border-color:var(--accent);color:var(--accent-ink)}.btn.danger{border-color:var(--bad);color:var(--bad)}.btn.danger:hover{background:var(--bad);color:#fff}.stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(230px,1fr));grid-gap:12px;gap:12px}.money{background:var(--surface);border:1px solid var(--border);border-left:3px solid var(--accent);border-radius:var(--r);padding:14px 16px;box-shadow:var(--shadow)}.money .k{font-size:10.5px;text-transform:uppercase;letter-spacing:.07em;color:var(--muted);font-weight:600}.money .v{font-family:Newsreader,Georgia,serif;font-size:27px;margin-top:4px;letter-spacing:-.5px}.money .sub{font-size:11.5px;color:var(--muted);margin-top:2px}td.num,th.num{text-align:right;font-feature-settings:"tnum";font-variant-numeric:tabular-nums}.tab.bad[aria-pressed=false]{border-color:var(--bad);color:var(--bad)}.pill.pending{background:var(--late-bg);color:var(--late-fg)}.pill.failed{background:var(--absent-bg);color:var(--absent-fg)}.pill.cancelled{background:var(--surface-2);color:var(--muted)}.sugg{display:flex;flex-direction:column;gap:6px}.sugg button{text-align:left;border:1px solid var(--border-strong);background:var(--surface);border-radius:7px;padding:9px 11px;cursor:pointer;font:inherit;font-size:13.5px;color:var(--text)}.sugg button:hover{border-color:var(--accent)}.sugg button .why{display:block;font-size:11.5px;color:var(--muted);margin-top:2px}.undobar{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:16px;padding:12px 14px;border-radius:var(--r);font-size:13px;background:var(--paid-bg);color:var(--paid-fg);border:1px solid}.undobar button{flex:none}.field input[type=file]{padding:7px}.errline{display:block;font-size:12px;color:var(--bad);font-style:normal;margin-top:4px;font-weight:600}.check{display:flex;gap:10px;align-items:flex-start;margin-bottom:12px;font-size:13.5px;cursor:pointer}.check input{margin-top:3px;width:16px;height:16px;flex:none;accent-color:var(--accent)}