@font-face{font-family:Archivo Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./archivo-vietnamese-wght-normal-XAtsl5Q_.woff2) format("woff2-variations");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Archivo Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./archivo-latin-ext-wght-normal-C4zznr8T.woff2) format("woff2-variations");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Archivo Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./archivo-latin-wght-normal-E0tuGl4L.woff2) format("woff2-variations");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}:root{--paper: #faf9f6;--panel: #ffffff;--ink: #1c1d22;--muted: #6b6c74;--line: #e4e2dc;--line-strong: #cfccc4;--rood: #c8102e;--rood-ink: #ffffff;--rood-soft: #fbe9ec;--ok: #2e7d4f;--ok-soft: #e7f3ec;--warn: #a05e03;--warn-soft: #fdf1dc;--radius: 10px;--mono: ui-monospace, "SF Mono", "Cascadia Mono", Menlo, Consolas, monospace;--scale: 1}[data-theme=dark]{--paper: #16171b;--panel: #1e2026;--ink: #ecebe7;--muted: #9a9aa2;--line: #2c2e36;--line-strong: #3d4049;--rood: #ff6057;--rood-ink: #1a0505;--rood-soft: #3a1d1f;--ok: #5cc98d;--ok-soft: #1d2f26;--warn: #e8b25c;--warn-soft: #33290f}*{box-sizing:border-box}html{font-size:calc(15px * var(--scale))}body{margin:0;font-family:Archivo Variable,system-ui,sans-serif;background:var(--paper);color:var(--ink);line-height:1.45}h1,h2,h3{line-height:1.15;margin:0;letter-spacing:-.015em}h1{font-size:1.5rem;font-weight:650}h2{font-size:1.05rem;font-weight:650}a{color:inherit}button{font:inherit}:focus-visible{outline:2px solid var(--rood);outline-offset:2px}@media (prefers-reduced-motion: reduce){*{transition:none!important}}.shell{display:grid;grid-template-columns:218px 1fr;min-height:100vh}.sidebar{border-right:1px solid var(--line);background:var(--panel);padding:0 0 1rem;position:sticky;top:0;height:100vh;overflow-y:auto}.brand{display:flex;align-items:baseline;gap:.5rem;padding:1.05rem 1rem .9rem;border-left:4px solid var(--rood);border-bottom:1px solid var(--line);margin-bottom:.6rem}.brand b{font-size:1.06rem;font-weight:750;letter-spacing:-.02em}.brand span{color:var(--rood);font-family:var(--mono);font-size:.72rem;font-weight:600}.navgroup{padding:.55rem 1rem .2rem;font-size:.66rem;text-transform:uppercase;letter-spacing:.09em;color:var(--muted)}.nav a{display:block;padding:.42rem 1rem .42rem calc(1rem - 4px);border-left:4px solid transparent;text-decoration:none;font-size:.88rem;color:var(--ink)}.nav a:hover{background:var(--paper)}.nav a.active{border-left-color:var(--rood);font-weight:600;background:var(--paper)}.main{padding:1.1rem 1.4rem 3rem;min-width:0}.topbar{display:flex;align-items:center;justify-content:space-between;gap:1rem;margin-bottom:1.1rem}.topbar .who{font-size:.82rem;color:var(--muted)}.card{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);padding:1rem 1.1rem}.cards{display:grid;gap:.8rem}.grid2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid4{grid-template-columns:repeat(4,minmax(0,1fr))}@media (max-width: 1100px){.grid4,.grid3{grid-template-columns:repeat(2,1fr)}}@media (max-width: 760px){.shell{grid-template-columns:1fr}.sidebar{position:static;height:auto}.grid2,.grid3,.grid4{grid-template-columns:1fr}}.kpi .lbl{font-size:.72rem;text-transform:uppercase;letter-spacing:.07em;color:var(--muted)}.kpi .val{font-size:1.6rem;font-weight:700;font-family:var(--mono);font-variant-numeric:tabular-nums;margin-top:.15rem}.kpi .sub{font-size:.78rem;color:var(--muted);margin-top:.1rem}.btn{border:1px solid var(--line-strong);background:var(--panel);color:var(--ink);border-radius:8px;padding:.42rem .8rem;cursor:pointer;font-size:.85rem}.btn:hover{border-color:var(--ink)}.btn.primary{background:var(--rood);border-color:var(--rood);color:var(--rood-ink);font-weight:600}.btn.primary:hover{filter:brightness(.94)}.btn.small{padding:.2rem .55rem;font-size:.78rem}.btn.danger{color:var(--rood);border-color:var(--rood);background:transparent}.btn:disabled{opacity:.5;cursor:default}.chip{font-family:var(--mono);font-variant-numeric:tabular-nums;font-size:.8rem;padding:.1rem .45rem;border-radius:6px;background:var(--paper);border:1px solid var(--line);white-space:nowrap}.chip.money-neg{background:var(--rood-soft);color:var(--rood);border-color:transparent;font-weight:600}.chip.money-pos{background:var(--ok-soft);color:var(--ok);border-color:transparent;font-weight:600}.badge{font-size:.72rem;padding:.12rem .5rem;border-radius:99px;border:1px solid var(--line-strong);white-space:nowrap}.badge.ok{background:var(--ok-soft);color:var(--ok);border-color:transparent}.badge.warn{background:var(--warn-soft);color:var(--warn);border-color:transparent}.badge.bad{background:var(--rood-soft);color:var(--rood);border-color:transparent}table.tbl{width:100%;border-collapse:collapse;font-size:.86rem}.tbl th{text-align:left;font-size:.68rem;text-transform:uppercase;letter-spacing:.07em;color:var(--muted);font-weight:600;padding:.45rem .6rem;border-bottom:1px solid var(--line-strong);white-space:nowrap;cursor:pointer;-webkit-user-select:none;user-select:none}.tbl th.nosort{cursor:default}.tbl td{padding:.5rem .6rem;border-bottom:1px solid var(--line);vertical-align:middle}.tbl tr.rowlink{cursor:pointer}.tbl tr.rowlink:hover td{background:var(--paper)}.tbl .num{text-align:right;font-family:var(--mono);font-variant-numeric:tabular-nums}.toolbar{display:flex;flex-wrap:wrap;gap:.5rem;align-items:center;margin-bottom:.8rem}.toolbar .grow{flex:1}input,select,textarea{font:inherit;color:var(--ink);background:var(--panel);border:1px solid var(--line-strong);border-radius:8px;padding:.42rem .6rem}input::placeholder{color:var(--muted)}.field{display:flex;flex-direction:column;gap:.25rem;margin-bottom:.7rem}.field label{font-size:.74rem;text-transform:uppercase;letter-spacing:.06em;color:var(--muted)}.field .err{color:var(--rood);font-size:.76rem}.pager{display:flex;gap:.5rem;align-items:center;justify-content:flex-end;margin-top:.7rem;font-size:.82rem;color:var(--muted)}.modal-back{position:fixed;top:0;right:0;bottom:0;left:0;background:#0a0a0c73;display:grid;place-items:center;z-index:50;padding:1rem}.modal{background:var(--panel);border:1px solid var(--line-strong);border-radius:12px;padding:1.1rem 1.2rem;width:min(560px,100%);max-height:92vh;overflow-y:auto}.modal h2{margin-bottom:.8rem}.modal .actions{display:flex;justify-content:flex-end;gap:.5rem;margin-top:1rem}.tabs{display:flex;gap:.1rem;border-bottom:1px solid var(--line-strong);margin-bottom:1rem;flex-wrap:wrap}.tabs button{border:0;background:none;padding:.5rem .8rem;cursor:pointer;color:var(--muted);border-bottom:3px solid transparent;margin-bottom:-1px;font-size:.88rem}.tabs button.active{color:var(--ink);font-weight:600;border-bottom-color:var(--rood)}.occ{height:7px;background:var(--paper);border:1px solid var(--line);border-radius:99px;overflow:hidden;min-width:90px}.occ i{display:block;height:100%;background:var(--ok)}.occ.full i{background:var(--rood)}.alert{border-left:4px solid var(--rood);background:var(--rood-soft);color:var(--ink);padding:.55rem .8rem;border-radius:0 8px 8px 0;font-size:.85rem;margin-bottom:.5rem}.alert.warn{border-left-color:var(--warn);background:var(--warn-soft)}.note{border:1px solid var(--line);border-radius:8px;padding:.55rem .75rem;margin-bottom:.55rem;font-size:.86rem}.note .meta{font-size:.72rem;color:var(--muted);margin-bottom:.15rem;font-family:var(--mono)}.note.system{background:var(--paper);border-style:dashed}.logline{font-family:var(--mono);font-size:.76rem;padding:.25rem 0;border-bottom:1px dashed var(--line);display:flex;gap:.6rem}.logline .t{color:var(--muted);flex-shrink:0}.logline.error{color:var(--rood)}.logline.warning{color:var(--warn)}.toast-wrap{position:fixed;bottom:1rem;right:1rem;display:flex;flex-direction:column;gap:.5rem;z-index:99}.toast{background:var(--ink);color:var(--paper);padding:.6rem 1rem;border-radius:8px;font-size:.85rem;max-width:380px}.toast.err{background:var(--rood);color:var(--rood-ink)}.week{display:grid;grid-template-columns:repeat(7,minmax(120px,1fr));gap:.5rem;overflow-x:auto}.day h3{font-size:.74rem;text-transform:uppercase;letter-spacing:.07em;color:var(--muted);margin-bottom:.4rem}.lesson{border:1px solid var(--line-strong);border-left:4px solid var(--rood);border-radius:6px;padding:.35rem .5rem;margin-bottom:.4rem;font-size:.76rem;cursor:pointer;background:var(--panel)}.lesson:hover{border-color:var(--ink)}.lesson.cancelled{opacity:.45;border-left-color:var(--muted);text-decoration:line-through}.lesson.substituted{border-left-color:var(--warn)}.lesson.done{border-left-color:var(--ok)}.lesson .time{font-family:var(--mono);font-weight:600}.lesson .sub{color:var(--muted)}.login-wrap{min-height:100vh;display:grid;place-items:center;background:var(--paper)}.login{width:min(380px,92vw)}.login .brandmark{border-left:6px solid var(--rood);padding-left:.9rem;margin-bottom:1.4rem}.login .brandmark h1{font-size:1.7rem;font-weight:750}.login .brandmark p{color:var(--muted);margin:.2rem 0 0;font-family:var(--mono);font-size:.78rem}.empty{color:var(--muted);font-size:.86rem;padding:1rem 0;text-align:center}.mt{margin-top:1rem}.mb{margin-bottom:1rem}.row{display:flex;gap:.5rem;align-items:center;flex-wrap:wrap}.spread{display:flex;justify-content:space-between;align-items:center;gap:1rem;flex-wrap:wrap}.mono{font-family:var(--mono);font-variant-numeric:tabular-nums}.muted{color:var(--muted)}.small{font-size:.8rem}
