/* v4.0 build401 preview · graphite background pass */
:root{
  color-scheme:dark;
  --bg:#050607;--bg2:#080a0b;--panel:#0a0d0f;--panel2:#0d1113;--panel3:#111619;
  --line:#283035;--line2:#1d2428;--text:#f3f7f8;--muted:#a4b3ba;--faint:#70828b;
  --live:#59e1b1;--blue:#68c7ff;--amber:#f3bd66;--red:#ff7479;--violet:#a895ff;--cyan:#65e3e8;
  --display:Bahnschrift,"Arial Narrow","Segoe UI Variable Display","Segoe UI",sans-serif;
  --ui:"Segoe UI Variable Text","Segoe UI",system-ui,sans-serif;
  --mono:"Cascadia Mono","SFMono-Regular",Consolas,monospace;
  --shadow:0 22px 70px rgba(0,0,0,.22);
}
*{box-sizing:border-box}html,body{margin:0;min-height:100%;background:var(--bg);color:var(--text);font-family:var(--ui);font-size:15px}body{background:
 radial-gradient(circle at 88% -12%,rgba(104,199,255,.025),transparent 36rem),
 radial-gradient(circle at 15% 0,rgba(89,225,177,.014),transparent 30rem),
 linear-gradient(180deg,#090c0e 0,#050607 40rem,#030405 100%)}
body:before{content:"";position:fixed;inset:0;pointer-events:none;opacity:.30;background-image:linear-gradient(rgba(255,255,255,.012) 1px,transparent 1px),linear-gradient(90deg,rgba(255,255,255,.009) 1px,transparent 1px);background-size:64px 64px;mask-image:linear-gradient(to bottom,black,transparent 82%)}
button,select,input{font:inherit}button{cursor:pointer}.mono{font-family:var(--mono)}
.shell{min-height:100vh}.topbar{height:70px;border-bottom:1px solid var(--line);display:grid;grid-template-columns:auto 1fr auto;align-items:center;gap:30px;padding:0 28px;position:sticky;top:0;z-index:50;background:rgba(8,10,11,.95);backdrop-filter:blur(18px)}
.brand{display:flex;align-items:center;gap:13px;min-width:240px}.brandmark{width:36px;height:36px;border:1px solid #35505d;position:relative;background:linear-gradient(145deg,#111619,#090c0d);box-shadow:inset 0 0 0 1px rgba(255,255,255,.02)}.brandmark:before{content:"";position:absolute;left:8px;right:8px;top:17px;height:1px;background:linear-gradient(90deg,var(--live),var(--blue));transform:rotate(-28deg)}.brandmark:after{content:"";position:absolute;width:6px;height:6px;border-radius:50%;right:7px;top:7px;background:var(--live);box-shadow:0 0 12px rgba(89,225,177,.45)}
.brand b{font:800 15px/1 var(--display);letter-spacing:.12em}.brand small{display:block;margin-top:5px;color:var(--faint);font:700 10px/1 var(--mono);letter-spacing:.08em}.mainnav{height:100%;display:flex;align-items:stretch;gap:4px}.mainnav button{border:0;border-bottom:2px solid transparent;background:transparent;color:var(--faint);font:800 12px/1 var(--mono);letter-spacing:.055em;padding:0 18px}.mainnav button:hover{color:var(--muted);background:#0d1113}.mainnav button.active{color:var(--text);border-bottom-color:var(--blue);background:linear-gradient(180deg,transparent,#101518)}
.live-status{display:flex;align-items:center;gap:18px;color:var(--muted);font:750 11px/1 var(--mono)}.statusdot{width:8px;height:8px;border-radius:50%;background:var(--live);box-shadow:0 0 0 5px rgba(89,225,177,.08),0 0 14px rgba(89,225,177,.2)}.rules{padding:8px 10px;border:1px solid #285044;background:#0a1915;color:var(--live)}
.page{max-width:1880px;margin:auto;padding:26px 28px 60px}.event-head{display:grid;grid-template-columns:minmax(420px,1fr) minmax(430px,.8fr);gap:28px;align-items:end;margin-bottom:19px}.eyebrow{font:800 12px/1 var(--mono);color:var(--blue);letter-spacing:.13em;margin-bottom:12px}.event-title{font:820 clamp(46px,5vw,82px)/.86 var(--display);letter-spacing:-.045em;margin:0;text-transform:uppercase}.event-meta{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-top:17px;color:var(--muted);font:700 12px/1 var(--mono)}.sep{width:1px;height:13px;background:var(--line)}
.event-controls{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:14px;align-items:end}.fieldlabel{display:block;color:var(--faint);font:800 11px/1 var(--mono);letter-spacing:.09em;margin-bottom:8px}.select-wrap{position:relative}.category-select{width:100%;appearance:none;background:linear-gradient(180deg,#141a1d,#101416);color:var(--text);border:1px solid #35505d;padding:14px 42px 14px 15px;font:750 15px/1 var(--ui);outline:none}.select-wrap:after{content:"⌄";position:absolute;right:14px;bottom:14px;color:var(--blue);pointer-events:none}.update{text-align:right;white-space:nowrap}.update b{display:block;font:800 25px/1 var(--mono)}.update span{display:block;margin-top:7px;color:var(--faint);font:700 10px/1 var(--mono);letter-spacing:.08em}
.category-strip{display:flex;gap:8px;overflow:auto;padding:0 0 15px;margin-bottom:17px;border-bottom:1px solid var(--line)}.cat-pill{min-width:190px;border:1px solid var(--line);background:#0d1113;color:var(--muted);padding:11px 13px;text-align:left}.cat-pill:hover{border-color:#3a5664;background:#111619}.cat-pill.active{border-color:#4a7182;background:linear-gradient(180deg,#161c1f,#0f1315);box-shadow:inset 0 -2px var(--blue)}.cat-pill b{display:block;color:var(--text);font:780 13px/1.15 var(--ui);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.cat-pill small{display:flex;justify-content:space-between;gap:10px;margin-top:8px;font:700 10px/1 var(--mono);color:var(--faint)}
.view{display:none}.view.active{display:block}.toolbar{min-height:56px;border:1px solid var(--line);background:rgba(13,17,19,.78);display:flex;align-items:center;justify-content:space-between;gap:18px;padding:9px 12px;margin-bottom:14px}.toolbar-left,.toolbar-right{display:flex;align-items:center;gap:9px;flex-wrap:wrap}.seg{display:flex;border:1px solid var(--line)}.seg button{border:0;border-right:1px solid var(--line);background:#0d1113;color:var(--muted);padding:10px 13px;font:750 11px/1 var(--mono)}.seg button:last-child{border:0}.seg button.active{color:var(--text);background:#171d20;box-shadow:inset 0 -2px var(--blue)}.search{height:36px;min-width:230px;border:1px solid var(--line);background:#0b0e10;color:var(--text);padding:0 12px;outline:none}.search:focus{border-color:#4a7182}.follow-label{font:750 11px/1 var(--mono);color:var(--faint)}.follow-call{color:var(--live);font-weight:800}.ghost-btn{border:1px solid var(--line);background:#101315;color:var(--muted);padding:9px 12px;font:750 11px/1 var(--mono)}.ghost-btn:hover{color:var(--text);border-color:#466271}
.summary-rail{display:grid;grid-template-columns:1.25fr .9fr .9fr .9fr .72fr;border:1px solid var(--line);margin-bottom:14px;background:linear-gradient(180deg,#101518,#0c1012);box-shadow:var(--shadow)}.summary-stat{min-height:105px;padding:17px 18px;border-right:1px solid var(--line);position:relative}.summary-stat:last-child{border:0}.summary-stat.leader:before{content:"";position:absolute;left:0;top:0;bottom:0;width:3px;background:var(--live)}.k{color:var(--faint);font:800 10px/1 var(--mono);letter-spacing:.095em}.big-call{font:820 26px/1 var(--display);margin-top:10px}.big-num{font:800 29px/1 var(--mono);letter-spacing:-.035em;margin-top:8px}.sub{color:var(--muted);font:650 11px/1.35 var(--mono);margin-top:9px}.good{color:var(--live)}.cold{color:var(--blue)}.warn{color:var(--amber)}.bad{color:var(--red)}
.surface{border:1px solid var(--line);background:linear-gradient(180deg,rgba(16,20,22,.90),rgba(9,12,14,.94));box-shadow:0 15px 45px rgba(0,0,0,.14)}.surface-head{min-height:54px;border-bottom:1px solid var(--line);display:flex;align-items:center;justify-content:space-between;gap:16px;padding:10px 15px}.surface-title{font:800 12px/1 var(--mono);letter-spacing:.09em;color:var(--muted)}.surface-meta{font:700 10px/1 var(--mono);color:var(--faint)}
.board{overflow:hidden}.board-head,.board-row{display:grid;grid-template-columns:38px minmax(130px,1fr) minmax(118px,.84fr) 78px 68px 92px 96px 64px minmax(120px,1fr) 36px 38px 18px!important;align-items:center}.board-head{min-height:43px;padding:0 14px;color:var(--faint);font:800 10px/1 var(--mono);letter-spacing:.05em;border-bottom:1px solid var(--line)}.board-row{min-height:76px;padding:0 14px;border-bottom:1px solid var(--line2);position:relative;transition:background .2s ease,transform .45s cubic-bezier(.2,.8,.2,1);cursor:pointer}.board-row:hover{background:#141a1d}.board-row.leader{background:linear-gradient(90deg,rgba(89,225,177,.06),transparent 54%)}.board-row.leader:before{content:"";position:absolute;left:0;top:0;bottom:0;width:3px;background:var(--live)}.pos{font:800 19px/1 var(--mono);color:var(--muted)}.board-row.leader .pos{color:var(--text)}.station-call{font:820 21px/1 var(--display)}.station-meta{font:650 10px/1.2 var(--mono);color:var(--faint);margin-top:7px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.score-main{font:790 22px/1 var(--mono);font-variant-numeric:tabular-nums}.score-gap{font:680 10px/1 var(--mono);color:var(--muted);margin-top:7px}.cell-num{font:760 14px/1 var(--mono)}.cell-sub{font:650 9px/1 var(--mono);color:var(--faint);margin-top:7px}.velocity{font:800 11px/1 var(--mono)}.move{font:800 11px/1 var(--mono)}.detail-arrow{font:800 19px/1 var(--mono);color:var(--faint);transition:transform .2s,color .2s}.board-row:hover .detail-arrow{transform:translateX(3px);color:var(--blue)}.star{appearance:none;background:transparent;border:0;color:#49606c;padding:6px;font-size:15px}.star.on{color:var(--amber)}
.category-board{margin-bottom:18px}.category-board .board-row{min-height:69px}.category-board-head{display:flex;align-items:center;justify-content:space-between;padding:12px 15px;border-bottom:1px solid var(--line);background:#12171a}.category-board-head h3{margin:0;font:800 17px/1 var(--display)}.category-board-head span{color:var(--faint);font:700 10px/1 var(--mono)}
.race-grid{display:grid;grid-template-columns:minmax(0,1.45fr) minmax(360px,.65fr);gap:16px}.battle-hero{border:1px solid var(--line);background:linear-gradient(135deg,#141a1d,#09151a 62%);display:grid;grid-template-columns:1fr 180px 1fr;align-items:center;min-height:174px;padding:22px 24px;margin-bottom:16px;position:relative;overflow:hidden}.battle-hero:after{content:"";position:absolute;inset:auto 0 0;height:2px;background:linear-gradient(90deg,var(--live),var(--blue),var(--amber));opacity:.7}.battle-side.right{text-align:right}.battle-label{font:800 10px/1 var(--mono);color:var(--faint);letter-spacing:.1em}.battle-call{font:820 34px/1 var(--display);margin-top:11px}.battle-score{font:800 27px/1 var(--mono);margin-top:8px}.battle-mid{text-align:center;border-left:1px solid var(--line);border-right:1px solid var(--line);padding:10px}.battle-mid .gapnum{font:800 26px/1 var(--mono)}.battle-mid .eta{margin-top:12px;color:var(--amber);font:800 16px/1 var(--mono)}
.chart-panel{min-width:0}.chart-host{height:360px;position:relative;padding:8px 10px 4px}.chart-host.tall{height:440px}.chart-host.small{height:270px}.chart-svg{width:100%;height:100%;display:block;overflow:visible}.chart-axis{fill:var(--faint);font:650 10px var(--mono)}.chart-grid{stroke:#1b303a;stroke-width:1;stroke-dasharray:2 7}.chart-line{fill:none;stroke-width:2.2;vector-effect:non-scaling-stroke;stroke-linecap:round;stroke-linejoin:round;animation:drawLine .8s ease both}.chart-line.leader{stroke-width:3}.chart-area{opacity:.08}.chart-end{font:800 11px var(--mono)}@keyframes drawLine{from{stroke-dasharray:1600;stroke-dashoffset:1600}to{stroke-dasharray:1600;stroke-dashoffset:0}}.legend{display:flex;gap:14px;flex-wrap:wrap;align-items:center}.legend-item{display:flex;align-items:center;gap:7px;color:var(--muted);font:750 10px/1 var(--mono)}.legend-dot{width:8px;height:8px;border-radius:50%}.chart-toolbar{display:flex;gap:6px;align-items:center;flex-wrap:wrap}.chart-toolbar button{border:1px solid transparent;background:transparent;color:var(--faint);padding:8px 10px;font:750 10px/1 var(--mono)}.chart-toolbar button.active{color:var(--text);border-color:#344d59;background:#141a1d}.chart-toolbar select{border:1px solid var(--line);background:#0f1315;color:var(--muted);padding:8px 10px;font:700 10px/1 var(--mono)}
.race-stack{display:grid;gap:16px}.race-two{display:grid;grid-template-columns:1.45fr .75fr;gap:16px}.race-director{padding:5px 15px 12px}.event-line{display:grid;grid-template-columns:10px 1fr;gap:10px;padding:13px 0;border-bottom:1px solid var(--line2)}.event-dot{width:8px;height:8px;border-radius:50%;margin-top:5px;background:var(--blue)}.event-line strong{font:760 13px/1.2 var(--ui)}.event-line small{display:block;color:var(--faint);font:650 10px/1.35 var(--mono);margin-top:5px}
.band-table{width:100%;border-collapse:collapse}.band-table th,.band-table td{padding:12px 13px;border-bottom:1px solid var(--line2);text-align:left}.band-table th{color:var(--faint);font:800 10px var(--mono)}.band-table td{font:700 12px var(--mono)}.band-name{font:820 18px var(--display)!important}.active-now{display:flex;gap:5px;flex-wrap:wrap}.active-chip{border:1px solid #2b4653;background:#111619;padding:4px 6px;color:var(--muted);font:750 9px var(--mono)}
.compare-select{padding:14px 15px;border-bottom:1px solid var(--line);display:flex;gap:7px;flex-wrap:wrap}.call-chip{border:1px solid var(--line);background:#0e1214;color:var(--muted);padding:8px 10px;font:750 11px var(--mono)}.call-chip.on{border-color:#4c7687;background:#161d20;color:var(--text)}
.replay-layout{display:grid;grid-template-columns:minmax(0,1.4fr) minmax(330px,.6fr);gap:16px}.replay-controls{display:grid;grid-template-columns:auto auto 1fr auto;gap:12px;align-items:center;padding:13px 15px;border-bottom:1px solid var(--line)}.play-btn{border:1px solid #3b5663;background:#141a1d;color:var(--text);padding:9px 14px;font:800 11px var(--mono)}.speed-select{border:1px solid var(--line);background:#0d1113;color:var(--muted);padding:9px 10px}.replay-slider{width:100%;accent-color:var(--live)}.replay-clock{font:800 12px var(--mono);color:var(--blue)}.mini-standings{padding:5px 14px 14px}.mini-row{display:grid;grid-template-columns:40px 1fr auto;gap:10px;align-items:center;padding:10px 0;border-bottom:1px solid var(--line2);transition:transform .35s ease}.mini-row .r{font:800 14px var(--mono);color:var(--faint)}.mini-row .c{font:820 16px var(--display)}.mini-row .s{text-align:right;font:760 12px var(--mono)}
.empty{padding:50px 20px;text-align:center;color:var(--faint);font:700 12px var(--mono)}.records-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:16px}.record-card{min-height:210px;padding:20px;border:1px solid var(--line);background:linear-gradient(160deg,#141a1d,#09151a)}.record-card h3{margin:0;color:var(--faint);font:800 11px var(--mono);letter-spacing:.1em}.record-score{font:800 35px/1 var(--mono);margin-top:26px}.record-call{font:820 22px/1 var(--display);margin-top:11px}.record-note{color:var(--muted);font:650 11px/1.45 var(--mono);margin-top:18px}
.drawer-backdrop{position:fixed;inset:0;background:rgba(0,0,0,.56);z-index:90;opacity:0;animation:fadeIn .18s forwards}.drawer{position:fixed;right:0;top:0;bottom:0;width:min(820px,72vw);z-index:91;background:#0b0f11;border-left:1px solid #35515d;box-shadow:-28px 0 80px rgba(0,0,0,.42);transform:translateX(100%);animation:drawerIn .34s cubic-bezier(.2,.8,.2,1) forwards;display:flex;flex-direction:column}.drawer-head{padding:22px 24px 18px;border-bottom:1px solid var(--line);background:linear-gradient(180deg,#141a1d,#0e1214)}.drawer-close{position:absolute;right:20px;top:19px;width:36px;height:36px;border:1px solid var(--line);background:#0e1214;color:var(--muted);font-size:20px}.drawer-close:hover{color:var(--text)}.drawer-kicker{color:var(--blue);font:800 11px var(--mono);letter-spacing:.1em}.drawer-call{font:820 44px/1 var(--display);margin-top:9px}.drawer-meta{display:flex;gap:10px;flex-wrap:wrap;color:var(--muted);font:700 11px var(--mono);margin-top:11px}.drawer-stats{display:grid;grid-template-columns:1.2fr repeat(4,1fr);border-top:1px solid var(--line);margin-top:18px}.drawer-stat{padding:13px 13px 2px;border-right:1px solid var(--line)}.drawer-stat:first-child{padding-left:0}.drawer-stat:last-child{border:0}.drawer-stat b{display:block;font:800 18px var(--mono);margin-top:7px}.drawer-stat.score b{font-size:26px}.drawer-tabs{height:54px;display:flex;border-bottom:1px solid var(--line);padding:0 20px}.drawer-tabs button{border:0;border-bottom:2px solid transparent;background:transparent;color:var(--faint);font:800 11px var(--mono);padding:0 15px}.drawer-tabs button.active{color:var(--text);border-bottom-color:var(--blue)}.drawer-body{overflow:auto;padding:18px 20px 40px}.drawer-pane{display:none}.drawer-pane.active{display:block}.detail-grid{display:grid;grid-template-columns:1fr 1fr;gap:14px}.detail-card{border:1px solid var(--line);background:#0e1214;padding:15px}.detail-card h4{margin:0;color:var(--faint);font:800 10px var(--mono);letter-spacing:.08em}.detail-card .value{font:800 24px var(--mono);margin-top:11px}.hourly-table{width:100%;border-collapse:collapse}.hourly-table th,.hourly-table td{padding:11px 10px;border-bottom:1px solid var(--line2);text-align:right;font:700 11px var(--mono)}.hourly-table th{color:var(--faint)}.hourly-table th:first-child,.hourly-table td:first-child{text-align:left}.band-bars{display:grid;gap:12px;padding:12px 2px}.band-row{display:grid;grid-template-columns:48px 1fr 76px 70px;gap:10px;align-items:center}.band-row .bn{font:820 17px var(--display)}.bar-track{height:11px;background:#11252e;position:relative;overflow:hidden}.bar-fill{height:100%;background:linear-gradient(90deg,var(--blue),var(--live));transform-origin:left;animation:barGrow .65s ease both}.band-row .bv{text-align:right;font:760 11px var(--mono)}@keyframes barGrow{from{transform:scaleX(0)}to{transform:scaleX(1)}}
.chart-tooltip{position:fixed;z-index:120;pointer-events:none;background:#090c0e;border:1px solid #3b5966;box-shadow:0 12px 38px rgba(0,0,0,.38);padding:9px 11px;min-width:140px;color:var(--text);font:700 10px/1.45 var(--mono)}
.toast{position:fixed;right:24px;bottom:24px;z-index:150;background:#12171a;border:1px solid #35515e;padding:11px 14px;color:var(--muted);font:700 11px var(--mono);box-shadow:var(--shadow)}
@keyframes fadeIn{to{opacity:1}}@keyframes drawerIn{to{transform:none}}
@media(max-width:1260px){.event-head{grid-template-columns:1fr}.event-controls{grid-template-columns:1fr auto}.summary-rail{grid-template-columns:1.3fr 1fr 1fr}.summary-stat:nth-child(n+4){display:none}.board-head,.board-row{grid-template-columns:38px minmax(130px,1fr) minmax(118px,.84fr) 78px 68px 92px 96px 64px minmax(120px,1fr) 36px 38px 18px}.board-head>:nth-child(8),.board-row>:nth-child(8){display:none}.race-grid,.replay-layout{grid-template-columns:1fr}.race-two{grid-template-columns:1fr}.drawer{width:min(880px,88vw)}}
@media(max-width:850px){.topbar{grid-template-columns:1fr auto;padding:0 16px}.mainnav{position:fixed;left:0;right:0;bottom:0;height:56px;background:#090c0d;border-top:1px solid var(--line);z-index:70;justify-content:space-around}.mainnav button{padding:0 9px}.brand{min-width:0}.brand-copy small{display:none}.page{padding:20px 14px 78px}.event-title{font-size:43px}.event-controls{grid-template-columns:1fr}.update{text-align:left}.summary-rail{grid-template-columns:1fr 1fr}.summary-stat{min-height:96px}.summary-stat:nth-child(3){display:none}.board{overflow:auto}.board-head,.board-row{min-width:850px}.drawer{width:100vw}.detail-grid{grid-template-columns:1fr}.records-grid{grid-template-columns:1fr}.battle-hero{grid-template-columns:1fr;gap:14px}.battle-mid{border:0;border-top:1px solid var(--line);border-bottom:1px solid var(--line)}.battle-side.right{text-align:left}}

/* v1.1 professional timing refinements */
.event-head.compact{grid-template-columns:minmax(300px,.72fr) minmax(680px,1.28fr);align-items:end;margin-bottom:14px}
.event-head.compact .event-title{font-size:clamp(30px,3.1vw,52px);line-height:.94;letter-spacing:-.025em}
.event-head.compact .eyebrow{margin-bottom:8px;font-size:10px}
.event-head.compact .event-meta{margin-top:10px;font-size:10px}
.pro-controls{grid-template-columns:minmax(300px,1fr) minmax(210px,.62fr) auto;gap:12px}
.my-station-select{border-color:#315d50;box-shadow:inset 3px 0 0 rgba(89,225,177,.75)}

.reference-strip{display:grid;grid-template-columns:minmax(150px,.58fr) repeat(3,minmax(215px,1fr)) auto;border:1px solid var(--line);background:linear-gradient(180deg,#101518,#0b0f11);margin:0 0 16px;min-height:98px;overflow:hidden}
.reference-context{padding:15px 16px;border-right:1px solid var(--line);display:flex;flex-direction:column;justify-content:center}.reference-kicker{font:800 10px/1.35 var(--mono);color:var(--muted);letter-spacing:.08em}.reference-elapsed{font:800 16px/1 var(--mono);color:var(--text);margin-top:10px}
.reference-card{padding:14px 16px;border-right:1px solid var(--line);position:relative;overflow:hidden}.reference-card:after{content:"";position:absolute;left:0;right:0;bottom:0;height:2px;background:var(--blue);opacity:.55}.reference-card.wr:after{background:var(--amber)}.reference-card.cr:after{background:var(--blue)}.reference-card.custom:after{background:var(--violet)}.reference-card.empty-ref{opacity:.58}.reference-top{display:flex;justify-content:space-between;gap:10px}.reference-label{font:800 9px/1 var(--mono);letter-spacing:.09em;color:var(--faint)}.reference-year{font:700 9px/1 var(--mono);color:var(--faint)}.reference-main{font:800 22px/1 var(--mono);margin-top:8px}.reference-call{font:760 11px/1 var(--display);color:var(--muted);margin-top:5px}.reference-pace{display:flex;justify-content:space-between;gap:12px;align-items:center;margin-top:9px;font:700 9px/1 var(--mono);color:var(--faint)}.reference-pace b{font-size:11px}
.reference-actions{padding:12px;display:flex;flex-direction:column;justify-content:center;gap:7px;min-width:132px}.target-action{border:1px solid #3a5865;background:#141a1d;color:var(--text);padding:9px 10px;font:800 9px/1 var(--mono);letter-spacing:.04em}.target-action:hover{border-color:var(--blue)}.target-action.subtle{background:transparent;color:var(--faint)}.reference-loading{grid-column:1/-1;padding:26px;color:var(--faint);font:700 10px var(--mono)}

.surface-subtitle{font:650 10px/1.3 var(--mono);color:var(--faint);margin-top:6px}.pro-toolbar{margin-bottom:12px}
.board-head.pro,.board-row.pro{grid-template-columns:38px minmax(130px,1fr) minmax(118px,.84fr) 78px 68px 92px 96px 64px minmax(120px,1fr) 36px 38px 18px}
.board-row.pro{min-height:82px;isolation:isolate;overflow:hidden}.board-row.pro:after{content:"";position:absolute;z-index:-2;left:0;top:0;bottom:0;width:var(--score-fill);background:linear-gradient(90deg,rgba(104,199,255,.072),rgba(104,199,255,.018) 72%,transparent);transition:width .7s cubic-bezier(.2,.8,.2,1)}.board-row.pro.leader:after{background:linear-gradient(90deg,rgba(89,225,177,.11),rgba(89,225,177,.025) 72%,transparent)}.board-row.pro.mine{box-shadow:inset 0 0 0 1px rgba(89,225,177,.28);background-color:rgba(89,225,177,.014)}.board-row.pro.mine:before{content:"";position:absolute;left:0;top:0;bottom:0;width:4px;background:var(--live);z-index:2}.mine-tag{display:inline-block;margin-left:9px;padding:3px 5px;border:1px solid #2d6554;color:var(--live);font:800 8px/1 var(--mono);vertical-align:3px}.station-cell{min-width:0}.band-now{font:820 15px/1 var(--display);color:var(--blue)}.freshness{font:800 11px/1 var(--mono);color:var(--live)}.freshness.stale-warn{color:var(--amber)}.freshness.stale-critical{color:var(--red)}.board-row.stale-warn{background-image:linear-gradient(90deg,rgba(243,189,102,.035),transparent 35%)}.board-row.stale-critical{opacity:.72;background-image:linear-gradient(90deg,rgba(255,116,121,.055),transparent 40%)}.board-row.stale-critical .station-call:after{content:" STALE";color:var(--red);font:800 8px var(--mono);margin-left:8px;vertical-align:2px}
.board-row.pro .station-call{font-size:22px}.board-row.pro .score-main{font-size:21px}.board-row.pro .cell-num{font-size:14px}.board-row.pro .cell-sub{font-size:9px}

.drawer-backdrop.closing{animation:backdropOut .32s ease forwards}.drawer.closing{animation:drawerOut .34s cubic-bezier(.4,0,.8,.2) forwards}.drawer{width:min(920px,74vw)}
@keyframes drawerOut{to{transform:translateX(100%)}}@keyframes backdropOut{to{opacity:0}}
.drawer-meta{font-size:10px}.drawer-tabs{overflow-x:auto}.drawer-tabs button{white-space:nowrap}.duel-strip{display:grid;grid-template-columns:1fr 140px 1fr;border-bottom:1px solid var(--line);min-height:96px}.duel-strip>div{padding:16px 18px}.duel-strip>div.right{text-align:right}.duel-strip span{display:block;color:var(--faint);font:800 9px/1 var(--mono);letter-spacing:.07em}.duel-strip b{display:block;font:800 23px/1 var(--mono);margin-top:9px}.duel-strip small{display:block;color:var(--muted);font:700 10px/1 var(--mono);margin-top:7px}.duel-gap{text-align:center;border-left:1px solid var(--line);border-right:1px solid var(--line);display:flex;flex-direction:column;justify-content:center}.duel-gap b{font-size:17px!important}

.replay-flow{display:grid;grid-template-columns:auto 1fr auto;gap:12px;align-items:center;padding:10px 15px;border-bottom:1px solid var(--line2)}.flow-label,.flow-note{font:750 9px/1 var(--mono);color:var(--faint)}.flow-track{height:3px;background:#181e21;overflow:hidden}.flow-track span{display:block;height:100%;width:0;background:linear-gradient(90deg,var(--live),var(--blue));transition:width .08s linear}.chart-line.no-animate{animation:none!important}.mini-row{will-change:transform}

.records-hero{display:flex;align-items:end;justify-content:space-between;gap:22px;padding:18px 20px;border:1px solid var(--line);background:linear-gradient(135deg,#151b1e,#0d1113);margin-bottom:15px}.records-title{font:820 27px/1 var(--display);margin-top:10px}.records-actions{display:flex;gap:8px}.records-grid.pro{margin-bottom:16px}.records-grid.pro .record-card{min-height:240px}.record-card.wr{box-shadow:inset 0 2px var(--amber)}.record-card.cr{box-shadow:inset 0 2px var(--blue)}.record-card.custom{box-shadow:inset 0 2px var(--violet)}.record-live{display:flex;justify-content:space-between;gap:14px;border-top:1px solid var(--line2);padding-top:10px;margin-top:10px;font:700 10px/1 var(--mono);color:var(--faint)}.record-live b{color:var(--text);font-size:12px}.record-live b.good{color:var(--live)}.record-live b.bad{color:var(--red)}.records-chart{margin-top:16px}

@media(max-width:1500px){.board-head.pro,.board-row.pro{grid-template-columns:38px minmax(130px,1fr) minmax(118px,.84fr) 78px 68px 92px 96px 64px minmax(120px,1fr) 36px 38px 18px}.reference-strip{grid-template-columns:minmax(130px,.5fr) repeat(3,minmax(185px,1fr)) auto}.event-head.compact{grid-template-columns:1fr}.pro-controls{grid-template-columns:1fr .7fr auto}}
@media(max-width:1260px){.board-head.pro,.board-row.pro{min-width:1160px}.board{overflow:auto}.reference-strip{overflow-x:auto;grid-template-columns:170px repeat(3,230px) 135px}.drawer{width:min(950px,90vw)}}
@media(max-width:850px){.event-head.compact .event-title{font-size:34px}.pro-controls{grid-template-columns:1fr}.reference-strip{grid-template-columns:160px repeat(3,220px) 130px}.drawer{width:100vw}.records-hero{align-items:flex-start;flex-direction:column}.records-actions{width:100%}.records-actions button{flex:1}}

/* v1.2 cockpit platform */
.pro-shell{min-height:100vh;display:grid;grid-template-columns:128px minmax(0,1fr);background:#090c0d}.side-rail{position:sticky;top:0;height:100vh;border-right:1px solid var(--line);background:#090c0d;display:flex;flex-direction:column;z-index:70}.rail-brand{height:82px;border-bottom:1px solid var(--line);display:flex;align-items:center;gap:10px;padding:0 14px}.rail-brand .brandmark{width:34px;height:34px;flex:0 0 auto}.rail-brand b{display:block;font:900 15px/1 var(--display);letter-spacing:.08em}.rail-brand small{display:block;margin-top:4px;color:var(--faint);font:800 8px/1.1 var(--mono);letter-spacing:.12em}.rail-nav{padding:10px 8px;display:grid;gap:4px}.rail-nav button{height:54px;border:1px solid transparent;background:transparent;color:#758a95;display:grid;grid-template-columns:22px 1fr;align-items:center;text-align:left;padding:0 10px;font:850 10px/1 var(--mono);letter-spacing:.07em}.rail-nav button span{font-size:14px;color:#587381}.rail-nav button:hover{background:#101518;color:var(--text)}.rail-nav button.active{background:#12181b;border-color:#1d3845;color:var(--text);box-shadow:inset 3px 0 var(--blue)}.rail-nav button.active span{color:var(--blue)}.rail-feeds{margin-top:auto;padding:12px;border-top:1px solid var(--line);display:grid;gap:9px}.rail-feeds div{display:flex;align-items:center;gap:8px;color:#6f848e;font:750 9px/1 var(--mono)}.rail-feeds i{width:7px;height:7px;border-radius:50%;background:#344a54}.rail-feeds i.on{background:var(--live);box-shadow:0 0 10px rgba(89,225,177,.35)}
.work-area{min-width:0}.pro-topbar{height:82px;border-bottom:1px solid var(--line);background:rgba(9,12,14,.96);display:grid;grid-template-columns:minmax(300px,1fr) minmax(540px,.9fr) auto auto;gap:22px;align-items:center;padding:0 22px;position:sticky;top:0;z-index:60;backdrop-filter:blur(18px)}.contest-lockup{display:flex;align-items:baseline;gap:11px;min-width:0}.contest-lockup .eyebrow{font-size:9px;margin:0;white-space:nowrap}.contest-lockup strong{font:900 clamp(24px,2vw,34px)/1 var(--display);letter-spacing:-.025em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.live-chip{padding:4px 6px;border:1px solid #2c6655;background:#0a1b16;color:var(--live);font:900 8px/1 var(--mono);letter-spacing:.09em}.header-fields{display:grid;grid-template-columns:minmax(280px,1fr) minmax(190px,.6fr);gap:10px}.header-fields label>span,.report-head label>span{display:block;margin-bottom:5px;color:#6f8793;font:850 8px/1 var(--mono);letter-spacing:.1em}.compact-select{width:100%;height:39px;appearance:none;border:1px solid #29434f;background:#0e1214;color:var(--text);padding:0 34px 0 11px;font:780 12px/1 var(--ui);outline:none}.mine-select{border-color:#2f5a4d;box-shadow:inset 2px 0 var(--live)}.header-clock{text-align:right;white-space:nowrap}.header-clock span{display:block;color:#637984;font:800 8px/1 var(--mono);letter-spacing:.08em}.header-clock b{display:block;margin-top:5px;font:850 20px/1 var(--mono)}.rules-chip{height:34px;border:1px solid #284f43;background:#091914;color:var(--live);padding:0 10px;display:flex;align-items:center;gap:7px;font:850 8px/1 var(--mono);letter-spacing:.08em}.rules-chip i{width:6px;height:6px;border-radius:50%;background:var(--live)}
.live-subnav{height:44px;border-bottom:1px solid var(--line);display:flex;align-items:stretch;background:#0b0e10;padding:0 18px;position:sticky;top:82px;z-index:55}.live-subnav.hidden{display:none}.live-subnav button{border:0;border-bottom:2px solid transparent;background:transparent;color:#758b96;padding:0 17px;font:850 10px/1 var(--mono);letter-spacing:.06em}.live-subnav button.active{color:var(--text);border-bottom-color:var(--blue);background:#101518}.category-mini{margin-left:auto;display:flex;align-items:center;gap:9px;color:#6f858f;font:750 9px/1 var(--mono);white-space:nowrap}.category-mini i{width:1px;height:11px;background:#29404a}.pro-page{max-width:2100px;margin:0 auto;padding:12px 16px 42px}
.pro-reference{display:grid;grid-template-columns:190px repeat(3,minmax(210px,1fr)) 92px;min-height:70px;margin-bottom:10px;border:1px solid var(--line);background:#0d1113;overflow:hidden}.ref-context,.ref-mini{padding:10px 13px;border-right:1px solid var(--line);display:flex;flex-direction:column;justify-content:center;min-width:0}.ref-context span,.ref-mini span{color:#6c838f;font:850 8px/1 var(--mono);letter-spacing:.09em}.ref-context b{font:850 15px/1 var(--display);margin-top:7px}.ref-context small,.ref-mini small{display:block;margin-top:5px;color:#7c909a;font:700 9px/1.25 var(--mono);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ref-mini b{font:850 18px/1 var(--mono);margin-top:7px}.ref-mini.wr{box-shadow:inset 0 2px var(--amber)}.ref-mini.cr{box-shadow:inset 0 2px var(--blue)}.ref-mini.custom{box-shadow:inset 0 2px var(--violet)}.ref-mini em{font-style:normal}.ref-import{border:0;background:#0c1a22;color:#91a8b2;font:850 9px/1 var(--mono);letter-spacing:.06em}.ref-import:hover{background:#11242d;color:var(--text)}
.cockpit-kpis,.report-kpis{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));border:1px solid var(--line);background:#0d1113;margin-bottom:10px}.metric-cell{min-height:94px;padding:13px 15px;border-right:1px solid var(--line);position:relative;overflow:hidden}.metric-cell:last-child{border:0}.metric-cell:before{content:"";position:absolute;left:0;top:0;bottom:0;width:3px;background:var(--blue)}.metric-cell.accent-live:before{background:var(--live)}.metric-cell.accent-amber:before{background:var(--amber)}.metric-cell.accent-violet:before{background:var(--violet)}.metric-cell>span{display:block;color:#6e8490;font:850 8px/1 var(--mono);letter-spacing:.1em}.metric-cell>b{display:block;margin-top:9px;font:850 29px/.95 var(--display);letter-spacing:-.025em}.metric-cell>b i{font:800 16px/1 var(--mono);font-style:normal;color:#c5d2d8}.metric-cell>small{display:block;margin-top:8px;color:#8ca0aa;font:700 10px/1.25 var(--mono)}
.cockpit-main-grid{display:grid;grid-template-columns:minmax(0,2.15fr) minmax(320px,.85fr);gap:10px;margin-bottom:10px}.performance-wide,.live-intel{min-height:300px}.cockpit-chart{height:245px}.intel-list{display:grid}.intel-event{min-height:58px;padding:11px 13px;border-bottom:1px solid var(--line2);display:grid;grid-template-columns:9px 1fr;gap:10px;align-items:center}.intel-event i{width:7px;height:7px;border-radius:50%;background:#607782}.intel-event i.live{background:var(--live)}.intel-event i.amber{background:var(--amber)}.intel-event i.blue{background:var(--blue)}.intel-event b{display:block;font:800 12px/1.2 var(--ui)}.intel-event small{display:block;margin-top:5px;color:#708791;font:700 9px/1.25 var(--mono)}.compact-empty{padding:20px!important;font-size:10px!important}
.cockpit-lower-grid{display:grid;grid-template-columns:minmax(0,1.62fr) minmax(430px,.9fr);gap:10px;margin-bottom:10px}.race-chart-pair{display:grid;grid-template-columns:1.45fr .85fr;gap:10px}.surface{border-radius:0!important}.surface-head{min-height:46px;padding:9px 13px}.surface-title{font-size:11px}.surface-subtitle{font-size:9px}.chart-host{min-height:230px}.chart-host.tall{min-height:340px}.chart-toolbar button,.chart-toolbar select{font-size:9px!important}
.board-toolbar{height:48px;border:1px solid var(--line);background:#0d1113;display:flex;align-items:center;gap:10px;padding:5px 8px;margin-bottom:10px}.board-toolbar .search{height:34px}.board-my{margin-left:auto;color:#6f858f;font:800 9px/1 var(--mono)}.board-my b{color:var(--live);font-size:11px}.pro-board{overflow:hidden}.board-head.telemetry,.board-row.telemetry{display:grid;grid-template-columns:54px minmax(150px,1.12fr) minmax(128px,.85fr) 72px 72px 94px 108px 82px 82px 94px 48px 24px;align-items:center}.board-head.telemetry{min-height:38px;padding:0 12px;color:#718893;font:850 8px/1 var(--mono);letter-spacing:.06em;border-bottom:1px solid var(--line)}.board-row.telemetry{min-height:66px;padding:0 12px;border-bottom:1px solid #172a33;position:relative;overflow:hidden;isolation:isolate;cursor:pointer;transition:background .18s ease,opacity .2s ease,transform .45s cubic-bezier(.2,.8,.2,1)}.board-row.telemetry:hover{background:#0f1f27}.board-row.telemetry .score-fill{position:absolute;z-index:-2;left:0;top:0;bottom:0;width:var(--score-fill);background:linear-gradient(90deg,rgba(104,199,255,.095),rgba(104,199,255,.025) 72%,transparent);transition:width .75s cubic-bezier(.2,.8,.2,1)}.board-row.telemetry.leader .score-fill{background:linear-gradient(90deg,rgba(89,225,177,.12),rgba(89,225,177,.025) 72%,transparent)}.board-row.telemetry.mine{box-shadow:inset 3px 0 var(--live),inset 0 0 0 1px rgba(89,225,177,.17)}.board-row.telemetry .pos{font:850 18px/1 var(--mono);color:#a5b5bd}.board-row.telemetry .station-call{font:850 19px/1 var(--display)}.station-meta{margin-top:5px;color:#70858f;font:700 8px/1 var(--mono);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mine-tag{font-size:7px}.score-main{font:850 19px/1 var(--mono)}.score-gap{margin-top:5px;color:#889ba4;font:750 8px/1 var(--mono)}.micro b,.active-cell b,.fresh-cell b{display:block;font:800 12px/1 var(--mono)}.micro small,.active-cell small,.fresh-cell small,.relative small{display:block;margin-top:5px;color:#6f858f;font:700 7px/1 var(--mono);text-transform:uppercase}.relative b{font:800 10px/1 var(--mono)}.active-cell b{color:var(--blue);font-size:13px}.fresh-cell b{color:var(--live);font-size:10px}.fresh-cell b.stale-warn{color:var(--amber)}.fresh-cell b.stale-critical{color:var(--red)}.row-spark{width:92px;height:28px}.row-spark svg{display:block;width:100%;height:100%}.move{font:850 10px/1 var(--mono)}.detail-arrow{font-size:22px;color:#6f8793}.board-row.stale-warn{background-image:linear-gradient(90deg,rgba(243,189,102,.045),transparent 38%)}.board-row.stale-critical{opacity:.68;background-image:linear-gradient(90deg,rgba(255,116,121,.07),transparent 45%)}
.band-table{font-size:10px}.band-table th{font-size:8px}.band-table td{padding:9px 10px}.band-name{font:850 16px/1 var(--display)}.active-chip{font-size:8px!important}
.report-head{min-height:94px;border:1px solid var(--line);background:#0d1113;margin-bottom:10px;padding:14px 16px;display:flex;align-items:end;justify-content:space-between;gap:20px}.report-head h2{margin:5px 0 0;font:850 28px/1 var(--display)}.report-head p{margin:7px 0 0;color:#718894;font:700 10px/1.35 var(--mono)}.report-head label{width:260px}.report-kpis{margin-bottom:10px}.report-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-bottom:10px}.report-grid.lower{grid-template-columns:1.2fr .8fr}.report-band-list{display:grid}.report-band{min-height:58px;border-bottom:1px solid var(--line2);display:grid;grid-template-columns:70px repeat(3,1fr);align-items:center;padding:0 13px}.report-band>b{font:850 18px/1 var(--display)}.report-band>div span{display:block;color:#6c838e;font:800 7px/1 var(--mono)}.report-band>div strong{display:block;margin-top:5px;font:800 13px/1 var(--mono)}.continent-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:1px;background:var(--line2)}.continent-grid>div{background:#0d1113;padding:14px}.continent-grid span{display:block;color:#728895;font:800 8px/1 var(--mono)}.continent-grid b{display:block;margin-top:7px;font:850 20px/1 var(--mono)}
.drawer{transition:transform .36s cubic-bezier(.16,.84,.24,1)!important}.drawer-backdrop{animation:fadeIn .28s ease both}.drawer.closing{animation:drawerOut .36s cubic-bezier(.4,0,.6,1) forwards!important}.drawer-backdrop.closing{animation:backdropOut .36s ease forwards!important}
@media(max-width:1500px){.pro-shell{grid-template-columns:104px minmax(0,1fr)}.pro-topbar{grid-template-columns:minmax(250px,.8fr) minmax(500px,1fr) auto}.rules-chip{display:none}.board-head.telemetry,.board-row.telemetry{grid-template-columns:50px minmax(135px,1fr) minmax(118px,.82fr) 64px 64px 88px 98px 72px 70px 82px 42px 20px}.board-row.telemetry .station-call{font-size:17px}.row-spark{width:80px}.cockpit-lower-grid{grid-template-columns:1.5fr 1fr}}
@media(max-width:1180px){.pro-shell{grid-template-columns:76px minmax(0,1fr)}.rail-brand>div:last-child{display:none}.rail-nav button{grid-template-columns:1fr;text-align:center;padding:0}.rail-nav button b{display:none}.pro-topbar{grid-template-columns:1fr auto;height:auto;min-height:86px;padding:10px 14px}.header-fields{grid-column:1/-1;grid-row:2;grid-template-columns:1fr 1fr}.header-clock{grid-column:2;grid-row:1}.live-subnav{top:86px}.cockpit-main-grid,.cockpit-lower-grid,.race-chart-pair,.report-grid,.report-grid.lower{grid-template-columns:1fr}.board{overflow:auto}.board-head.telemetry,.board-row.telemetry{min-width:1200px}.pro-reference{overflow-x:auto;grid-template-columns:170px repeat(3,230px) 90px}.cockpit-kpis,.report-kpis{grid-template-columns:1fr 1fr}}
@media(max-width:760px){.pro-shell{display:block}.side-rail{display:none}.pro-topbar{position:static;grid-template-columns:1fr}.header-clock{grid-column:auto;grid-row:auto;text-align:left}.header-fields{grid-column:auto;grid-row:auto;grid-template-columns:1fr}.live-subnav{position:static}.pro-page{padding:10px}.cockpit-kpis,.report-kpis{grid-template-columns:1fr}.metric-cell{border-right:0;border-bottom:1px solid var(--line)}.report-head{align-items:flex-start;flex-direction:column}.report-head label{width:100%}}
.spot-timeline{display:grid}.spot-row{min-height:48px;border-bottom:1px solid var(--line2);display:grid;grid-template-columns:76px 52px 1fr 96px 72px;align-items:center;padding:0 12px;gap:8px}.spot-row time,.spot-row span,.spot-row small{font:750 9px/1 var(--mono);color:#6f858f}.spot-row b{font:850 14px/1 var(--display);color:var(--blue)}.spot-row strong{font:800 12px/1 var(--mono)}

/* v1.3 readability + professional surfaces */
:root{--font-floor:11px}
body{font-size:13px}
.surface-title{font-size:13px!important;letter-spacing:.085em}.surface-subtitle,.surface-meta{font-size:10px!important;line-height:1.35!important}.eyebrow{font-size:10px!important}.pro-page{padding-top:14px}.rail-nav button{min-height:58px}.rail-nav button b{font-size:10px!important}.rail-feeds span{font-size:9px!important}.contest-lockup strong{font-size:23px!important}.contest-lockup .eyebrow{font-size:9px!important}.compact-select{font-size:13px!important;height:42px}.header-fields label>span,.report-head label>span{font-size:9px!important}.category-mini{font-size:10px!important}.rules-chip{font-size:9px!important}.header-clock span{font-size:9px!important}.header-clock b{font-size:21px!important}
.metric-cell>span{font-size:10px!important}.metric-cell>b{font-size:31px!important}.metric-cell>small{font-size:11px!important;line-height:1.35!important}.intel-event b{font-size:13px!important}.intel-event small{font-size:10px!important}.board-head.telemetry{font-size:9px!important}.board-row.telemetry{min-height:74px}.board-row.telemetry .pos{font-size:20px}.board-row.telemetry .station-call{font-size:21px!important}.station-meta{font-size:10px!important}.score-main{font-size:21px!important}.score-gap{font-size:9px!important}.micro b,.active-cell b{font-size:13px!important}.micro small,.active-cell small,.fresh-cell small,.relative small{font-size:9px!important}.relative b,.fresh-cell b{font-size:11px!important}.move{font-size:11px!important}.band-table{font-size:11px!important}.band-table th{font-size:9px!important}.band-table td{padding:11px 10px!important}.active-chip{font-size:9px!important}.chart-toolbar button,.chart-toolbar select{font-size:10px!important;min-height:32px}.cell-sub{font-size:9px!important}.empty{font-size:12px!important}
.chart-host{min-height:270px}.chart-host.tall{min-height:390px}.cockpit-chart{height:285px}.row-spark{height:32px}
.view.active>*{animation:surfaceEnter .35s cubic-bezier(.2,.8,.2,1) both}@keyframes surfaceEnter{from{opacity:.2;transform:translateY(5px)}to{opacity:1;transform:none}}

.settings-hero,.clubs-hero{border:1px solid var(--line);background:linear-gradient(135deg,#0e1214,#091219 70%);padding:22px 24px;margin-bottom:12px;display:flex;align-items:center;justify-content:space-between;gap:24px}.settings-hero h2,.clubs-hero h2{margin:5px 0 0;font:850 30px/1 var(--display)}.settings-hero p,.clubs-hero p{margin:9px 0 0;color:#8fa3ac;font:700 12px/1.4 var(--ui)}.account-status{min-width:290px;border:1px solid #2a404b;padding:12px 14px;display:flex;gap:11px;align-items:center;background:#0b0f11}.account-status i{width:9px;height:9px;border-radius:50%;background:#607681;box-shadow:0 0 0 4px rgba(96,118,129,.09)}.account-status.on i{background:var(--live);box-shadow:0 0 0 4px rgba(89,225,177,.1)}.account-status span{display:block;color:#78909a;font:850 9px/1 var(--mono);letter-spacing:.08em}.account-status b{display:block;margin-top:6px;font:800 13px/1.2 var(--ui)}
.settings-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px}.settings-card{min-height:260px}.form-grid{padding:16px;display:grid;grid-template-columns:1fr 1fr;gap:14px}.form-grid label{color:#78909a;font:850 9px/1 var(--mono);letter-spacing:.07em;position:relative}.form-grid input,.form-grid select{display:block;width:100%;height:44px;margin-top:8px;background:#0a0d0f;border:1px solid #2a414c;color:#e7f0f4;padding:0 12px;font:750 13px/1 var(--ui);outline:none;transition:border-color .2s,box-shadow .2s}.form-grid input:focus,.form-grid select:focus{border-color:#4c91ae;box-shadow:0 0 0 2px rgba(104,199,255,.08)}.form-grid label>small{position:absolute;right:10px;bottom:14px;color:#6f858f}.settings-actions{padding:0 16px 16px;display:flex;align-items:center;gap:13px}.primary-action{min-height:38px;border:1px solid #367b68;background:#0d2a23;color:#82edc6;padding:0 16px;font:850 10px/1 var(--mono);letter-spacing:.05em;cursor:pointer;transition:transform .16s,background .2s}.primary-action:hover{background:#12382e;transform:translateY(-1px)}.form-note{color:#708690;font:700 10px/1.35 var(--ui)}

.club-summary{min-width:310px;display:grid;grid-template-columns:1fr auto;gap:4px 14px;align-items:end}.club-summary span{grid-column:1/-1;color:#78909a;font:850 9px/1 var(--mono)}.club-summary b{font:850 17px/1.1 var(--display)}.club-summary strong{font:850 28px/1 var(--mono);color:var(--live)}.club-summary small{grid-column:1/-1;color:#859aa4;font:700 10px/1.2 var(--ui)}.clubs-layout{display:grid;grid-template-columns:minmax(0,1.6fr) minmax(360px,.75fr);gap:12px;margin-bottom:12px}.club-list{display:grid}.club-row{min-height:74px;border:0;border-bottom:1px solid var(--line2);background:transparent;color:inherit;display:grid;grid-template-columns:50px minmax(180px,1fr) minmax(150px,.75fr) 120px;align-items:center;text-align:left;padding:0 15px;cursor:pointer;transition:background .2s,transform .2s}.club-row:hover{background:#12171a}.club-row.active{background:linear-gradient(90deg,rgba(89,225,177,.11),rgba(89,225,177,.015));box-shadow:inset 3px 0 var(--live)}.club-rank{font:850 20px/1 var(--mono);color:#9aadb5}.club-name b{display:block;font:850 17px/1.1 var(--display)}.club-name small{display:block;margin-top:7px;color:#708690;font:700 10px/1.2 var(--ui)}.club-fill{height:8px;background:#161c1f;position:relative;overflow:hidden}.club-fill i{position:absolute;inset:0 auto 0 0;background:linear-gradient(90deg,#327e79,#59e1b1);box-shadow:0 0 15px rgba(89,225,177,.16);transition:width .65s cubic-bezier(.2,.8,.2,1)}.club-row>strong{text-align:right;font:850 19px/1 var(--mono)}.club-member-list{display:grid}.club-member{min-height:62px;border-bottom:1px solid var(--line2);display:grid;grid-template-columns:42px 90px 1fr;grid-template-rows:1fr 1fr;align-items:center;padding:8px 13px}.club-member>span{grid-row:1/3;color:#78909a;font:850 12px/1 var(--mono)}.club-member>b{font:850 15px/1 var(--display)}.club-member>i{font:850 14px/1 var(--mono);font-style:normal;text-align:right}.club-member>small{grid-column:2/4;color:#728894;font:700 9px/1 var(--ui)}.club-chart-surface{margin-bottom:12px}

.report-tabs{height:46px;border:1px solid var(--line);background:#0d1113;margin-bottom:12px;display:flex;align-items:stretch;padding:0 8px}.report-tabs button{border:0;border-bottom:2px solid transparent;background:transparent;color:#778d97;padding:0 18px;font:850 10px/1 var(--mono);letter-spacing:.05em;cursor:pointer}.report-tabs button.active{color:#eef6f8;border-color:var(--blue);background:#12181b}.pro-report-head{min-height:104px}.report-dashboard{display:grid;grid-template-columns:1.35fr 1fr;gap:12px}.report-dashboard>.surface{min-height:430px}.report-pro-kpis{margin-bottom:12px}.report-feature-placeholder{min-height:320px;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;padding:32px}.report-feature-placeholder b{font:850 14px/1 var(--display);letter-spacing:.06em}.report-feature-placeholder p{max-width:650px;color:#8298a2;font:700 12px/1.55 var(--ui)}.continent-grid.pro>div{min-height:120px}.continent-grid.pro small{display:block;margin-top:5px;color:#708690;font:700 9px/1 var(--mono)}

@media(max-width:1400px){.settings-grid,.clubs-layout,.report-dashboard{grid-template-columns:1fr}.account-status,.club-summary{min-width:0}.club-row{grid-template-columns:46px minmax(160px,1fr) 140px 105px}}
@media(max-width:900px){.settings-hero,.clubs-hero{align-items:flex-start;flex-direction:column}.form-grid{grid-template-columns:1fr}.club-row{grid-template-columns:42px 1fr 100px}.club-fill{display:none}.report-tabs{overflow-x:auto}.report-tabs button{white-space:nowrap}}

/* v1.4 motion/readability/report refinements */
.cockpit-board-head{display:grid;grid-template-columns:54px minmax(150px,1.12fr) minmax(128px,.85fr) 72px 72px 94px 108px 82px 82px 94px 48px 24px;align-items:center;min-height:42px;padding:0 12px;color:#8096a0;font:850 10px/1 var(--mono);letter-spacing:.065em;background:#0e1214;border-top:1px solid var(--line2);border-bottom:1px solid var(--line)}
.cockpit-race .board-row.telemetry{border-bottom:0;margin:2px 0;min-height:78px;background-color:#0d1113}
.cockpit-race .board-row.telemetry:hover{background-color:#161c1f}
.cockpit-race .board-row.telemetry .station-call{font-size:23px!important}
.cockpit-race .board-row.telemetry .score-main{font-size:23px!important}
.cockpit-race .board-row.telemetry .pos{font-size:21px!important}
.cockpit-race .board-row.telemetry .micro b,.cockpit-race .board-row.telemetry .active-cell b{font-size:14px!important}
.cockpit-race .board-row.telemetry .relative b,.cockpit-race .board-row.telemetry .fresh-cell b{font-size:12px!important}
.cockpit-race .station-meta,.cockpit-race .micro small,.cockpit-race .active-cell small,.cockpit-race .fresh-cell small,.cockpit-race .relative small{font-size:9px!important}
.board-row.telemetry{will-change:transform}.score-main,.micro b,.summary-stat .big-num,.metric-cell>b{font-variant-numeric:tabular-nums}

.report-upload-actions{display:flex;align-items:center;gap:14px;margin-top:15px}.report-upload-actions>span{color:#78909a;font:700 10px/1.35 var(--ui)}.secondary-action{height:38px;border:1px solid #334a55;background:#0e1214;color:#a9bbc3;padding:0 14px;font:850 10px/1 var(--mono);cursor:pointer}.secondary-action:hover{border-color:#4d6b77;color:#eaf3f6}
.report-file-banner{min-height:112px;border:1px solid var(--line);background:linear-gradient(105deg,#0e1214,#081117 72%);display:grid;grid-template-columns:1fr auto auto;align-items:center;gap:22px;padding:17px 20px;margin-bottom:12px}.report-file-banner h2{margin:4px 0 5px;font:850 27px/1 var(--display)}.report-file-banner p{margin:0;color:#8499a2;font:700 11px/1.4 var(--ui)}.file-meta{min-width:180px;border-left:1px solid var(--line);padding-left:18px}.file-meta span{display:block;color:#738b96;font:850 9px/1 var(--mono);letter-spacing:.07em}.file-meta b{display:block;margin-top:7px;font:850 22px/1 var(--mono)}.file-meta small{display:block;margin-top:7px;color:#7e939c;font:700 9px/1 var(--ui)}
.report-window-grid{display:grid;grid-template-columns:1fr 1fr;padding:16px;gap:10px}.report-window-grid>div{min-height:96px;border:1px solid #1d343e;background:#0b0f11;padding:15px}.report-window-grid span{display:block;color:#76909b;font:850 9px/1 var(--mono)}.report-window-grid b{display:block;margin-top:12px;font:850 22px/1 var(--mono)}.report-best{margin-bottom:12px}.report-best .detail-card small{display:block;margin-top:8px;color:#788e98;font:700 10px/1.3 var(--ui)}
.transition-surface{margin-top:12px}.transition-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:1px;background:var(--line2)}.transition-grid>div{min-height:70px;background:#0d1113;padding:13px 15px;display:flex;align-items:center;justify-content:space-between}.transition-grid b{font:800 12px/1 var(--mono);color:#9fb1b9}.transition-grid strong{font:850 18px/1 var(--mono);color:#e9f2f5}
.break-list{display:grid}.break-list>div{min-height:58px;border-bottom:1px solid var(--line2);display:grid;grid-template-columns:44px 1fr auto;align-items:center;padding:0 14px}.break-list span{color:#718894;font:850 11px/1 var(--mono)}.break-list b{font:800 13px/1 var(--mono)}.break-list strong{color:var(--amber);font:850 13px/1 var(--mono)}
.report-lane-kpis{margin-bottom:12px}.lane-matrix{padding:12px}.lane-row{min-height:66px;border-bottom:1px solid var(--line2);display:grid;grid-template-columns:80px repeat(6,1fr);align-items:center}.lane-row>b{font:850 17px/1 var(--display)}.lane-row span{display:flex;flex-direction:column;gap:6px}.lane-row i{font:800 9px/1 var(--mono);font-style:normal;color:#718894}.lane-row strong{font:850 15px/1 var(--mono)}.inband-note{margin-top:12px}.candidate-list{display:grid}.candidate-list>div{min-height:52px;border-bottom:1px solid var(--line2);display:grid;grid-template-columns:84px 70px 120px 1fr;align-items:center;padding:0 14px}.candidate-list time,.candidate-list span,.candidate-list small{font:750 10px/1 var(--mono);color:#778e98}.candidate-list b{font:850 13px/1 var(--mono);color:var(--amber)}
.club-chart-surface canvas{cursor:pointer}.club-detail{transition:opacity .22s ease,transform .22s ease}.club-row{border-bottom:0!important;margin-bottom:2px}.club-member{border-bottom:0!important;margin-bottom:1px;background:#0d1113}

@media(max-width:1500px){.cockpit-board-head{grid-template-columns:50px minmax(135px,1fr) minmax(118px,.82fr) 64px 64px 88px 98px 72px 70px 82px 42px 20px}.transition-grid{grid-template-columns:repeat(2,1fr)}}
@media(max-width:1180px){.cockpit-board-head{min-width:1200px}.cockpit-race{overflow:auto}.report-file-banner{grid-template-columns:1fr}.file-meta{border-left:0;border-top:1px solid var(--line);padding:12px 0 0}.lane-row{min-width:850px}.lane-matrix{overflow:auto}}
@media(max-width:760px){.transition-grid{grid-template-columns:1fr}.report-window-grid{grid-template-columns:1fr}.candidate-list>div{grid-template-columns:70px 55px 1fr}.candidate-list small{grid-column:1/-1;padding-bottom:8px}}

/* v1.6 timing-tower density + motion pass */
.live-subnav{contain:layout paint}.live-subnav button{min-width:118px}.pro-page{contain:layout style}
.compact-board-head{min-height:52px}.compact-board-head .surface-subtitle{font-size:10px}
.pro-board{background:#0a0d0f}
.board-list{display:grid;gap:2px;padding:2px 0 4px;background:#080b0d}
.board-head.telemetry,.board-row.telemetry{grid-template-columns:52px minmax(190px,1.18fr) minmax(170px,.95fr) 104px 98px 118px 132px 112px 92px 116px 54px 24px;column-gap:10px}
.board-head.telemetry{min-height:40px;padding:0 14px;border-bottom:0;background:#0e1214;color:#8198a2;font-size:9px!important}
.board-row.telemetry{min-height:64px;padding:0 14px;border-bottom:0!important;margin:0;background:#0e1214;box-shadow:inset 0 1px rgba(255,255,255,.012);transition:background-color .18s ease,opacity .2s ease,box-shadow .25s ease;will-change:transform}
.board-row.telemetry:nth-child(even){background:#0d1113}.board-row.telemetry:hover{background:#161d20;box-shadow:inset 3px 0 var(--blue),inset 0 1px rgba(255,255,255,.025)}
.board-row.telemetry .score-fill{top:0;bottom:0;background:linear-gradient(90deg,rgba(56,135,157,.17),rgba(56,135,157,.055) 66%,rgba(56,135,157,.012));transition:width .95s cubic-bezier(.16,1,.3,1)}
.board-row.telemetry.leader .score-fill{background:linear-gradient(90deg,rgba(72,160,195,.22),rgba(72,160,195,.07) 68%,rgba(72,160,195,.012))}
.board-row.telemetry.mine .score-fill{background:linear-gradient(90deg,rgba(89,225,177,.18),rgba(89,225,177,.045) 70%,rgba(89,225,177,.008))}
.pace-strip{display:none!important}
.board-row.telemetry .pos{font-size:19px!important}.board-row.telemetry .station-call{font-size:20px!important;letter-spacing:.01em}.station-meta{font-size:9px!important;margin-top:4px}.score-main{font-size:20px!important}.score-subline{margin-top:5px;display:flex;align-items:center;gap:10px}.score-gap{margin:0;font-size:9px!important;min-width:58px}.score-progress{display:none!important}
.micro b,.active-cell b{font-size:13px!important}.micro small,.active-cell small,.fresh-cell small,.relative small{font-size:8.5px!important;margin-top:4px}.relative b,.fresh-cell b{font-size:11px!important}.active-cell b{font-size:14px!important}.row-spark{width:108px;height:30px}.move{font-size:11px!important}.detail-arrow{opacity:.55}
.board-row.stale-warn{background-image:linear-gradient(90deg,rgba(243,189,102,.08),transparent 55%)}.board-row.stale-critical{opacity:.62;filter:saturate(.72);background-image:linear-gradient(90deg,rgba(255,116,121,.09),transparent 58%)}
.tt-station{font:850 15px/1 var(--display);color:#fff;margin-bottom:6px}.tt-value{font:850 23px/1 var(--mono);color:#eef6f8}.tt-meta{margin-top:7px;color:#7f96a1;font:800 9px/1 var(--mono);letter-spacing:.05em}

@media(max-width:1500px){.board-head.telemetry,.board-row.telemetry{grid-template-columns:48px minmax(165px,1.08fr) minmax(150px,.88fr) 88px 84px 105px 118px 95px 82px 95px 46px 20px;column-gap:7px}.row-spark{width:90px}}
@media(max-width:1180px){.board-head.telemetry,.board-row.telemetry{min-width:1230px}}

/* v1.7 continuous telemetry refinements */
.board-row.telemetry{contain:layout paint;backface-visibility:hidden;transform:translateZ(0)}
.board-row.telemetry.leader:not(.mine){box-shadow:inset 3px 0 #5b9fbd,inset 0 1px rgba(255,255,255,.015)}
.board-row.telemetry.mine{box-shadow:inset 4px 0 var(--live),inset 0 0 0 1px rgba(89,225,177,.28)!important}
.board-row.telemetry.mine .mine-tag{background:rgba(89,225,177,.14);border-color:rgba(89,225,177,.45);color:var(--live)}
.interactive-chart{position:relative}
.chart-readout{position:absolute;z-index:20;right:16px;top:48px;min-width:170px;pointer-events:none;padding:10px 12px;background:rgba(6,8,9,.95);border:1px solid #36515e;box-shadow:0 12px 34px rgba(0,0,0,.28);backdrop-filter:blur(7px)}
.chart-readout-call{display:flex;align-items:center;gap:8px;color:#dce8ed;font:800 12px/1 var(--mono);letter-spacing:.02em}.chart-readout-call i{width:8px;height:8px;border-radius:50%}
.chart-readout-value{margin-top:8px;color:#fff;font:850 22px/1 var(--mono)}
.chart-readout-meta{margin-top:7px;color:#8399a3;font:700 9px/1.35 var(--mono);text-transform:uppercase}
.row-spark svg{display:block}.row-spark polyline{transition:stroke .25s ease}

/* v1.8 high-density field + club soft-refresh pass */
.board-head.telemetry{position:sticky;top:0;z-index:8;min-height:34px;padding:0 10px;background:rgba(10,13,15,.97);backdrop-filter:blur(8px)}
.board-list{gap:1px;padding:1px 0 3px}
.board-row.telemetry{min-height:48px;padding:0 10px;content-visibility:auto;contain-intrinsic-size:48px;background:#0d1113}
.board-row.telemetry:nth-child(even){background:#0c1012}
.board-head.telemetry,.board-row.telemetry{grid-template-columns:42px minmax(175px,1.15fr) minmax(165px,.92fr) 100px 92px 108px 122px 104px 68px 96px 44px 18px;column-gap:8px}
.board-row.telemetry .pos{font-size:17px!important}.board-row.telemetry .station-call{font-size:18px!important}.station-line{display:flex;align-items:baseline;gap:9px;min-width:0}.station-meta{display:inline!important;margin:0!important;font-size:8px!important;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:110px;color:#647a84}.mine-tag{margin-left:5px}
.score-line{display:flex;align-items:baseline;gap:10px;min-width:0}.score-main{font-size:18px!important}.score-gap{margin:0!important;font-size:8px!important;white-space:nowrap;color:#7f939d}.score-subline{margin:0!important}
.micro,.relative,.active-cell,.fresh-cell{display:flex;align-items:baseline;gap:6px;min-width:0}.micro b,.active-cell b{font-size:12px!important}.micro small,.active-cell small,.fresh-cell small,.relative small{margin:0!important;font-size:7px!important;white-space:nowrap}.relative b,.fresh-cell b{font-size:10px!important;white-space:nowrap}.active-cell b{font-size:12px!important}.row-spark{width:82px;height:22px}.move{font-size:10px!important}.detail-arrow{font-size:18px}
.board-row.telemetry .score-fill{transition:width .8s cubic-bezier(.16,1,.3,1)}
.board-row.telemetry.mine{box-shadow:inset 3px 0 var(--live),inset 0 0 0 1px rgba(89,225,177,.22)!important}
.club-row{min-height:58px;margin-bottom:1px}.club-name small{margin-top:4px}.club-member{min-height:48px;padding:5px 11px}.club-member>small{font-size:8px}.club-chart-surface .chart-host.tall{min-height:340px}
.club-initial-loading{min-height:220px}
@media(max-width:1500px){.board-head.telemetry,.board-row.telemetry{grid-template-columns:40px minmax(155px,1.08fr) minmax(145px,.86fr) 86px 80px 96px 108px 92px 62px 82px 40px 16px;column-gap:6px}.station-meta{max-width:80px}.row-spark{width:72px}}
@media(max-width:1180px){.board-head.telemetry,.board-row.telemetry{min-width:1120px}}

/* Optional comfortable density from Settings */
body.density-comfortable .board-row.telemetry{min-height:62px;padding:0 14px;contain-intrinsic-size:62px}
body.density-comfortable .board-row.telemetry .station-call{font-size:20px!important}
body.density-comfortable .score-main{font-size:20px!important}
body.density-comfortable .row-spark{height:28px;width:96px}


/* v1.9: true compact timing rows + stable club surface */
.board-list{gap:0!important;padding:0 0 2px!important}
.board-row.telemetry,
.cockpit-race .board-row.telemetry{
  min-height:40px!important;
  height:40px!important;
  padding:0 8px!important;
  margin:0!important;
  border:0!important;
  align-items:center!important;
}
.board-head.telemetry{min-height:30px!important;height:30px!important;padding:0 8px!important}
.board-row.telemetry .pos,.cockpit-race .board-row.telemetry .pos{font-size:15px!important}
.board-row.telemetry .station-call,.cockpit-race .board-row.telemetry .station-call{font-size:16px!important;line-height:1!important}
.board-row.telemetry .station-meta,.cockpit-race .board-row.telemetry .station-meta{font-size:7px!important;max-width:100px!important}
.board-row.telemetry .score-main,.cockpit-race .board-row.telemetry .score-main{font-size:16px!important;line-height:1!important}
.board-row.telemetry .score-gap,.cockpit-race .board-row.telemetry .score-gap{font-size:7px!important}
.board-row.telemetry .micro b,.board-row.telemetry .active-cell b,.cockpit-race .board-row.telemetry .micro b,.cockpit-race .board-row.telemetry .active-cell b{font-size:10.5px!important}
.board-row.telemetry .micro small,.board-row.telemetry .active-cell small,.board-row.telemetry .fresh-cell small,.board-row.telemetry .relative small,
.cockpit-race .board-row.telemetry .micro small,.cockpit-race .board-row.telemetry .active-cell small,.cockpit-race .board-row.telemetry .fresh-cell small,.cockpit-race .board-row.telemetry .relative small{font-size:6px!important}
.board-row.telemetry .relative b,.board-row.telemetry .fresh-cell b,.cockpit-race .board-row.telemetry .relative b,.cockpit-race .board-row.telemetry .fresh-cell b{font-size:9px!important}
.board-row.telemetry .row-spark,.cockpit-race .board-row.telemetry .row-spark{height:15px!important;width:68px!important}
.board-row.telemetry .move,.cockpit-race .board-row.telemetry .move{font-size:8.5px!important}
.board-row.telemetry .detail-arrow,.cockpit-race .board-row.telemetry .detail-arrow{font-size:15px!important}
.board-row.telemetry.leader:not(.mine),.cockpit-race .board-row.telemetry.leader:not(.mine){box-shadow:inset 2px 0 #5b9fbd!important}
.board-row.telemetry.mine,.cockpit-race .board-row.telemetry.mine{box-shadow:inset 3px 0 var(--live),inset 0 0 0 1px rgba(89,225,177,.22)!important}
body.density-comfortable .board-row.telemetry,
body.density-comfortable .cockpit-race .board-row.telemetry{min-height:52px!important;height:52px!important;padding:0 11px!important}
body.density-comfortable .board-row.telemetry .station-call{font-size:18px!important}
body.density-comfortable .board-row.telemetry .score-main{font-size:18px!important}
body.density-comfortable .row-spark{height:21px!important;width:82px!important}
#clubsView{overflow-anchor:none}
#clubsView .clubs-layout,#clubsView .club-chart-surface{overflow-anchor:none}

/* v2.0: compact timing geometry + stable post-event report */
.board-head.telemetry,.board-row.telemetry{
  grid-template-columns:40px 250px 220px 112px 102px 122px 142px 96px 86px minmax(190px,1fr) 54px 18px!important;
  column-gap:8px!important;
}
.active-cell{display:flex;align-items:center;min-width:0}.active-cell b{font-size:11px!important;white-space:nowrap;color:var(--blue)}
.fresh-cell{display:flex;align-items:center}.fresh-cell b{font-size:10px!important;white-space:nowrap}
.trend-cell{display:flex;align-items:center;gap:9px;min-width:0}.trend-cell .row-spark{flex:1 1 auto;width:auto!important;min-width:105px!important;height:18px!important}.trend-cell small{font:750 7px/1 var(--mono);color:#6e8792;white-space:nowrap;min-width:72px;text-align:right}
.board-row.telemetry .station-cell{min-width:0}.board-row.telemetry .station-line{gap:7px}.board-row.telemetry .station-meta{max-width:120px!important}
@media(max-width:1500px){.board-head.telemetry,.board-row.telemetry{grid-template-columns:38px 215px 195px 98px 90px 108px 126px 82px 76px minmax(150px,1fr) 48px 16px!important;column-gap:6px!important}.trend-cell small{display:none}.trend-cell .row-spark{min-width:105px!important}}
@media(max-width:1180px){.board-head.telemetry,.board-row.telemetry{min-width:1260px!important}}

.report-focus-grid{display:grid;grid-template-columns:minmax(0,1.7fr) minmax(320px,.7fr);gap:12px;margin-top:12px}.report-primary-chart,.report-command{min-height:430px}.report-main-chart{height:360px}.report-command .surface-head{border-bottom:1px solid var(--line2)}.report-snapshot-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px;padding:14px}.report-snapshot-grid .detail-card{min-height:142px}.report-secondary-grid{display:grid;grid-template-columns:1.35fr 1fr;gap:12px;margin-top:12px}.report-rate-main{margin-top:12px}.report-rate-bursts{margin-top:12px}.chart-host.medium{height:280px}
.role-kpis{margin-bottom:12px}.report-role-grid{display:grid;grid-template-columns:1fr 1.25fr;gap:12px}.role-chart{height:390px}.run-frequency-surface{margin-top:12px}.run-frequency-grid{display:grid;grid-template-columns:repeat(6,minmax(150px,1fr));gap:8px;padding:12px}.run-frequency-grid>div{min-height:60px;border:1px solid var(--line2);background:#0e1214;padding:10px 12px;display:grid;grid-template-columns:42px 1fr auto;align-items:center;gap:8px}.run-frequency-grid b{font:850 13px/1 var(--display);color:var(--blue)}.run-frequency-grid strong{font:800 13px/1 var(--mono)}.run-frequency-grid span{font:700 9px/1 var(--mono);color:#78909b}
.geo-kpis{display:grid;grid-template-columns:repeat(4,1fr);gap:0;margin-bottom:12px}.geography-grid{margin-top:12px}
@media(max-width:1300px){.report-focus-grid,.report-secondary-grid,.report-role-grid{grid-template-columns:1fr}.run-frequency-grid{grid-template-columns:repeat(3,1fr)}.geo-kpis{grid-template-columns:1fr 1fr}}

/* v2.1: dense without tiny type — remove vertical dead space, preserve legibility */
.board-head.telemetry{
  min-height:28px!important;
  height:28px!important;
  padding:0 8px!important;
  line-height:1!important;
}
.board-row.telemetry,
.cockpit-race .board-row.telemetry{
  min-height:34px!important;
  height:34px!important;
  padding:0 8px!important;
  line-height:1!important;
  align-items:center!important;
  overflow:hidden;
  contain-intrinsic-size:34px;
}
.board-row.telemetry .pos,
.cockpit-race .board-row.telemetry .pos{
  font-size:16px!important;
  line-height:1!important;
}
.board-row.telemetry .station-call,
.cockpit-race .board-row.telemetry .station-call{
  font-size:18px!important;
  line-height:.95!important;
  letter-spacing:-.01em;
}
.board-row.telemetry .station-meta,
.cockpit-race .board-row.telemetry .station-meta{
  font-size:8.5px!important;
  line-height:1!important;
  max-width:125px!important;
}
.board-row.telemetry .score-main,
.cockpit-race .board-row.telemetry .score-main{
  font-size:18px!important;
  line-height:.95!important;
}
.board-row.telemetry .score-gap,
.cockpit-race .board-row.telemetry .score-gap{
  font-size:8.5px!important;
  line-height:1!important;
}
.board-row.telemetry .micro b,
.board-row.telemetry .active-cell b,
.cockpit-race .board-row.telemetry .micro b,
.cockpit-race .board-row.telemetry .active-cell b{
  font-size:12px!important;
  line-height:1!important;
}
.board-row.telemetry .micro small,
.board-row.telemetry .active-cell small,
.board-row.telemetry .fresh-cell small,
.board-row.telemetry .relative small,
.cockpit-race .board-row.telemetry .micro small,
.cockpit-race .board-row.telemetry .active-cell small,
.cockpit-race .board-row.telemetry .fresh-cell small,
.cockpit-race .board-row.telemetry .relative small{
  font-size:8px!important;
  line-height:1!important;
}
.board-row.telemetry .relative b,
.board-row.telemetry .fresh-cell b,
.cockpit-race .board-row.telemetry .relative b,
.cockpit-race .board-row.telemetry .fresh-cell b{
  font-size:10.5px!important;
  line-height:1!important;
}
.board-row.telemetry .move,
.cockpit-race .board-row.telemetry .move{
  font-size:10.5px!important;
  line-height:1!important;
}
.board-row.telemetry .detail-arrow,
.cockpit-race .board-row.telemetry .detail-arrow{
  font-size:16px!important;
  line-height:1!important;
}
.board-row.telemetry .row-spark,
.cockpit-race .board-row.telemetry .row-spark{
  height:21px!important;
}
.trend-cell .row-spark{
  height:21px!important;
  min-width:125px!important;
}
/* The column headers already explain these metrics; avoid redundant second-line labels. */
.board-row.telemetry .micro.pace small,
.board-row.telemetry .fresh-cell small,
.board-row.telemetry .active-cell small{
  display:none!important;
}
.board-row.telemetry .micro,
.board-row.telemetry .relative,
.board-row.telemetry .active-cell,
.board-row.telemetry .fresh-cell,
.cockpit-race .board-row.telemetry .micro,
.cockpit-race .board-row.telemetry .relative,
.cockpit-race .board-row.telemetry .active-cell,
.cockpit-race .board-row.telemetry .fresh-cell{
  align-items:center!important;
}
body.density-comfortable .board-row.telemetry,
body.density-comfortable .cockpit-race .board-row.telemetry{
  min-height:44px!important;
  height:44px!important;
  padding:0 10px!important;
  contain-intrinsic-size:44px;
}
body.density-comfortable .board-row.telemetry .station-call{font-size:20px!important}
body.density-comfortable .board-row.telemetry .score-main{font-size:20px!important}
body.density-comfortable .board-row.telemetry .micro b{font-size:13px!important}
body.density-comfortable .row-spark{height:25px!important}

/* v2.2 club-chart focus: neutral field by default, explicit focus only */
.surface-head-actions{display:flex;align-items:center;gap:12px}.mini-action{border:1px solid #2c4652;background:#0d1113;color:#8fdcff;font:700 10px/1 Bahnschrift,Segoe UI,sans-serif;letter-spacing:.08em;padding:7px 10px;cursor:pointer}.mini-action:hover{border-color:#65d7ff;color:#dff8ff}.mini-action[hidden]{display:none!important}

/* v2.3: compact premium report controls, animated report surfaces, transition flow */
.report-pro-kpis .metric-cell{min-height:78px;padding:10px 14px}
.report-pro-kpis .metric-cell>b{font-size:27px!important;margin-top:7px}
.report-pro-kpis .metric-cell>small{margin-top:6px;font-size:10px!important}
.report-head-flex{align-items:center;gap:14px;flex-wrap:wrap}
.report-rate-controls{margin-left:auto;display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.seg-group{display:flex;border:1px solid #29434f;background:#0c1012;height:34px;overflow:hidden}
.seg-group button{min-width:66px;border:0;border-right:1px solid #243b46;background:transparent;color:#8298a2;padding:0 12px;font:850 10px/1 var(--mono);cursor:pointer;transition:background .22s ease,color .22s ease,box-shadow .22s ease}
.seg-group button:last-child{border-right:0}.seg-group button:hover{color:#dbe7eb;background:#12181b}.seg-group button.active{background:#171f23;color:#f1f7f9;box-shadow:inset 0 -2px var(--blue)}
.seg-group.secondary button.active{box-shadow:inset 0 -2px var(--live)}
.compact-command{min-height:0}.compact-command .surface-head{min-height:52px}
.rate-summary-strip{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));border-top:1px solid var(--line2);height:calc(100% - 53px)}
.rate-summary-strip>div{padding:15px 14px;border-right:1px solid var(--line2);display:flex;flex-direction:column;justify-content:center;min-width:0}
.rate-summary-strip>div:last-child{border-right:0}.rate-summary-strip span{color:#758c97;font:850 9px/1 var(--mono);letter-spacing:.05em}.rate-summary-strip b{margin-top:7px;font:850 20px/1 var(--mono);white-space:nowrap}.rate-summary-strip small{margin-top:6px;color:#8aa0a9;font:700 9px/1.25 var(--ui)}
.rate-command-bar{display:grid;grid-template-columns:auto minmax(620px,1fr);align-items:stretch;gap:12px;margin-bottom:12px}.rate-command-bar>.report-rate-controls{margin:0;border:1px solid var(--line);background:#0d1113;padding:10px;justify-content:center;align-content:center}.rate-command-bar>.rate-summary-strip{height:auto;border:1px solid var(--line);background:#0d1113}
.short-chart{height:210px}.report-rate-bursts{margin-top:12px}.report-compact-chart .chart-host.medium{height:300px}
.transition-pro{margin-top:12px}.transition-layout{display:grid;grid-template-columns:minmax(0,1.65fr) minmax(260px,.55fr);min-height:360px}.transition-flow{height:360px;border-right:1px solid var(--line2)}
.transition-ranking{padding:8px 14px;display:grid;align-content:start}.transition-ranking>div{min-height:40px;display:grid;grid-template-columns:30px 1fr auto;align-items:center;gap:8px;border-bottom:1px solid rgba(45,66,76,.35)}.transition-ranking>div:last-child{border-bottom:0}.transition-ranking span{color:#607985;font:800 9px/1 var(--mono)}.transition-ranking b{font:800 12px/1 var(--mono);color:#cbd8de}.transition-ranking strong{font:850 15px/1 var(--mono);color:var(--amber)}
.report-tabs button{transition:background .22s ease,color .22s ease,border-color .22s ease}.report-tabs button:hover{color:#d9e5e9;background:#101518}
#reportBody{will-change:opacity,transform}
@media(max-width:1200px){.rate-command-bar{grid-template-columns:1fr}.transition-layout{grid-template-columns:1fr}.transition-flow{border-right:0;border-bottom:1px solid var(--line2)}.rate-summary-strip{grid-template-columns:1fr 1fr}.report-rate-controls{margin-left:0}}

/* v2.4: stable report transitions + focus fill + replay motion tower */
#reportBody{opacity:1;transform:none}
.replay-standings-stable{position:relative;overflow:hidden;min-height:52px}
.replay-standings-stable .replay-row{position:absolute;left:0;right:0;top:0;height:50px;display:grid;grid-template-columns:48px minmax(100px,1fr) minmax(120px,.9fr);align-items:center;border:1px solid transparent;background:#0d1113;opacity:0;transform:translate3d(0,var(--replay-y,0),0) scale(.985);transition:transform .34s cubic-bezier(.16,1,.3,1),opacity .20s ease,background .22s ease,border-color .22s ease;will-change:transform;contain:layout paint style}
.replay-standings-stable .replay-row.entered{opacity:1;transform:translate3d(0,var(--replay-y,0),0) scale(1)}
.replay-standings-stable .replay-row.leader{background:linear-gradient(90deg,rgba(89,225,177,.11),rgba(89,225,177,.012));border-left-color:var(--live)}
.replay-standings-stable .replay-row.leaving{opacity:0;transform:translate3d(12px,var(--replay-y,0),0) scale(.98)}
.replay-standings-stable .replay-row .r{padding-left:12px;color:#8fa4ad;font:850 15px/1 var(--mono)}
.replay-standings-stable .replay-row .c{font:850 17px/1 var(--display);color:#edf5f8}
.replay-standings-stable .replay-row .s{text-align:right;padding-right:12px;font:850 15px/1 var(--mono)}
.replay-standings-stable .replay-row .s b{font:inherit}
.replay-standings-stable .replay-row .cell-sub{margin-top:4px;color:#78909b;font:700 9px/1 var(--mono)}
@media (prefers-reduced-motion: reduce){.replay-standings-stable .replay-row{transition:none!important}}

/* v2.5 report visual hierarchy */
.report-context-strip{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));min-height:66px;border:1px solid var(--line);background:#0c1012;margin-bottom:12px;overflow:hidden}
.report-context-strip>div{position:relative;padding:10px 14px;border-right:1px solid var(--line2);display:flex;flex-direction:column;justify-content:center;min-width:0}
.report-context-strip>div:last-child{border-right:0}.report-context-strip>div:before{content:"";position:absolute;left:0;top:0;bottom:0;width:2px;background:linear-gradient(180deg,var(--blue),transparent 88%)}
.report-context-strip>div:nth-child(2):before{background:linear-gradient(180deg,var(--live),transparent 88%)}.report-context-strip>div:nth-child(3):before{background:linear-gradient(180deg,var(--amber),transparent 88%)}.report-context-strip>div:nth-child(4):before{background:linear-gradient(180deg,var(--violet),transparent 88%)}
.report-context-strip span{font:850 9px/1 var(--mono);letter-spacing:.08em;color:#718995}.report-context-strip b{margin-top:6px;font:850 20px/1 var(--mono);color:#eef6f8;white-space:nowrap}.report-context-strip small{margin-top:5px;font:700 9px/1.25 var(--ui);color:#7e949d;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.band-report-grid{grid-template-columns:minmax(0,1.45fr) minmax(340px,.65fr)!important}.band-heat-chart{height:330px!important}.band-profile-chart{height:330px!important}.transition-pro{margin-top:12px}.transition-layout{grid-template-columns:minmax(0,1.55fr) minmax(280px,.45fr);min-height:380px}.transition-flow{height:380px;border-right:1px solid var(--line2)}
.geo-modern-grid{display:grid;grid-template-columns:minmax(320px,.75fr) minmax(0,1.25fr);gap:12px;margin-top:12px}.geo-donut,.geo-polar{height:330px!important}.geo-entity-surface,.geo-state-surface{margin-top:12px}.geo-treemap{height:390px!important}.geo-state-map{height:330px!important}.operating-grid{grid-template-columns:minmax(360px,.8fr) minmax(0,1.2fr)!important}.operating-chart{height:330px!important}
.report-secondary-grid{grid-template-columns:minmax(0,1.45fr) minmax(350px,.65fr)}.report-compact-chart .chart-host.medium{height:290px}.report-primary-chart,.report-command{min-height:410px}.report-main-chart{height:340px}
.rate-command-bar{margin-bottom:10px}.short-chart{height:230px}.compact-bursts .surface-head{min-height:42px}.report-rate-bursts{margin-top:10px}
@media(max-width:1300px){.report-context-strip{grid-template-columns:1fr 1fr}.band-report-grid,.geo-modern-grid,.operating-grid{grid-template-columns:1fr!important}.transition-layout{grid-template-columns:1fr}.transition-flow{border-right:0;border-bottom:1px solid var(--line2)}.report-secondary-grid{grid-template-columns:1fr}}
@media(max-width:760px){.report-context-strip{grid-template-columns:1fr}.report-context-strip>div{border-right:0;border-bottom:1px solid var(--line2)}.report-context-strip>div:last-child{border-bottom:0}}

/* v2.6 ContestScope report + scale system */
.surface-subtitle,.surface-meta{font-size:11px!important;line-height:1.4!important}
.report-tabs button{font-size:11px!important;min-height:48px}
.report-context-strip span{font-size:10px!important}.report-context-strip small{font-size:10px!important}.report-context-strip b{font-size:21px!important}
.rate-summary-strip span{font-size:10px!important}.rate-summary-strip small{font-size:10px!important}.rate-summary-strip b{font-size:21px!important}
.club-name small{font-size:11px!important}.club-member>small{font-size:10px!important}.club-summary small{font-size:11px!important}
.club-row{position:relative;isolation:isolate;overflow:hidden;grid-template-columns:50px minmax(180px,1fr) 135px!important;min-height:56px!important;padding:0 15px!important;background:#0d1113!important}
.club-row::before{content:"";position:absolute;z-index:-1;left:0;top:0;bottom:0;width:var(--club-fill,0%);background:linear-gradient(90deg,rgba(89,225,177,.18) 0%,rgba(89,225,177,.075) 62%,rgba(89,225,177,.012) 100%);transition:width .75s cubic-bezier(.16,1,.3,1),opacity .25s ease}
.club-row:hover::before{opacity:.95}.club-row.active{box-shadow:inset 3px 0 var(--live),inset 0 0 0 1px rgba(89,225,177,.26)!important;background:#0d1113!important}.club-row.active::before{background:linear-gradient(90deg,rgba(89,225,177,.28),rgba(89,225,177,.09) 70%,rgba(89,225,177,.018))}
.club-fill{display:none!important}.club-row>strong{font-size:19px!important}.club-name b{font-size:17px!important}
.club-head-tools{display:flex;align-items:center;gap:12px}.compact-seg{height:32px}.compact-seg button{font-size:9px!important;padding:0 9px!important}

.pace-profile-surface{margin-top:10px}.pace-profile{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:1px;background:var(--line2);padding-top:1px}.pace-profile>div:not(.pace-scale){background:#0d1113;padding:14px 16px;min-height:78px;display:flex;flex-direction:column;justify-content:center}.pace-profile span{font:850 10px/1 var(--mono);letter-spacing:.06em;color:#7f96a0}.pace-profile b{margin-top:8px;font:850 22px/1 var(--mono);color:#edf5f8}.pace-scale{grid-column:1/-1;position:relative;height:48px;background:#081218;border-top:1px solid var(--line2);margin-top:0;padding:0 18px}.pace-scale:before{content:"";position:absolute;left:18px;right:18px;top:17px;height:4px;background:linear-gradient(90deg,#17333e,#315e71,#59e1b1);opacity:.9}.pace-scale i{position:absolute;left:calc(18px + (100% - 36px)*var(--p)/100);top:11px;width:2px;height:16px;background:#f2f7f8;box-shadow:0 0 8px #fff4}.pace-scale small{position:relative;display:inline-block;width:24.5%;padding-top:31px;text-align:center;font:800 9px/1 var(--mono);color:#78909b}

.transition-ranking-head{min-height:32px!important;color:#758d98;font:850 10px/1 var(--mono);letter-spacing:.08em;display:flex!important;align-items:center!important;border-bottom:1px solid var(--line2)!important}.transition-flow{height:340px!important}.transition-layout{min-height:340px!important;grid-template-columns:minmax(0,1.6fr) minmax(270px,.4fr)!important}
.operating-layout-pro{display:grid;grid-template-columns:minmax(0,1.7fr) minmax(330px,.55fr);gap:12px}.operating-timeline{height:370px!important}.compact-breaks>div{min-height:54px}.breaks-surface{min-width:0}
.geo-zone-grid{height:340px!important}.geo-entity-pareto{height:390px!important}.geo-state-pareto{height:320px!important}.geo-modern-grid{grid-template-columns:minmax(320px,.62fr) minmax(0,1.38fr)!important}
.band-profile-chart{height:340px!important}.report-secondary-grid{grid-template-columns:minmax(0,1.65fr) minmax(390px,.6fr)!important}

/* keep dense fields usable with hundreds of rows */
.board-toolbar .seg{flex-wrap:wrap}.board-my{font-size:11px!important}.board-toolbar .search{min-width:220px}
@media(max-width:1300px){.operating-layout-pro{grid-template-columns:1fr}.report-secondary-grid{grid-template-columns:1fr!important}.geo-modern-grid{grid-template-columns:1fr!important}.club-head-tools{align-items:flex-end;flex-direction:column;gap:6px}}
@media(max-width:760px){.pace-profile{grid-template-columns:1fr 1fr}.club-row{grid-template-columns:42px 1fr 100px!important}.club-head-tools{display:none}.geo-zone-grid{height:420px!important}}

/* v2.6 readability + product identity */
.surface-subtitle,.surface-meta,.form-note,.operation-note,.club-name small,.club-member small,.metric-cell small,.report-strip small,.settings-card small{font-size:12px!important;line-height:1.35!important}
.board-row .micro small,.board-row .score-sub,.board-row .station-meta{font-size:10px!important;line-height:1.1!important}
.chart-host .chart-readout-meta{font-size:11px!important}
.rules-catalog-status{margin-top:14px;padding:12px 14px;border:1px solid #1c3440;background:linear-gradient(90deg,rgba(104,199,255,.08),rgba(89,225,177,.025));display:flex;align-items:center}
.rules-catalog-status>div{display:grid;grid-template-columns:auto auto;gap:2px 14px;align-items:baseline}
.rules-catalog-status span{font-size:10px;letter-spacing:.13em;color:#78a1b5;font-weight:800}.rules-catalog-status b{font-size:14px;color:#eaf3f7}.rules-catalog-status small{grid-column:1/-1;color:#829aa5}

/* v2.7 deployment-proof + leaderboard operator/readability pass */
.build-stamp{margin:8px 10px 12px;padding-top:8px;border-top:1px solid rgba(58,83,95,.35);color:#5f7a86;font:800 9px/1 var(--mono);letter-spacing:.08em;text-align:center}
.header-fields.single-field,.header-fields{grid-template-columns:minmax(360px,1fr)!important;max-width:620px}
.board-count{margin-left:auto;color:#78909a;font:850 10px/1 var(--mono);letter-spacing:.05em;white-space:nowrap}
.station-line{display:flex;align-items:baseline;gap:8px;min-width:0;white-space:nowrap;overflow:hidden}
.station-operator{font:850 18px/1 var(--display);color:#93a8b1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}
body.density-comfortable .station-operator{font-size:20px}
.board-row.telemetry .station-meta{display:none!important}
/* Club rows use the score field itself as the progress surface; no separate bar. */
.club-row::before{background:linear-gradient(90deg,rgba(89,225,177,.24) 0%,rgba(89,225,177,.115) 58%,rgba(89,225,177,.028) 86%,transparent 100%)!important}
.club-row.active::before{background:linear-gradient(90deg,rgba(89,225,177,.34) 0%,rgba(89,225,177,.15) 62%,rgba(89,225,177,.03) 90%,transparent)!important}
@media(max-width:1500px){.station-operator{font-size:16px}.header-fields.single-field,.header-fields{max-width:520px}}

/* v2.8 contest directory, branding, compact records and cockpit reset */
.pro-shell{grid-template-columns:154px minmax(0,1fr)!important}
.rail-brand{height:92px!important;border:0;border-bottom:1px solid var(--line);background:linear-gradient(145deg,#111619,#090c0d);color:inherit;text-align:left;cursor:pointer;padding:0 12px!important;gap:11px!important;width:100%}
.rail-brand>div:last-child{min-width:0}.rail-brand b{font:900 14px/1 var(--display)!important;letter-spacing:.04em!important;white-space:nowrap}.rail-brand small{font:800 8px/1 var(--mono)!important;letter-spacing:.11em!important;color:#76909b!important;margin-top:6px!important;white-space:nowrap}
.cs-logo{width:54px;height:54px;position:relative;border:1px solid #31505d;background:radial-gradient(circle at 50% 50%,#182126 0 20%,#0d1113 21% 100%);display:grid;place-items:center;box-shadow:inset 0 0 0 1px rgba(255,255,255,.025)}
.cs-logo:before,.cs-logo:after,.cs-logo i:before{content:"";position:absolute;border:1px solid rgba(104,199,255,.26);border-radius:50%;inset:8px}.cs-logo:after{inset:15px;border-color:rgba(89,225,177,.34)}.cs-logo i:before{inset:23px;border-color:rgba(243,189,102,.5)}.cs-logo i{position:absolute;inset:0}.cs-logo i:after{content:"";position:absolute;width:27px;height:2px;left:24px;top:16px;background:linear-gradient(90deg,var(--live),var(--blue));transform:rotate(-29deg);transform-origin:left center;box-shadow:0 0 10px rgba(104,199,255,.25)}.cs-logo span{position:relative;z-index:2;font:950 13px/1 var(--display);letter-spacing:.03em;color:#dff2f5}.cs-logo.mini{width:44px;height:44px;flex:0 0 44px}.cs-logo.mini:before{inset:6px}.cs-logo.mini:after{inset:12px}.cs-logo.mini i:before{inset:19px}.cs-logo.mini i:after{width:22px;left:20px;top:13px}
.pro-topbar{grid-template-columns:minmax(310px,.95fr) minmax(480px,1fr) auto auto!important;gap:12px!important;padding:0 16px!important}
.contest-picker-button{height:54px;min-width:0;border:1px solid #29434f;background:linear-gradient(180deg,#13191c,#0d1113);color:var(--text);padding:7px 12px;text-align:left;display:grid;grid-template-columns:1fr auto;grid-template-rows:auto 1fr;column-gap:10px;align-items:center}.contest-picker-button:hover{border-color:#4a7182;background:#161d20}.contest-picker-button span{grid-column:1;color:#6f8793;font:850 8px/1 var(--mono);letter-spacing:.1em}.contest-picker-button b{grid-column:1;font:880 17px/1.1 var(--display);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.contest-picker-button i{grid-column:2;grid-row:1/3;color:#73909d;font:800 8px/1 var(--mono);font-style:normal;max-width:130px;overflow:hidden;text-overflow:ellipsis}
.header-fields{grid-template-columns:minmax(330px,1fr) 96px!important;max-width:none!important;gap:8px!important}.filter-toggle{height:42px;align-self:end;border:1px solid #29434f;background:#0e1214;color:#91a7b0;display:flex;align-items:center;justify-content:center;gap:9px;font:850 9px/1 var(--mono);letter-spacing:.07em}.filter-toggle:hover{border-color:#4a7182;color:#eef5f7}.filter-toggle b{font-size:15px;color:var(--blue)}
.category-filterbar{min-height:62px;border-bottom:1px solid var(--line);background:#081218;display:flex;align-items:end;gap:9px;padding:8px 18px;position:relative;top:auto;z-index:57}.category-filterbar.hidden{display:none}.category-filterbar .filter-title{align-self:center;margin-right:8px;color:#718a95;font:850 9px/1 var(--mono);letter-spacing:.08em}.category-filterbar label{min-width:145px}.category-filterbar label span{display:block;color:#6f8793;font:850 7px/1 var(--mono);letter-spacing:.08em;margin:0 0 5px 2px}.category-filterbar select{height:34px;width:100%;border:1px solid #29434f;background:#0e1214;color:#dce7eb;padding:0 9px;font:750 10px/1 var(--ui)}.category-filterbar button{height:34px;border:1px solid #29434f;background:#0f1315;color:#8da3ad;padding:0 12px;font:850 8px/1 var(--mono)}
.pro-reference{display:block!important;min-height:44px!important;height:44px!important;margin-bottom:8px!important;border:1px solid var(--line)!important;overflow:hidden!important}.record-compact{height:42px;display:grid;grid-template-columns:58px auto minmax(240px,1fr) 150px 72px;align-items:center;gap:10px;padding:0 8px}.record-compact>span{color:#708791;font:850 8px/1 var(--mono);letter-spacing:.09em}.record-scope-tabs{height:28px;display:flex;border:1px solid #29414c}.record-scope-tabs button{border:0;border-right:1px solid #29414c;background:#0d1113;color:#738b96;padding:0 9px;font:850 7px/1 var(--mono);letter-spacing:.04em}.record-scope-tabs button:last-child{border:0}.record-scope-tabs button.active{background:#181e21;color:#f0f6f8;box-shadow:inset 0 -2px var(--blue)}.record-selected{display:flex;align-items:baseline;gap:12px;min-width:0}.record-selected b{font:900 18px/1 var(--mono);white-space:nowrap}.record-selected small{color:#8197a1;font:750 9px/1 var(--mono);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.record-delta{text-align:right}.record-delta span{display:block;color:#6d8490;font:800 7px/1 var(--mono)}.record-delta b{display:block;margin-top:3px;font:900 13px/1 var(--mono)}
.cockpit-telemetry-strip{min-height:68px;border:1px solid var(--line);background:#0d1113;margin-bottom:9px;display:grid;grid-template-columns:1.15fr .72fr .8fr 1.1fr 1.15fr}.cockpit-telemetry-strip>div{padding:9px 12px;border-right:1px solid var(--line);min-width:0;position:relative}.cockpit-telemetry-strip>div:last-child{border:0}.cockpit-telemetry-strip span{display:block;color:#708690;font:850 8px/1 var(--mono);letter-spacing:.08em}.cockpit-telemetry-strip b{display:block;margin-top:7px;font:900 20px/1 var(--display);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.cockpit-telemetry-strip small{display:block;margin-top:5px;color:#849aa3;font:750 9px/1.15 var(--mono);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.cockpit-telemetry-strip .telemetry-main{box-shadow:inset 3px 0 var(--blue)}.cockpit-telemetry-strip .space-weather{box-shadow:inset 0 2px var(--live)}.cockpit-telemetry-strip .lightning-status{box-shadow:inset 0 2px var(--amber)}
.cockpit-main-grid.cockpit-no-intel{grid-template-columns:minmax(0,2.2fr) minmax(300px,.72fr)!important}.conditions-panel{min-height:300px}.conditions-body{display:grid}.condition-block{min-height:118px;padding:17px 16px;border-bottom:1px solid var(--line2);display:flex;flex-direction:column;justify-content:center}.condition-block:last-child{border:0}.condition-block span{color:#708791;font:850 8px/1 var(--mono);letter-spacing:.09em}.condition-block b{margin-top:10px;font:900 21px/1 var(--display)}.condition-block small{margin-top:8px;color:#8499a2;font:750 10px/1.35 var(--mono)}.condition-block.lightning b{color:var(--amber)}
/* Contest Hub */
.contest-home{min-height:100vh;max-width:1540px;margin:auto;padding:28px 34px 60px}.home-brand{display:flex;align-items:center;gap:14px}.home-brand>div:last-child b{display:block;font:950 25px/1 var(--display);letter-spacing:.025em}.home-brand>div:last-child small{display:block;margin-top:6px;color:#78909a;font:850 9px/1 var(--mono);letter-spacing:.14em}.home-intro{margin:68px 0 42px;max-width:820px}.home-intro>span{color:var(--blue);font:850 10px/1 var(--mono);letter-spacing:.14em}.home-intro h1{margin:10px 0 0;font:900 clamp(46px,6vw,86px)/.9 var(--display);letter-spacing:-.04em}.home-intro p{max-width:720px;margin:18px 0 0;color:#91a5ae;font:700 15px/1.55 var(--ui)}.event-section{margin-top:28px}.event-section-head{display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid var(--line);padding:0 2px 10px}.event-section-head b{font:900 12px/1 var(--mono);letter-spacing:.09em}.event-section-head span{color:#708791;font:750 9px/1 var(--mono)}.event-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:9px;margin-top:10px}.event-grid.compact{grid-template-columns:repeat(4,minmax(0,1fr))}.event-card{min-height:88px;border:1px solid var(--line);background:linear-gradient(180deg,#101518,#0c1012);color:inherit;text-align:left;padding:10px 12px;display:grid;grid-template-columns:54px 1fr 16px;gap:12px;align-items:center;transition:transform .18s,border-color .18s,background .18s}.event-card:hover{transform:translateY(-2px);border-color:#466473;background:#151b1e}.event-card.on_air{box-shadow:inset 3px 0 var(--live)}.event-card.upcoming{box-shadow:inset 3px 0 var(--blue)}.event-logo{width:50px;height:50px;border:1px solid #2c4651;background:#081218;display:grid;place-items:center;overflow:hidden}.event-logo img{width:100%;height:100%;object-fit:contain;padding:4px}.event-logo span{font:950 16px/1 var(--display);color:#c7d8de}.event-copy{min-width:0}.event-copy small{display:block;color:#748c97;font:850 8px/1 var(--mono);letter-spacing:.06em}.event-copy b{display:block;margin-top:7px;font:850 15px/1.12 var(--display);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.event-copy em{display:block;margin-top:7px;color:#8197a1;font:750 9px/1 var(--mono);font-style:normal}.event-card>i{font:900 22px/1 var(--display);color:#688390;font-style:normal}.event-empty{border:1px dashed #273d47;color:#748994;padding:22px;font:750 11px/1.3 var(--ui)}.event-empty.small{padding:12px}.home-source{margin-top:34px;color:#5f7782;font:700 9px/1.4 var(--mono)}
/* Contest picker */
.picker-backdrop{position:fixed;inset:0;background:rgba(0,0,0,.55);z-index:180;backdrop-filter:blur(3px)}.contest-picker-panel{position:fixed;top:0;right:0;bottom:0;width:min(560px,94vw);background:#081218;border-left:1px solid #2b424d;z-index:181;box-shadow:-30px 0 80px rgba(0,0,0,.36);animation:pickerIn .32s cubic-bezier(.16,1,.3,1)}@keyframes pickerIn{from{transform:translateX(40px);opacity:.3}to{transform:none;opacity:1}}.picker-head{height:82px;border-bottom:1px solid var(--line);display:flex;align-items:center;justify-content:space-between;padding:0 18px}.picker-head span{display:block;color:#6d8490;font:850 8px/1 var(--mono);letter-spacing:.1em}.picker-head b{display:block;margin-top:7px;font:900 23px/1 var(--display)}.picker-head button{border:0;background:transparent;color:#89a0aa;font-size:27px}.picker-scroll{height:calc(100vh - 82px);overflow:auto;padding:12px}.picker-scroll h3{margin:18px 2px 8px;color:#778f99;font:900 9px/1 var(--mono);letter-spacing:.1em}.picker-scroll .event-card{width:100%;margin-bottom:7px}
@media(max-width:1500px){.pro-shell{grid-template-columns:128px minmax(0,1fr)!important}.rail-brand b{font-size:12px!important}.rail-brand small{font-size:7px!important}.pro-topbar{grid-template-columns:minmax(260px,.9fr) minmax(420px,1fr) auto!important}.rules-chip{display:none}.event-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.event-grid.compact{grid-template-columns:repeat(3,minmax(0,1fr))}.cockpit-telemetry-strip{grid-template-columns:1fr 1fr 1fr 1.15fr 1.15fr}}
@media(max-width:1180px){.pro-shell{grid-template-columns:78px minmax(0,1fr)!important}.rail-brand>div:last-child{display:none}.cs-logo.mini{width:46px;height:46px}.pro-topbar{grid-template-columns:1fr auto!important}.contest-picker-button{min-width:0}.category-filterbar{position:static;overflow:auto}.cockpit-telemetry-strip{grid-template-columns:1fr 1fr}.cockpit-telemetry-strip>div{border-bottom:1px solid var(--line)}.event-grid,.event-grid.compact{grid-template-columns:1fr 1fr}}
@media(max-width:700px){.event-grid,.event-grid.compact{grid-template-columns:1fr}.contest-home{padding:20px 16px 45px}.home-intro{margin-top:44px}.record-compact{grid-template-columns:50px 1fr 70px}.record-selected small,.record-delta span,.ref-import{display:none}.cockpit-telemetry-strip{grid-template-columns:1fr}.pro-reference{height:auto!important}.record-compact{height:auto;min-height:48px;flex-wrap:wrap}}

/* v2.9 cockpit consolidation + ContestScope wordmark + dense Band Battle */
/* Brand identity: typography first. The name is the mark; the three timing strokes are the visual signature. */
.brand-wordmark{border:0;background:transparent;color:inherit;text-align:left}
.scope-wordmark{position:relative;display:inline-grid;grid-template-columns:auto auto;align-items:end;gap:3px;padding-bottom:9px;white-space:nowrap}
.scope-wordmark>span{font:900 19px/.88 var(--display);letter-spacing:.015em;color:#dce8ec}
.scope-wordmark>strong{font:950 25px/.82 var(--display);letter-spacing:-.035em;color:#fff}
.scope-wordmark>i{position:absolute;left:0;right:0;bottom:1px;height:5px;display:flex;align-items:flex-end;gap:3px}
.scope-wordmark>i em{display:block;height:2px;background:var(--blue);transform:skewX(-28deg);box-shadow:0 0 8px rgba(104,199,255,.12)}
.scope-wordmark>i em:nth-child(1){width:24%;background:#4e7f92}.scope-wordmark>i em:nth-child(2){width:34%;background:var(--blue)}.scope-wordmark>i em:nth-child(3){width:15%;height:3px;background:var(--live)}
.scope-wordmark.compact{display:grid;grid-template-columns:1fr;gap:0;padding-bottom:10px;min-width:94px}.scope-wordmark.compact>span{font-size:14px;letter-spacing:.055em}.scope-wordmark.compact>strong{font-size:22px;margin-top:1px}.scope-wordmark.compact>i{right:16px}
.rail-brand.brand-wordmark{height:80px!important;padding:11px 12px 8px!important;display:flex!important;flex-direction:column!important;align-items:flex-start!important;justify-content:center!important;gap:3px!important;width:100%;border-bottom:1px solid var(--line)!important}
.rail-brand.brand-wordmark>small{display:block!important;color:#6f8792!important;font:800 7px/1 var(--mono)!important;letter-spacing:.13em!important;margin:0!important}
.home-brand.brand-wordmark{display:flex;flex-direction:column;align-items:flex-start;gap:7px}.home-brand.brand-wordmark .scope-wordmark>span{font-size:23px}.home-brand.brand-wordmark .scope-wordmark>strong{font-size:34px}.home-brand.brand-wordmark>small{color:#738c97;font:850 9px/1 var(--mono);letter-spacing:.16em}

/* Records belong to Cockpit / Records, never to the leaderboard surface. */
.pro-reference{display:none!important}

/* Compact cockpit command strip: score, rate, selected record and all station conditions once. */
.cockpit-summary-v29{display:grid;grid-template-columns:.9fr .72fr 1.45fr 1.2fr;min-height:91px;margin-bottom:9px;border:1px solid var(--line);background:linear-gradient(180deg,#101518,#0b0f11);overflow:hidden}
.cockpit-summary-v29>div{min-width:0;padding:11px 14px;border-right:1px solid var(--line);position:relative}.cockpit-summary-v29>div:last-child{border-right:0}
.cockpit-summary-v29>div:before{content:"";position:absolute;left:0;right:0;top:0;height:2px;background:#2b5365}.cockpit-summary-v29 .cockpit-score:before{background:var(--blue)}.cockpit-summary-v29 .cockpit-rate:before{background:var(--live)}.cockpit-summary-v29 .cockpit-record:before{background:var(--amber)}.cockpit-summary-v29 .cockpit-conditions:before{background:linear-gradient(90deg,var(--live),var(--amber))}
.cockpit-summary-v29 span{color:#758d98;font:850 8px/1 var(--mono);letter-spacing:.085em}.cockpit-summary-v29>div>b,.cockpit-rate>b,.cockpit-score>b{display:block;margin-top:8px;font:900 29px/.9 var(--display);letter-spacing:-.025em;color:#f2f7f9;font-variant-numeric:tabular-nums}.cockpit-summary-v29>div>small,.cockpit-score>small,.cockpit-rate>small{display:block;margin-top:8px;color:#879ca5;font:750 9px/1.2 var(--mono)}
.cockpit-record{display:grid;grid-template-rows:auto 1fr auto}.cockpit-record-head{display:flex;align-items:center;justify-content:space-between;gap:9px}.record-scope-tabs.cockpit-tabs{height:24px;border-color:#334954}.record-scope-tabs.cockpit-tabs button{height:22px;padding:0 7px;font-size:6.8px}.cockpit-record-main{min-width:0;display:flex;align-items:baseline;gap:11px;margin-top:6px}.cockpit-record-main>b{font:900 26px/.9 var(--display);color:#f3bd66;white-space:nowrap}.cockpit-record-main>em{min-width:0;font:850 10px/1 var(--mono);font-style:normal;color:#d6e1e5;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.cockpit-record-foot{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-top:8px;border-top:1px solid #1a3039;padding-top:6px}.cockpit-record-foot span{letter-spacing:0;color:#788f99}.cockpit-record-foot span b{color:#cbd8dd;font:850 10px/1 var(--mono)}.cockpit-record-foot>strong{font:900 12px/1 var(--mono);white-space:nowrap}
.cockpit-conditions{display:flex;flex-direction:column;justify-content:center}.conditions-top{display:flex;align-items:baseline;justify-content:space-between;gap:12px}.conditions-top b{font:900 19px/1 var(--display);white-space:nowrap}.cockpit-conditions>small{margin-top:7px!important}.lightning-inline{margin-top:8px;height:24px;border:1px solid #304336;background:#091713;display:grid;grid-template-columns:7px auto 1fr;align-items:center;gap:7px;padding:0 8px}.lightning-inline i{width:6px;height:6px;border-radius:50%;background:var(--amber);box-shadow:0 0 8px rgba(243,189,102,.25)}.lightning-inline b{font:900 7px/1 var(--mono);letter-spacing:.08em;color:#efc774}.lightning-inline span{font:750 7px/1 var(--mono);letter-spacing:0;color:#7f948a;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}

/* One performance surface. Score Evolution and Gap are modes, not duplicate panels. */
.performance-focus{margin-bottom:9px}.performance-focus .surface-head{min-height:52px}.performance-title{height:24px;padding:8px 14px 0;color:#8ca2ac;font:900 10px/1 var(--display);letter-spacing:.025em}.cockpit-chart-v29{height:252px!important;min-height:252px!important}.performance-focus .chart-toolbar{flex-wrap:nowrap}.performance-focus .chart-toolbar button{padding-left:10px;padding-right:10px}
.race-chart-pair,.conditions-panel,.cockpit-telemetry-strip{display:none!important}

/* Category Race + Band Battle restore the dense competition-oriented lower cockpit. */
.cockpit-lower-grid.v29{display:grid;grid-template-columns:minmax(0,1.22fr) minmax(560px,.92fr);gap:9px;align-items:stretch}.cockpit-lower-grid.v29>.surface{min-width:0}
.band-battle-v29{container-type:inline-size;overflow:hidden}.band-battle-v29 .surface-head{min-height:48px}.battle-kpis{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));border-bottom:1px solid var(--line);background:#0b0f11}.battle-kpis>div{min-width:0;padding:9px 10px;border-right:1px solid var(--line2)}.battle-kpis>div:last-child{border:0}.battle-kpis span{display:block;color:#6f8793;font:850 7px/1 var(--mono);letter-spacing:.085em}.battle-kpis b{display:block;margin-top:6px;font:900 17px/.95 var(--display);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.battle-kpis small{display:block;margin-top:5px;color:#8298a1;font:750 7.5px/1.15 var(--mono);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.battle-grid-head,.battle-row{display:grid;grid-template-columns:48px 88px minmax(92px,1fr) 48px minmax(92px,1fr) 48px 116px;column-gap:5px;align-items:center}.battle-grid-head{height:28px;padding:0 8px;color:#67808c;font:850 6.5px/1 var(--mono);letter-spacing:.055em;background:#081218;border-bottom:1px solid var(--line2)}.battle-grid-body{display:grid}.battle-row{min-height:48px;padding:0 8px;border-bottom:1px solid #142730;background:#0d1113;transition:background .2s ease}.battle-row:last-child{border-bottom:0}.battle-row.hot{background:linear-gradient(90deg,rgba(243,189,102,.105),rgba(243,189,102,.025) 72%,transparent);box-shadow:inset 2px 0 var(--amber)}.battle-band{display:flex;align-items:center;gap:5px}.battle-band>b{font:900 16px/1 var(--display)}.battle-band>span{font:900 6px/1 var(--mono);color:#f4c76d;border:1px solid #654f2b;padding:3px 4px}.battle-you{display:grid;grid-template-columns:auto auto;gap:2px 4px;align-items:baseline}.battle-you b{font:900 11px/1 var(--mono);color:#dce8ed}.battle-you span{font:800 5.5px/1 var(--mono);color:#607985}.battle-leader{min-width:0}.battle-leader strong{display:block;font:900 9px/1 var(--mono);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:#dce8ed}.battle-leader small{display:block;margin-top:4px;color:#657f8b;font:750 6.5px/1 var(--mono)}.battle-gap{font:900 10px/1 var(--mono);text-align:center}.battle-active{min-width:0;display:flex;flex-direction:column;justify-content:center;gap:2px}.battle-active-line{height:17px;display:grid;grid-template-columns:25px minmax(0,1fr);align-items:center;border-left:2px solid #31566e;background:#101518;padding:0 4px}.battle-active-line i{font:900 6.5px/1 var(--mono);font-style:normal;color:#79a8c8}.battle-active-line b{font:900 8px/1 var(--mono);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.battle-active-line.mine{border-left-color:var(--live);background:rgba(89,225,177,.08)}.battle-active>small{font:750 6px/1 var(--mono);color:#657c87;padding-left:5px}.battle-active>span{color:#5e7480;font:800 8px/1 var(--mono)}

@container (max-width:680px){.battle-grid-head,.battle-row{grid-template-columns:44px 76px minmax(86px,1fr) 44px minmax(86px,1fr) 44px 92px;column-gap:3px}.battle-kpis b{font-size:15px}.battle-active-line{grid-template-columns:21px minmax(0,1fr)}}
@media(max-width:1500px){.cockpit-summary-v29{grid-template-columns:.9fr .7fr 1.35fr 1.1fr}.cockpit-summary-v29>div{padding:10px}.cockpit-summary-v29>div>b,.cockpit-score>b,.cockpit-rate>b{font-size:25px}.cockpit-lower-grid.v29{grid-template-columns:minmax(0,1.15fr) minmax(520px,.9fr)}.performance-focus .chart-toolbar button:nth-last-child(-n+2){padding-left:8px;padding-right:8px}}
@media(max-width:1180px){.cockpit-summary-v29{grid-template-columns:1fr 1fr}.cockpit-summary-v29>div{border-bottom:1px solid var(--line)}.cockpit-lower-grid.v29{grid-template-columns:1fr}.performance-focus .chart-toolbar{overflow:auto;max-width:58vw}.band-battle-v29{min-width:0}}


/* v3.0 race-context + configurable performance field + replay stabilization */
/* Leaderboard scope is intentionally simple: Top 10 or Full Field. */
.board-toolbar .seg button{min-width:82px}

/* Category Race is the dynamic My Race surface: four above + four below. */
.cockpit-lower-grid.v30{display:grid;grid-template-columns:minmax(0,1.42fr) minmax(500px,.82fr);gap:9px;align-items:stretch}
.cockpit-race{overflow:hidden}
.cockpit-board-head.v30,
.cockpit-board-v30 .board-row.telemetry{
  display:grid!important;
  grid-template-columns:38px minmax(130px,1fr) minmax(118px,.84fr) 78px 68px 92px 96px 64px minmax(120px,1fr) 36px 38px 18px!important;
  column-gap:7px!important;
  align-items:center!important;
}
.cockpit-board-head.v30{height:30px;padding:0 9px;color:#708893;font:850 7.5px/1 var(--mono);letter-spacing:.055em;border-bottom:1px solid var(--line2);background:#0b0f11}
.cockpit-board-v30 .board-row.telemetry{min-height:38px!important;height:38px!important;padding:0 9px!important;margin:0!important;border-bottom:1px solid rgba(33,55,65,.34)!important;background-color:#0d1113}
.cockpit-board-v30 .board-row.telemetry:last-child{border-bottom:0!important}
.cockpit-board-v30 .active-cell,
.cockpit-board-v30 .fresh-cell,
.cockpit-board-v30 .detail-arrow{display:none!important}
.cockpit-board-v30 .station-call{font-size:17px!important}
.cockpit-board-v30 .station-operator{font-size:12px!important;color:#8197a0;max-width:92px}
.cockpit-board-v30 .station-line{gap:5px}
.cockpit-board-v30 .score-main{font-size:17px!important}
.cockpit-board-v30 .micro b{font-size:11.5px!important}
.cockpit-board-v30 .micro small{font-size:7.5px!important}
.cockpit-board-v30 .relative b{font-size:9.5px!important}
.cockpit-board-v30 .relative small{font-size:7px!important}
.cockpit-board-v30 .trend-cell .row-spark{min-width:100px!important;height:20px!important}
.cockpit-board-v30 .trend-cell small{display:none}
.cockpit-board-v30 .move{font-size:10px!important;text-align:center}

/* Performance field controls: own station is pinned first; up to four rivals configurable. */
.trace-head-v30{position:relative;align-items:center;gap:12px}.trace-head-actions{display:flex;align-items:center;gap:10px;min-width:0}.trace-config-btn{height:30px;border:1px solid #35515f;background:#101518;color:#b9ccd4;padding:0 10px;font:850 8px/1 var(--mono);letter-spacing:.045em;white-space:nowrap;cursor:pointer}.trace-config-btn:hover{color:#fff;border-color:#68c7ff}.trace-picker{position:absolute;right:10px;top:54px;z-index:40;width:min(620px,80vw);max-height:360px;overflow:auto;background:#0c1012;border:1px solid #34505d;box-shadow:0 22px 60px rgba(0,0,0,.48);padding:12px}.trace-picker[hidden]{display:none!important}.trace-picker-head{display:flex;align-items:center;justify-content:space-between;gap:12px;padding-bottom:10px;border-bottom:1px solid var(--line2)}.trace-picker-head b{display:block;font:900 10px/1 var(--display);letter-spacing:.05em}.trace-picker-head small{display:block;margin-top:5px;color:#7c929b;font:750 9px/1.2 var(--ui)}.trace-picker-head button{border:1px solid #304854;background:#0e1214;color:#9ab0b8;height:28px;padding:0 9px;font:800 8px/1 var(--mono);cursor:pointer}.trace-call-grid{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:6px;margin-top:10px}.trace-call-grid button{height:34px;border:1px solid #223b47;background:#0e1214;color:#a8bbc3;font:850 10px/1 var(--mono);cursor:pointer;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.trace-call-grid button.on{border-color:var(--blue);background:rgba(104,199,255,.10);color:#fff}.trace-call-grid button.pinned{border-color:rgba(89,225,177,.55);background:rgba(89,225,177,.09);color:#dffbef;cursor:default}.trace-call-grid button small{margin-left:5px;color:var(--live);font-size:6px}.trace-picker-foot{margin-top:10px;color:#6f858f;font:750 8px/1.3 var(--ui)}

/* Band Battle legibility: QSO/MULT labels and values must read at a glance. */
.band-battle-v29 .battle-grid-head{font-size:7.5px!important;height:30px!important;color:#7f97a2!important}
.band-battle-v29 .battle-you b{font-size:13px!important}.band-battle-v29 .battle-you span{font-size:7px!important;color:#8ba0a9!important}.band-battle-v29 .battle-leader strong{font-size:10px!important}.band-battle-v29 .battle-leader small{font-size:8px!important;color:#8197a0!important}.band-battle-v29 .battle-gap{font-size:11px!important}.band-battle-v29 .battle-active-line{height:19px!important}.band-battle-v29 .battle-active-line b{font-size:9px!important}.band-battle-v29 .battle-active-line i{font-size:7px!important}

/* Replay is an isolated playback surface: no live polling replaces it while playing. */
.replay-standings-stable .replay-row{height:46px;opacity:1!important;transform:translate3d(0,var(--replay-y,0),0)!important;transition:transform .42s cubic-bezier(.16,1,.3,1),background .20s ease,border-color .20s ease!important;contain:layout paint style;backface-visibility:hidden}
.replay-standings-stable[data-speed="4"] .replay-row{transition-duration:.28s!important}.replay-standings-stable[data-speed="8"] .replay-row{transition-duration:.18s!important}
.replay-standings-stable .replay-row.entered{opacity:1!important;transform:translate3d(0,var(--replay-y,0),0)!important}.replay-standings-stable .replay-row.leaving{opacity:1!important}

@media(max-width:1450px){.cockpit-lower-grid.v30{grid-template-columns:minmax(0,1.3fr) minmax(470px,.8fr)}.cockpit-board-head.v30,.cockpit-board-v30 .board-row.telemetry{grid-template-columns:38px minmax(130px,1fr) minmax(118px,.84fr) 78px 68px 92px 96px 64px minmax(120px,1fr) 36px 38px 18px!important}.cockpit-board-v30 .station-operator{font-size:11px;max-width:76px}.trace-call-grid{grid-template-columns:repeat(4,minmax(0,1fr))}}
@media(max-width:1180px){.cockpit-lower-grid.v30{grid-template-columns:1fr}.cockpit-race{overflow:auto}.cockpit-board-head.v30,.cockpit-board-v30 .board-row.telemetry{min-width:920px!important}.trace-head-actions{max-width:70vw;overflow:auto}.trace-call-grid{grid-template-columns:repeat(3,minmax(0,1fr))}}

/* v3.0 Band Battle readability refinement */
.band-battle-v29 .battle-you span{font-size:8.5px!important;letter-spacing:.02em}.band-battle-v29 .battle-leader small{font-size:9px!important}.band-battle-v29 .battle-grid-head{font-size:8px!important}.band-battle-v29 .battle-row{min-height:50px!important}

/* v3.1 report visualization refresh + Band Battle hot-row cleanup */
/* Hot band is a row state, never an inline badge. */
.band-battle-v29 .battle-row.hot{
  position:relative;
  background:linear-gradient(90deg,rgba(243,189,102,.13),rgba(243,189,102,.055) 58%,rgba(243,189,102,.015));
  box-shadow:inset 3px 0 0 var(--amber);
}
.band-battle-v29 .battle-row.hot .battle-band{position:relative;padding-left:1px}
.band-battle-v29 .battle-row.hot .battle-band:after{content:"";width:5px;height:5px;border-radius:50%;background:var(--amber);box-shadow:0 0 8px rgba(243,189,102,.42);flex:0 0 auto}
.band-battle-v29 .battle-band>span{display:none!important}
.band-battle-v29 .battle-grid-head,.band-battle-v29 .battle-row{grid-template-columns:52px 92px minmax(92px,1fr) 48px minmax(92px,1fr) 48px 116px}

/* CQ zone report: radial distribution plus a compact ranking column. */
.geo-zone-layout{display:grid;grid-template-columns:minmax(0,1fr) 190px;min-height:382px;align-items:stretch}
.geo-zone-rose{height:382px!important;min-width:0}
.geo-zone-ranking{border-left:1px solid var(--line2);padding:18px 14px;display:flex;flex-direction:column;justify-content:center;gap:4px;background:linear-gradient(180deg,rgba(13,17,19,.76),rgba(9,12,14,.30))}
.geo-zone-ranking-head{color:#718995;font:900 9px/1 var(--mono);letter-spacing:.08em;margin-bottom:9px}
.geo-zone-ranking>div:not(.geo-zone-ranking-head){display:grid;grid-template-columns:30px 1fr auto;gap:8px;align-items:center;min-height:42px;border-bottom:1px solid rgba(43,67,78,.45)}
.geo-zone-ranking>div:last-child{border-bottom:0}
.geo-zone-ranking span{width:24px;height:24px;border:1px solid #31515f;display:grid;place-items:center;color:#7fb8cf;font:900 8px/1 var(--mono);background:#0f1417}
.geo-zone-ranking b{font:900 11px/1 var(--mono);color:#dce8ed}
.geo-zone-ranking strong{font:850 10px/1 var(--mono);color:#93a9b2;white-space:nowrap}
.geo-zone-ranking>div:nth-child(2) span{border-color:rgba(89,225,177,.7);color:var(--live)}
.geo-zone-ranking>div:nth-child(3) span{border-color:rgba(104,199,255,.7);color:var(--blue)}
.geo-zone-ranking>div:nth-child(4) span{border-color:rgba(157,122,255,.62);color:#a98cff}

/* Operating timeline is a factual activity-lane view built from 5 Min QSO buckets. */
.operating-timeline{height:410px!important;min-height:410px}
.operating-timeline-surface .surface-subtitle{max-width:760px}

/* Mirrored yield chart benefits from a little extra width and calm background. */
.band-profile-surface .band-profile-chart,.report-compact-chart #fileBands{background:linear-gradient(180deg,rgba(16,20,22,.16),rgba(9,12,14,0))}

@media(max-width:1450px){
  .geo-zone-layout{grid-template-columns:minmax(0,1fr) 166px}
  .geo-zone-ranking{padding-left:10px;padding-right:10px}
  .geo-zone-ranking strong{font-size:9px}
}
@media(max-width:980px){
  .geo-zone-layout{grid-template-columns:1fr}
  .geo-zone-ranking{border-left:0;border-top:1px solid var(--line2);display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:5px;padding:10px}
  .geo-zone-ranking-head{grid-column:1/-1}
  .geo-zone-ranking>div:not(.geo-zone-ranking-head){grid-template-columns:24px 1fr;min-height:44px;border:1px solid rgba(43,67,78,.45);padding:5px}
  .geo-zone-ranking strong{grid-column:2;font-size:8px}
}
@container (max-width:680px){
  .band-battle-v29 .battle-grid-head,.band-battle-v29 .battle-row{grid-template-columns:46px 74px minmax(82px,1fr) 40px minmax(82px,1fr) 40px 88px;column-gap:3px}
}

/* ==========================================================================
   v3.2 · Public Leaderboard — field statistics block
   The station list comes first. This renders below it, full width.
   Widgets go in a row of three and charts in a row of two, instead of a short
   side column next to a tall one: that height mismatch was what left the
   vertical gap.
   ========================================================================== */
.field-block{margin-top:14px;display:flex;flex-direction:column;gap:14px}

.field-strip{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:1px;
  background:var(--line2);border:1px solid var(--line2)}
.field-strip>div{background:var(--panel);padding:13px 15px;min-width:0}
.field-strip span{display:block;font:800 8.5px/1 var(--mono);letter-spacing:.14em;color:var(--faint);
  margin-bottom:10px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.field-strip b{display:block;font:700 23px/1 var(--mono);letter-spacing:-.015em;
  font-variant-numeric:tabular-nums;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.field-strip b.hot{color:var(--amber)}
.field-strip small{display:block;font-size:11px;color:var(--faint);margin-top:7px;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}

.field-widgets{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:14px;align-items:stretch}
.field-widget{display:flex;flex-direction:column}
.field-widget .wlist{flex:1;padding:4px 0 6px}

.wlist .witem{display:grid;grid-template-columns:26px minmax(0,1fr) auto;gap:10px;align-items:center;
  padding:9px 15px;transition:background .2s}
.wlist .witem:hover{background:var(--panel2)}
.wlist .witem.empty-line{grid-template-columns:1fr;padding:16px 15px}
.wlist .witem.empty-line small{color:var(--faint);font-size:11.5px}
.wlist .wi{font:700 11px/1 var(--mono);color:var(--faint);font-variant-numeric:tabular-nums}
.wlist .wc{min-width:0}
.wlist .wc strong{display:block;font:700 13px/1 var(--mono);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.wlist .wc small{display:block;font-size:10.5px;color:var(--faint);margin-top:5px;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.wlist .wv{font:700 14px/1 var(--mono);text-align:right;white-space:nowrap;
  font-variant-numeric:tabular-nums}
.wlist .wv.up{color:var(--live)}
.wlist .wv.dn{color:var(--red)}
.wlist .wv.hot{color:var(--amber)}

.field-charts{display:grid;grid-template-columns:minmax(0,1.65fr) minmax(0,1fr);gap:14px;align-items:stretch}
.field-charts>.surface{display:flex;flex-direction:column}
.chart-host.field-river,.chart-host.field-pulse{flex:1;min-height:236px;padding:4px 6px 0}
.field-note{padding:10px 15px;border-top:1px solid var(--line2);color:var(--faint);font-size:11.5px}
.field-note b{color:var(--muted);font-weight:600}

@media(max-width:1180px){
  .field-strip{grid-template-columns:repeat(3,minmax(0,1fr))}
  .field-widgets{grid-template-columns:1fr 1fr}
  .field-charts{grid-template-columns:1fr}
}
@media(max-width:760px){
  .field-strip{grid-template-columns:1fr 1fr}
  .field-widgets{grid-template-columns:1fr}
}

/* ==========================================================================
   v3.3 · Cockpit detail view
   The v3.1 compact surfaces are untouched. EXPAND reveals a detail layer inside
   the same surface: nothing is replaced, nothing navigates away, and a refresh
   never rebuilds it. Height is animated with grid-template-rows on a wrapper so
   no child is transformed — a dropped frame cannot strand a row, which is the
   failure that hid standings positions in v3.2.
   ========================================================================== */
.surface-head-actions{display:flex;align-items:center;gap:12px;flex-shrink:0}
.cs-expand{border:1px solid #344d59;background:#141a1d;color:var(--muted);
  font:800 9px/1 var(--mono);letter-spacing:.1em;padding:8px 11px;cursor:pointer;white-space:nowrap;
  transition:color .2s ease,border-color .2s ease,background .2s ease}
.cs-expand:hover{color:var(--text);border-color:#4a6a78}
.cs-expand:focus-visible{outline:2px solid var(--blue);outline-offset:1px}
.surface.cs-open .cs-expand{color:var(--live);border-color:#1f5648;background:rgba(89,225,177,.08)}

.cs-zoom{display:grid;grid-template-rows:0fr;
  transition:grid-template-rows .5s cubic-bezier(.22,.61,.36,1)}
.cs-zoom>*{min-height:0;overflow:hidden}
.surface.cs-open .cs-zoom{grid-template-rows:1fr;border-top:1px solid var(--line2)}
.surface.cs-open .cs-compact{display:none}

/* timing tower */
.cs-tw{display:grid;grid-template-columns:minmax(320px,.85fr) minmax(0,1.6fr)}
.cs-twl{border-right:1px solid var(--line2)}
.cs-twhead,.cs-twrow{display:grid;grid-template-columns:34px minmax(0,1fr) 92px 74px 62px;
  gap:9px;align-items:center;padding:0 14px}
.cs-twhead{font:800 8px/1 var(--mono);letter-spacing:.12em;color:var(--faint);height:32px;
  border-bottom:1px solid var(--line2);position:sticky;top:0;background:var(--panel);z-index:3}
.cs-twhead div:nth-child(n+3){text-align:right}
.cs-twrow{height:38px;position:relative;border-left:2px solid transparent;
  transition:background .25s ease,border-color .25s ease}
.cs-twrow::after{content:"";position:absolute;inset:auto 0 0 0;height:1px;background:var(--line2);opacity:.45}
.cs-twrow:hover{background:var(--panel2)}
.cs-twrow.me{background:rgba(89,225,177,.05);border-left-color:var(--live)}
.cs-twrow .p{font:700 13px/1 var(--mono);color:var(--muted);font-variant-numeric:tabular-nums}
.cs-twrow.p1 .p{color:var(--amber)}
.cs-twrow .c{font:700 14px/1 var(--mono);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.cs-twrow.me .c{color:var(--live)}
.cs-twrow .s{font:700 13px/1 var(--mono);text-align:right;font-variant-numeric:tabular-nums}
.cs-twrow .g,.cs-twrow .i{font:700 11px/1 var(--mono);text-align:right;color:var(--faint);
  font-variant-numeric:tabular-nums;transition:color .3s ease}
.cs-twrow .i.close{color:var(--live)}

/* F1 interval grid */
.cs-sg{overflow:auto;scrollbar-width:thin}
.cs-sghead{display:flex;align-items:center;gap:14px;height:32px;padding:0 14px;
  border-bottom:1px solid var(--line2);position:sticky;top:0;background:var(--panel);z-index:3}
.cs-lg{display:flex;align-items:center;gap:6px;font:700 8.5px/1 var(--mono);
  letter-spacing:.08em;color:var(--faint);white-space:nowrap}
.cs-lg i{width:9px;height:9px;display:block}
.cs-lg i.p{background:#b06cf0}
.cs-lg i.g{background:#4fd98e;opacity:.8}
.cs-lg i.y{background:#e8c95c;opacity:.55}
.cs-lg i.idle{background:#1a2b34}
.cs-sgrow{display:flex;align-items:center;gap:2px;height:38px;padding:0 14px}
.cs-sgcell{flex:1;min-width:6px;height:22px;background:#1a2b34;
  transition:background .45s ease,opacity .45s ease,box-shadow .45s ease}
.cs-sgcell.y{background:#e8c95c;opacity:.55}
.cs-sgcell.g{background:#4fd98e;opacity:.8}
.cs-sgcell.p{background:#b06cf0;opacity:.95;box-shadow:0 0 9px rgba(176,108,240,.5)}
.cs-sgcell.now{outline:1px solid rgba(255,255,255,.32);outline-offset:-1px}
.cs-sgcell:hover{outline:1px solid var(--text);outline-offset:-1px}

/* band battle detail */
.cs-bbrow{border-bottom:1px solid var(--line2)}
.cs-bbhead{display:grid;grid-template-columns:74px 112px minmax(0,1fr) 96px;gap:12px;align-items:center;
  padding:11px 15px;cursor:pointer;transition:background .2s ease}
.cs-bbhead:hover{background:var(--panel2)}
.cs-bbrow.open .cs-bbhead{background:var(--panel2)}
.cs-bbband{font:800 17px/1 var(--display);display:flex;align-items:center;gap:8px}
.cs-bbband i{width:8px;height:8px;flex-shrink:0}
.cs-bbnum b{display:block;font:700 14px/1 var(--mono);font-variant-numeric:tabular-nums}
.cs-bbnum small{display:block;font:700 8px/1 var(--mono);color:var(--faint);margin-top:5px;letter-spacing:.1em}
.cs-bbbar{height:20px;background:#0e1214;position:relative;overflow:hidden}
.cs-bbbar i{position:absolute;inset:0 auto 0 0;opacity:.5;
  transition:width .8s cubic-bezier(.22,.61,.36,1)}
.cs-bbbar span{position:absolute;right:7px;top:50%;transform:translateY(-50%);
  font:700 9.5px/1 var(--mono);color:var(--muted);white-space:nowrap}
.cs-bbcount{font:700 11px/1 var(--mono);text-align:right;color:var(--faint)}
.cs-bbcount b{color:var(--live)}
.cs-bbdetail{display:none;padding:4px 15px 14px;background:#0b0f11}
.cs-bbrow.open .cs-bbdetail{display:block}
.cs-bbgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(184px,1fr));gap:1px;
  background:var(--line2);border:1px solid var(--line2)}
.cs-bbst{background:var(--panel);padding:9px 11px;display:grid;grid-template-columns:32px minmax(0,1fr) auto;
  gap:9px;align-items:center}
.cs-bbst .r{font:700 10.5px/1 var(--mono);color:var(--faint)}
.cs-bbst .n{font:700 12.5px/1 var(--mono);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.cs-bbst .n small{display:block;font:700 8px/1 var(--mono);color:var(--faint);margin-top:4px}
.cs-bbst .v{font:700 12px/1 var(--mono);text-align:right;color:var(--live);font-variant-numeric:tabular-nums}
.cs-bbempty{padding:14px 4px;color:var(--faint);font-size:11.5px}

.cs-foot{padding:10px 15px;border-top:1px solid var(--line2);color:var(--faint);font-size:11.5px;flex-shrink:0}
.cs-foot b{color:var(--muted);font-weight:600}

@media(max-width:1180px){
  .cs-tw{grid-template-columns:1fr}
  #csRaceStrip{grid-template-columns:1fr 1fr}
  #csBandStrip{grid-template-columns:repeat(3,1fr)}
  .stage{min-height:auto}
  .stage,.stage.race,.stage.band{grid-template-rows:auto auto}
}

/* ==========================================================================
   v3.3 · MAX RATE tile and rate order drawer
   Two questions, deliberately separated: NOW is the current-window rate and is
   trustworthy from the first poll; PEAK accumulates while the page is open and
   is labelled so nobody mistakes a short session for a contest record.
   ========================================================================== */
.cockpit-maxrate{position:relative;padding:12px 14px;background:var(--panel);
  border-left:1px solid var(--line2);cursor:pointer;min-width:0;
  transition:background .2s ease}
.cockpit-maxrate:hover{background:var(--panel2)}
.cockpit-maxrate:focus-visible{outline:2px solid var(--blue);outline-offset:-2px}
.cockpit-maxrate>span{display:block;font:800 9px/1 var(--mono);letter-spacing:.14em;
  color:var(--faint);margin-bottom:10px}
.cockpit-maxrate>b{display:block;font:700 19px/1 var(--mono);letter-spacing:-.01em;
  color:var(--amber);font-variant-numeric:tabular-nums}
.cockpit-maxrate>small{display:block;font-size:11px;color:var(--faint);margin-top:7px;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.cockpit-maxrate .mr-open{position:absolute;right:14px;top:12px;font-style:normal;
  font:800 8px/1 var(--mono);letter-spacing:.1em;color:#41606e;transition:color .2s ease}
.cockpit-maxrate:hover .mr-open{color:var(--blue)}

/* Self-contained: does NOT reuse .drawer, whose resting state is
   translateX(100%) and which relies on its own forwards animation to become
   visible. Two animation declarations on one element mean the later one wins,
   and the panel would snap back off-screen the moment it finished. Here the
   resting state is already visible, so a dropped or cancelled animation can
   never hide it. */
.mr-drawer{position:fixed;right:0;top:0;bottom:0;width:min(660px,92vw);z-index:95;
  background:var(--panel);border-left:1px solid var(--line);
  box-shadow:-28px 0 80px rgba(0,0,0,.45);display:flex;flex-direction:column;
  transform:none;opacity:1;
  animation:mrIn .32s cubic-bezier(.22,.61,.36,1)}
.mr-drawer.closing{animation:mrOut .26s ease forwards}
@keyframes mrIn{from{transform:translateX(26px);opacity:0}to{transform:translateX(0);opacity:1}}
@keyframes mrOut{to{transform:translateX(26px);opacity:0}}
.mr-head{display:flex;justify-content:space-between;align-items:flex-start;gap:16px;
  padding:16px 18px;border-bottom:1px solid var(--line2);flex-shrink:0}
.mr-title{font:800 12px/1 var(--mono);letter-spacing:.1em}
.mr-sub{font-size:12px;color:var(--faint);margin-top:8px}
.mr-close{background:transparent;border:1px solid var(--line);color:var(--muted);
  font:700 13px/1 var(--mono);padding:8px 11px;cursor:pointer;transition:color .2s,border-color .2s}
.mr-close:hover{color:var(--text);border-color:#4a6a78}
.mr-legend{padding:10px 18px;border-bottom:1px solid var(--line2);color:var(--faint);font-size:11px}
.mr-legend b{color:var(--muted);font:800 9px/1 var(--mono);letter-spacing:.1em}
.mr-list{flex:1;overflow:auto;scrollbar-width:thin}
.mr-row{display:grid;grid-template-columns:34px minmax(0,1fr) minmax(70px,1.1fr) 84px 84px;
  gap:11px;align-items:center;padding:10px 18px;border-bottom:1px solid var(--line2);
  transition:background .2s ease}
.mr-row:hover{background:var(--panel2)}
.mr-row.me{background:rgba(89,225,177,.055);box-shadow:inset 3px 0 var(--live)}
.mr-i{font:700 11px/1 var(--mono);color:var(--faint);font-variant-numeric:tabular-nums}
.mr-c{font:700 14px/1 var(--mono);min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.mr-row.me .mr-c{color:var(--live)}
.mr-c small{display:block;font:700 9px/1 var(--mono);color:var(--faint);margin-top:5px}
.mr-bar{height:8px;background:#0e1214;position:relative;overflow:hidden}
.mr-bar i{position:absolute;inset:0 auto 0 0;background:var(--amber);opacity:.55;
  transition:width .7s cubic-bezier(.22,.61,.36,1)}
.mr-n,.mr-p{font:700 13px/1 var(--mono);text-align:right;font-variant-numeric:tabular-nums}
.mr-n{color:var(--amber)}
.mr-p{color:var(--muted)}
.mr-n small,.mr-p small{display:block;font:800 7.5px/1 var(--mono);letter-spacing:.1em;
  color:var(--faint);margin-top:5px}
.mr-empty{padding:26px 18px;color:var(--faint);font-size:12.5px;line-height:1.6}

@media(max-width:900px){
  .mr-row{grid-template-columns:28px minmax(0,1fr) 70px 70px}
  .mr-bar{display:none}
}


/* The summary was a four-column grid; adding MAX RATE pushed CONDITIONS onto a
   second row. The extra column is only declared when the tile is present, so a
   build without the module keeps the original layout. */
.cockpit-summary-v29:has(.cockpit-maxrate){grid-template-columns:.85fr .62fr .78fr 1.25fr 1.05fr}
@media(max-width:1500px){
  .cockpit-summary-v29:has(.cockpit-maxrate){grid-template-columns:.85fr .6fr .75fr 1.2fr 1fr}
}
@media(max-width:1180px){
  .cockpit-summary-v29:has(.cockpit-maxrate){grid-template-columns:1fr 1fr}
}

/* ==========================================================================
   v3.3 · Leaderboard card strip and Top 5 comparison
   Category headlines sit above the station list: the cards answer "what is
   happening here" and the list answers "who". MAX RATE lives among them
   because for a spectator "who is running hottest" is as immediate a question
   as "who is winning".
   ========================================================================== */
.field-strip-host{margin-bottom:10px}
.field-strip-host .field-strip{grid-template-columns:repeat(6,minmax(0,1fr))}
.field-strip .clickable{position:relative;cursor:pointer;transition:background .2s ease}
.field-strip .clickable:hover{background:var(--panel2)}
.field-strip .clickable:focus-visible{outline:2px solid var(--blue);outline-offset:-2px}
.field-strip .clickable .mr-open{position:absolute;right:13px;top:11px;font-style:normal;
  font:800 7.5px/1 var(--mono);letter-spacing:.1em;color:#41606e;transition:color .2s ease}
.field-strip .clickable:hover .mr-open{color:var(--blue)}

.h2h{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-top:12px}
.h2h-panel{display:flex;flex-direction:column}
.chart-host.h2h-chart{flex:1;min-height:230px;padding:4px 6px 0}

@media(max-width:1400px){
  .field-strip-host .field-strip{grid-template-columns:repeat(3,minmax(0,1fr))}
}
@media(max-width:1000px){
  .h2h{grid-template-columns:1fr}
}
@media(max-width:760px){
  .field-strip-host .field-strip{grid-template-columns:1fr 1fr}
}

/* v3.5 · plain-text report export. Sits with the report tabs because the .txt
   is what gets pasted into 3830, not a buried menu item. */
.report-export{margin-left:auto;border:1px solid #344d59;background:#141a1d;color:var(--muted);
  font:800 9px/1 var(--mono);letter-spacing:.1em;padding:9px 13px;cursor:pointer;
  transition:color .2s ease,border-color .2s ease,background .2s ease}
.report-export:hover{color:var(--live);border-color:#1f5648;background:rgba(89,225,177,.08)}
.report-export:focus-visible{outline:2px solid var(--blue);outline-offset:1px}
.report-tabs{display:flex;align-items:center}

/* v3.6 · BAND ACTIVITY window control and per-band split.
   The range bar sits between the head and the chart, not inside the head: the
   head already carries the title, subtitle and the NOW readout, and a fourth
   element there pushed the readout off on narrow screens. */
.field-rangebar{display:flex;align-items:center;gap:10px;padding:8px 14px 0;flex-wrap:wrap}
.field-ranges{display:flex;border:1px solid #23394383}
.field-ranges button{border:0;border-right:1px solid #23394383;background:transparent;color:#6f858f;
  font:800 9px/1 var(--mono);letter-spacing:.09em;padding:8px 11px;cursor:pointer;
  transition:color .18s ease,background .18s ease}
.field-ranges button:last-child{border-right:0}
.field-ranges button:hover{color:var(--text);background:#101518}
.field-ranges button.active{color:#090c0d;background:var(--blue)}
.field-ranges button:focus-visible{outline:2px solid var(--blue);outline-offset:-2px}
.field-split-btn{margin-left:auto;border:1px solid #344d59;background:#141a1d;color:var(--muted);
  font:800 9px/1 var(--mono);letter-spacing:.09em;padding:8px 12px;cursor:pointer;
  transition:color .18s ease,border-color .18s ease,background .18s ease}
.field-split-btn:hover{color:var(--live);border-color:#1f5648;background:rgba(89,225,177,.08)}
.field-split-btn:focus-visible{outline:2px solid var(--blue);outline-offset:1px}
/* Additive: the split appears BELOW the chart and the chart keeps its height.
   Expanding a surface should add a reading, not shrink the one already there. */
.field-split{padding:10px 14px 2px;display:grid;gap:2px}
.field-split[hidden]{display:none}
.split-head,.split-row{display:grid;grid-template-columns:1.25fr .8fr 1fr .8fr 1fr;align-items:center;gap:6px}
.split-head{color:#5f757f;font:800 8px/1 var(--mono);letter-spacing:.11em;padding-bottom:6px;
  border-bottom:1px solid rgba(58,83,95,.35)}
.split-head span+span,.split-row span+span{text-align:right;font-variant-numeric:tabular-nums}
.split-row{padding:6px 0;border-bottom:1px solid rgba(58,83,95,.16);color:#a7bcc5;
  font:700 11px/1 var(--mono)}
.split-row.quiet{color:#5c7079}
.split-band{display:flex;align-items:center;gap:7px;color:var(--text);font-weight:800}
.split-band i{width:9px;height:9px;flex:0 0 auto}
.split-now{color:var(--text);font-weight:800}
.split-empty{color:#5f727b;font:400 11px/1.4 var(--mono);padding:8px 0}

/* v3.6 · Performance Trace presets. The row replaces the single reset button in
   the picker head; on narrow widths it wraps under the title rather than
   squeezing the three labels into ellipsis. */
.trace-picker-head{flex-wrap:wrap}
.trace-presets{display:flex;gap:6px;flex-wrap:wrap}
.trace-presets button{border:1px solid #304854;background:#0e1214;color:#9ab0b8;height:28px;
  padding:0 10px;font:800 8px/1 var(--mono);letter-spacing:.05em;cursor:pointer;white-space:nowrap;
  transition:color .18s ease,border-color .18s ease,background .18s ease}
.trace-presets button:hover{color:#fff;border-color:#68c7ff}
.trace-presets button.active{border-color:var(--blue);background:rgba(104,199,255,.12);color:#fff}
.trace-presets button:focus-visible{outline:2px solid var(--blue);outline-offset:1px}

/* v3.6 · report overview finding line. Sits between the KPIs and the charts so
   the conclusion is read before the evidence, which is the order a reader wants
   and the opposite of the order a chart offers. */
.report-shape-note{margin:0 0 12px;padding:12px 15px;border:1px solid var(--line);
  border-left:3px solid var(--blue);background:#0f1315;color:#a7bcc5;
  font:400 12px/1.6 var(--ui)}
.report-shape-note b{color:var(--text);font-weight:800;font-variant-numeric:tabular-nums}

/* v3.6 · Replay key moments. Sits under the timing tower in the same aside, so
   the list and the order it refers to are read together. */
.replay-moments{border-top:1px solid var(--line);margin-top:10px}
.moments-head{display:flex;align-items:baseline;justify-content:space-between;gap:8px;
  padding:11px 13px 8px;color:#8ba1ab;font:900 9px/1 var(--mono);letter-spacing:.11em}
.moments-head span{color:#5f757f;font:750 8px/1 var(--mono);letter-spacing:.06em}
.moments-empty{padding:0 13px 13px;color:#6f848e;font:400 11px/1.5 var(--ui)}
.moment-row{width:100%;display:grid;grid-template-columns:26px 1fr auto;align-items:center;gap:9px;
  border:0;border-top:1px solid rgba(58,83,95,.2);background:transparent;color:inherit;
  padding:9px 13px;text-align:left;cursor:pointer;transition:background .18s ease}
.moment-row:hover{background:#101518}
.moment-row.active{background:rgba(104,199,255,.09);box-shadow:inset 3px 0 var(--blue)}
.moment-row:focus-visible{outline:2px solid var(--blue);outline-offset:-2px}
.moment-i{color:#546b75;font:800 9px/1 var(--mono);font-variant-numeric:tabular-nums}
.moment-c strong{display:block;color:var(--text);font:850 12px/1 var(--mono)}
.moment-c small{display:block;margin-top:4px;color:#6f848e;font:700 9px/1 var(--ui)}
.moment-t{text-align:right;color:#a7bcc5;font:800 10px/1 var(--mono);font-variant-numeric:tabular-nums}
.moment-t small{display:block;margin-top:4px;color:#5f757f;font:700 8px/1 var(--mono)}

/* v3.6 · side rail treatment.
   Icons are inline SVG on a shared 20-unit box, so the nav row is sized by the
   button and not by whatever the font decided a glyph should be. */
.rail-nav{padding:6px 8px 10px!important;display:block!important}
.rail-group-label{padding:12px 12px 6px;color:#4f666f;font:800 7px/1 var(--mono);letter-spacing:.15em}
.rail-group-rule{margin:8px 12px;border-top:1px solid rgba(58,83,95,.32)}
.rail-nav button{width:100%;height:50px;margin-bottom:2px;gap:2px;
  grid-template-columns:24px 1fr!important;position:relative;
  transition:background .18s ease,color .18s ease}
.rail-nav button span{display:flex;align-items:center;justify-content:center;width:24px;height:24px}
.rail-nav button span svg{width:18px;height:18px;display:block}
.rail-nav button.active span{color:var(--blue)}
.rail-nav button:focus-visible{outline:2px solid var(--blue);outline-offset:-2px}
/* Feed lamps have three states now: live, stale and absent. Stale is the one
   that matters -- a board still painting numbers nobody is sending. */
.rail-feeds i{transition:background .3s ease,box-shadow .3s ease}
.rail-feeds i.stale{background:var(--amber,#f3bd66);box-shadow:0 0 8px rgba(243,189,102,.3)}
.rail-feeds div{cursor:default}
@media(max-width:1180px){
  .rail-group-label{display:none}
  .rail-group-rule{margin:6px 10px}
  .rail-nav button{grid-template-columns:1fr!important;justify-items:center}
  .rail-nav button span{margin:0 auto}
}

/* v3.7 · window control feedback. A range wider than the history collected so
   far is still selectable -- it just cannot fill yet -- so it is dimmed rather
   than disabled, and the caption says how much there is. */
.field-ranges button.unfilled{color:#4a5f69}
.field-ranges button.unfilled.active{color:#050607;background:#7fa6b8}
.field-observed{color:#6f858f;font:700 10px/1.3 var(--mono);letter-spacing:.03em}
@media(max-width:900px){.field-observed{width:100%;order:3}}

/* v3.7 · CQ zone board.
   Replaces the polar rose. Forty tiles at a fixed size: a zone worked once is
   as visible as the zone worked five thousand times, which is the whole point —
   the ones you are missing are the ones worth acting on.

   Volume is a five-step scale with a printed key rather than a gradient. A step
   can be read off the legend; a shade has to be judged, and judging shades at
   arm's length on a laptop screen is exactly what this audience should not have
   to do. */
.geo-zone-layout{grid-template-columns:minmax(0,1fr) 200px;min-height:0!important;align-items:stretch}
.zone-board{padding:18px 20px 20px;min-width:0}
.zone-score{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;margin-bottom:16px}
.zone-score b{font:800 40px/1 var(--display);color:var(--text);letter-spacing:-.01em;
  font-variant-numeric:tabular-nums}
.zone-score span{color:var(--muted);font:400 15px/1 var(--ui)}
.zone-score small{margin-left:auto;color:var(--faint);font:700 11px/1 var(--mono)}
.zone-grid{display:grid;grid-template-columns:repeat(8,minmax(0,1fr));gap:5px}
.zone-tile{aspect-ratio:1;display:flex;flex-direction:column;align-items:center;justify-content:center;
  gap:3px;border:1px solid transparent;transition:transform .16s ease,box-shadow .16s ease}
.zone-tile b{font:800 17px/1 var(--mono);font-variant-numeric:tabular-nums}
.zone-tile small{font:700 9px/1 var(--mono);opacity:.82}
.zone-tile:hover{transform:translateY(-2px);box-shadow:0 6px 18px rgba(0,0,0,.5)}
/* Steps climb in lightness AND in chroma, so they stay separable for the most
   common colour-vision deficiencies and in greyscale. */
.zone-tile.z0{background:#090c0e;border-color:#16262e;border-style:dashed;color:#3f545e}
.zone-tile.z1{background:#0d2731;color:#7e9aa5}
.zone-tile.z2{background:#124155;color:#a7c3ce}
.zone-tile.z3{background:#166986;color:#dcecf3}
.zone-tile.z4{background:#1d94a0;color:#f2fbfd}
.zone-tile.z5{background:#59e1b1;color:#04120d}
.zone-legend{display:flex;align-items:center;gap:14px;flex-wrap:wrap;margin-top:16px;
  padding-top:13px;border-top:1px solid var(--line2)}
.zone-key{display:flex;align-items:center;gap:6px;color:var(--faint);font:700 10px/1 var(--mono)}
.zone-key i{width:13px;height:13px;flex:0 0 auto}
.zone-key i.z0{background:#090c0e;border:1px dashed #16262e}
.zone-key i.z1{background:#0d2731}.zone-key i.z2{background:#124155}
.zone-key i.z3{background:#166986}.zone-key i.z4{background:#1d94a0}
.zone-key i.z5{background:#59e1b1}
.zone-legend-note{margin-left:auto;color:#4f666f;font:700 10px/1 var(--mono)}
/* The actionable line. Missing multipliers are what a contester goes and
   chases, so they get stated as text, not left to be inferred from a colour. */
.zone-missing{margin-top:14px;padding:11px 13px;background:#0d1113;border-left:3px solid var(--amber)}
.zone-missing span{display:block;color:var(--faint);font:700 10px/1 var(--mono);margin-bottom:6px}
.zone-missing b{color:#e8d3a8;font:700 13px/1.6 var(--mono);word-spacing:.1em}
.zone-missing.complete{border-left-color:var(--live)}
.zone-missing.complete span{color:var(--live);font-size:12px;margin:0}
.geo-zone-ranking-head{color:var(--faint);font:800 9px/1 var(--mono);letter-spacing:.11em;margin-bottom:10px}
.geo-zone-ranking>div{display:flex;align-items:baseline;justify-content:space-between;gap:8px;
  padding:9px 0;border-bottom:1px solid rgba(58,83,95,.18)}
.geo-zone-ranking>div b{color:var(--text);font:800 13px/1 var(--mono)}
.geo-zone-ranking>div strong{color:var(--muted);font:700 11px/1 var(--mono);font-variant-numeric:tabular-nums}
@media(max-width:1180px){
  .geo-zone-layout{grid-template-columns:1fr}
  .geo-zone-ranking{border-left:0;border-top:1px solid var(--line2)}
  .zone-grid{grid-template-columns:repeat(5,minmax(0,1fr))}
}

/* v3.7.1 · zone board sizing.
   The first cut let the tiles inherit the full width of the surface with a 1:1
   aspect ratio, which produced 110 px cards for a two-digit number. The board
   should read as an instrument panel scanned in one glance, not as forty cards
   scrolled past: fixed compact height, and the grid capped so a wide monitor
   makes the panel denser rather than making each tile bigger. */
.zone-board{padding:16px 18px 18px}
.zone-grid{grid-template-columns:repeat(8,minmax(0,1fr));gap:4px;max-width:520px}
.zone-tile{aspect-ratio:auto;height:46px;gap:1px}
.zone-tile b{font-size:14px}
.zone-tile small{font-size:8px}
.zone-tile:hover{transform:none;box-shadow:inset 0 0 0 1px rgba(255,255,255,.35)}
.zone-score{margin-bottom:12px;gap:8px}
.zone-score b{font-size:32px}
.zone-score span{font-size:13px}
.zone-score small{margin-left:0;padding-left:10px;border-left:1px solid var(--line2)}
.zone-legend{max-width:520px;margin-top:12px;padding-top:10px;gap:11px}
.zone-key{font-size:9px;gap:5px}
.zone-key i{width:11px;height:11px}
.zone-missing{max-width:520px;margin-top:12px;padding:9px 11px}
.zone-missing b{font-size:12px;line-height:1.5}
.geo-zone-layout{grid-template-columns:minmax(0,1fr) 178px}
.geo-zone-ranking{justify-content:flex-start!important;padding:16px 13px!important}
.geo-zone-ranking>div{padding:7px 0}
.geo-zone-ranking>div b{font-size:12px}
@media(max-width:1180px){
  .zone-grid,.zone-legend,.zone-missing{max-width:none}
  .zone-tile{height:44px}
}

/* v3.8 · the band panel opens on its own class.
   Depending only on an ancestor .cs-open meant the band zoom had a working
   button that revealed nothing, because its grid row was never unlocked. */
.cs-zoom.cs-zoom-open{grid-template-rows:1fr;border-top:1px solid var(--line2)}
.cs-zoom-inner{min-height:0;overflow:hidden}
/* GENERATE TXT REPORT is an action, not a tab. It sat in the tab strip styled
   like the tabs beside it, so it read as a fifth section nobody had selected. */
.report-export{margin-left:auto;border:1px solid #2f6f5c!important;
  background:rgba(89,225,177,.1)!important;color:var(--live)!important;
  font:800 10px/1 var(--mono)!important;letter-spacing:.07em;padding:0 14px!important;
  height:34px;display:inline-flex;align-items:center;transition:background .18s ease}
.report-export:hover{background:rgba(89,225,177,.2)!important}
.report-export:focus-visible{outline:2px solid var(--live);outline-offset:2px}
.surface-hint{margin-top:5px;color:#5f757f;font:700 9px/1 var(--mono);letter-spacing:.05em}

/* v3.9 · the resolved category under the report title. */
.file-category{margin:5px 0 0;color:var(--live);font:800 11px/1.4 var(--mono);letter-spacing:.05em}

/* v4.0 · Replay MOMENTUM. Flex with `order` so rows re-sort by animating rather
   than by being torn down and rebuilt at the frame rate. */
.replay-momentum{border-top:1px solid var(--line)}
.mom-list{display:flex;flex-direction:column;padding:0 13px 13px;gap:5px}
.mom-row{display:grid;grid-template-columns:64px 1fr 52px;align-items:center;gap:8px;
  transition:opacity .2s ease}
.mom-row b{color:#9db2bb;font:800 11px/1 var(--mono);overflow:hidden;text-overflow:ellipsis}
.mom-track{height:9px;background:#0d1113;overflow:hidden}
.mom-track span{display:block;height:100%;background:#2c6f7f;
  transition:width .22s cubic-bezier(.4,0,.2,1)}
.mom-row i{text-align:right;color:#7f959f;font:800 10px/1 var(--mono);font-style:normal;
  font-variant-numeric:tabular-nums}
.mom-row.top b,.mom-row.top i{color:var(--text)}
.mom-row.top .mom-track span{background:var(--live)}
.mom-row.mine b{color:var(--amber)}
.mom-row.mine .mom-track span{background:var(--amber)}
.records-hint{margin-top:6px;color:#6f858f;font:400 11px/1.5 var(--ui);max-width:60ch}

/* v4.1 · zone board fills its surface.
   The board was capped at 520 px and sat in the left third of a 1,000 px
   surface with the rest empty. Ten columns by four rows uses the width, lands
   exactly on forty with no ragged last row, and makes a zone easier to find:
   zone 24 is row 3, column 4, which is arithmetic anyone can do in their head. */
.zone-grid{grid-template-columns:repeat(10,minmax(0,1fr));max-width:none;gap:5px}
.zone-tile{height:60px;gap:2px}
.zone-tile b{font-size:17px}
.zone-tile small{font-size:9px}
.zone-legend,.zone-missing{max-width:none}
.zone-board{padding:18px 20px 20px}
.zone-score b{font-size:36px}
@media(max-width:1180px){
  .zone-grid{grid-template-columns:repeat(8,minmax(0,1fr))}
  .zone-tile{height:52px}
}
@media(max-width:760px){
  .zone-grid{grid-template-columns:repeat(5,minmax(0,1fr))}
}

/* v4.2 · MOMENTUM in the main column.
   It was a narrow strip in the aside while the space under the transport sat
   empty. Bars are the thing you watch during playback, so they get the width. */
.replay-momentum.wide{border-top:0;border-bottom:1px solid var(--line);
  background:linear-gradient(180deg,rgba(10,24,32,.5),transparent)}
.replay-momentum.wide .moments-head{padding:12px 16px 10px}
.replay-momentum.wide .mom-list{padding:0 16px 14px;gap:7px}
.replay-momentum.wide .mom-row{grid-template-columns:96px 1fr 66px;gap:12px}
.replay-momentum.wide .mom-row b{font-size:13px}
.replay-momentum.wide .mom-track{height:15px}
.replay-momentum.wide .mom-row i{font-size:12px}

/* v4.3 · BREAKDOWN.
   Dense on purpose, but in our type and on our canvas. The value of the table
   it echoes is the density, not the 1990s chrome: tabular numerals, a tight
   row, and no cell borders — separation comes from alignment and a hairline
   rule, which is quieter and scans faster. */
.bd-surface{overflow:hidden}
.bd-scroll{overflow-x:auto}
.bd-table{width:100%;border-collapse:collapse;font-family:var(--mono);
  font-variant-numeric:tabular-nums}
.bd-table thead th{position:sticky;top:0;z-index:2;background:#0a0d0f;
  color:#5f757f;font:800 8px/1 var(--mono);letter-spacing:.11em;text-align:right;
  padding:11px 9px;border-bottom:1px solid var(--line);white-space:nowrap}
.bd-table th.bd-pos,.bd-table th.bd-call,.bd-table th.bd-club{text-align:left}
.bd-table th.bd-band{text-align:center}
.bd-table tbody tr{border-bottom:1px solid rgba(58,83,95,.14)}
.bd-table tbody tr:hover{background:#0e1214}
.bd-table tbody tr.mine{background:rgba(243,189,102,.07);
  box-shadow:inset 3px 0 var(--amber)}
.bd-table td{padding:8px 9px;text-align:right;white-space:nowrap;color:#a7bcc5;
  font:700 12px/1.2 var(--mono)}
.bd-pos{text-align:left!important;color:#546b75;font-weight:800;font-size:10px!important}
.bd-call{text-align:left!important;color:var(--text)!important;font-weight:850!important;
  font-size:13px!important;letter-spacing:.01em}
.bd-score{color:var(--text)!important;font-weight:850!important}
/* Two numbers in one cell: QSOs above, multipliers below in the accent. One
   line of "112/37" makes the eye parse a separator before it reads either
   number; stacked, both are read at a glance and the columns stay aligned. */
.bd-band{text-align:center!important;line-height:1.25!important;padding:6px 9px!important}
.bd-band b{display:block;color:#cfe0e6;font:800 12px/1.2 var(--mono)}
.bd-band i{display:block;color:var(--amber);font:700 9px/1.2 var(--mono);font-style:normal}
.bd-band.none{color:#33454e!important;font-size:11px!important}
.bd-last{color:#6f858f!important;font-size:10px!important}
.bd-club{text-align:left!important;color:#7f959f!important;font-size:10px!important;
  max-width:190px;overflow:hidden;text-overflow:ellipsis}
.bd-warn{padding:11px 15px;margin:0;color:#a7bcc5;background:#0d1113;
  border-left:3px solid var(--amber);font:400 12px/1.5 var(--ui)}
/* The only motion in the table. A changed cell lifts briefly and settles, so
   the eye is drawn to what moved rather than to the page redrawing. */
@keyframes bdBump{0%{background:rgba(104,199,255,.22)}100%{background:transparent}}
.bd-bump{animation:bdBump .9s ease-out}
@media(prefers-reduced-motion:reduce){.bd-bump{animation:none}}

/* v4.6 · Rules Mode.
   The chip reports real state now, so it needs three: compliant, unrestricted,
   and the one that matters — Full Mode with a restricted category declared. */
.rules-chip{display:flex;align-items:center;gap:8px;border:1px solid var(--line);
  background:transparent;padding:8px 12px;cursor:pointer;color:var(--muted);
  font:800 9px/1 var(--mono);letter-spacing:.09em;transition:border-color .18s ease}
.rules-chip:hover{border-color:#3a5563}
.rules-chip small{color:var(--faint);font:700 8px/1 var(--mono);letter-spacing:.03em}
.rules-chip i{width:7px;height:7px;flex:0 0 auto;background:#3d4d55;border-radius:50%}
.rules-chip i.on{background:var(--live);box-shadow:0 0 8px rgba(89,225,177,.35)}
.rules-chip i.warn{background:var(--red);box-shadow:0 0 8px rgba(255,116,121,.4)}
.rules-panel{position:fixed;top:64px;right:18px;z-index:60;width:min(400px,calc(100vw - 36px));
  max-height:calc(100vh - 90px);overflow:auto;background:var(--panel);
  border:1px solid var(--line);box-shadow:0 30px 80px rgba(0,0,0,.6)}
.rp-head{display:flex;align-items:center;justify-content:space-between;padding:13px 15px;
  border-bottom:1px solid var(--line)}
.rp-head b{color:var(--text);font:900 10px/1 var(--mono);letter-spacing:.11em}
.rp-head button{border:0;background:transparent;color:var(--faint);font-size:14px;cursor:pointer}
.rp-body{padding:15px}
.rp-intro{margin:0 0 15px;color:var(--muted);font:400 12px/1.55 var(--ui)}
.rp-field{display:block;margin-bottom:11px}
.rp-field span{display:block;margin-bottom:5px;color:var(--faint);font:800 8px/1 var(--mono);letter-spacing:.11em}
.rp-field input,.rp-field select{width:100%;height:36px;padding:0 10px;background:var(--bg2);
  border:1px solid var(--line);color:var(--text);font:700 13px/1 var(--mono)}
.rp-policy{margin:15px 0;padding:11px 12px;background:var(--bg2);border-left:2px solid var(--line)}
.rp-policy b{display:block;margin-bottom:5px;color:var(--text);font:800 11px/1 var(--mono)}
.rp-policy p{margin:0;color:var(--muted);font:400 11px/1.5 var(--ui)}
.rp-unverified{margin-top:7px!important;color:var(--amber)!important}
.rp-unverified a{color:var(--blue)}
.rp-state{padding:10px 12px;color:var(--muted);font:400 11px/1.5 var(--ui);
  border-left:2px solid var(--line);background:var(--bg2)}
.rp-state.on{border-left-color:var(--live);color:#cfe0e6}
.rp-mode{margin:15px 0}
.rp-mode button{width:100%;height:38px;border:1px solid #2f6f5c;background:rgba(89,225,177,.08);
  color:var(--live);font:800 9px/1 var(--mono);letter-spacing:.09em;cursor:pointer}
.rp-mode button.is-full{border-color:#6b3438;background:rgba(255,116,121,.08);color:var(--red)}
.rp-warn{margin:9px 0 0;color:var(--red);font:700 11px/1.5 var(--ui)}
.rp-cert{padding:12px;border:1px solid var(--line)}
.rp-cert span{display:block;color:var(--faint);font:800 8px/1 var(--mono);letter-spacing:.11em}
.rp-cert b{display:block;margin:7px 0;font:800 13px/1 var(--mono)}
.rp-cert b.clean{color:var(--live)}
.rp-cert b.dirty{color:var(--amber)}
.rp-cert p{margin:0 0 10px;color:var(--faint);font:400 10px/1.5 var(--ui)}
.rp-cert button{width:100%;height:32px;border:1px solid var(--line);background:transparent;
  color:var(--muted);font:800 8px/1 var(--mono);letter-spacing:.09em;cursor:pointer}
.rp-privacy{margin:13px 0 0;color:var(--faint);font:400 10px/1.5 var(--ui)}
/* Withheld reads as deliberate, not as missing data or a broken cell. */
.bd-band.withheld{color:#2f3d45!important;background:repeating-linear-gradient(135deg,
  transparent,transparent 4px,rgba(120,140,150,.05) 4px,rgba(120,140,150,.05) 8px)}
.bd-warn.rules{border-left-color:var(--live)}
.bd-rules-link{border:0;background:transparent;color:var(--blue);font:inherit;
  text-decoration:underline;cursor:pointer;padding:0}

/* v4.8 · account chip, sign-in panel and the history archive. */
.acct-chip i{background:#3d4d55}
.acct-chip i.on{background:var(--live);box-shadow:0 0 8px rgba(89,225,177,.35)}
.acct-panel{position:fixed;top:64px;right:18px;z-index:60;width:min(380px,calc(100vw - 36px));
  background:var(--panel);border:1px solid var(--line);box-shadow:0 30px 80px rgba(0,0,0,.6)}
.hist-cta{width:100%;height:38px;border:1px solid #2f6f5c;background:rgba(89,225,177,.08);
  color:var(--live);font:800 9px/1 var(--mono);letter-spacing:.09em;cursor:pointer}
.acct-ok{margin:11px 0 0;color:var(--live);font:400 11px/1.5 var(--ui)}
.acct-ok a{color:var(--blue)}
.acct-err{margin:11px 0 0;color:var(--red);font:400 11px/1.5 var(--ui)}
.hist-signin{padding:22px 18px;max-width:62ch}
.hist-signin p{margin:0 0 15px;color:var(--muted);font:400 13px/1.6 var(--ui)}
.hist-signin .hist-cta{max-width:200px}
.hist-list{padding:4px 0 8px}
.hist-group{border-top:1px solid var(--line2)}
.hist-gh{display:flex;align-items:baseline;justify-content:space-between;gap:10px;
  padding:14px 16px 8px}
.hist-gh b{color:var(--text);font:850 13px/1 var(--mono);letter-spacing:.02em}
.hist-gh span{color:var(--faint);font:700 9px/1 var(--mono)}
.hist-row{display:grid;grid-template-columns:52px minmax(120px,1.1fr) minmax(80px,1.4fr) 108px 82px 128px 28px;
  align-items:center;gap:12px;padding:9px 16px;border-top:1px solid rgba(58,83,95,.12);
  font-variant-numeric:tabular-nums}
.hist-row:hover{background:#0a161d}
.hist-year{color:var(--muted);font:800 12px/1 var(--mono)}
.hist-cat{color:#9db2bb;font:700 11px/1.3 var(--ui);overflow:hidden;text-overflow:ellipsis}
.hist-cat small{display:block;color:var(--faint);font:700 9px/1 var(--mono);margin-top:3px}
/* Scaled against this operator's own best in this contest, never against the
   field: the question an archive answers is whether you are improving. */
.hist-bar{display:block;height:8px;background:#0d181e}
.hist-bar i{display:block;height:100%;background:#2c6f7f}
.hist-row.peak .hist-bar i{background:var(--live)}
.hist-score{text-align:right;color:var(--text);font:850 13px/1 var(--mono)}
.hist-row.peak .hist-score{color:var(--live)}
.hist-rank{text-align:right;color:var(--amber);font:800 11px/1 var(--mono)}
.hist-qso{text-align:right;color:var(--faint);font:700 10px/1 var(--mono)}
.hist-rules{color:var(--live);font:800 8px/1 var(--mono);text-align:right}
.hist-rules.off{color:transparent}
@media(max-width:1100px){
  .hist-row{grid-template-columns:46px 1fr 92px 70px;row-gap:6px}
  .hist-bar,.hist-qso{display:none}
}

/* v4.11 · breakdown motion and the callsign field.
   Rows are lifted while they slide so a moving row passes over its neighbours
   rather than through them. */
.bd-table tbody tr.bd-moved{position:relative;z-index:3}
.bd-table tbody tr.bd-moved td{background:rgba(104,199,255,.04)}
.bd-score,.bd-num{transition:color .3s ease}
/* Reduced motion turns off the slide and the count. Someone who asked for less
   movement did not ask for prettier movement. */
@media(prefers-reduced-motion:reduce){
  .bd-table tbody tr{transition:none!important;transform:none!important}
}
.rp-field input.invalid{border-color:var(--red);color:var(--red)}
.rp-fielderr{margin:-6px 0 11px;color:var(--red);font:700 11px/1.4 var(--ui)}
.rp-fielderr[hidden]{display:none}

/* v4.13 · the portal.
   First screen, and for a first-time visitor the entire impression. It answers
   one question before anything else — is something running right now — because
   a scoreboard is worth opening during a contest and worth little between them.

   Motion is confined to the live section on purpose. Animating a contest that
   finished in March is decoration; animating one receiving scores this second
   is the state of the thing. */
.portal{position:relative;min-height:100vh;padding:0 0 60px;overflow-x:hidden}
.portal-sky{position:absolute;inset:0 0 auto;height:min(560px,62vh);pointer-events:none;
  mask-image:linear-gradient(180deg,#000 40%,transparent)}
.portal-sky canvas{width:100%;height:100%;display:block}
.portal-head{position:relative;padding:88px 32px 46px;max-width:1180px;margin:0 auto}
.portal-head .scope-wordmark{font-size:38px;letter-spacing:.04em}
.portal-tag{margin:18px 0 26px;max-width:56ch;color:var(--muted);font:400 17px/1.6 var(--ui)}
.portal-actions{display:flex;align-items:center;gap:14px;flex-wrap:wrap}
.portal-cta{border:1px solid #2f6f5c;background:rgba(89,225,177,.1);color:var(--live);
  font:800 10px/1 var(--mono);letter-spacing:.09em;padding:13px 20px;cursor:pointer;
  transition:background .2s ease}
.portal-cta:hover{background:rgba(89,225,177,.2)}
.portal-cta.ghost{border-color:var(--line);background:transparent;color:var(--muted)}
.portal-cta.ghost:hover{color:var(--text);border-color:#3a5563;background:transparent}
.portal-who{color:var(--live);font:700 12px/1 var(--mono)}
.portal section{position:relative;max-width:1180px;margin:0 auto;padding:0 32px 40px}
.portal-sec{display:flex;align-items:center;gap:11px;padding:22px 0 14px;
  color:var(--muted);font:900 10px/1 var(--mono);letter-spacing:.13em;
  border-bottom:1px solid var(--line2);margin-bottom:18px}
.portal-sec span{margin-left:auto;color:var(--faint);font:700 10px/1 var(--mono);letter-spacing:.04em}
.portal-sec i{width:8px;height:8px;background:#39505b;border-radius:50%}
.portal-sec i.pulse{background:var(--live);animation:portalPulse 2s ease-in-out infinite}
@keyframes portalPulse{
  0%,100%{box-shadow:0 0 0 0 rgba(89,225,177,.45)}
  60%{box-shadow:0 0 0 9px rgba(89,225,177,0)}
}
.portal-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(268px,1fr));gap:12px}
.portal-grid.dim{opacity:.62}
.portal-card{display:flex;flex-direction:column;align-items:flex-start;gap:7px;
  padding:18px 18px 16px;border:1px solid var(--line);background:transparent;
  text-align:left;cursor:pointer;color:inherit;position:relative;overflow:hidden;
  transition:border-color .22s ease,transform .22s ease}
.portal-card:hover{border-color:#3a5563;transform:translateY(-2px)}
.portal-card:focus-visible{outline:2px solid var(--blue);outline-offset:2px}
.portal-card b{color:var(--text);font:800 15px/1.35 var(--ui)}
.pc-mode{color:var(--faint);font:800 8px/1 var(--mono);letter-spacing:.13em;min-height:8px}
.pc-when{color:var(--muted);font:700 11px/1 var(--mono)}
/* Live cards carry the only strong colour on the page, and a slow sweep so the
   section reads as active from the corner of the eye. */
.portal-card.live{border-color:#1f5648}
.portal-card.live b{color:#fff}
.portal-card.live .pc-when{color:var(--live)}
.portal-card.live:after{content:"";position:absolute;inset:0;pointer-events:none;
  background:linear-gradient(100deg,transparent 30%,rgba(89,225,177,.09) 50%,transparent 70%);
  background-size:220% 100%;animation:portalSweep 4.5s ease-in-out infinite}
@keyframes portalSweep{0%{background-position:120% 0}100%{background-position:-120% 0}}
.pc-live{margin-top:4px;color:#071014;background:var(--live);font:800 8px/1 var(--mono);
  letter-spacing:.11em;padding:6px 10px}
.portal-live.quiet .portal-sec{color:var(--faint)}
.portal-foot{max-width:1180px;margin:0 auto;padding:34px 32px 0;border-top:1px solid var(--line2)}
.portal-foot p{margin:0 0 8px;max-width:74ch;color:var(--muted);font:400 12px/1.6 var(--ui)}
.portal-foot-sub{color:var(--faint)!important;font-size:11px!important}
@media(prefers-reduced-motion:reduce){
  .portal-sec i.pulse,.portal-card.live:after{animation:none}
  .portal-card:hover{transform:none}
}
@media(max-width:720px){
  .portal-head{padding:52px 18px 30px}
  .portal-head .scope-wordmark{font-size:28px}
  .portal-tag{font-size:15px}
  .portal section{padding:0 18px 30px}
  .portal-foot{padding:26px 18px 0}
}

/* v4.14 · portal masthead and the account chip's real home.
   The chip was in the top bar, which already carries the contest, the category,
   the filters, the clock and the rules state. It wrapped to a second line and
   landed on top of the sub-nav. The rail has room and is where an account
   belongs anyway — beside the feed lamps, not beside the contest selector. */
.rail-acct{display:flex;align-items:center;gap:9px;width:calc(100% - 20px);margin:0 10px 10px;
  padding:10px 11px;border:1px solid #23394383;background:transparent;color:var(--muted);
  font:800 9px/1 var(--mono);letter-spacing:.07em;cursor:pointer;text-align:left;
  transition:color .18s ease,border-color .18s ease}
.rail-acct:hover{color:var(--text);border-color:#3a5563}
.rail-acct:focus-visible{outline:2px solid var(--blue);outline-offset:1px}
.rail-acct i{width:7px;height:7px;flex:0 0 auto;background:#3d4d55;border-radius:50%}
.rail-acct i.on{background:var(--live);box-shadow:0 0 8px rgba(89,225,177,.35)}
.rail-acct span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

/* The mark, on one line.
   CONTEST sets the word and SCOPE carries it: same baseline, one optical unit,
   with the weight and size difference doing the separating instead of a line
   break. Broken across two lines it read as two words that happened to be
   stacked; on one it reads as a name. */
.portal-mark{display:flex;align-items:baseline;gap:clamp(8px,1.4vw,18px);
  white-space:nowrap;line-height:.9}
.portal-mark span{color:var(--muted);font:300 clamp(24px,4.6vw,52px)/.9 var(--display);
  letter-spacing:.2em;text-transform:uppercase}
.portal-mark strong{color:var(--text);font:800 clamp(40px,8.6vw,96px)/.9 var(--display);
  letter-spacing:.01em;text-transform:uppercase;text-shadow:0 0 46px rgba(104,199,255,.18)}

/* Two score traces, and the teal one overtakes the blue. The tagline drawn as
   a picture -- and something a scoreboard could not draw, because a scoreboard
   has no shape over time.

   The line segments are straight on purpose: these are sampled score reports,
   and a spline between them would invent values nobody posted. Same rule the
   live charts follow. */
.mark-trace{display:block;width:min(576px,100%);height:clamp(56px,8vw,84px);margin:18px 0 0;
  overflow:visible}
.mt-grid line{stroke:rgba(120,150,165,.10);stroke-width:1;vector-effect:non-scaling-stroke}
.mt-lead,.mt-chase{fill:none;stroke-width:2.2;vector-effect:non-scaling-stroke;
  stroke-linecap:round;stroke-linejoin:round}
.mt-lead{stroke:url(#mtFade)}
.mt-chase{stroke:url(#mtFadeB);stroke-width:1.8}
.mt-head{fill:var(--live);filter:drop-shadow(0 0 7px rgba(89,225,177,.75))}
@media(prefers-reduced-motion:no-preference){
  /* Drawn rather than revealed: dashoffset makes the line arrive left to right
     the way the contest does, which is the point. Both traces share the timing
     so the overtake happens where the paths actually cross. */
  .mt-lead,.mt-chase{stroke-dasharray:900;stroke-dashoffset:900;
    animation:mtDraw 4.6s cubic-bezier(.32,.08,.24,1) infinite}
  .mt-chase{animation-delay:.12s}
}
@keyframes mtDraw{
  0%{stroke-dashoffset:900}
  62%{stroke-dashoffset:0}
  88%{stroke-dashoffset:0;opacity:1}
  100%{stroke-dashoffset:0;opacity:0}
}
@media(prefers-reduced-motion:reduce){.mt-head{display:none}}
.portal-head{padding-top:104px}
@media(max-width:720px){
  .portal-head{padding-top:58px}
  .portal-sub{font-size:14px}
}

/* v4.16 · the line lands in two beats.
   The second half is the one that does the work — anyone can claim real time,
   only a product that actually built a race can say the rest — so it gets the
   emphasis and the break, rather than running on as one flat sentence. */
/* Two lines, and exactly two.
   A max-width in ch and a <br> was the wrong tool: the character measure does
   not know how wide the words actually are at a clamped font size, so the last
   word fell to a third line. Each half is its own block and refuses to wrap,
   and the font size is what yields on a narrow screen instead of the line
   count. A two-beat line that lands in three beats has lost its timing. */
h1.portal-tag{max-width:none;display:flex;flex-direction:column;gap:.1em;
  font-size:clamp(21px,3.4vw,42px)}
h1.portal-tag span,h1.portal-tag em{display:block;white-space:nowrap;font-style:normal}
h1.portal-tag em{color:var(--live)}
@media(max-width:640px){
  /* Below this the second line cannot hold on one row at any readable size, so
     it is allowed to wrap rather than shrinking the type into illegibility. */
  h1.portal-tag{font-size:clamp(19px,5.2vw,28px)}
  h1.portal-tag em{white-space:normal}
}

/* v4.18 · mark weight, and the entrance.
   CONTEST carries real weight now and sits tight against SCOPE: at 300 it read
   as a caption above a logo rather than as the first half of a name. */
.portal-mark{gap:clamp(4px,0.5vw,9px)}
.portal-mark span{font-weight:600;letter-spacing:.13em;color:#c3d2d8}
.portal-mark strong{letter-spacing:-.005em}

/* v4.21 · the entrance, sequenced.
   Phase one: the portal clears everything except the mark, so for a moment the
   mark is alone and the eye has one thing to follow. The cards drop away
   nearest-first, which reads as the page stepping back rather than blinking
   out. */
.portal-leaving .portal-tag,
.portal-leaving .portal-sub,
.portal-leaving .portal-actions,
.portal-leaving .mark-trace,
.portal-leaving .portal-foot{
  opacity:0;transform:translateY(14px);
  transition:opacity .3s ease,transform .34s cubic-bezier(.4,0,.6,1)}
.portal-leaving section{opacity:0;transform:translateY(22px);
  transition:opacity .34s ease,transform .38s cubic-bezier(.4,0,.6,1)}
.portal-leaving section:nth-of-type(2){transition-delay:.05s}
.portal-leaving section:nth-of-type(3){transition-delay:.09s}
.portal-leaving .portal-sky{opacity:0;transition:opacity .5s ease}
.portal-leaving .portal-mark{opacity:0;transition:opacity .18s ease .1s}

/* Phase three: the board rises into place behind the mark. It starts fractionally
   later than the flight so the mark leads and is not overtaken by the thing it
   is introducing. */
#app.view-entering{opacity:0;transform:translateY(16px) scale(.994)}
#app{transition:opacity .5s ease,transform .58s cubic-bezier(.22,.61,.36,1);
  transform-origin:top center}
@media(prefers-reduced-motion:reduce){
  #app{transition:none}
  .portal-leaving *{transition:none!important}
}

/* v4.23 · a quieter masthead.
   The tagline was competing with the wordmark instead of supporting it. At that
   size the eye had two headlines and no idea which was the name of the thing.
   Roughly half the size, and the second line keeps the colour so the contrast
   does the emphasis rather than the scale. */
h1.portal-tag{font-size:clamp(16px,1.85vw,25px);font-weight:600;letter-spacing:-.005em;
  margin:26px 0 24px}
h1.portal-tag span{color:#9db2bb}
@media(max-width:640px){h1.portal-tag{font-size:clamp(15px,3.6vw,20px)}}
/* The one thing to do on this page, so it looks like it. */
.portal-cta{padding:15px 26px;font-size:11px;letter-spacing:.11em}
.portal-actions{margin-bottom:6px}
/* The board arrives on its own, without anything flying across it. */
#app.view-entering{opacity:0;transform:translateY(12px)}
#app{transition:opacity .46s ease,transform .5s cubic-bezier(.22,.61,.36,1)}

/* v4.23 · club mismatch. Amber, not red: nothing is broken, but there is a
   window to fix it and the window closes when the contest does. */
.club-mismatch{margin:0 0 14px;padding:12px 15px;background:#0a1820;
  border-left:3px solid var(--amber);color:var(--muted);font:400 12px/1.6 var(--ui)}
.club-mismatch b{display:block;margin-bottom:5px;color:var(--amber);
  font:800 10px/1 var(--mono);letter-spacing:.09em}
.club-mismatch strong{color:var(--text);font-weight:800}
.club-mismatch span{display:block;margin-top:6px;color:var(--faint);font-size:11px}

/* v4.24 · the account panel. One panel, four states, no navigation. */
.rp-hint{margin:-4px 0 12px;color:var(--faint);font:400 11px/1.5 var(--ui)}
.rp-field span i{font-style:normal;color:#54686f;letter-spacing:0}
.hist-cta.ghost{border-color:var(--line);background:transparent;color:var(--muted)}
.hist-cta.ghost:hover{color:var(--text);border-color:#3a5563}
.acct-links{display:flex;justify-content:space-between;gap:12px;margin-top:12px;flex-wrap:wrap}
.acct-switch{border:0;background:transparent;color:var(--blue);cursor:pointer;padding:4px 0;
  font:400 12px/1.4 var(--ui);text-decoration:underline;text-underline-offset:3px}
.acct-switch:hover{color:#9fdcff}
.acct-switch:focus-visible{outline:2px solid var(--blue);outline-offset:2px}
.acct-panel .acct-switch{display:block;margin-top:10px}
.acct-panel .acct-links .acct-switch{margin-top:0}

/* v4.24.2 · a click always shows something. */
.hist-cta.is-busy{opacity:.6;cursor:progress}
.hist-cta:disabled{cursor:not-allowed}
#acctResult p{margin:10px 0 0}

/* v4.25 · password reveal and confirmation.
   The eye sits inside the field rather than beside it, so the field keeps its
   full width and the control is where the thumb already is on a phone. */
.rp-field.with-reveal{position:relative}
.rp-field.with-reveal input{padding-right:42px}
.pw-reveal{position:absolute;right:1px;bottom:1px;width:38px;height:34px;
  display:flex;align-items:center;justify-content:center;
  border:0;background:transparent;color:#6f858f;cursor:pointer;
  transition:color .16s ease}
.pw-reveal:hover{color:var(--text)}
.pw-reveal[aria-pressed="true"]{color:var(--live)}
/* Not reachable by Tab: it sits between the password and the submit button, and
   catching it there interrupts the one path most people take through this form.
   It stays reachable by pointer and by screen reader. */
.pw-reveal:focus{outline:none}

/* v4.26 · settings feedback. A field that stores a value and changes nothing is
   the quiet kind of broken; the panel now states what the value resolved to. */
.set-note{margin:12px 0 0;padding:9px 12px;background:var(--bg2);border-left:2px solid var(--line);
  color:var(--muted);font:400 11px/1.55 var(--ui)}
.set-note.good{border-left-color:var(--live);color:#bcd3da}
.set-note.bad{border-left-color:var(--amber);color:#e8d3a8}

/* v4.27 · storm status.
   It sat as one grey line among solar figures. Those only inform; this one is
   the item that can cost a station its antennas, so it gets separated and
   sized to be read at a glance from across a room at four in the morning. */
.wx-storm{margin-top:10px;padding:10px 12px;border-left:3px solid #3a5563;background:#0a151b}
.wx-storm b{display:block;color:var(--muted);font:900 11px/1 var(--mono);letter-spacing:.11em}
.wx-storm span{display:block;margin-top:6px;color:#9db2bb;font:400 12px/1.5 var(--ui)}
.wx-storm small{display:block;margin-top:6px;color:var(--faint);font:400 10px/1.4 var(--ui)}
.wx-storm.none,.wx-storm.bad{border-left-color:var(--amber)}
.wx-storm.none b,.wx-storm.bad b{color:var(--amber)}
.wx-storm.pending{border-left-color:#3a5563}
.wx-storm.clear{border-left-color:var(--live)}
.wx-storm.clear b{color:var(--live)}
.wx-storm.warn{border-left-color:var(--amber);background:rgba(243,189,102,.06)}
.wx-storm.warn b{color:var(--amber);font-size:13px}
/* The only state that shifts the whole panel. If this is on screen the operator
   has a decision to make, and it should not look like the others. */
.wx-storm.critical{border-left-color:var(--red);background:rgba(255,116,121,.09)}
.wx-storm.critical b{color:var(--red);font-size:15px;letter-spacing:.06em}
.wx-storm.critical span{color:#f4d7d8}
@media(prefers-reduced-motion:no-preference){
  .wx-storm.critical{animation:stormPulse 2.4s ease-in-out infinite}
}
@keyframes stormPulse{0%,100%{background:rgba(255,116,121,.09)}50%{background:rgba(255,116,121,.16)}}

/* v4.28 · Race Lab picker.
   Three hundred callsigns as three hundred buttons is a wall the eye cannot
   search, and a real contest runs to a thousand. Type instead. */
.compare-toolbar{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.compare-toolbar .seg-group{display:flex;border:1px solid #23394383;background:transparent}
.compare-toolbar .seg-group button{border:0;border-right:1px solid #23394383;background:transparent;
  color:#6f858f;font:800 9px/1 var(--mono);letter-spacing:.07em;padding:9px 12px;cursor:pointer;
  transition:color .16s ease,background .16s ease}
.compare-toolbar .seg-group button:last-child{border-right:0}
.compare-toolbar .seg-group button:hover{color:var(--text);background:#0d1a21}
.compare-toolbar .seg-group button.active{color:#03080b;background:var(--blue)}
.compare-picker{display:flex;align-items:center;gap:14px;flex-wrap:wrap;
  padding:14px 15px;border-bottom:1px solid var(--line2)}
.cp-chosen{display:flex;gap:7px;flex-wrap:wrap}
.cp-tag{display:inline-flex;align-items:center;gap:8px;border:1px solid #2f6f5c;
  background:rgba(89,225,177,.08);color:var(--live);padding:7px 10px;cursor:pointer;
  font:800 12px/1 var(--mono)}
.cp-tag:hover{background:rgba(255,116,121,.12);border-color:#6b3438;color:var(--red)}
.cp-tag i{font-style:normal;opacity:.7;font-size:11px}
.cp-empty{color:var(--faint);font:400 12px/1 var(--ui)}
.cp-search{position:relative;margin-left:auto;min-width:min(320px,100%)}
.cp-search input{width:100%;height:36px;padding:0 12px;background:var(--bg2);
  border:1px solid var(--line);color:var(--text);font:700 13px/1 var(--mono)}
.cp-search input:focus{outline:none;border-color:var(--blue)}
.cp-results{position:absolute;left:0;right:0;top:calc(100% + 4px);z-index:20;
  background:var(--panel);border:1px solid var(--line);box-shadow:0 20px 50px rgba(0,0,0,.55);
  max-height:290px;overflow:auto}
.cp-results[hidden]{display:none}
.cp-hit{display:flex;align-items:baseline;justify-content:space-between;gap:12px;width:100%;
  border:0;border-bottom:1px solid rgba(58,83,95,.16);background:transparent;color:inherit;
  padding:10px 12px;cursor:pointer;text-align:left}
.cp-hit:hover,.cp-hit.first{background:#0d1a21}
.cp-hit b{color:var(--text);font:850 13px/1 var(--mono)}
.cp-hit span{color:var(--faint);font:700 10px/1 var(--mono)}
.cp-none{padding:12px;color:var(--faint);font:400 12px/1.4 var(--ui)}

/* v4.29 · the shared station picker.
   One control, two surfaces. Race Lab and Performance Trace had separate
   implementations of the same thing and would have drifted apart. */
.station-picker{display:flex;align-items:center;gap:14px;flex-wrap:wrap;
  padding:13px 15px;border-bottom:1px solid var(--line2)}
.sp-chosen{display:flex;gap:7px;flex-wrap:wrap;align-items:center}
.sp-tag{display:inline-flex;align-items:center;gap:8px;border:1px solid #2f6f5c;
  background:rgba(89,225,177,.08);color:var(--live);padding:7px 10px;cursor:pointer;
  font:800 12px/1 var(--mono);transition:background .16s ease,border-color .16s ease}
.sp-tag:hover{background:rgba(255,116,121,.12);border-color:#6b3438;color:var(--red)}
.sp-tag i{font-style:normal;opacity:.7;font-size:11px}
/* Pinned is not clickable and must not look clickable. */
.sp-tag.pinned{border-color:var(--line);background:transparent;color:var(--muted)}
.sp-tag.pinned:hover{background:rgba(255,116,121,.1);border-color:#6b3438;color:var(--red)}
.sp-tag.pinned i{color:var(--faint);font:800 8px/1 var(--mono);letter-spacing:.09em;opacity:1}
.sp-empty{color:var(--faint);font:400 12px/1 var(--ui)}
.sp-search{position:relative;margin-left:auto;min-width:min(320px,100%)}
.sp-search input{width:100%;height:36px;padding:0 12px;background:var(--bg2);
  border:1px solid var(--line);color:var(--text);font:700 13px/1 var(--mono)}
.sp-search input:focus{outline:none;border-color:var(--blue)}
.sp-results{position:absolute;left:0;right:0;top:calc(100% + 4px);z-index:30;
  background:var(--panel);border:1px solid var(--line);box-shadow:0 20px 50px rgba(0,0,0,.55);
  max-height:290px;overflow:auto}
.sp-results[hidden]{display:none}
.sp-hit{display:flex;align-items:baseline;justify-content:space-between;gap:12px;width:100%;
  border:0;border-bottom:1px solid rgba(58,83,95,.16);background:transparent;color:inherit;
  padding:10px 12px;cursor:pointer;text-align:left}
.sp-hit:hover,.sp-hit.first{background:#0d1a21}
.sp-hit b{color:var(--text);font:850 13px/1 var(--mono)}
.sp-hit span{color:var(--faint);font:700 10px/1 var(--mono)}
.sp-none{padding:12px;color:var(--faint);font:400 12px/1.4 var(--ui)}

/* v4.30 · archive note in the report banner. */
.file-archive{margin-top:7px}
.fa-note{color:var(--faint);font:400 11px/1.5 var(--ui)}
.fa-note.saved{color:var(--live)}
.fa-note .acct-switch{font-size:11px;display:inline}

/* v4.32 · the expanded band panel.
   The detail used to list only stations that moved in the current window while
   the header quoted totals for the whole contest — two different questions in
   one row. It now ranks every station with QSOs on the band, with the ones
   moving right now marked. Nothing truncated: the reason to open a band is
   usually to find one particular station, and that station is rarely near the
   top. */
.cs-bbtable{padding:4px 0 10px}
.cs-bbth,.cs-bbtr{display:grid;grid-template-columns:36px minmax(96px,1.3fr) 60px 54px minmax(80px,1fr) 62px;
  align-items:center;gap:10px;padding:6px 14px}
.cs-bbth{color:#5f757f;font:800 8px/1 var(--mono);letter-spacing:.11em;
  border-bottom:1px solid rgba(58,83,95,.28)}
.cs-bbth span+span,.cs-bbtr span+span{text-align:right}
.cs-bbth span:nth-child(2),.cs-bbtr span.c{text-align:left}
.cs-bbtr{border-bottom:1px solid rgba(58,83,95,.12);font-variant-numeric:tabular-nums}
.cs-bbtr:hover{background:#0a161d}
.cs-bbtr .p{color:#546b75;font:800 9px/1 var(--mono);text-align:left}
.cs-bbtr .c{color:var(--text);font:850 12px/1.25 var(--mono)}
.cs-bbtr .c small{display:block;margin-top:3px;color:var(--faint);font:700 8px/1 var(--mono)}
.cs-bbtr .q{color:#cfe0e6;font:800 12px/1 var(--mono)}
.cs-bbtr .m{color:var(--amber);font:700 11px/1 var(--mono)}
.cs-bbtr .s{display:block;height:7px;background:#0d181e;position:relative;overflow:hidden}
.cs-bbtr .s i{display:block;height:100%}
.cs-bbtr .g{color:#546b75;font:700 10px/1 var(--mono)}
/* Working this band right now. The only colour in the table, so it reads at a
   glance which of these are live and which are history. */
.cs-bbtr.live .g{color:var(--live);font-weight:800}
.cs-bbtr.mine{background:rgba(243,189,102,.07);box-shadow:inset 3px 0 var(--amber)}
.cs-bbtr.mine .c{color:var(--amber)}
@media(max-width:900px){
  .cs-bbth,.cs-bbtr{grid-template-columns:32px 1fr 54px 48px;gap:8px}
  .cs-bbth span:nth-child(5),.cs-bbth span:nth-child(6),
  .cs-bbtr .s,.cs-bbtr .g{display:none}
}

/* v4.33 · storm line, compressed.
   In the resting states this is a status, not a warning, and a status that
   takes three lines in a shared card pushes the whole page down to say nothing
   is happening. The alert states still get their weight. */
.wx-storm{margin-top:8px;padding:7px 10px;display:flex;align-items:baseline;gap:9px;flex-wrap:wrap}
.wx-storm b{display:inline;font-size:10px}
.wx-storm span{display:inline;margin-top:0;font-size:11px;line-height:1.35}
.wx-storm small{flex-basis:100%;margin-top:4px}
/* An alert is not a status line and should not look like one. */
.wx-storm.warn,.wx-storm.critical{display:block;padding:10px 12px}
.wx-storm.warn b,.wx-storm.critical b{display:block}
.wx-storm.warn span,.wx-storm.critical span{display:block;margin-top:5px;font-size:12px}

/* v4.34 · the trace picker stops covering the chart.
   Inside a panel that already floats over a chart, a second floating layer
   hides the thing being compared — and a list that scrolls inside an overlay
   hides its own contents too. Inline, the results push the panel down and
   everything stays readable. */
.station-picker.inline{flex-direction:column;align-items:stretch;gap:10px}
.station-picker.inline .sp-search{margin-left:0;min-width:0}
.station-picker.inline .sp-results{position:static;box-shadow:none;margin-top:6px;
  max-height:none;overflow:visible;background:var(--bg2)}
/* Five is the chart's limit, so the list never needs to run long enough to
   scroll: showing the six best matches is always enough to pick from. */
.station-picker.inline .sp-hit{padding:9px 12px}
.trace-picker{max-height:none;overflow:visible}

/* v4.35 · contest and category live in the rail.
   They changed least often in a session and were taking a full strip across the
   widest part of the screen — space the charts wanted and two selectors did
   not. In the rail they answer "where am I", which is the question the rail is
   already for. */
.rail-context{padding:12px 10px 6px;border-bottom:1px solid var(--line2);margin-bottom:6px}
.rail-contest{display:block;width:100%;text-align:left;border:1px solid var(--line);
  background:transparent;padding:9px 11px;cursor:pointer;
  transition:border-color .18s ease}
.rail-contest:hover{border-color:#3a5563}
.rail-contest:focus-visible{outline:2px solid var(--blue);outline-offset:1px}
.rail-contest span{display:block;color:var(--faint);font:800 8px/1 var(--mono);letter-spacing:.11em}
.rail-contest b{display:block;margin-top:5px;color:var(--text);font:800 13px/1.25 var(--ui);
  overflow:hidden;text-overflow:ellipsis}
.rail-contest i{display:block;margin-top:3px;color:#54686f;font:700 9px/1 var(--mono);
  font-style:normal;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rail-category{display:block;margin-top:9px}
.rail-category>span{display:block;margin-bottom:5px;color:var(--faint);
  font:800 8px/1 var(--mono);letter-spacing:.11em}
.rail-category .compact-select{width:100%;height:34px;background:var(--bg2);
  border:1px solid var(--line);color:var(--text);font:700 12px/1 var(--ui);padding:0 9px}
/* The strip that is left carries only what changes. */
.pro-topbar.slim{display:flex;align-items:center;gap:14px;min-height:auto;padding:10px 16px}
.pro-topbar.slim .header-clock{margin-left:auto;text-align:right}
@media(max-width:1180px){
  /* Collapsed rail: the labels go, the controls stay. Hiding the contest
     selector entirely would leave no way to change contest on a narrow screen. */
  .rail-context{padding:10px 8px 6px}
  .rail-contest b{font-size:12px}
  .rail-contest i,.rail-category>span{display:none}
}

/* v4.37 · the header row, shortened.
   82 px was two lines of padding around one line of content, on both sides of
   the screen. The space is won by tightening the row, not by shrinking the
   type — the clock and the contest name are what people read from across a
   desk and they keep their size.

   Both sides move together. The rail brand and the top bar share an edge, and
   changing one without the other is what left the two lines out of step. */
.rail-brand{height:56px!important;padding:0 12px!important}
.pro-topbar{height:56px!important;display:flex!important;align-items:center;gap:16px;
  padding:0 18px!important;grid-template-columns:none!important}
.live-subnav{top:56px!important}
/* Label above value was costing a line each. Inline, they read the same and
   take half the height. */
.contest-picker-button{display:flex!important;align-items:baseline;gap:9px;
  background:transparent!important;border:1px solid var(--line);padding:7px 12px!important;
  max-width:min(38ch,42%);overflow:hidden}
.contest-picker-button span{color:var(--faint);font:800 8px/1 var(--mono);letter-spacing:.11em;
  flex:0 0 auto}
.contest-picker-button b{color:var(--text);font:800 14px/1 var(--ui);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.topbar-category{display:flex;align-items:baseline;gap:9px;min-width:0}
.topbar-category>span{color:var(--faint);font:800 8px/1 var(--mono);letter-spacing:.11em;
  flex:0 0 auto}
.topbar-category .compact-select{height:32px;min-width:200px;background:var(--bg2);
  border:1px solid var(--line);color:var(--text);font:700 12px/1 var(--ui);padding:0 9px}
.pro-topbar .filter-toggle{flex:0 0 auto;height:32px;padding:0 12px}
.pro-topbar .header-clock{margin-left:auto;text-align:right;display:flex;align-items:baseline;gap:10px}
.pro-topbar .header-clock span{color:var(--faint);font:700 8px/1 var(--mono);letter-spacing:.09em}
.pro-topbar .header-clock b{font-size:22px}
.pro-topbar .rules-chip{flex:0 0 auto;padding:7px 11px}
@media(max-width:1180px){
  .pro-topbar .header-clock span,.topbar-category>span{display:none}
  .contest-picker-button{max-width:34%}
}

/* v4.38 · demo banner.
   Present on every screen of a demo contest, not once on entry. A notice read
   and forgotten before the first screenshot is taken is not a notice. */
.demo-banner{display:flex;align-items:center;gap:12px;padding:9px 18px;
  background:rgba(168,149,255,.1);border-bottom:1px solid rgba(168,149,255,.3)}
.demo-banner b{color:var(--violet);font:900 9px/1 var(--mono);letter-spacing:.13em;
  border:1px solid rgba(168,149,255,.5);padding:5px 9px;flex:0 0 auto}
.demo-banner span{color:#cfc6f5;font:400 12px/1.45 var(--ui)}
@media(max-width:760px){.demo-banner span{font-size:11px}}

/* v4.40 · one row, one height, one alignment.
   The previous pass mixed baseline alignment inside the controls with centre
   alignment on the row, and let each control find its own height. The result
   was five things sitting at five different vertical positions, which reads as
   sloppiness even to someone who could not say why.

   Every direct child is now the same height and centred. The clock keeps its
   size — it is the one thing read from across a desk — but it stops dragging
   the row's baseline around. */
.pro-topbar{align-items:center!important;gap:12px!important}
.pro-topbar>*{height:34px!important;display:flex!important;align-items:center!important;
  margin:0!important;box-sizing:border-box}
/* Labels sit beside their value, vertically centred, never on a shared
   baseline: a 22px clock and an 8px label have no baseline in common that
   looks deliberate. */
.contest-picker-button{gap:10px!important;padding:0 12px!important;
  border:1px solid var(--line)!important;background:transparent!important}
.contest-picker-button span,.topbar-category>span,.pro-topbar .header-clock span{
  align-self:center!important;line-height:1!important;position:relative;top:.5px}
.contest-picker-button b{line-height:1!important;font-size:13px!important}
.topbar-category{gap:10px!important;padding:0!important}
.topbar-category .select-wrap{display:flex;align-items:center;height:34px}
.topbar-category .compact-select{height:34px!important;line-height:1!important;
  padding:0 10px!important}
.pro-topbar .filter-toggle{gap:8px;padding:0 12px!important;line-height:1!important}
.pro-topbar .filter-toggle span,.pro-topbar .filter-toggle b{line-height:1!important}
.pro-topbar .header-clock{gap:10px!important;justify-content:flex-end}
.pro-topbar .header-clock b{line-height:1!important;font-size:21px!important;
  position:relative;top:-1px}
.pro-topbar .rules-chip{gap:8px;padding:0 12px!important}
.pro-topbar .rules-chip span,.pro-topbar .rules-chip small{line-height:1!important}
/* The sub-nav shares the rail's left edge, so its first tab lines up with the
   navigation below it rather than floating in from nowhere. */
.live-subnav{padding:0 16px!important}

/* v4.41 · the clock and the rules chip belong on the right.
   The blanket margin reset in the alignment pass killed the auto margin that
   pushed them there — a fix for one problem quietly undoing another, which is
   the usual cost of a rule written with `*`. */
.pro-topbar .header-clock{margin-left:auto!important}
.pro-topbar .rules-chip{margin-left:0!important}

/* v4.42 · BREAKDOWN reads at 100%.
   Sized so it does not need browser zoom. The table was built to fit a lot of
   columns and ended up fitting them at a size nobody reads comfortably —
   which for a table whose whole purpose is to be scanned is the wrong trade.

   The height is paid for by tightening the padding, not by adding rows: the
   numbers grow, the gaps shrink, and the table takes about the same space. */
.bd-table thead th{font-size:9px;padding:12px 10px;letter-spacing:.1em}
.bd-table td{padding:7px 10px;font-size:14px}
.bd-pos{font-size:11px!important}
.bd-call{font-size:16px!important;letter-spacing:.015em}
.bd-score{font-size:16px!important}
/* QSOs lead, multipliers sit under them. Both were a size too small to read
   without leaning in, and the multiplier is the number that decides the
   contest. */
.bd-band{padding:5px 10px!important;line-height:1.2!important}
.bd-band b{font-size:15px}
.bd-band i{font-size:11px;margin-top:1px}
.bd-band.none{font-size:13px!important}
.bd-last{font-size:11px!important}
.bd-club{font-size:12px!important;max-width:220px}
.bd-warn{font-size:13px;padding:12px 16px}
.bd-surface .surface-title{font-size:13px}
.bd-surface .surface-subtitle{font-size:12px}
/* Narrow screens keep the old density: at that width the choice is between
   smaller type and losing columns, and losing columns is worse. */
@media(max-width:1280px){
  .bd-table td{font-size:13px;padding:6px 8px}
  .bd-call{font-size:14px!important}
  .bd-score{font-size:14px!important}
  .bd-band b{font-size:13px}
  .bd-band i{font-size:10px}
}

/* v4.53 · interface scale.
   Zoom on the shell rather than a stack of media queries. A 14-inch laptop at
   1920x1080 shows this at roughly half the physical size it has on a desk
   monitor, and the honest fix is to scale the whole thing together — nudging
   twenty font sizes makes it right on one machine and wrong on the other.

   Zoom reflows, so the layout adapts instead of a scaled picture sitting inside
   scrollbars. The rail and the header keep their proportions because everything
   moves at once. */
.pro-shell{zoom:1}
/* Fixed-position panels are outside the shell, so they do not inherit its zoom.
   Scaled with it explicitly, or the sign-in dialog would stay tiny on a screen
   where everything else had grown. */
html[data-ui-scale="110"] .acct-panel,html[data-ui-scale="110"] .rules-panel{zoom:1.1}
html[data-ui-scale="125"] .acct-panel,html[data-ui-scale="125"] .rules-panel{zoom:1.25}
html[data-ui-scale="150"] .acct-panel,html[data-ui-scale="150"] .rules-panel{zoom:1.5}

/* v4.57 · RACE ORDER, sized properly this time.
   Two earlier passes nudged sizes by two or three pixels and the result was
   indistinguishable from before. A change that cannot be seen is not a change,
   and repeating it in smaller increments does not help.

   The width comes from STATION and SCORE, which were sized for a callsign plus
   an operator name plus a comfortable margin and ended up holding a hand's
   width of nothing. Space between columns is not information; the figures are.

   TREND goes back beside its sparkline. Stacked, it doubled the row height for
   one number and pushed the line under the graph where it read as a caption
   rather than a value. */
.cockpit-board-v30 .board-row.telemetry,
.cockpit-board-v30 .board-head.telemetry,
.pro-board .board-row.telemetry,
.pro-board .board-head.telemetry{
  grid-template-columns:40px minmax(118px,.72fr) minmax(122px,.62fr) 92px 84px 112px 124px 76px 152px 50px 60px 20px;
  gap:8px}
.cockpit-board-v30 .board-head.telemetry,
.pro-board .board-head.telemetry{min-height:38px;padding:0 10px;font-size:9px;letter-spacing:.04em}
.board-head.telemetry>div{display:flex;align-items:baseline;gap:5px}
.board-head.telemetry i{color:#5b737d;font:700 9px/1 var(--mono);font-style:normal;white-space:nowrap}
.cockpit-board-v30 .board-row.telemetry,.pro-board .board-row.telemetry{padding:0 10px;min-height:46px}

/* The figures. These are what the row is for. */
.cockpit-board-v30 .station-call,.pro-board .station-call{font-size:19px!important;letter-spacing:.01em}
.cockpit-board-v30 .station-operator,.pro-board .station-operator{font-size:12px!important;max-width:none}
.cockpit-board-v30 .score-main,.pro-board .score-main{font-size:22px!important}
.cockpit-board-v30 .score-gap,.pro-board .score-gap{font-size:12px!important}
.cockpit-board-v30 .micro b,.pro-board .micro b{font-size:20px!important;line-height:1.05}
.cockpit-board-v30 .micro small,.pro-board .micro small{font-size:11px!important}
.cockpit-board-v30 .relative b,.pro-board .relative b{font-size:16px!important}
.cockpit-board-v30 .relative small,.pro-board .relative small{font-size:10px!important}
.cockpit-board-v30 .active-cell b,.pro-board .active-cell b{font-size:14px!important}
.cockpit-board-v30 .move,.pro-board .move{font-size:16px!important;text-align:center}
.cockpit-board-v30 .fresh-cell b,.pro-board .fresh-cell b{font-size:11px!important;color:var(--faint)}

/* Trend: graph and value on one line, the value carrying real weight. */
.cockpit-board-v30 .trend-cell,.pro-board .trend-cell{
  display:flex;flex-direction:row;align-items:center;gap:9px;min-width:0}
.cockpit-board-v30 .trend-cell .row-spark,.pro-board .trend-cell .row-spark{
  height:26px;flex:1 1 auto;min-width:0}
.cockpit-board-v30 .trend-cell small,.pro-board .trend-cell small{
  flex:0 0 auto;font-size:14px!important;font-weight:800;white-space:nowrap;color:#a7bcc5}

@media(max-width:1600px){
  .cockpit-board-v30 .board-row.telemetry,.cockpit-board-v30 .board-head.telemetry,
  .pro-board .board-row.telemetry,.pro-board .board-head.telemetry{
    grid-template-columns:34px minmax(100px,.7fr) minmax(104px,.6fr) 78px 70px 96px 104px 64px 118px 44px 0 18px;
    gap:6px}
  .board-head.telemetry>div:nth-child(11),.fresh-cell{display:none}
  .cockpit-board-v30 .station-call,.pro-board .station-call{font-size:17px!important}
  .cockpit-board-v30 .score-main,.pro-board .score-main{font-size:19px!important}
  .cockpit-board-v30 .micro b,.pro-board .micro b{font-size:17px!important}
}

/* v4.58 · the sizes, written at a specificity that can actually win.
   Three passes failed for one reason: `body.density-comfortable
   .board-row.telemetry .micro b` is four selectors deep, and everything I wrote
   was two. It won every time regardless of file order, and !important on both
   sides made the failure look like a mystery rather than a specificity loss.

   These are written against the same ancestors as the rules they replace, so
   the comparison is decided by order rather than by weight. */
body .board-row.telemetry .micro b,
body.density-comfortable .board-row.telemetry .micro b{font-size:21px!important;line-height:1.05}
body .board-row.telemetry .micro small,
body.density-comfortable .board-row.telemetry .micro small{font-size:11px!important}
body .board-row.telemetry .station-call,
body.density-comfortable .board-row.telemetry .station-call{font-size:19px!important}
body .board-row.telemetry .score-main,
body.density-comfortable .board-row.telemetry .score-main{font-size:22px!important}
body .board-row.telemetry .score-gap,
body.density-comfortable .board-row.telemetry .score-gap{font-size:12px!important}
body .board-row.telemetry .relative b,
body.density-comfortable .board-row.telemetry .relative b{font-size:16px!important}
body .board-row.telemetry .active-cell b,
body.density-comfortable .board-row.telemetry .active-cell b{font-size:14px!important}
body .board-row.telemetry .move,
body.density-comfortable .board-row.telemetry .move{font-size:15px!important}

/* STATION and SCORE stop growing. Both were fractional, so on a wide screen
   they absorbed all the spare width and left the figures crowded — the gap
   between a callsign and its score was wider than either of them. Fixed
   columns; the slack goes to TREND, which is the only cell that can use it. */
.cockpit-board-v30 .board-row.telemetry,
.cockpit-board-v30 .board-head.telemetry,
.pro-board .board-row.telemetry,
.pro-board .board-head.telemetry{
  grid-template-columns:38px 168px 148px 96px 84px 116px 130px 78px minmax(150px,1fr) 52px 62px 20px;
  gap:10px}

/* The trend value can no longer push into MOVE: the sparkline yields, the
   number is capped, and the cell clips. Overflow from one column landing under
   another column's heading is what made MOVE look misplaced. */
body .board-row.telemetry .trend-cell{
  display:flex;flex-direction:row;align-items:center;gap:8px;min-width:0;overflow:hidden}
body .board-row.telemetry .trend-cell .row-spark,
body.density-comfortable .row-spark{height:24px!important;width:auto!important;
  flex:1 1 auto;min-width:0}
body .board-row.telemetry .trend-cell small{flex:0 0 auto;font-size:13px!important;
  font-weight:800;white-space:nowrap;color:#a7bcc5}
@media(max-width:1600px){
  .cockpit-board-v30 .board-row.telemetry,.cockpit-board-v30 .board-head.telemetry,
  .pro-board .board-row.telemetry,.pro-board .board-head.telemetry{
    grid-template-columns:32px 132px 128px 82px 72px 100px 108px 66px minmax(110px,1fr) 46px 0 18px;gap:7px}
}

/* v4.59 · the grid, written where it actually applies.
   The sizes in the previous pass landed because they were scoped to `body
   .board-row.telemetry`. The grid was scoped to the container classes instead
   and never matched, so an older twelve-column template stayed in force — which
   is why MOVE sat under the wrong heading while the fonts had changed.

   Widths now: STATION and SCORE are only as wide as they need to be, MOVE is
   narrow with no side padding, and everything reclaimed goes to TREND, the one
   cell that reads better with more room. */
body .board-row.telemetry,
body .board-head.telemetry,
body.density-comfortable .board-row.telemetry,
body.density-comfortable .board-head.telemetry{
  grid-template-columns:34px 118px 132px 96px 78px 108px 104px 74px minmax(190px,1fr) 40px 44px 20px;
  gap:10px}
body .board-head.telemetry{min-height:36px;padding:0 10px;font-size:9px}
body .board-head.telemetry>div{display:flex;align-items:baseline;gap:5px}
body .board-head.telemetry i{color:#5b737d;font:700 9px/1 var(--mono);font-style:normal;white-space:nowrap}
/* MOVE carries one glyph and a digit, so it needs no padding of its own — the
   width it was holding is width the sparkline can use. */
body .board-row.telemetry .move{padding:0!important;text-align:center}
body .board-row.telemetry .fresh-cell{text-align:right}
body .board-row.telemetry .fresh-cell b{font-size:12px!important;color:var(--faint)}
/* Δ PACE is a number with a sign and a colour; the word underneath repeated
   what both already said and took a line to do it. */
body .board-row.telemetry .relative{display:flex;align-items:center}
body .board-row.telemetry .relative b{font-size:16px!important}
/* The sparkline fills whatever the row can spare. */
body .board-row.telemetry .trend-cell{display:flex;align-items:center;gap:10px;min-width:0;overflow:hidden}
body .board-row.telemetry .trend-cell .row-spark,
body.density-comfortable .row-spark{height:26px!important;width:auto!important;flex:1 1 auto;min-width:0}
body .board-row.telemetry .trend-cell small{flex:0 0 auto;font-size:13px!important;font-weight:800;color:#a7bcc5}
@media(max-width:1600px){
  body .board-row.telemetry,body .board-head.telemetry,
  body.density-comfortable .board-row.telemetry,body.density-comfortable .board-head.telemetry{
    grid-template-columns:30px 104px 118px 82px 68px 94px 92px 62px minmax(130px,1fr) 36px 38px 18px;gap:7px}
}

/* v4.60 · one grid, declared to win.
   I have now written this template four times and lost four times to rules I
   had not found: some scoped to a container class, some behind a media query,
   one declaring nine columns for a twelve-cell row. Chasing them one at a time
   was the mistake — each attempt looked correct in isolation and was silently
   outranked.

   This is declared with !important against every ancestor the board is known to
   use. That is a blunt instrument and it is the right one here: the alternative
   is another round of guessing at which of a dozen legacy rules is in force on
   a screen I cannot see. The stack needs consolidating, and that is its own
   piece of work rather than something to attempt mid-fix. */
body .board-row.telemetry,
body .board-head.telemetry,
body.density-comfortable .board-row.telemetry,
body.density-comfortable .board-head.telemetry,
.cockpit-board-v30 .board-row.telemetry,
.cockpit-board-head.v30,
.cockpit-race .board-row.telemetry,
.cockpit-race .board-head.telemetry,
.pro-board .board-row.telemetry,
.pro-board .board-head.telemetry{
  grid-template-columns:34px 116px 136px 96px 76px 108px 104px 76px minmax(200px,1fr) 40px 44px 20px!important;
  gap:10px!important}

/* Sizes normalised. The callsign had ended up smaller than the figures beside
   it, which inverts the reading order: the station is what a row is, the
   numbers are what it is doing. */
body .board-row.telemetry .station-call,
body.density-comfortable .board-row.telemetry .station-call,
.cockpit-board-v30 .station-call{font-size:20px!important;line-height:1.05}
body .board-row.telemetry .score-main,
body.density-comfortable .board-row.telemetry .score-main{font-size:21px!important}
body .board-row.telemetry .micro b,
body.density-comfortable .board-row.telemetry .micro b,
.cockpit-board-v30 .micro b{font-size:18px!important;line-height:1.05}
body .board-row.telemetry .relative b,
body.density-comfortable .board-row.telemetry .relative b{font-size:16px!important}
body .board-row.telemetry .active-cell b{font-size:14px!important}
body .board-row.telemetry .move{font-size:15px!important;padding:0!important;text-align:center}
body .board-row.telemetry .fresh-cell{text-align:right}
body .board-row.telemetry .fresh-cell b{font-size:13px!important}
body .board-row.telemetry .trend-cell{display:flex!important;align-items:center;gap:10px;
  min-width:0;overflow:hidden}
body .board-row.telemetry .trend-cell .row-spark,
body.density-comfortable .row-spark,
.cockpit-board-v30 .row-spark{height:26px!important;width:auto!important;flex:1 1 auto;min-width:0}
body .board-row.telemetry .trend-cell small{flex:0 0 auto;font-size:13px!important;font-weight:800}
@media(max-width:1600px){
  body .board-row.telemetry,body .board-head.telemetry,
  body.density-comfortable .board-row.telemetry,body.density-comfortable .board-head.telemetry,
  .cockpit-board-v30 .board-row.telemetry,.cockpit-board-head.v30,
  .pro-board .board-row.telemetry,.pro-board .board-head.telemetry{
    grid-template-columns:30px 102px 118px 82px 66px 94px 92px 64px minmax(140px,1fr) 36px 38px 18px!important;
    gap:7px!important}
}

/* v4.61 · TIGHT RACES reads as a matchup.
   Two callsigns separated by a slash with the detail stacked underneath is a
   table row about two stations. "A vs B" with the context beside it is a
   contest between them, which is what the panel is for — and the callsigns are
   what the reader scans, so they carry the size. */
.battle-row .battle-pair{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap;min-width:0}
.battle-pair b{color:var(--text);font:850 16px/1.15 var(--mono);letter-spacing:.01em}
.battle-pair i{color:var(--faint);font:700 10px/1 var(--mono);font-style:normal;
  letter-spacing:.08em;text-transform:uppercase}
/* Context on the same line, in the space the stacked version was using for a
   second row. */
.battle-pair span{flex:0 0 100%;margin-top:4px;color:var(--faint);
  font:700 11px/1 var(--mono)}
@media(min-width:1500px){
  /* Wide enough to keep it all on one line, which is when the matchup reads
     best: names, then who they are, then how close. */
  .battle-pair span{flex:0 0 auto;margin-top:0;margin-left:4px}
}
.battle-row .wv{font-size:16px!important;font-weight:800}
.battle-row .wv.hot{color:var(--live)}

/* v4.62 · widths rebalanced, MOVE before TREND.
   The last pass gave TREND everything it could take and the columns that carry
   text lost the room they needed: the gap was clipping into QSO, and STATION
   had no space for the operator callsign that goes in brackets after the
   station one — a case that only appears on some entries, so it is easy to
   size for and forget.

   TREND is halved. A sparkline is a shape, not a measurement: at half the width
   it still shows the same rises and falls, and the width it was holding is
   width the numbers needed. */
body .board-row.telemetry,
body .board-head.telemetry,
body.density-comfortable .board-row.telemetry,
body.density-comfortable .board-head.telemetry,
.cockpit-board-v30 .board-row.telemetry,
.cockpit-board-head.v30,
.cockpit-race .board-row.telemetry,
.cockpit-race .board-head.telemetry,
.pro-board .board-row.telemetry,
.pro-board .board-head.telemetry{
  grid-template-columns:34px 186px 178px 98px 78px 110px 108px 78px 48px minmax(120px,.62fr) 46px 20px!important;
  gap:12px!important}
/* The station cell has to hold "CALL (OPERATOR)" without either being cut. */
body .board-row.telemetry .station-cell{min-width:0}
body .board-row.telemetry .station-operator{font-size:12px!important;max-width:none;
  overflow:hidden;text-overflow:ellipsis}
/* Score and gap sit on one line and must not run into the next column. */
body .board-row.telemetry .score-cell{min-width:0}
body .board-row.telemetry .score-gap{white-space:nowrap}
body .board-row.telemetry .trend-cell .row-spark{height:24px!important}
@media(max-width:1600px){
  body .board-row.telemetry,body .board-head.telemetry,
  body.density-comfortable .board-row.telemetry,body.density-comfortable .board-head.telemetry,
  .cockpit-board-v30 .board-row.telemetry,.cockpit-board-head.v30,
  .pro-board .board-row.telemetry,.pro-board .board-head.telemetry{
    grid-template-columns:30px 156px 152px 84px 68px 96px 96px 66px 42px minmax(90px,.55fr) 40px 18px!important;
    gap:8px!important}
}

/* v4.63 · RACE ORDER final widths, and BREAKDOWN sized to match.
   STATION goes to 210px. "LU9ESD (AC1NU)" is fourteen monospaced characters
   and fitted at 186 only just — a column that works until an entry uses an
   operator callsign is a column that fails during a contest, which is the worst
   time to find out. TREND takes what is left. */
body .board-row.telemetry,
body .board-head.telemetry,
body.density-comfortable .board-row.telemetry,
body.density-comfortable .board-head.telemetry,
.cockpit-board-v30 .board-row.telemetry,
.cockpit-board-head.v30,
.cockpit-race .board-row.telemetry,
.cockpit-race .board-head.telemetry,
.pro-board .board-row.telemetry,
.pro-board .board-head.telemetry{
  grid-template-columns:34px 210px 176px 96px 76px 108px 106px 76px 46px minmax(180px,.9fr) 46px 20px!important;
  gap:12px!important}

/* BREAKDOWN. The headings were half the size of the ones in RACE ORDER for no
   reason, and the figures under them were smaller still. */
.bd-table thead th{font-size:11px!important;padding:13px 10px!important;letter-spacing:.09em}
.bd-table thead th.bd-band{font-size:12px!important;color:#8ba1ab}
.bd-call{font-size:19px!important}
.bd-score{font-size:19px!important}
.bd-table td{font-size:16px!important;padding:9px 10px!important}
.bd-pos{font-size:12px!important}
/* One line per band: count, separator, multipliers. */
.bd-band{padding:8px 10px!important;line-height:1!important;white-space:nowrap}
.bd-band b{display:inline!important;font-size:17px!important;color:#eef6f9}
.bd-band s{display:inline;margin:0 3px;color:#41535c;text-decoration:none;font:700 13px/1 var(--mono)}
.bd-band i{display:inline!important;font-size:15px!important;font-style:normal;color:var(--amber)}
.bd-band.none{font-size:15px!important}
.bd-last{font-size:13px!important}
.bd-club{font-size:13px!important}
.bd-surface .surface-title{font-size:14px}
.bd-surface .surface-subtitle{font-size:13px}
@media(max-width:1600px){
  body .board-row.telemetry,body .board-head.telemetry,
  body.density-comfortable .board-row.telemetry,body.density-comfortable .board-head.telemetry,
  .cockpit-board-v30 .board-row.telemetry,.cockpit-board-head.v30,
  .pro-board .board-row.telemetry,.pro-board .board-head.telemetry{
    grid-template-columns:30px 176px 150px 84px 68px 96px 94px 66px 42px minmax(120px,.8fr) 40px 18px!important;
    gap:8px!important}
  .bd-call,.bd-score{font-size:17px!important}
  .bd-table td{font-size:14px!important}
  .bd-band b{font-size:15px!important}
  .bd-band i{font-size:13px!important}
}

/* v4.64 · the breakdown heading row, at the size of what it labels.
   The headings were 11px over figures at 17. A column heading smaller than the
   column it names reads as a footnote, and on a table meant to be scanned the
   heading is the thing that lets you find the column at all — it should not be
   the hardest text on the row to read.

   STATION was already larger than its neighbours because of a rule of its own,
   which made the row look uneven rather than deliberate. They match now. */
.bd-table thead th,
.bd-table thead th.bd-band,
.bd-table thead th.bd-call,
.bd-table thead th.bd-num,
.bd-table thead th.bd-pos,
.bd-table thead th.bd-last,
.bd-table thead th.bd-club{font-size:14px!important;letter-spacing:.06em;
  padding:14px 10px!important;color:#8ba1ab!important;font-weight:800!important}
/* The band numbers are the only headings that are values rather than words, so
   they keep the tabular figures the cells below them use. */
.bd-table thead th.bd-band{font-family:var(--mono);font-variant-numeric:tabular-nums;
  color:#a7bcc5!important}
@media(max-width:1600px){
  .bd-table thead th,.bd-table thead th.bd-band,.bd-table thead th.bd-call{font-size:12px!important}
}

/* v4.66 · replay score tower and the compare picker. */
.replay-momentum .mom-row{grid-template-columns:104px 1fr 92px}
.replay-momentum .mom-row b{font-size:14px}
.replay-momentum .mom-row i{font-size:14px;font-variant-numeric:tabular-nums}
.replay-momentum .mom-track{height:18px}
.replay-momentum .mom-row.top .mom-track span{background:var(--live)}
.replay-momentum .mom-row.mine .mom-track span{background:var(--amber)}
/* The picker sits between the tower and the chart it controls, so the
   relationship is obvious without a label saying so. */
.replay-compare{border-top:1px solid var(--line);border-bottom:1px solid var(--line2)}
.replay-compare .station-picker{border-bottom:0;padding:10px 16px 14px}

/* v4.68 · headings and key moments, at a size that can be read.
   The RACE ORDER headings were 9px over figures at 18 to 21 — a label smaller
   than what it labels stops working as a label. KEY MOMENTS was worse: it is
   the panel that tells you what actually happened in the race, set in the
   smallest type on the page. */
body .board-head.telemetry{min-height:44px!important;font-size:13px!important;
  letter-spacing:.05em!important}
body .board-head.telemetry i{font-size:11px!important}
/* The replay chart needs a height of its own; without one it collapses and
   renders nothing, which looks exactly like a chart that failed. */
#replayChart{min-height:320px}
#replayChart .empty{padding:40px 20px;text-align:center}
/* The real class names are moment-*, not km-*. Writing the first guess and not
   checking is how a whole block of styling lands on nothing. */
.replay-moments .moment-row{padding:12px 16px!important}
.replay-moments .moment-c strong{font-size:15px!important}
.replay-moments .moment-c small{font-size:12px!important}
.replay-moments .moment-t{font-size:13px!important}
.replay-moments .moment-t small,.replay-moments .moment-held{font-size:11px!important}
.replay-moments .moment-i{font-size:12px!important}
.key-moments-head,.moments-head{font-size:12px!important}
.moments-head span{font-size:11px!important}

/* v4.69 · MOVERS reads as a move.
   The callsign was the size of a list entry and the position change was a grey
   caption under it. The change is the entire point of the panel — a station
   that went from fourth to third is the news, and it should not be the
   smallest thing in the row. */
.mover-row .mover-body{display:flex;align-items:baseline;gap:12px;flex-wrap:wrap;min-width:0}
.mover-body b{color:var(--text);font:850 16px/1.15 var(--mono);letter-spacing:.01em}
.mover-jump{font:800 14px/1 var(--mono);letter-spacing:.02em}
.mover-jump.up{color:var(--live)}
.mover-jump.dn{color:var(--red)}
.mover-row .wv{font-size:17px!important;font-weight:800}
.mover-row .wv.up{color:var(--live)}
.mover-row .wv.dn{color:var(--red)}

/* v4.72 · published records.
   The bar shows progress toward the record, and the note under it says what the
   comparison actually is. Every number here is a verified score; every number
   on the live board is a claimed one, and an operator two percent "above" a
   record has not broken it — they have their errors still to lose. */
.rec-list{padding:4px 0 8px}
.rec-row{display:grid;grid-template-columns:74px minmax(140px,1fr) 60px 132px minmax(120px,1fr) 76px 84px;
  align-items:center;gap:12px;padding:11px 16px;border-top:1px solid rgba(58,83,95,.14);
  font-variant-numeric:tabular-nums}
.rec-row:hover{background:#0a161d}
.rec-scope{color:var(--faint);font:800 10px/1 var(--mono);letter-spacing:.11em}
.rec-holder b{display:block;color:var(--text);font:850 16px/1.15 var(--mono)}
.rec-holder small{display:block;margin-top:3px;color:var(--faint);font:700 10px/1.3 var(--mono)}
.rec-year{color:var(--muted);font:800 13px/1 var(--mono)}
.rec-score{text-align:right;color:var(--text);font:850 17px/1 var(--mono)}
.rec-bar{display:block;height:9px;background:#0d181e}
.rec-bar i{display:block;height:100%;background:#2c6f7f}
.rec-pct{text-align:right;color:var(--muted);font:800 14px/1 var(--mono)}
/* Above the record is worth showing and worth not celebrating: the claimed
   score has not been checked yet. */
.rec-pct.over{color:var(--amber)}
.rec-nb{color:var(--faint);font:700 10px/1 var(--mono);text-align:right}
.rec-note{margin:0;padding:14px 16px;border-top:1px solid var(--line2);
  color:var(--faint);font:400 12px/1.55 var(--ui)}
@media(max-width:1200px){
  .rec-row{grid-template-columns:64px 1fr 52px 108px 66px}
  .rec-bar,.rec-nb{display:none}
}

/* v4.73 · the pre-contest state.
   A contest in the calendar with no scores yet is a state, not a 404. It is
   also the period when an operator most wants to see the records they are
   about to chase, so that is what the page shows. */
.pre-contest .empty{padding:32px 20px;text-align:center;font-size:14px}

/* v4.75.1 · a failed entry says which contest and why. */
.empty b{display:block;margin-bottom:8px;color:var(--text);font:800 15px/1.3 var(--ui)}
.empty span{display:block;margin-bottom:16px;color:var(--muted);font:400 13px/1.5 var(--ui)}
.empty .hist-cta{max-width:220px;margin:0 auto}

/* v4.77 · contextual help.
   A mark on the panel rather than a tour on arrival: a tour answers questions
   nobody has asked yet, which is why everyone closes it. This is read at the
   moment somebody wonders what they are looking at. */
.help-mark{margin-left:8px;width:16px;height:16px;padding:0;flex:0 0 auto;
  display:inline-flex;align-items:center;justify-content:center;
  border:1px solid #2e4652;border-radius:50%;background:transparent;
  color:#5f7a86;font:800 10px/1 var(--mono);cursor:pointer;vertical-align:middle;
  transition:color .16s ease,border-color .16s ease}
.help-mark:hover{color:var(--blue);border-color:var(--blue)}
.help-mark:focus-visible{outline:2px solid var(--blue);outline-offset:2px}
.help-pop{position:fixed;z-index:120;width:min(360px,calc(100vw - 24px));
  background:var(--panel);border:1px solid var(--line);
  box-shadow:0 26px 70px rgba(0,0,0,.6)}
.help-head{display:flex;align-items:center;justify-content:space-between;
  padding:12px 14px;border-bottom:1px solid var(--line)}
.help-head b{color:var(--text);font:900 10px/1 var(--mono);letter-spacing:.11em}
.help-close{border:0;background:transparent;color:var(--faint);font-size:13px;cursor:pointer}
.help-pop p{margin:0;padding:12px 14px;color:var(--muted);font:400 13px/1.6 var(--ui)}
.help-what{color:#cfe0e6!important;border-bottom:1px solid var(--line2)}
.help-read{border-bottom:1px solid var(--line2)}
/* The limit is the part that earns trust, so it is marked rather than tucked
   at the end of a paragraph where it reads as a footnote. */
.help-limit{background:#0a151b}
.help-limit span{display:block;margin-bottom:5px;color:var(--amber);
  font:800 8px/1 var(--mono);letter-spacing:.11em;text-transform:uppercase}

/* v4.78.2 · compact public audience telemetry.
   It lives in the existing 34 px top-bar rhythm and carries the detail only in
   a hover/focus flyout, so live-viewer telemetry does not steal panel space. */
.presence-chip{position:relative!important;height:34px!important;flex:0 0 auto;display:flex!important;align-items:center!important;
  padding:0 10px;border:1px solid var(--line);background:rgba(255,255,255,.012);color:#93a6ae;
  font:800 10px/1 var(--mono);letter-spacing:.02em;cursor:default;outline:none}
.presence-chip:hover,.presence-chip:focus-visible{border-color:#3a5563;color:#d7e2e6}
.presence-inline{display:flex;align-items:center;gap:6px;white-space:nowrap}.presence-inline>span{color:#758b95;font-size:9px}.presence-inline b{color:#dbe6ea;font:850 11px/1 var(--mono)}.presence-inline i{font-style:normal;color:#40525a}
.presence-chip.waiting{opacity:.65}
.presence-tip{position:absolute;right:0;top:41px;z-index:110;width:220px;display:none;padding:11px 12px;
  background:#090d0f;border:1px solid #314852;box-shadow:0 14px 34px rgba(0,0,0,.42);color:#9bafb7}
.presence-chip:hover .presence-tip,.presence-chip:focus-visible .presence-tip{display:grid;gap:6px}
.presence-tip b{color:#eef5f7;font:850 11px/1.2 var(--ui)}.presence-tip span{font:700 9px/1.35 var(--mono);color:#7f949d}
@media(max-width:1180px){.presence-chip{padding:0 8px}.presence-tip{right:-34px}}
@media(max-width:760px){.presence-chip{display:none!important}}
.presence-inline svg{width:12px;height:12px;fill:none;stroke:#758b95;stroke-width:1.35;stroke-linecap:round;stroke-linejoin:round;flex:0 0 auto}


/* v4.79 · verified local scoring audit.
   Rules stay internal; this surface shows only whether the uploaded score can
   be reconstructed exactly and the scoring totals needed to trust the result. */
.known-score-audit{display:flex;align-items:center;justify-content:space-between;gap:18px;
  margin:0 0 12px;padding:11px 14px;border:1px solid var(--line);background:rgba(255,255,255,.012)}
.known-score-audit>div{display:flex;align-items:baseline;gap:10px;white-space:nowrap}
.known-score-audit span{color:var(--faint);font:800 9px/1 var(--mono);letter-spacing:.1em}
.known-score-audit b{color:var(--text);font:900 13px/1 var(--mono)}
.known-score-audit p{margin:0;color:var(--muted);font:600 11px/1.45 var(--ui);text-align:right}
.known-score-audit.ok{border-color:rgba(64,191,133,.36)}
.known-score-audit.ok b{color:var(--live)}
.known-score-audit.warn{border-color:rgba(230,178,73,.38)}
.known-score-audit.warn b{color:var(--amber)}
@media(max-width:760px){.known-score-audit{align-items:flex-start;flex-direction:column}.known-score-audit p{text-align:left}}
