:root{--navy:#0f2557;--royal:#1f56d6;--sky:#e8f0ff;--ink:#14203a;--mut:#56617a;--line:#e3e7f0;--mist:#f4f6fb;--card:#fff;--ok:#15803d;--okb:#16a34a1c;--bad:#b42318;--badb:#dc26261a;--warn:#a35a00;--warnb:#f59e0b26;--late:#6d28d9;--lateb:#7c3aed1a}
*{box-sizing:border-box}
[hidden]{display:none!important}
html,body{margin:0;background:var(--mist);color:var(--ink);font:16px/1.5 "Atkinson Hyperlegible",system-ui,-apple-system,"Segoe UI",Roboto,sans-serif}
h1,h2,h3{font-family:"Bricolage Grotesque",system-ui,sans-serif;line-height:1.2;margin:0}
button,input,select,textarea{font:inherit;color:inherit}
:focus-visible{outline:3px solid #6b9bff;outline-offset:2px}
.boot{min-height:100vh;display:grid;place-content:center;justify-items:center;color:var(--mut)}
/* login */
.auth{min-height:100vh;display:grid;place-items:center;padding:20px 16px;background:radial-gradient(1200px 500px at 50% -10%,#1f56d633,transparent),linear-gradient(180deg,#0f2557,#13367d 55%,#f4f6fb 55.1%)}
.auth-card{width:100%;max-width:420px;background:var(--card);border-radius:22px;padding:26px 22px;box-shadow:0 24px 60px #0f255740}
.brand{display:flex;gap:12px;align-items:center;margin-bottom:18px}.brand img{width:54px;height:auto}.brand b{display:block;font:800 16px/1.2 "Bricolage Grotesque",system-ui;color:var(--navy)}.brand span{font-size:13px;color:var(--mut)}
.auth h1{font-size:24px;margin:0 0 4px}.auth p.sub{margin:0 0 16px}
.fl{display:flex;flex-direction:column;gap:5px;font-weight:700;font-size:14px;margin-bottom:12px}
.fl input,.fl select,.fl textarea{font-weight:400;font-size:16px;padding:11px 12px;border:1.5px solid var(--line);border-radius:12px;background:#fff;width:100%}
.fl input:focus,.fl select:focus,textarea:focus{border-color:var(--royal);outline:none}
.pw{position:relative}.pw input{padding-right:70px}.pw button{position:absolute;right:6px;top:50%;transform:translateY(-50%);border:0;background:none;color:var(--royal);font-weight:700;padding:6px 8px;cursor:pointer}
.btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;border:0;border-radius:12px;padding:11px 16px;font-weight:700;background:var(--royal);color:#fff;cursor:pointer;min-height:44px}
.btn.wide{width:100%}.btn.ghost{background:#fff;color:var(--ink);border:1.5px solid var(--line)}.btn.sm{min-height:36px;padding:7px 12px;font-size:14px}.btn:disabled{opacity:.55;cursor:default}
.err{color:var(--bad);font-weight:700;min-height:1.4em;margin:6px 0 0}
.note{font-size:13.5px;color:var(--mut);margin:14px 0 0}
.back{display:inline-block;margin-top:14px;color:#fff;text-decoration:none;font-weight:700}
.sub{color:var(--mut)}
/* app */
.top{position:sticky;top:0;z-index:10;background:var(--navy);color:#fff;padding:10px 16px calc(10px);display:flex;align-items:center;gap:10px;box-shadow:0 4px 16px #0f255733}
.top img{width:36px;height:auto}.top .who{flex:1;min-width:0}.top b{display:block;font-size:15px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.top .who span{display:block;font-size:12.5px;color:#c7d5ff;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.top .cls{background:#ffffff22;border-radius:999px;padding:3px 10px;font-weight:800;font-size:14px;white-space:nowrap}
.top .out{background:#ffffff1f;color:#fff;border:0;border-radius:10px;padding:8px 10px;font-weight:700;cursor:pointer}
.tabs{position:sticky;top:56px;z-index:9;display:grid;grid-template-columns:repeat(3,1fr);gap:6px;padding:10px 16px;background:var(--mist);border-bottom:1px solid var(--line)}
.tabs button{border:1.5px solid var(--line);background:#fff;border-radius:12px;padding:9px 4px;font-weight:700;font-size:14px;cursor:pointer;display:flex;flex-direction:column;align-items:center;gap:2px}
.tabs button.on{background:var(--royal);border-color:var(--royal);color:#fff}.tabs i{font-style:normal;font-size:20px}
main{max-width:760px;margin:0 auto;padding:14px 16px 110px}
.card{background:var(--card);border:1px solid var(--line);border-radius:16px;padding:14px;margin-bottom:12px;box-shadow:0 2px 10px #0f255710}
.bar{display:flex;flex-wrap:wrap;gap:10px;align-items:flex-end}.bar .fl{margin:0;flex:1;min-width:140px}
.sum{display:flex;gap:8px;flex-wrap:wrap;margin:10px 0 0}.sum span{background:var(--mist);border-radius:999px;padding:3px 10px;font-size:13px;font-weight:700}
.stu{display:flex;flex-direction:column;gap:8px;padding:12px 0;border-top:1px solid var(--line)}.stu:first-child{border-top:0}
.stu .nm{display:flex;align-items:center;gap:10px}.stu .nm img,.av{width:38px;height:38px;border-radius:50%;object-fit:cover;flex:none}.av{display:grid;place-items:center;background:var(--sky);color:var(--royal);font-weight:800}
.stu .nm b{display:block}.stu .nm small{color:var(--mut)}
.seg{display:grid;grid-auto-flow:column;grid-auto-columns:1fr;gap:5px}
.seg button{border:1.5px solid var(--line);background:#fff;border-radius:10px;padding:9px 4px;font-weight:700;font-size:13.5px;cursor:pointer;min-height:42px}
.seg button.on.P,.seg button.on.E,.seg button.on.C{background:var(--ok);border-color:var(--ok);color:#fff}
.seg button.on.A,.seg button.on.N{background:var(--bad);border-color:var(--bad);color:#fff}
.seg button.on.L{background:var(--late);border-color:var(--late);color:#fff}
.seg button.on.G{background:var(--royal);border-color:var(--royal);color:#fff}
.seg button.on.S,.seg button.on.I{background:#d97706;border-color:#d97706;color:#fff}
.seg4{grid-auto-columns:unset;grid-template-columns:repeat(4,1fr)}
.meta{font-size:13px;color:var(--mut)}.meta b{color:var(--ink)}
.stu input.rm{padding:9px 11px;border:1.5px solid var(--line);border-radius:10px;width:100%}
.stu details summary{cursor:pointer;color:var(--royal);font-weight:700;font-size:14px}.stu details .fl{margin:8px 0 0}
.stu.changed{background:linear-gradient(90deg,#1f56d60f,transparent)}
.time{display:flex;align-items:center;gap:8px;font-size:14px}.time input{padding:6px 8px;border:1.5px solid var(--line);border-radius:8px}
.save{position:fixed;left:0;right:0;bottom:0;z-index:11;padding:12px 16px calc(12px + env(safe-area-inset-bottom));background:#fffffff2;border-top:1px solid var(--line);display:flex;gap:10px;justify-content:center;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px)}
.save .btn{flex:1;max-width:420px}
.banner{border-radius:12px;padding:10px 12px;margin-bottom:12px;font-weight:700}.banner.info{background:var(--sky);color:var(--navy)}.banner.bad{background:var(--badb);color:var(--bad)}.banner.ok{background:var(--okb);color:var(--ok)}
.cam{position:relative;border-radius:14px;overflow:hidden;background:#000;aspect-ratio:1/1;max-height:60vh;margin:10px 0}.cam video{width:100%;height:100%;object-fit:cover}
.cam .fr{position:absolute;inset:18%;border:3px solid #ffffffd0;border-radius:16px;box-shadow:0 0 0 999px #0006}
.res{border-radius:12px;padding:10px 12px;font-weight:700}.res.ok{background:var(--okb);color:var(--ok)}.res.late{background:var(--lateb);color:var(--late)}.res.bad{background:var(--badb);color:var(--bad)}.res.dup{background:var(--warnb);color:var(--warn)}
#toast{position:fixed;left:50%;bottom:90px;transform:translateX(-50%) translateY(20px);opacity:0;transition:.25s;z-index:50;background:var(--navy);color:#fff;padding:11px 16px;border-radius:12px;font-weight:700;max-width:calc(100% - 32px);text-align:center;pointer-events:none}
#toast.show{opacity:1;transform:translateX(-50%)}#toast.err{background:var(--bad)}#toast.ok{background:var(--ok)}
@media (min-width:700px){.stu{display:grid;grid-template-columns:minmax(180px,1fr) minmax(260px,1.3fr);align-items:center;column-gap:16px}.stu .extra{grid-column:1/-1}}
@media (prefers-reduced-motion:reduce){*{transition:none!important;animation:none!important}}
/* diary */
.chip{display:inline-block;border-radius:999px;padding:2px 9px;font-size:12px;font-weight:700;white-space:nowrap;background:#64748b1a;color:#475569}
.st-d{background:var(--warnb);color:var(--warn)}.st-s{background:#2563eb1a;color:#1d4ed8}.st-r{background:var(--lateb);color:var(--late)}.st-i{background:#0891b21f;color:#0e7490}.st-sh{background:var(--okb);color:var(--ok)}.st-n{background:var(--badb);color:var(--bad)}
.pn{display:inline-grid;place-items:center;min-width:34px;height:28px;border-radius:8px;background:var(--navy);color:#fff;font-weight:800;font-size:13px;flex:none}
.slot{border:1.5px solid var(--line);border-radius:14px;margin:10px 0;overflow:hidden}.slot.open{border-color:var(--royal)}
.slothead{width:100%;display:flex;align-items:center;gap:10px;background:#fff;border:0;padding:12px;text-align:left;cursor:pointer}.slothead>span:nth-child(2){flex:1;min-width:0}.slothead small{display:block;color:var(--mut);font-size:12.5px}
.dform{padding:4px 12px 12px;border-top:1px solid var(--line)}.dform textarea,.cmbe textarea,.card textarea{font:inherit;font-size:15px;padding:10px 12px;border:1.5px solid var(--line);border-radius:12px;width:100%;resize:vertical}
.dform .fl{margin:10px 0 0}.dform .bar{margin-top:12px}
.tt div{display:flex;flex-wrap:wrap;align-items:center;gap:8px;padding:8px 0;border-top:1px solid var(--line)}.tt div:first-child{border-top:0}.tt small{flex-basis:100%;color:var(--mut);padding-left:42px}
.ckrow{display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:10px 0;border-top:1px solid var(--line)}.ckrow:first-child{border-top:0}.ckn{flex:1;min-width:140px}.ckn small{display:block;color:var(--mut);font-size:12.5px}
.cmbe{border:1px solid var(--line);border-radius:12px;padding:10px 12px;margin:10px 0}.cmbe h3{font-size:16px;margin:0 0 4px;display:flex;flex-wrap:wrap;gap:6px;align-items:center}.cmbe h3 small{color:var(--mut);font-weight:400;font-size:13px}.cmbe .fl{margin:8px 0 0}
.ack{display:flex;gap:8px;align-items:flex-start;background:var(--warnb);border-radius:10px;padding:9px 11px;margin:8px 0;font-size:14px}
.dprev{margin-top:14px}.dpaper{border:1px solid var(--line);border-radius:14px;padding:14px;background:#fff;max-width:520px}
.dhead{display:flex;gap:10px;align-items:center;border-bottom:3px solid var(--royal);padding-bottom:8px;margin-bottom:8px}.dhead img{width:46px;height:auto}.dhead div{display:flex;flex-direction:column}.dhead b{color:var(--navy)}.dhead span{font-size:13px;color:var(--mut)}
.dsub{padding:8px 0;border-bottom:1px dashed var(--line)}.dsub h3{font-size:16px;color:var(--navy);margin:0 0 4px}.dsub h3 small{font-weight:400;color:var(--mut);font-size:12px}.dsub p{margin:2px 0;font-size:14.5px}.hwk{background:#fff7e6;border-radius:8px;padding:4px 8px}
.dins{background:#fee2e2;border-radius:10px;padding:8px 10px;margin:10px 0}.dins p{margin:4px 0 0}.dsig{margin-top:10px;font-size:14px}
.share{display:flex;flex-wrap:wrap;gap:8px;margin:12px 0}.btn.wa{background:#16a34a}
.confirm{background:var(--sky);border-radius:12px;padding:10px 12px;margin-top:10px}.confirm p{margin:0 0 8px;font-size:14px}
pre.msg{white-space:pre-wrap;font:13px/1.45 ui-monospace,Consolas,monospace;background:var(--mist);border-radius:10px;padding:10px}
.top select{background:transparent;color:#fff;border:0;font:inherit;font-weight:800}.top select option{color:#000}
@media print{body *{visibility:hidden}#dpaper,#dpaper *{visibility:visible}#dpaper{position:absolute;left:0;top:0;border:0;max-width:none;width:100%}}
/* ---- v7: tabs that scroll on small screens, Home, leave register, My Performance Record ---- */
.tabs{display:flex;overflow-x:auto;scroll-snap-type:x proximity;scrollbar-width:none;-webkit-overflow-scrolling:touch}
.tabs::-webkit-scrollbar{display:none}
.tabs button{flex:1 0 auto;min-width:86px;scroll-snap-align:start;transition:background .2s,border-color .2s,transform .15s}
.tabs button:hover{border-color:#b9cbf3}.tabs button:active{transform:scale(.97)}
.seg button.on.V{background:#0e7490;border-color:#0e7490;color:#fff}
.top img{width:40px;height:40px;object-fit:contain;background:#fff;border-radius:10px;padding:2px}
.brand img{object-fit:contain}
.h2{font-size:18px;margin:0 0 8px;font-family:"Bricolage Grotesque",system-ui,sans-serif}
details>summary.h2{cursor:pointer;margin:0;list-style:none}details>summary.h2::before{content:"▸ ";color:var(--royal)}details[open]>summary.h2::before{content:"▾ "}
.sect{margin:18px 2px 10px}
.hero{background:linear-gradient(135deg,#0f2557,#1f56d6 70%,#3b82f6);color:#fff;border-radius:20px;padding:18px;margin-bottom:12px;display:flex;flex-direction:column;gap:10px;box-shadow:0 12px 30px #1f56d633;position:relative;overflow:hidden}
.hero::after{content:"";position:absolute;right:-40px;top:-40px;width:160px;height:160px;border-radius:50%;background:#ffffff14}
.hero h1{font-size:24px}.hero .hi{margin:0;color:#c7d5ff;font-weight:700}.meta.light{color:#dbe5ff}
.chips{display:flex;flex-wrap:wrap;gap:6px}.pill2{background:#ffffff26;border-radius:999px;padding:4px 10px;font-size:13px;font-weight:700}.pill2.o{background:#ffffff14}
.kgrid{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:10px;margin-bottom:12px}
.kcard{background:#fff;border:1px solid var(--line);border-radius:16px;padding:12px 14px;box-shadow:0 2px 10px #0f255710;transition:transform .2s,box-shadow .2s}
.kcard:hover{transform:translateY(-2px);box-shadow:0 8px 20px #0f25571a}
.kcard span{display:block;font-size:13px;color:var(--mut);font-weight:700}.kcard b{font:800 28px/1.1 "Bricolage Grotesque",system-ui}.kcard.warn{border-color:#f59e0b;background:#fffbeb}
.qa{display:flex;flex-wrap:wrap;gap:8px;margin-top:12px}
.tt{display:grid;gap:6px}.tt>div{display:grid;grid-template-columns:44px 1fr;column-gap:8px;align-items:center;padding:8px 10px;border-radius:12px;background:var(--mist)}.tt .pn{grid-row:span 2;background:var(--royal);color:#fff;border-radius:10px;font-weight:800;text-align:center;padding:6px 0}.tt small{color:var(--mut)}
.rings{display:flex;flex-wrap:wrap;gap:16px;margin:6px 0 10px}
.ring{display:flex;align-items:center;gap:10px}.ring svg{width:64px;height:64px;transform:rotate(-90deg)}.ring circle{fill:none;stroke-width:5}.ring .rb{stroke:#e8edf8}.ring .rf{stroke:var(--royal);stroke-linecap:round;stroke-dasharray:var(--p) 100;animation:ringin 1s ease-out both}
.ring b{display:block;font:800 20px/1 "Bricolage Grotesque",system-ui}.ring span{font-size:13px;color:var(--mut);font-weight:700}
@keyframes ringin{from{stroke-dasharray:0 100}}
.bars{display:grid;gap:7px}.brow{display:grid;grid-template-columns:70px 1fr 34px;align-items:center;gap:8px;font-size:14px}.brow b{text-align:right}
.btrack{height:10px;border-radius:99px;background:#eef2fa;overflow:hidden}.btrack i{display:block;height:100%;width:var(--w);border-radius:99px;background:var(--royal);animation:grow .9s cubic-bezier(.2,.8,.2,1) both}
.btrack i.g{background:var(--ok)}.btrack i.l{background:var(--late)}.btrack i.v{background:#0e7490}.btrack i.a{background:var(--bad)}
@keyframes grow{from{width:0}}
.anim{animation:up .45s cubic-bezier(.2,.8,.2,1) both;animation-delay:calc(var(--d,0) * 60ms)}
@keyframes up{from{opacity:0;transform:translateY(10px)}}
.skel{height:14px;border-radius:8px;margin:10px 0;background:linear-gradient(90deg,#eef2fa 25%,#f8faff 50%,#eef2fa 75%);background-size:200% 100%;animation:sk 1.2s infinite}.skel.s2{width:60%}
@keyframes sk{to{background-position:-200% 0}}
.empty{text-align:center;color:var(--mut)}.empty span{font-size:34px}
.tw{overflow-x:auto}.rt{width:100%;border-collapse:collapse;font-size:14px;margin-top:8px}.rt th,.rt td{text-align:left;padding:7px 8px;border-bottom:1px solid var(--line);white-space:nowrap}.rt th{font-size:12.5px;color:var(--mut);text-transform:uppercase;letter-spacing:.03em}
.review .rvh{display:flex;justify-content:space-between;gap:10px;align-items:flex-start;margin-bottom:6px}
.rvq{background:var(--sky);border-left:4px solid var(--royal);border-radius:10px;padding:10px 12px;margin:8px 0}.rvq p{margin:4px 0 0}
.review details{margin:8px 0}.review summary{cursor:pointer;font-weight:700;color:var(--royal)}
.dut{margin:4px 0 8px;padding-left:20px}
.resp{border-top:1px dashed var(--line);margin-top:10px;padding-top:10px}.ri{background:var(--mist);border-radius:10px;padding:8px 10px;margin-top:6px}.ri.ack{background:var(--okb)}
.lvl{display:grid;gap:8px;margin-bottom:10px}.lvi{border:1px solid var(--line);border-radius:12px;padding:10px 12px}
.lvadd{border-top:1px solid var(--line);padding-top:10px}.lvadd summary{cursor:pointer;font-weight:800;color:var(--royal);margin-bottom:8px}
.ck{display:flex;gap:8px;align-items:center;font-weight:700;margin-bottom:10px}
.c-ok{background:var(--okb);color:var(--ok)}.c-warn{background:var(--warnb);color:var(--warn)}.c-bad{background:var(--badb);color:var(--bad)}.c-info{background:#0891b21f;color:#0e7490}
@media (prefers-reduced-motion:reduce){*,*::before,*::after{animation:none!important;transition:none!important}}
.still .anim{animation:none}
.dfiles{display:flex;flex-wrap:wrap;gap:6px;font-weight:400}.dfile{background:var(--mist);border-radius:10px;padding:5px 8px;font-size:14px}.dfile a{color:var(--royal)}.dfile button{border:0;background:none;color:var(--bad);cursor:pointer;font-weight:700}
.fl.priv textarea{background:#fffbeb;border-color:#f5d48b}
.exr{display:grid;grid-template-columns:1fr 90px 64px;gap:8px;align-items:center;padding:9px 0;border-top:1px solid var(--line)}.exr:first-child{border:0}.exr small{display:block}.exr input{padding:9px;border:1.5px solid var(--line);border-radius:10px;font-size:16px;text-align:center;width:100%}
