:root{--navy:#1f3864;--ink:#1a1c1f;--muted:#6b7280;--line:#e4e6ea;--bg:#f7f8fa;--green:#2f7a4d;--amber:#b06f00;--red:#b3261e;--radius:8px}*{box-sizing:border-box}body{color:var(--ink);background:var(--bg);margin:0;font-family:-apple-system,Segoe UI,Roboto,Arial,sans-serif;font-size:15px}button{font:inherit;cursor:pointer}input,select{font:inherit}.login-page{place-items:center;min-height:100vh;padding:24px;display:grid}.login-card{border:1px solid var(--line);background:#fff;border-radius:12px;flex-direction:column;gap:14px;width:100%;max-width:380px;padding:36px 32px;display:flex}.login-mark{color:var(--navy);text-align:center;font-size:34px}.login-card h1{text-align:center;margin:0;font-size:22px}.login-card>.muted{text-align:center;margin:0 0 8px}.login-card label{color:var(--muted);flex-direction:column;gap:5px;font-size:13px;display:flex}.login-card input,.site-select{border:1px solid var(--line);border-radius:var(--radius);color:var(--ink);background:#fff;padding:10px 12px}.login-card input:focus,.site-select:focus{outline:2px solid var(--navy);outline-offset:-1px}.login-card button[type=submit]{border-radius:var(--radius);background:var(--navy);color:#fff;border:0;margin-top:6px;padding:12px;font-weight:600}.login-card button[disabled]{opacity:.6}.app{grid-template-columns:220px 1fr;min-height:100vh;display:grid}.loading{min-height:100vh;color:var(--muted);place-items:center;display:grid}.sidebar{background:var(--navy);color:#fff;flex-direction:column;gap:18px;padding:20px 14px;display:flex}.brand{font-size:17px;font-weight:600}.brand-mark{margin-right:6px}.sidebar ul{flex-direction:column;gap:2px;margin:0;padding:0;list-style:none;display:flex}.sidebar li button{text-align:left;border-radius:var(--radius);color:#cfd6e4;background:0 0;border:0;width:100%;padding:9px 12px}.sidebar li button:hover{color:#fff;background:#ffffff14}.sidebar li button.active{color:#fff;background:#ffffff29;font-weight:600}.who{border-top:1px solid #ffffff26;margin-top:auto;padding-top:14px;font-size:13px}.who-name{font-weight:600}.who-role{color:#aab4c8;text-transform:capitalize;margin-bottom:8px}.link{color:#cfd6e4;background:0 0;border:0;padding:0;text-decoration:underline}main{padding:28px 32px;overflow:auto}.page-head{justify-content:space-between;align-items:flex-start;gap:16px;display:flex}.page h1{margin:0 0 4px;font-size:22px}.muted{color:var(--muted);margin:0;font-size:13px}.footnote{margin-top:14px}button.danger{background:var(--red);color:#fff;border-radius:var(--radius);border:0;padding:11px 18px;font-weight:600}.tiles{grid-template-columns:repeat(auto-fit,minmax(130px,1fr));gap:12px;margin:20px 0;display:grid}.tile{border:1px solid var(--line);border-radius:var(--radius);background:#fff;padding:16px}.tile-value{font-size:26px;font-weight:600}.tile-label{color:var(--muted);margin-top:2px;font-size:12px}.banner{border-radius:var(--radius);margin:12px 0;padding:11px 14px;font-size:14px}.banner.info{color:var(--navy);background:#eef2fb}.banner.warn{color:var(--amber);background:#fdf4e3}.banner.error{color:var(--red);background:#fdecea}.grid{border-collapse:collapse;border:1px solid var(--line);border-radius:var(--radius);background:#fff;width:100%;overflow:hidden}.grid th{text-align:left;text-transform:uppercase;letter-spacing:.04em;color:var(--muted);border-bottom:1px solid var(--line);padding:10px 14px;font-size:12px}.grid td{border-bottom:1px solid #f1f2f4;padding:11px 14px}.grid tr:last-child td{border-bottom:0}.grid .empty{text-align:center;color:var(--muted);padding:28px}.dot{border-radius:50%;width:8px;height:8px;margin-right:8px;display:inline-block}.dot.worker{background:#2a9d8f}.dot.user{background:#d4a017}.dot.visitor{background:#4a7fd4}.chip{border-radius:10px;margin-left:8px;padding:1px 6px;font-size:11px}.chip.warn{color:var(--amber);background:#fdf4e3}.pos small{color:var(--muted)}.pos.current{color:var(--green)}.pos.recent{color:var(--amber)}.pos.stale{color:var(--red)}.card{border:1px solid var(--line);border-radius:var(--radius);background:#fff;margin:16px 0;padding:20px}.card.quiet{color:var(--muted)}.card h2{margin:0 0 14px;font-size:16px}.form{flex-direction:column;gap:12px;display:flex}.form label{color:var(--muted);flex-direction:column;gap:4px;font-size:13px;display:flex}.form input,.form select,.form textarea{border:1px solid var(--line);border-radius:var(--radius);color:var(--ink);background:#fff;padding:9px 11px}.form-row{grid-template-columns:1fr 1fr;gap:12px;display:grid}.form-actions{justify-content:flex-end;gap:10px;margin-top:4px;display:flex}button{border-radius:var(--radius);background:var(--navy);color:#fff;border:0;padding:10px 16px;font-weight:600}button.secondary{color:var(--ink);border:1px solid var(--line);background:#fff}button[disabled]{opacity:.55;cursor:default}.head-actions{gap:10px;display:flex}.row-actions{white-space:nowrap}.row-actions .link{color:var(--navy);margin-right:10px;font-weight:500}.mono{font-family:ui-monospace,Cascadia Code,Consolas,monospace;font-size:13px}tr.dim{opacity:.55}.chip.live{background:var(--red);color:#fff;letter-spacing:.06em;vertical-align:middle;padding:2px 8px;font-size:11px}.tile.red{border-left:3px solid var(--red)}.tile.amber{border-left:3px solid var(--amber)}.tile.green{border-left:3px solid var(--green)}.banner.ok{color:var(--green);background:#e9f5ee}.badge{text-transform:capitalize;border-radius:12px;padding:3px 9px;font-size:12px;font-weight:600;display:inline-block}.badge.help{color:var(--red);background:#fdecea}.badge.unaccounted{color:var(--amber);background:#fdf4e3}.badge.safe{color:var(--green);background:#e9f5ee}.badge.not_on_site,.badge.excused{color:var(--muted);background:#eef0f3}tr.status-help td{background:snow}tr.status-unaccounted td{background:#fffdf7}.filters{gap:10px;margin:16px 0;display:flex}.filters input{flex:1}.filters input,.filters select{border:1px solid var(--line);border-radius:var(--radius);color:var(--ink);background:#fff;padding:9px 11px}.form textarea{resize:vertical;font-family:ui-monospace,Consolas,monospace;font-size:13px}.grid.small th,.grid.small td{padding:7px 11px;font-size:13px}.preview{margin:4px 0}.badge.reg-registered{color:var(--green);background:#e9f5ee}.badge.reg-pending{color:var(--amber);background:#fdf4e3}.badge.reg-revoked{color:var(--red);background:#fdecea}.error-detail{color:var(--red);border-radius:var(--radius);white-space:pre-wrap;background:#fdecea;padding:12px;font-size:13px;overflow-x:auto}.chip.info{color:var(--navy);background:#eef2fb}.filters label.inline{color:var(--muted);align-items:center;gap:8px;font-size:13px;display:flex}.filters label.inline input{width:auto}.tabs{gap:4px;margin-left:auto;display:flex}.tab{color:var(--muted);border:1px solid var(--line);background:#fff;padding:8px 16px;font-weight:500}.tab.active{background:var(--navy);color:#fff;border-color:var(--navy)}.grid .num,.grid th.num{text-align:right}.token-box{background:var(--bg);border:1px dashed var(--line);border-radius:var(--radius);letter-spacing:.04em;word-break:break-all;padding:14px;font-size:16px}.badge-preview{border:1px solid var(--ink);background:#fff;border-radius:4px;width:340px;padding:0 0 14px;overflow:hidden}.badge-head{background:var(--ink);color:#fff;letter-spacing:.1em;padding:8px 14px;font-weight:700}.badge-name{padding:12px 14px 0;font-size:22px;font-weight:700}.badge-company{color:var(--muted);padding:2px 14px 0}.badge-preview hr{border:0;border-top:1px solid var(--line);margin:12px 0}.badge-line{padding:1px 14px;font-size:13px}.badge-qr{background:var(--bg);border:1px solid var(--line);word-break:break-all;border-radius:4px;margin:12px 14px 4px;padding:8px;font-size:11px}.badge-foot{color:var(--muted);padding:4px 14px;font-size:11px}.badge-reprint{color:var(--red);padding:2px 14px;font-size:11px;font-weight:700}.enrol-code{letter-spacing:.18em;text-align:center;background:var(--bg);border:2px dashed var(--navy);border-radius:var(--radius);color:var(--navy);padding:24px 16px 20px;font-family:ui-monospace,Cascadia Code,Consolas,monospace;font-size:44px;font-weight:700}.countdown{text-align:center;color:var(--muted);margin-top:-4px;font-size:14px}.countdown.urgent{color:var(--red);font-weight:600}.filters .checkbox{white-space:nowrap;color:var(--muted);align-items:center;gap:8px;padding:0 4px;font-size:14px;display:flex}.filters .checkbox input{width:16px;height:16px}
