:root{--desk:#efe9dc;--paper:#faf6ec;--ink:#2b2a27;--ink-muted:#6b665c;--vermilion:#b8322a;--grid:#e4b7af;--grid-strong:#cf8a80;--font-serif:"Noto Serif TC", "Songti TC", "PMingLiU", serif;--font-sans:"Noto Sans TC", "PingFang TC", "Microsoft JhengHei", sans-serif;--space-1:.25rem;--space-2:.5rem;--space-3:.75rem;--space-4:1rem;--space-5:1.5rem;--space-6:2rem}*,:before,:after{box-sizing:border-box}body{background:var(--desk);min-height:100vh;color:var(--ink);font-family:var(--font-sans);-webkit-text-size-adjust:100%;margin:0;font-size:1rem;line-height:1.6}h1,h2,p,ol{margin:0}ol{padding:0;list-style:none}.paper{max-width:28rem;padding:var(--space-5) var(--space-4) var(--space-6);background:var(--paper);min-height:100vh;margin:0 auto}@media (width>=30rem){.paper{margin:var(--space-6) auto;min-height:auto;padding:var(--space-6) var(--space-5);outline:1px solid var(--grid-strong);outline-offset:-.5rem;box-shadow:0 1px 0 var(--grid), 0 .75rem 2rem #2b2a2714}}.masthead{padding-bottom:var(--space-4);border-bottom:2px solid var(--vermilion);margin-bottom:var(--space-5)}.masthead-title{font-family:var(--font-serif);letter-spacing:.15em;font-size:1.5rem;font-weight:900}.masthead-rule{color:var(--ink-muted);font-size:.875rem}.period+.period{margin-top:var(--space-6)}.period-head{align-items:baseline;gap:var(--space-3);flex-wrap:wrap;display:flex}.period-title{font-family:var(--font-serif);font-size:1.25rem;font-weight:900}.period-range{color:var(--ink-muted);font-size:.875rem}.period-tag{color:var(--vermilion);border:1px solid var(--vermilion);padding:0 var(--space-2);border-radius:2px;font-size:.75rem}.period-deadline{margin-top:var(--space-1);font-size:.875rem}.period-countdown{color:var(--vermilion);font-weight:500}.sheets{gap:var(--space-3);margin-top:var(--space-4);grid-template-columns:repeat(3,1fr);display:grid}.sheet-paper{aspect-ratio:1;border:1.5px solid var(--grid-strong);background-color:var(--paper);background-image:linear-gradient(to right, var(--grid) 1px, transparent 1px), linear-gradient(to bottom, var(--grid) 1px, transparent 1px);background-size:5% 5%;position:relative}.stamp{border:.2rem solid var(--vermilion);color:var(--vermilion);font-family:var(--font-serif);background:#faf6ecd1;border-radius:50%;place-items:center;font-size:clamp(1.25rem,7vw,2rem);font-weight:900;line-height:1;animation:.18s ease-out stamp-in;display:grid;position:absolute;inset:18%;transform:rotate(-12deg)}@keyframes stamp-in{0%{transform:rotate(-12deg)scale(1.3)}}@media (prefers-reduced-motion:reduce){.stamp{animation:none}}.sheet-date{margin-top:var(--space-2);font-family:var(--font-serif);text-align:center;font-weight:600}.sheet-status{color:var(--ink-muted);text-align:center;font-size:.75rem}.sheet.is-done .sheet-status{color:var(--vermilion);font-weight:500}.period-tally{margin-top:var(--space-3);color:var(--ink-muted);font-size:.875rem}.overview{margin-top:var(--space-6);padding-top:var(--space-4);border-top:1px solid var(--grid-strong)}.overview-title{font-family:var(--font-serif);font-size:1rem;font-weight:600}.cells{margin-top:var(--space-3);grid-template-columns:repeat(14,1fr);gap:3px;display:grid}.cell{aspect-ratio:1;border:1px solid var(--grid)}.cell.is-passed{background:var(--vermilion);border-color:var(--vermilion)}.cell.is-failed{border-color:var(--ink-muted);background:linear-gradient(to top right, transparent calc(50% - 1px), var(--ink-muted) calc(50% - 1px), var(--ink-muted) calc(50% + 1px), transparent calc(50% + 1px))}.cell.is-open{border:2px solid var(--vermilion)}.legend{gap:var(--space-2) var(--space-4);margin-top:var(--space-3);color:var(--ink-muted);flex-wrap:wrap;font-size:.75rem;display:flex}.legend-item{align-items:center;gap:var(--space-1);display:inline-flex}.legend-item .cell{width:.75rem}.totals{margin-top:var(--space-4);color:var(--ink-muted);font-size:.875rem}.totals-number{font-family:var(--font-serif);color:var(--ink);margin-right:var(--space-1);font-size:2.5rem;font-weight:900;line-height:1.1}.note{gap:var(--space-2);margin-top:var(--space-5);color:var(--ink);align-items:flex-start;font-size:.875rem;display:flex}.note svg{width:1.25rem;height:1.25rem;fill:var(--vermilion);flex:none}.status-line{color:var(--ink-muted);font-size:.875rem}.retry-button{margin-top:var(--space-3);font:inherit;color:var(--vermilion);border:1px solid var(--vermilion);padding:var(--space-1) var(--space-4);cursor:pointer;background:0 0;font-size:.875rem}.retry-button:focus-visible{outline:2px solid var(--vermilion);outline-offset:2px}.colophon{margin-top:var(--space-6);color:var(--ink-muted);font-size:.75rem}
