:root{--chart:#f4f0dd;--chart-deep:#eae4c8;--magenta:#b5227a;--blue:#2456a4;--contour:#b08d4f;--ink:#23262c;--ink-soft:#5c6068;--ok:#2c7a3d;--font-ui:"B612", system-ui, sans-serif;--font-data:"B612 Mono", ui-monospace, monospace}*{box-sizing:border-box}body{background:var(--chart);color:var(--ink);font-family:var(--font-ui);margin:0;font-size:15px;line-height:1.45}.app{max-width:1100px;margin:0 auto;padding:0 20px 80px}.masthead{border-bottom:3px double var(--ink);align-items:baseline;gap:14px;padding:26px 0 14px;display:flex}.masthead h1{font-family:var(--font-data);letter-spacing:.04em;text-transform:uppercase;margin:0;font-size:26px}.masthead h1 .accent{color:var(--magenta)}.masthead .legend{color:var(--ink-soft);font-size:12.5px}.cycle-tag{font-family:var(--font-data);color:var(--blue);border:1px solid var(--blue);white-space:nowrap;border-radius:2px;margin-left:auto;padding:2px 8px;font-size:12px}.panel{border:1px solid var(--ink);background:#fffef7;margin-top:22px;padding:16px 18px}.panel h2{font-size:13px;font-family:var(--font-data);text-transform:uppercase;letter-spacing:.08em;color:var(--ink-soft);margin:0 0 8px}.upload-row{flex-wrap:wrap;align-items:center;gap:12px;display:flex}.btn{font-family:var(--font-ui);border:1.5px solid var(--ink);background:var(--chart-deep);color:var(--ink);cursor:pointer;border-radius:2px;padding:8px 14px;font-size:14px}.btn:hover{background:var(--chart)}.btn:focus-visible{outline:3px solid var(--blue);outline-offset:2px}.btn.primary{background:var(--magenta);border-color:var(--magenta);color:#fff}.btn.primary:hover{filter:brightness(1.08)}.btn:disabled{opacity:.45;cursor:not-allowed}.hint{color:var(--ink-soft);font-size:12.5px}.notice{color:var(--magenta);font-size:13.5px}.notice.ok{color:var(--ok)}.state-grid{grid-template-columns:repeat(auto-fill,minmax(148px,1fr));gap:12px;margin-top:26px;display:grid}.state-tile{border:1px solid var(--ink);cursor:pointer;background:#fffef7;flex-direction:column;align-items:center;gap:6px;padding:12px 10px 10px;transition:transform .12s;display:flex}.state-tile:hover{transform:translateY(-2px)}.state-tile:focus-visible{outline:3px solid var(--blue);outline-offset:2px}.state-tile.complete{border-color:var(--magenta);box-shadow:0 0 0 1px var(--magenta)}.state-code{font-family:var(--font-data);letter-spacing:.06em;font-size:22px;font-weight:700}.state-count{font-family:var(--font-data);color:var(--ink-soft);font-size:12px}@media (prefers-reduced-motion:reduce){.state-tile,.ring-progress{transition:none!important}}.ring{display:block}.ring-track{stroke:var(--chart-deep)}.ring-progress{stroke:var(--magenta);transition:stroke-dashoffset .5s}.ring-pct{font-family:var(--font-data);fill:var(--ink);font-size:13px}.ring-ticks line{stroke:var(--magenta);stroke-width:2px}.detail-head{align-items:center;gap:14px;margin-top:26px;display:flex}.detail-head h2{font-family:var(--font-data);margin:0;font-size:22px}.back{margin-left:auto}.airport-cols{grid-template-columns:1fr 1fr;gap:18px;margin-top:14px;display:grid}@media (width<=720px){.airport-cols{grid-template-columns:1fr}}.airport-list{border:1px solid var(--ink);background:#fffef7}.airport-list h3{font-family:var(--font-data);text-transform:uppercase;letter-spacing:.08em;border-bottom:1px solid var(--ink);margin:0;padding:8px 12px;font-size:12.5px}.airport-list.visited h3{color:var(--ok)}.airport-list.unvisited h3{color:var(--magenta)}.airport-list ul{max-height:420px;margin:0;padding:6px 0;list-style:none;overflow-y:auto}.airport-list li{gap:10px;padding:4px 12px;font-size:13.5px;display:flex}.airport-list li .ident{font-family:var(--font-data);color:var(--blue);min-width:46px;font-weight:700}.empty{color:var(--ink-soft);padding:12px;font-size:13px}.footer{border-top:1px solid var(--contour);color:var(--ink-soft);margin-top:40px;padding-top:12px;font-size:12px}.state-map{padding:10px 12px 4px}.state-map svg{width:100%;height:auto;display:block}.map-state{fill:var(--magenta);fill-opacity:.06;stroke:var(--ink);stroke-width:.75px;stroke-linejoin:round;cursor:pointer;transition:fill-opacity .15s}.map-state:hover{stroke-width:1.75px}.map-state.complete{fill-opacity:1}.map-state.nodata{fill:var(--chart-deep);fill-opacity:1;cursor:default}.map-note{margin:6px 2px 8px}.masthead svg{align-self:center}.footer .credit{margin-top:6px;display:block}.footer .credit a{color:var(--magenta);text-decoration:none}.footer .credit a:hover{text-decoration:underline}
