:root{--bg:#f6f7f9;--panel:#ffffff;--ink:#1a1d21;--muted:#6b7280;--line:#e5e7eb;--accent:#2563eb;--accent-soft:#eef2ff;--danger:#dc2626;--ok:#16a34a;--radius:10px}*{box-sizing:border-box}body,html{margin:0;padding:0}body{background:var(--bg);color:var(--ink);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif;font-size:15px;line-height:1.5}a{color:var(--accent);text-decoration:none}a:hover{text-decoration:underline}.topbar{display:flex;align-items:center;justify-content:space-between;height:56px;padding:0 20px;background:var(--panel);border-bottom:1px solid var(--line)}.topbar .brand{font-weight:700;font-size:16px;color:var(--ink)}.topbar .who{display:flex;align-items:center;gap:14px;font-size:14px;color:var(--muted)}.topbar .who b{color:var(--ink);font-weight:600}.layout{display:flex;min-height:calc(100vh - 56px)}.sidenav{width:210px;flex-shrink:0;background:var(--panel);border-right:1px solid var(--line);padding:16px 10px}.sidenav a{display:block;padding:9px 12px;border-radius:8px;color:var(--ink);font-weight:500}.sidenav a:hover{background:var(--accent-soft);text-decoration:none}.main{flex:1 1;padding:24px 28px;max-width:1100px}.bare{display:flex;min-height:100vh;align-items:center;justify-content:center;padding:24px}h1{font-size:22px;margin:0 0 4px}.subtle{color:var(--muted);font-size:14px;margin:0 0 20px}.cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));grid-gap:12px;gap:12px;margin-bottom:24px}.card{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);padding:14px 16px}.card .label{color:var(--muted);font-size:13px;margin-bottom:6px}.card .value{font-size:24px;font-weight:700}.card .value.warn{color:var(--danger)}.panel{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);overflow:hidden;margin-bottom:24px}.panel h2{font-size:15px;margin:0;padding:14px 16px;border-bottom:1px solid var(--line)}table{width:100%;border-collapse:collapse;font-size:14px}td,th{text-align:left;padding:9px 16px;border-bottom:1px solid var(--line)}th{color:var(--muted);font-weight:600;font-size:13px;background:#fafbfc}tr:last-child td{border-bottom:none}td.num,th.num{text-align:right;font-feature-settings:"tnum";font-variant-numeric:tabular-nums}.tag{display:inline-block;font-size:12px;padding:1px 8px;border-radius:999px;background:var(--accent-soft);color:var(--accent)}.tag.missed{background:#fee2e2;color:var(--danger)}.tag.ok{background:#dcfce7;color:var(--ok)}.btn{display:inline-block;padding:8px 14px;border-radius:8px;border:1px solid var(--line);background:var(--panel);color:var(--ink);font-size:14px;font-weight:500;cursor:pointer}.btn:hover{background:#f3f4f6;text-decoration:none}.btn.primary{background:var(--accent);border-color:var(--accent);color:#fff}.btn.primary:hover{background:#1d4ed8}.btn:disabled{opacity:.5;cursor:not-allowed}.period{display:inline-flex;gap:4px;margin-bottom:20px}.period a{padding:6px 14px;border:1px solid var(--line);border-radius:8px;color:var(--ink);font-size:14px}.period a.active{background:var(--accent);border-color:var(--accent);color:#fff}.period a:hover{text-decoration:none}.hint{background:#fffbeb;border:1px solid #fde68a;border-radius:8px;padding:12px 14px;font-size:14px;color:#92400e;margin-bottom:20px}.login-card{background:var(--panel);border:1px solid var(--line);border-radius:14px;padding:36px 40px;text-align:center;max-width:380px}.login-card h1{margin-bottom:8px}.login-card p{color:var(--muted);margin:0 0 24px}