:root{--wandr-navy:#12202f;--wandr-slate:#1f2f44;--wandr-cyan:#2ec4d6;--wandr-blue:#2bb5e8;--wandr-violet:#7a5cf0;--wandr-gradient:linear-gradient(135deg, var(--wandr-blue), var(--wandr-violet));--wandr-mark-flat:#5a7ff2;--surface-page:#f4f6f8;--surface-card:#fff;--border-subtle:#dde3ea;--text-primary:#1f2f44;--text-muted:#3c4b5e;--state-active-bg:#d6f2f7;--state-active-fg:#0b4a57;--state-active-dot:#2ec4d6;--state-overdue-bg:#fdebc8;--state-overdue-fg:#6b4400;--state-overdue-dot:#f5a524;--state-returned-bg:#e3e8ee;--state-returned-fg:#2b394b;--state-returned-dot:#6b7c93;--font-display:"Outfit", system-ui, sans-serif;--font-ui:"Manrope", system-ui, sans-serif}@media (prefers-color-scheme:dark){:root{--surface-page:#12202f;--surface-card:#1b2d42;--border-subtle:#2a3f57;--text-primary:#fff;--text-muted:#b9c6d6;--state-active-bg:#123c47;--state-active-fg:#bdeff6;--state-overdue-bg:#4a3510;--state-overdue-fg:#fbdda0;--state-returned-bg:#2a3f57;--state-returned-fg:#d5dee8}}body{font-family:var(--font-ui);background:var(--surface-page);color:var(--text-primary);margin:0}h1{font-family:var(--font-display)}.layout{max-width:40rem;margin:0 auto;padding:1rem}.layout nav{gap:1rem;margin-bottom:1rem;display:flex}.layout nav a{color:var(--text-muted)}.signin{background:var(--surface-card);border:1px solid var(--border-subtle);border-radius:12px;gap:.75rem;padding:1.25rem;display:grid}.signin label{font-weight:600}.signin input{font:inherit;border:1px solid var(--border-subtle);background:var(--surface-page);color:var(--text-primary);border-radius:8px;padding:.75rem}.signin button{font:inherit;background:var(--wandr-gradient);color:#fff;cursor:pointer;border:0;border-radius:8px;padding:.75rem 1rem;font-weight:600}.signin button:disabled{opacity:.6;cursor:default}.signin-note{color:var(--text-muted)}.signin-error{background:var(--state-overdue-bg);color:var(--state-overdue-fg);border-radius:8px;padding:.75rem}.pupil-shell{box-sizing:border-box;color:#1f2f44;background:#f4f6f8;flex-direction:column;gap:24px;max-width:440px;min-height:100dvh;margin:auto;padding:28px 24px 32px;display:flex}.pupil-header{justify-content:space-between;align-items:center;font-weight:700;display:flex}.wordmark{font-family:var(--font-display);letter-spacing:-.02em;font-size:36px;font-weight:500}.wordmark span{background:var(--wandr-gradient);color:#0000;-webkit-background-clip:text;background-clip:text}.pass-card{text-align:center;background:#fff;border:1px solid #dde3ea;border-radius:28px;flex-direction:column;flex:1;align-items:center;gap:20px;min-height:420px;padding:32px 28px;display:flex}.pass-badge{color:#0b4a57;background:#d6f2f7;border-radius:999px;gap:10px;padding:10px 16px;font-weight:700;display:flex}.pass-orbit{color:#2bb5e8;width:168px;height:168px;margin-top:12px}.pass-countdown{font-family:var(--font-display);letter-spacing:-.02em;font-variant-numeric:tabular-nums;font-size:clamp(44px,18vw,88px);font-weight:500;line-height:1}.pass-card p{margin:0}.pass-origin{box-sizing:border-box;text-align:left;background:#f4f6f8;border-radius:16px;gap:4px;width:100%;margin-top:auto;padding:16px 18px;display:grid}.pass-origin small{letter-spacing:.08em;font-weight:700}.pass-origin strong{font-size:20px}.pupil-shell footer{text-align:center;font-weight:600}.scan-instruction{color:#fff;background:#1f2f44;border-radius:16px;padding:18px}.pass-message{background:#fff;border-radius:16px;margin:0;padding:14px}.is-overdue .pass-badge{background:var(--state-overdue-bg);color:var(--state-overdue-fg)}.is-overdue .pass-orbit{color:var(--state-overdue-fg)}.room-qr{width:min(100%,400px);height:auto}.teacher-qr{text-align:center}
