:root{--ink: #271A1E;--dim: rgba(39,26,30,.62);--faint: rgba(39,26,30,.4);--line: rgba(39,26,30,.12);--canvas: #F8F4EC;--card: #FDFBF7;--accent: #D41055;--green: #1F8A5B;--amber: #b45309;--red: #b91c1c;--tap: 44px}*{box-sizing:border-box}:focus-visible{outline:3px solid rgba(212,16,85,.45);outline-offset:2px}.field:focus-visible{outline-offset:0}html{-webkit-text-size-adjust:100%}body{margin:0;background:var(--canvas);font-family:Instrument Sans,sans-serif;color:var(--ink);font-size:16px;line-height:1.5}a{color:var(--ink)}h1,h2,h3{margin:0}h1{font-family:Newsreader,Georgia,serif;font-weight:500;font-size:30px;line-height:1.15}h2{font-family:Newsreader,Georgia,serif;font-weight:500;font-size:23px;line-height:1.2}h3{font-size:17px;font-weight:700}p{margin:0 0 10px}.dim{color:var(--dim)}.small{font-size:14px}.mt{margin-top:16px}.row{display:flex;gap:12px;align-items:center;flex-wrap:wrap}.row.between{justify-content:space-between}.stack>*+*{margin-top:12px}.sr{position:absolute;left:-9999px}.topbar{background:var(--ink);color:#fdfbf7;padding:0 20px;display:flex;align-items:center;gap:18px;min-height:60px;flex-wrap:wrap}.brand{font-family:Newsreader,Georgia,serif;font-size:21px;text-decoration:none;color:inherit;padding:8px 0}.brand span{opacity:.6}.topbar .school{font-size:15px;opacity:.85;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:32vw}.nav{display:flex;gap:4px;margin-left:auto;flex-wrap:wrap}.nav a,.nav button{color:#fdfbf7c7;text-decoration:none;padding:10px 14px;min-height:var(--tap);display:inline-flex;align-items:center;border-radius:10px;font:inherit;font-size:16px;font-weight:500;background:none;border:none;cursor:pointer}.nav a.on{color:#fdfbf7;background:#fdfbf724;font-weight:700}.nav a:hover,.nav button:hover{background:#fdfbf71a}.who{font-size:14px;opacity:.7;margin-left:8px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:28vw}.page-head .sub{color:var(--dim);font-size:18px;margin-top:2px}.page-head .nowrap,.nowrap{white-space:nowrap}.page-head .jump{font-size:15px}.page{max-width:1120px;margin:0 auto;padding:26px 20px 80px}.page-head{display:flex;align-items:flex-end;gap:16px;flex-wrap:wrap;margin-bottom:18px}.page-head .grow{flex:1;min-width:200px}.crumbs{font-size:15px;color:var(--dim);margin-bottom:8px}.crumbs a{color:var(--dim)}.card{background:var(--card);border:1px solid var(--line);border-radius:18px;padding:20px 22px}.card+.card{margin-top:16px}.card h2{margin-bottom:8px}.grid2{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:16px;align-items:start}.grid2>.card{margin-top:0}.stats{display:flex;gap:14px;flex-wrap:wrap;margin:10px 0 4px}.stat{background:#fff;border:1px solid var(--line);border-radius:14px;padding:12px 18px;min-width:120px}.stat b{display:block;font-size:26px;font-family:Newsreader,Georgia,serif;font-weight:500;line-height:1.1}.stat span{font-size:14px;color:var(--dim)}.btn{border:1px solid rgba(39,26,30,.2);background:#fff;border-radius:999px;padding:9px 20px;min-height:var(--tap);font:inherit;font-size:16px;font-weight:600;color:var(--ink);cursor:pointer;display:inline-flex;align-items:center;justify-content:center;gap:8px;text-decoration:none}.btn:hover{background:#271a1e0a}.btn:disabled{opacity:.5;cursor:default}.btn.primary{background:var(--ink);border-color:var(--ink);color:#fff}.btn.primary:hover{background:#3a2a30}.btn.danger{background:var(--accent);border-color:var(--accent);color:#fff}.btn.quiet{border-color:transparent;background:transparent}.btn.quiet:hover{background:#271a1e0f}.btn.small{min-height:40px;padding:6px 14px;font-size:15px}.label{display:block;font-size:14px;font-weight:700;color:var(--dim);margin:12px 0 4px}.field,select.field,textarea.field{width:100%;border:1px solid rgba(39,26,30,.2);border-radius:12px;padding:10px 14px;min-height:var(--tap);font:inherit;font-size:16px;background:#fff;color:var(--ink)}.field:focus{outline:3px solid rgba(212,16,85,.3);outline-offset:0;border-color:#d4105599}.check{display:flex;align-items:center;gap:10px;min-height:var(--tap);font-size:16px}.check input{width:22px;height:22px}.form-actions{display:flex;gap:10px;align-items:center;flex-wrap:wrap;margin-top:16px}.notice{border-radius:12px;padding:12px 16px;font-size:16px;margin:12px 0;border:1px solid transparent}.notice.error{background:#fdecec;color:var(--red);border-color:#f5c2c2}.notice.ok{background:#e8f5ee;color:var(--green);border-color:#bfe3d0}.notice.info{background:#fff;color:var(--ink);border-color:var(--line)}.notice.warn{background:#fff5e6;color:var(--amber);border-color:#f3d5a8}.table-wrap{overflow-x:auto;-webkit-overflow-scrolling:touch}table.table{width:100%;border-collapse:collapse;font-size:16px}.table th{text-align:left;font-size:13px;letter-spacing:.06em;text-transform:uppercase;color:var(--faint);padding:8px 12px;border-bottom:1px solid var(--line);white-space:nowrap}.table td{padding:9px 12px;border-bottom:1px solid var(--line);vertical-align:middle;overflow-wrap:anywhere}.table tr:last-child td{border-bottom:none}.table td.act{text-align:right;white-space:nowrap}.table a.name{font-weight:700;text-decoration:none;display:inline-flex;min-height:40px;align-items:center}.table tr.off td{color:var(--faint)}.pill{display:inline-block;font-size:13px;font-weight:700;border-radius:999px;padding:3px 10px;white-space:nowrap}.pill.stuck{background:#fdecec;color:var(--red)}.pill.pending{background:#fff5e6;color:var(--amber)}.pill.ok{background:#e8f5ee;color:var(--green)}.pill.quiet{background:#271a1e12;color:var(--dim)}.pin-slots{display:flex;gap:12px;margin:8px 0 14px}.pin-slot{width:72px;height:72px;border-radius:16px;border:2px dashed rgba(39,26,30,.25);background:#fff;display:grid;place-items:center;font-size:22px;color:var(--faint)}.pin-slot.full{border-style:solid;border-color:var(--ink)}.pin-slot.next{border-color:var(--accent)}.pin-slot img{width:56px;height:56px;object-fit:contain}.pin-grid{display:grid;grid-template-columns:repeat(3,minmax(88px,1fr));gap:10px;max-width:420px}.pin-pic{border:1px solid var(--line);background:#fff;border-radius:16px;padding:10px 6px 8px;min-height:110px;display:flex;flex-direction:column;align-items:center;gap:6px;cursor:pointer;font:inherit;font-size:14px;color:var(--ink)}.pin-pic img{width:56px;height:56px;object-fit:contain}.pin-pic:hover{background:#271a1e0a}.pin-pic:disabled{opacity:.45;cursor:default}.pin-pic .n{position:absolute}.matrix{border-collapse:collapse;font-size:15px}.matrix th,.matrix td{border:1px solid var(--line);text-align:center;padding:0}.matrix th{font-size:13px;color:var(--dim);font-weight:600;padding:8px 6px;background:#fff}.matrix th.name,.matrix td.name{text-align:left;padding:6px 12px;position:sticky;left:0;background:var(--card);z-index:1;white-space:nowrap;max-width:200px;overflow:hidden;text-overflow:ellipsis}.matrix td.name a{text-decoration:none;font-weight:700;display:inline-flex;min-height:36px;align-items:center}.matrix .cell{width:40px;height:38px;display:grid;place-items:center;font-size:17px}.matrix .cell.completed{background:#e8f5ee;color:var(--green);font-weight:700}.matrix .cell.current{color:var(--ink)}.matrix .cell.stuck{background:#fdecec;color:var(--red);font-weight:800}.matrix .cell.started{color:var(--dim)}.matrix .cell.not_started{color:#271a1e4d}.matrix td.done{padding:0 12px;white-space:nowrap;color:var(--dim)}.matrix.courses th{white-space:nowrap}.matrix .cell.course{width:auto;min-width:72px;padding:0 10px;font-size:15px;white-space:nowrap}.stat b.pending{color:var(--faint)}.legend{display:flex;gap:16px;flex-wrap:wrap;font-size:14px;color:var(--dim);margin-top:10px}.legend b{display:inline-grid;place-items:center;width:26px;height:26px;border-radius:6px;margin-right:6px;font-weight:700}.sheet{background:#fff;color:#111;border:1px solid var(--line);border-radius:18px;padding:28px 32px;max-width:720px;margin:16px auto 0}.class-card .top{text-align:center}.class-card .school{font-size:20px;color:#444}.class-card .klass{font-family:Newsreader,Georgia,serif;font-size:34px;font-weight:500;margin:2px 0 0}.class-card .year{font-size:20px;color:#555;margin-bottom:10px}.class-card .code{font-family:Newsreader,Georgia,serif;font-size:84px;letter-spacing:.08em;font-weight:500;line-height:1;margin:6px 0 4px}.class-card .where{font-size:18px;color:#333;margin-bottom:18px}.class-card .where b{font-weight:700}.class-card .hint{text-align:center;font-size:17px;color:#333;margin:0 0 12px}.pic-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px}.pic-grid figure{margin:0;border:1px solid #ddd;border-radius:14px;padding:10px 8px;text-align:center}.pic-grid img{width:72px;height:72px;object-fit:contain;display:block;margin:0 auto 4px}.pic-grid figcaption{font-size:16px;color:#222}.cert{text-align:center;padding:48px 40px}.cert .eyebrow{font-size:14px;letter-spacing:.18em;text-transform:uppercase;color:#666}.cert .title{font-family:Newsreader,Georgia,serif;font-size:40px;font-weight:500;margin:8px 0 24px}.cert .name{font-family:Newsreader,Georgia,serif;font-size:54px;font-weight:500;margin:6px 0}.cert .what{font-size:20px;color:#333;margin:14px 0}.cert .what b{font-weight:700;color:#111}.cert .meta{font-size:16px;color:#555;margin-top:28px}.town-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:14px}.town-slot iframe{width:100%;height:220px;border:1px solid var(--line);border-radius:12px;background:#fff}.scrim{position:fixed;top:0;right:0;bottom:0;left:0;background:#271a1e66;display:grid;place-items:center;z-index:50;padding:20px}.modal{background:var(--card);border-radius:18px;padding:24px;width:min(480px,100%);box-shadow:0 20px 60px #00000040}.gate{min-height:100vh;display:grid;place-items:center;padding:20px}.gate section{width:min(460px,100%);background:var(--card);border:1px solid var(--line);border-radius:18px;padding:30px 32px}@media (max-width: 1100px){.who{display:none}}@media (max-width: 900px){.nav{gap:0}.nav a,.nav button{padding:10px;font-size:15px}.matrix th.name,.matrix td.name{max-width:140px}}@media (max-width: 640px){.page{padding:18px 14px 60px}.topbar{padding:0 12px;gap:10px;min-height:52px}.topbar .school{display:none}.brand{font-size:19px;padding:6px 0}.nav{margin-left:0;width:100%;justify-content:flex-start}.nav a,.nav button{padding:8px 10px;min-height:40px}.class-card .code{font-size:60px}.cert .name{font-size:40px}h1{font-size:26px}.stat{min-width:0;flex:1 1 40%;padding:10px 14px}table.table.stack,.table.stack tbody,.table.stack tr,.table.stack td{display:block}.table.stack thead{display:none}.table.stack tr{padding:10px 0;border-bottom:1px solid var(--line)}.table.stack tr:last-child{border-bottom:none}.table.stack td{padding:3px 0;border:none;display:flex;gap:10px;align-items:baseline}.table.stack td.lead{display:block;padding-bottom:4px}.table.stack td[data-label]:before{content:attr(data-label);flex:0 0 110px;font-size:13px;letter-spacing:.04em;text-transform:uppercase;color:var(--faint)}.table.stack td.act{text-align:left;padding-top:6px}.table.stack td.act:before{display:none}.table.stack td:empty,.table.stack td.quiet{display:none}.matrix th.name,.matrix td.name{max-width:120px;padding:4px 8px}.matrix .cell{width:36px;height:36px;font-size:16px}.matrix .cell.course{min-width:60px;padding:0 6px;font-size:14px}}@media print{@page{size:auto;margin:14mm}body{background:#fff;color:#000;font-size:12pt}.no-print{display:none!important}.sheet{border:none;border-radius:0;box-shadow:none;max-width:none;margin:0;padding:0;page-break-after:always;break-after:page;page-break-inside:avoid}.sheet:last-child{page-break-after:auto;break-after:auto}.class-card .code{font-size:64pt}.pic-grid{gap:8mm}.pic-grid figure{border-color:#999}.pic-grid img{width:26mm;height:26mm}.cert{padding:30mm 10mm}}
