section{padding:28px 0}
.sh{display:flex;align-items:baseline;gap:16px;margin-bottom:22px}
.sh h2{font-family:'Cormorant Garamond',serif;font-size:26px;font-weight:700;color:var(--cream)}.sh .line{flex:1;height:1px;background:var(--border)}.sh .tag{font-family:'JetBrains Mono',monospace;font-size:11px;color:var(--ad);letter-spacing:1px;white-space:nowrap}
/* --bw (base.css): thickens 1px->2px in sunlight -- scoreboard is one of
   the four surfaces the Task B brief named for the sunlight border
   treatment (score pad, scoreboard, tabs, headers). */
.sb{background:var(--pm);border:var(--bw) solid var(--bs);border-radius:16px;padding:28px;margin-bottom:24px}
.st{display:flex;justify-content:center;align-items:center;gap:20px}.stm{text-align:center;flex:1}
.stm .tl{font-family:'JetBrains Mono',monospace;font-size:10px;letter-spacing:3px;text-transform:uppercase}
.stm.sa .tl{color:var(--tal)}.stm.sb2 .tl{color:var(--tbl)}
.stm .tn{width:100%}
.stm .tn input{font-family:'Cormorant Garamond',serif;font-size:clamp(18px,2.4vw,24px);font-weight:700;color:var(--cream);background:transparent;border:none;border-bottom:1px dashed var(--border);text-align:center;width:100%;max-width:100%;outline:none;text-overflow:ellipsis}.stm .tn input:focus{border-color:var(--ad)}
.sp{font-family:'Cormorant Garamond',serif;font-size:56px;font-weight:700;line-height:1;margin-top:4px}.sp.pa{color:var(--tal)}
/* H3: --tbl (#c0654e) measured 4.10:1 on --pm here -- under the 4.5:1 floor
   set for this specific readout, while --tal (Team A) measures 5.04:1 on the
   same card. --tbl itself is left alone (it's reused across badges/borders
   elsewhere at sizes/contexts the audit didn't flag); --tbl-lg is a dedicated,
   lightened variant scoped to just this scoreboard number so Team B's total
   reads as legibly as Team A's without touching --tbl's other surfaces. */
.sp.pb{color:var(--tbl-lg)}
/* Momentum: #ptsA/#ptsB roll, never snap (Phase 3 Task 2, design/motion-
   forge/scoreboard.html variant B — ui-tournament.js momentumRollNumber()).
   .sp-wrap fixes the line to one card-height so the old/new value stack can
   translate by exactly one line without reflowing the totals row around it;
   64px must match .tnum-old/.tnum-new's own height below. Reduced motion
   never builds the stacked markup at all (momentumRollNumber checks first),
   so no CSS override is needed here. */
.sp-wrap{position:relative;overflow:hidden;height:64px}
.sp-wrap .sp{margin-top:0}
.tnum-roll{display:flex;flex-direction:column}
.tnum-roll .tnum-old,.tnum-roll .tnum-new{height:64px;line-height:64px}
@keyframes tnumRoll{from{transform:translateY(0)}to{transform:translateY(-64px)}}
.tnum-roll.rolling{animation:tnumRoll var(--dur-slow) var(--ease-spring) both}
.svs{font-family:'Cormorant Garamond',serif;font-style:italic;font-size:18px;color:var(--tm)}.sof{font-family:'JetBrains Mono',monospace;font-size:11px;color:var(--tm);margin-top:2px}
.rb{margin-bottom:14px;background:var(--pm);border:1px solid var(--border);border-radius:10px;overflow:hidden}
.rh{display:flex;justify-content:space-between;align-items:center;padding:12px 16px;background:rgba(var(--amber-rgb),0.04);border-bottom:1px solid var(--border);flex-wrap:wrap;gap:8px}
.rh .rl{font-family:'JetBrains Mono',monospace;font-size:11px;letter-spacing:2px;text-transform:uppercase;color:var(--amber)}.rh .rf{font-size:12px;color:var(--ts)}.rh .rt{font-family:'JetBrains Mono',monospace;font-size:11px;color:var(--tm)}
.mr{display:grid;grid-template-columns:1fr auto minmax(70px,auto) auto 1fr;align-items:center;padding:10px 16px;border-bottom:1px solid var(--border);gap:10px}.mr:last-child{border-bottom:none}
.mp{font-size:13px;font-weight:500}.mp.l{text-align:right;color:var(--tal)}.mp.r{text-align:left;color:var(--tbl)}
.mvs{font-family:'Cormorant Garamond',serif;font-style:italic;color:var(--tm);font-size:13px;text-align:center}
.mre select{font-family:'JetBrains Mono',monospace;font-size:11px;background:var(--pl);border:1px solid var(--border);border-radius:6px;color:var(--cream);padding:5px 6px;outline:none;-webkit-appearance:none;appearance:none;cursor:pointer}
.mre select:focus{border-color:var(--ad)}.mre select option{background:var(--pm)}
.mre-result{position:relative;text-align:center;cursor:pointer;padding:2px 4px;border-radius:6px;transition:background var(--dur-fast);display:inline-block}
.mre-edit{position:absolute;top:-2px;right:-10px;font-size:8px;color:var(--tm);opacity:0;transition:opacity var(--dur-fast)}
.mre-manual{position:absolute;top:100%;left:50%;transform:translateX(-50%);margin-top:4px;z-index:20;background:var(--pm);border:1px solid var(--bs);border-radius:8px;padding:6px}
.mre-manual select{font-family:'JetBrains Mono',monospace;font-size:11px;background:var(--pl);border:1px solid var(--border);border-radius:6px;color:var(--cream);padding:5px 6px;outline:none;cursor:pointer}
@media(max-width:640px){.mr{grid-template-columns:1fr;text-align:center;gap:2px}.mp.l,.mp.r{text-align:center}}
.sg{display:grid;grid-template-columns:1fr 1fr;gap:14px}@media(max-width:700px){.sg{grid-template-columns:1fr}}
.sd{background:var(--pm);border:1px solid var(--border);border-radius:10px;padding:18px}
.sd .dl{font-family:'JetBrains Mono',monospace;font-size:11px;letter-spacing:3px;text-transform:uppercase;color:var(--amber);margin-bottom:14px}
.sr{padding:10px 0;border-bottom:1px solid var(--border)}.sr:last-child{border-bottom:none}
.sr .srt{font-family:'JetBrains Mono',monospace;font-size:11px;color:var(--ad)}.sr .srn{font-family:'Cormorant Garamond',serif;font-size:18px;font-weight:700;color:var(--cream);margin:3px 0 2px}
.sr .srf{font-size:12px;color:var(--ts);line-height:1.4}.sr .srp{font-family:'JetBrains Mono',monospace;font-size:10px;color:var(--tm);margin-top:3px}
.lg{display:grid;grid-template-columns:repeat(3,1fr);gap:14px}@media(max-width:600px){.lg{grid-template-columns:1fr}}
.lc2{background:var(--pm);border:1px solid var(--border);border-radius:10px;padding:18px;text-align:center}
.lc2 .lv{font-family:'Cormorant Garamond',serif;font-size:32px;font-weight:700;color:var(--amber)}.lc2 .ll{font-size:12px;color:var(--ts);margin-top:3px}.lc2 .ld{font-family:'JetBrains Mono',monospace;font-size:10px;color:var(--tm);margin-top:6px}
.lp{background:linear-gradient(135deg,var(--pm) 0%,rgba(var(--amber-rgb),0.03) 100%);border:1px solid var(--ad);border-radius:12px;padding:20px;margin-bottom:24px}
.lp .lph{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px}
.lp .lph h3{font-family:'Cormorant Garamond',serif;font-size:22px;color:var(--cream)}
.lpb{font-family:'JetBrains Mono',monospace;font-size:11px;text-transform:uppercase;letter-spacing:2px;color:var(--amber);background:rgba(var(--amber-rgb),0.08);border:1px solid var(--ad);border-radius:6px;padding:6px 14px;cursor:pointer;transition:background-color var(--dur-base),border-color var(--dur-base)}
.lpe{text-align:center;padding:20px 0;color:var(--tm);font-style:italic;font-size:13px}
.lpi{list-style:none}.lpi li{display:flex;justify-content:space-between;align-items:center;padding:8px 0;border-bottom:1px solid var(--border);font-size:12px;gap:8px}.lpi li:last-child{border-bottom:none}
.lpn{color:var(--ts);flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.lpp{font-family:'JetBrains Mono',monospace;font-size:11px;color:var(--amber);white-space:nowrap}
.lpc{font-family:'JetBrains Mono',monospace;font-size:11px;color:var(--tm);text-align:center;margin-top:8px}
/* Players Tab */
.pl-wrap{max-width:680px;margin:0 auto}
.pl-chip-section{margin-bottom:14px}
.pl-chip-label{font-family:'JetBrains Mono',monospace;font-size:9px;letter-spacing:2px;text-transform:uppercase;color:var(--tm);margin-bottom:6px}
.pl-chip-row{display:flex;flex-wrap:wrap;gap:6px;justify-content:center}
.pl-chip{font-family:'JetBrains Mono',monospace;font-size:11px;letter-spacing:0.5px;padding:7px 14px;border:1px solid var(--border);border-radius:20px;color:var(--ts);cursor:pointer;transition:color var(--dur-fast),border-color var(--dur-fast),background-color var(--dur-fast);user-select:none;white-space:nowrap;background:transparent}
.pl-chip.on{color:var(--amber);border-color:var(--ad);background:rgba(var(--amber-rgb),0.1);font-weight:500}
.pl-empty{text-align:center;padding:40px 0;color:var(--tm);font-style:italic;font-size:13px}
.pl-result{background:var(--pm);border:1px solid var(--border);border-radius:10px;padding:12px 16px;margin-bottom:8px;display:grid;grid-template-columns:56px 1fr 36px;gap:10px;align-items:center}
.pl-result .pl-ed{font-family:'JetBrains Mono',monospace;font-size:10px;letter-spacing:1px;color:var(--ad);white-space:nowrap;text-align:center}
.pl-result .pl-ed .pl-yr{font-size:15px;font-weight:700;color:var(--amber);display:block;line-height:1.1}
.pl-result .pl-matchup{min-width:0;text-align:center}
.pl-result .pl-matchup .pl-round{font-family:'JetBrains Mono',monospace;font-size:9px;letter-spacing:1px;text-transform:uppercase;color:var(--tm);margin-bottom:2px}
.pl-result .pl-matchup .pl-teams{font-size:13px;color:var(--cream);font-weight:400;line-height:1.4}
.pl-result .pl-matchup .pl-teams .pl-me{color:var(--amber);font-weight:600}
.pl-result .pl-matchup .pl-score{font-family:'JetBrains Mono',monospace;font-size:11px;color:var(--ts);margin-top:2px}
.pl-result .pl-matchup .pl-fmt{font-size:11px;color:var(--tm);margin-top:1px}
.pl-result .pl-outcome{font-family:'JetBrains Mono',monospace;font-size:14px;font-weight:700;white-space:nowrap;text-align:center}
.pl-outcome.pw{color:var(--tal)}.pl-outcome.pl2{color:var(--tbl)}.pl-outcome.pt{color:var(--tm)}
.pl-summary{display:flex;gap:20px;justify-content:center;margin-bottom:20px;flex-wrap:wrap}
.pl-summary .pl-stat{text-align:center;min-width:56px}
.pl-summary .pl-stat .pl-sv{font-family:'Cormorant Garamond',serif;font-size:28px;font-weight:700;color:var(--cream)}
.pl-summary .pl-stat .pl-sl{font-family:'JetBrains Mono',monospace;font-size:9px;letter-spacing:2px;text-transform:uppercase;color:var(--tm)}
@media(max-width:640px){.pl-result{grid-template-columns:48px 1fr 32px;gap:6px;padding:10px 10px}.pl-result .pl-ed .pl-yr{font-size:13px}}
/* Tickers */
.ticker{background:var(--pm);border:1px solid var(--border);border-radius:10px;padding:12px 16px;margin-bottom:12px}
.ticker-hdr{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px}
.ticker-label{font-family:'JetBrains Mono',monospace;font-size:9px;letter-spacing:2px;text-transform:uppercase;color:var(--ad)}
.ticker-link{font-family:'JetBrains Mono',monospace;font-size:10px;color:var(--amber);cursor:pointer;text-decoration:none;letter-spacing:1px;transition:color var(--dur-fast)}
.ticker-empty{font-size:12px;color:var(--tm);font-style:italic;padding:4px 0}
.ticker-row{display:flex;align-items:center;gap:8px;padding:6px 0;border-bottom:1px solid var(--border);font-size:12px}.ticker-row:last-child{border-bottom:none}
.ticker-row .tr-line{flex:1;color:var(--ts);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}
.ticker-row .tr-vs{font-family:'JetBrains Mono',monospace;font-size:10px;color:var(--tm);white-space:nowrap}
.ticker-row .tr-val{font-family:'JetBrains Mono',monospace;font-size:11px;color:var(--amber);white-space:nowrap;font-weight:500}
/* Notables ticker */
.notable-strip{overflow:hidden;padding-bottom:4px}
.np-marquee{overflow:hidden;width:100%;-webkit-mask-image:linear-gradient(90deg,transparent,#000 4%,#000 96%,transparent);mask-image:linear-gradient(90deg,transparent,#000 4%,#000 96%,transparent)}
.np-track{display:inline-flex;gap:8px;white-space:nowrap;will-change:transform;animation:npscroll var(--np-dur,30s) linear infinite}
@keyframes npscroll{from{transform:translateX(0)}to{transform:translateX(-50%)}}
@media (prefers-reduced-motion:reduce){.np-track{animation:none}.notable-strip{overflow-x:auto;-webkit-overflow-scrolling:touch}}
.notable-pill{flex:0 0 auto;display:inline-flex;align-items:center;gap:6px;background:rgba(var(--amber-rgb),0.06);border:1px solid var(--border);border-radius:8px;padding:6px 12px;font-size:11px;white-space:nowrap}
.notable-pill.np-latest{border-color:var(--amber);background:rgba(var(--amber-rgb),0.14)}
.np-badge{font-family:'JetBrains Mono',monospace;font-size:8px;letter-spacing:1px;text-transform:uppercase;font-weight:700;color:var(--pine,#0c1a12);background:var(--amber);border-radius:4px;padding:2px 5px;margin-right:2px}
.notable-pill .np-icon{font-size:14px}
.notable-pill .np-text{color:var(--cream);font-weight:500}
.notable-pill .np-detail{color:var(--tm);font-size:10px;margin-left:4px}
.notable-pill .np-round{font-family:'JetBrains Mono',monospace;font-size:8px;letter-spacing:1px;text-transform:uppercase;color:var(--ad);border:1px solid var(--border);border-radius:4px;padding:1px 5px;margin-left:8px}
/* Live match cards */
.live-matches{display:grid;grid-template-columns:repeat(2,1fr);gap:12px}
@media(max-width:640px){.live-matches{grid-template-columns:1fr}}
.lm-card{background:var(--pm);border:1px solid var(--border);border-radius:10px;padding:14px 16px;cursor:pointer;transition:border-color var(--dur-base),transform var(--dur-base)}
.lm-card .lm-round{font-family:'JetBrains Mono',monospace;font-size:9px;letter-spacing:2px;text-transform:uppercase;color:var(--ad);margin-bottom:6px;text-align:center}
.lm-card .lm-teams{display:flex;align-items:center;justify-content:center;gap:8px;margin-bottom:6px}
.lm-card .lm-team{font-family:'Cormorant Garamond',serif;font-size:16px;font-weight:600;color:var(--cream);max-width:45%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.lm-card .lm-vs{font-family:'Cormorant Garamond',serif;font-style:italic;color:var(--tm);font-size:13px}
.lm-card .lm-status{text-align:center;font-family:'JetBrains Mono',monospace;font-size:12px;font-weight:600}
.lm-card .lm-thru{text-align:center;font-family:'JetBrains Mono',monospace;font-size:10px;color:var(--tm);margin-top:2px}
.lm-card .lm-live{display:inline-block;font-family:'JetBrains Mono',monospace;font-size:8px;letter-spacing:2px;text-transform:uppercase;color:var(--tal);background:rgba(var(--ta-rgb),0.15);padding:2px 8px;border-radius:10px;margin-right:6px}
/* Momentum: status pill flip (Phase 3 Task 2, design/motion-forge/
   scoreboard.html variant B — flipStatus()). ui-tournament.js bakes
   .status-flip directly into a card's .lm-status-text HTML only for a
   match whose status signature changed since the LAST renderLiveMatches()
   pass (module state, same diff for a local tap or a realtime.js callback)
   — never on an unrelated rerender, and never twice for the same change,
   since the class only exists if this exact render decided to add it. */
.lm-status .lm-status-text{display:inline-block;perspective:300px}
@keyframes lmStatusFlip{0%{transform:rotateX(0)}48%{transform:rotateX(85deg)}52%{transform:rotateX(-85deg)}100%{transform:rotateX(0)}}
.lm-status-text.status-flip{animation:lmStatusFlip var(--dur-slow) var(--ease-in-out) both}
@media(prefers-reduced-motion:reduce){
  /* No flip — a plain fade instead (Task brief: "no flips (fade instead)"). */
  @keyframes lmStatusFade{from{opacity:.25}to{opacity:1}}
  .lm-status-text.status-flip{animation:lmStatusFade var(--dur-fast) linear both}
}
/* Momentum: gentle FLIP reorder (the cut — README.md §The Cut: "--dur-slow,
   only on status-class change, never continuous"). renderLiveMatches()
   batches every card's pre-mutation getBoundingClientRect() up front, then
   — after the single grid.innerHTML rewrite — batches the post-mutation
   reads and sets --flip-dx/--flip-dy per card that actually moved, so the
   CSS keyframe (transform only, no layout thrash) plays the delta back to
   zero. Reduced motion: class still lands (so state stays consistent) but
   the animation is fully suppressed — cards land in their new order with
   no reorder animation, per the brief. */
@keyframes flipReorder{from{transform:translate(var(--flip-dx,0px),var(--flip-dy,0px))}to{transform:translate(0,0)}}
.lm-card.flip-in{animation:flipReorder var(--dur-slow) var(--ease-out) both;will-change:transform}
@media(prefers-reduced-motion:reduce){
  .lm-card.flip-in{animation:none}
}
/* Momentum tug-of-war bar (Phase 3 Task 2 port of design/motion-forge/
   scoreboard.html variant B — Nick's cut, 2026-08-13). Two team-colored
   halves meeting at a knot; renderMomentumBar() (js/ui-tournament.js) sets
   width/left directly off the same a/b totals calcScores() just computed.
   The clinch tick mark is edition.clinch_points (Tournament Setup's own
   "Points to Clinch" field) — real data, not invented — hidden entirely
   when it isn't set. */
.tug{position:relative;height:14px;border-radius:7px;overflow:hidden;background:var(--tb);margin-top:2px;contain:layout}
.tug .tfill{position:absolute;inset:0 auto 0 0;background:var(--ta);width:50%;transition:width var(--dur-slow) var(--ease-spring)}
.tug .tknot{position:absolute;top:-3px;bottom:-3px;width:3px;border-radius:2px;background:var(--cream);left:50%;transition:left var(--dur-slow) var(--ease-spring);box-shadow:0 0 6px rgba(var(--cream-rgb),.4)}
.tug .tclinch{position:absolute;top:0;bottom:0;width:2px;background:rgba(var(--cream-rgb),.55)}
@keyframes tugPulse{50%{transform:scaleY(1.35)}}
.tug.pulse{animation:tugPulse var(--dur-slow) var(--ease-out)}
/* Fix round 1 (Important 1): renderMomentumBar() adds this on the very
   first render only (no prior state to seed from), so the initial
   width/left write lands instantly instead of transitioning from the
   CSS-default 50% above. */
.tug.no-anim .tfill,.tug.no-anim .tknot{transition:none}
@media(prefers-reduced-motion:reduce){
  /* Reduced motion: the bar still snaps to its new position (no width/left
     transition), but a brief opacity cross-fade replaces the scaleY pulse
     so a change still registers without any motion. */
  .tug .tfill,.tug .tknot{transition:none}
  @keyframes tugFlash{0%{opacity:.5}100%{opacity:1}}
  .tug.pulse{animation:tugFlash var(--dur-base) linear}
}
/* The Field */
.field-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:10px}
@media(max-width:700px){.field-grid{grid-template-columns:repeat(2,1fr)}}
.field-card{background:var(--pm);border:1px solid var(--border);border-radius:10px;padding:12px;transition:border-color var(--dur-fast)}
.field-card.has-title{border-color:rgba(var(--amber-rgb),0.35)}
.field-card .fc-name{font-family:'Cormorant Garamond',serif;font-size:16px;font-weight:700;color:var(--cream);margin-bottom:4px}
.field-card .fc-rec{display:flex;align-items:baseline;gap:6px;margin-bottom:6px}
.field-card .fc-wlt{font-family:'JetBrains Mono',monospace;font-size:18px;font-weight:600;color:var(--al)}
.field-card .fc-pct{font-family:'JetBrains Mono',monospace;font-size:10px;color:var(--tm)}
.field-card .fc-titles{font-family:'JetBrains Mono',monospace;font-size:9px;color:var(--amber);margin-bottom:4px;letter-spacing:0.5px}
.field-card .fc-tags{display:flex;flex-wrap:wrap;gap:3px}
.fc-rookie{display:inline-flex;align-items:center;gap:4px;font-family:'JetBrains Mono',monospace;font-size:9px;letter-spacing:1px;text-transform:uppercase;color:var(--al);background:rgba(var(--al-rgb),0.1);border:1px solid rgba(var(--al-rgb),0.2);border-radius:4px;padding:2px 8px;margin-bottom:4px}
.fc-rookie::before{content:'⭐';font-size:10px}
/* Chip Bet Builder */
.book-builder{background:linear-gradient(135deg,var(--pm) 0%,rgba(var(--amber-rgb),0.03) 100%);border:1px solid var(--ad);border-radius:12px;padding:20px 20px 24px;margin-bottom:24px}
.bb-title{display:flex;justify-content:space-between;align-items:center;margin-bottom:16px}
.bb-title h3{font-family:'Cormorant Garamond',serif;font-size:22px;color:var(--cream)}
.bb-title .bb-clear{font-family:'JetBrains Mono',monospace;font-size:10px;text-transform:uppercase;letter-spacing:2px;color:var(--tm);background:none;border:1px solid var(--border);border-radius:6px;padding:5px 12px;cursor:pointer;transition:color var(--dur-base),border-color var(--dur-base)}
/* Line preview sentence */
.line-preview{background:var(--pl);border:1px solid var(--border);border-radius:10px;padding:14px 16px;margin-bottom:20px;min-height:48px;display:flex;align-items:center;justify-content:space-between;gap:12px;transition:border-color var(--dur-slow)}
.line-preview.has-content{border-color:var(--ad)}
.line-preview .lp-sentence{font-family:'Cormorant Garamond',serif;font-size:18px;color:var(--cream);font-weight:600;line-height:1.3}
.line-preview .lp-empty{font-size:13px;color:var(--tm);font-style:italic}
.line-preview .lp-add{font-family:'JetBrains Mono',monospace;font-size:10px;text-transform:uppercase;letter-spacing:2px;color:var(--amber);background:rgba(var(--amber-rgb),0.08);border:1px solid var(--ad);border-radius:6px;padding:6px 14px;cursor:pointer;white-space:nowrap;transition:background-color var(--dur-base)}
.line-preview .lp-add:disabled{opacity:.3;cursor:not-allowed}
/* Chip rows */
.chip-section{margin-bottom:16px}
.chip-label{font-family:'JetBrains Mono',monospace;font-size:10px;letter-spacing:2px;text-transform:uppercase;color:var(--tm);margin-bottom:8px}
.chip-row{display:flex;flex-wrap:wrap;gap:6px}
.chip{font-family:'JetBrains Mono',monospace;font-size:11px;letter-spacing:0.5px;padding:7px 14px;border:1px solid var(--border);border-radius:20px;color:var(--ts);cursor:pointer;transition:color var(--dur-fast),border-color var(--dur-fast),background-color var(--dur-fast);user-select:none;white-space:nowrap;background:transparent}
.chip.on{color:var(--amber);border-color:var(--ad);background:rgba(var(--amber-rgb),0.1);font-weight:500}
.chip.field-chip{font-style:italic}
.chip.fc-a{border-left:2px solid var(--tal)}
.chip.fc-b{border-left:2px solid var(--tbl)}
.chip.vs-indicator{color:var(--tm);border:none;padding:7px 4px;cursor:default;font-style:italic;font-family:'Cormorant Garamond',serif;font-size:13px}
/* O/U line input */
.ou-row{display:flex;align-items:center;gap:10px;margin-top:8px;padding:10px 14px;background:rgba(var(--amber-rgb),0.04);border:1px solid var(--border);border-radius:8px}
.ou-row label{font-family:'JetBrains Mono',monospace;font-size:11px;color:var(--tm);letter-spacing:1px;text-transform:uppercase}
.ou-row input{font-family:'JetBrains Mono',monospace;font-size:16px;color:var(--amber);background:transparent;border:none;border-bottom:1px dashed var(--ad);width:56px;text-align:center;outline:none;padding:2px 0}
.ou-row input:focus{border-color:var(--amber)}
.ou-row .ou-hint{font-size:11px;color:var(--tm);font-style:italic}
/* Odds chips */
.odds-custom{display:inline-flex;align-items:center;gap:4px;border:1px solid var(--border);border-radius:20px;padding:3px 10px 3px 12px;transition:border-color var(--dur-fast),background-color var(--dur-fast)}
.odds-custom.on{border-color:var(--ad);background:rgba(var(--amber-rgb),0.1)}
.odds-custom span{font-family:'JetBrains Mono',monospace;font-size:11px;color:var(--ts)}
.odds-custom input{font-family:'JetBrains Mono',monospace;font-size:12px;color:var(--amber);background:transparent;border:none;width:48px;outline:none;text-align:center}
/* Slip */
.slip{margin:20px 0;border:1px solid var(--border);border-radius:10px;overflow:hidden}
.slip-hdr{display:flex;justify-content:space-between;align-items:center;padding:10px 14px;background:rgba(var(--amber-rgb),0.04);border-bottom:1px solid var(--border)}
.slip-hdr .slip-title{font-family:'JetBrains Mono',monospace;font-size:10px;letter-spacing:2px;text-transform:uppercase;color:var(--ad)}
.slip-hdr .slip-count{font-family:'JetBrains Mono',monospace;font-size:10px;color:var(--tm)}
.slip-empty{text-align:center;padding:20px;color:var(--tm);font-style:italic;font-size:13px}
.slip-item{display:flex;justify-content:space-between;align-items:center;padding:10px 14px;border-bottom:1px solid var(--border);gap:8px}
.slip-item:last-child{border-bottom:none}
.slip-item .si-line{flex:1;min-width:0}
.slip-item .si-desc{font-size:13px;font-weight:500;color:var(--cream);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.slip-item .si-meta{font-family:'JetBrains Mono',monospace;font-size:10px;color:var(--tm);margin-top:2px}
.slip-item .si-odds{font-family:'JetBrains Mono',monospace;font-size:13px;color:var(--amber);font-weight:500;white-space:nowrap}
.slip-item .si-rm{font-size:15px;color:var(--tm);cursor:pointer;padding:2px 6px;margin-left:4px}
/* Who's betting section */
.whos-betting{background:var(--pl);border:1px solid var(--border);border-radius:10px;padding:16px;margin-bottom:16px}
.wb-label{font-family:'JetBrains Mono',monospace;font-size:10px;letter-spacing:2px;text-transform:uppercase;margin-bottom:10px}
.wb-label.bettor-label{color:var(--tal)}
.wb-label.taker-label{color:var(--tbl)}
.wb-grid{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin-bottom:16px}
@media(max-width:600px){.wb-grid{grid-template-columns:1fr}}
.wb-side{background:var(--pm);border:1px solid var(--border);border-radius:10px;padding:14px}
.side-list{list-style:none;margin-bottom:8px}.side-list li{display:flex;justify-content:space-between;align-items:center;padding:6px 0;border-bottom:1px solid var(--border);gap:6px}.side-list li:last-child{border-bottom:none}
.side-name{font-size:13px;color:var(--cream);flex:1}
.side-pct input{font-family:'JetBrains Mono',monospace;font-size:12px;color:var(--amber);background:transparent;border:none;border-bottom:1px dashed var(--border);width:36px;text-align:center;outline:none}.side-pct input:focus{border-color:var(--ad)}
.side-pct span{font-size:11px;color:var(--tm)}
.side-rm{font-size:13px;color:var(--tm);cursor:pointer;padding:0 4px}
.side-add{display:flex;gap:6px}.side-add select{flex:1;font-family:'JetBrains Mono',monospace;font-size:11px;background:var(--pl);border:1px solid var(--border);border-radius:6px;color:var(--cream);padding:5px 6px;outline:none}.side-add select:focus{border-color:var(--ad)}.side-add select option{background:var(--pm)}
.side-add button{font-family:'JetBrains Mono',monospace;font-size:11px;color:var(--amber);background:none;border:1px solid var(--ad);border-radius:6px;padding:5px 10px;cursor:pointer}
.pct-warn{font-family:'JetBrains Mono',monospace;font-size:10px;color:var(--rs);margin-top:4px}
/* Wager row */
.wager-row{display:flex;align-items:center;gap:16px;flex-wrap:wrap}
.wager-row label{font-family:'JetBrains Mono',monospace;font-size:10px;letter-spacing:2px;text-transform:uppercase;color:var(--tm)}
.wager-row input{font-family:'JetBrains Mono',monospace;font-size:16px;color:var(--amber);background:var(--pl);border:1px solid var(--border);border-radius:8px;padding:8px 12px;width:100px;outline:none}.wager-row input:focus{border-color:var(--ad)}
/* Payout */
.payout-box{margin-top:12px;padding:14px;background:rgba(var(--amber-rgb),0.05);border:1px solid var(--border);border-radius:8px}
.payout-box .po-title{font-family:'JetBrains Mono',monospace;font-size:10px;text-transform:uppercase;letter-spacing:2px;color:var(--ad);margin-bottom:10px}
.po-row{display:flex;justify-content:space-between;align-items:center;padding:5px 0;border-bottom:1px solid var(--border);font-size:12px}.po-row:last-child{border-bottom:none}
.po-row .po-label{color:var(--ts)}.po-row .po-val{font-family:'JetBrains Mono',monospace;color:var(--cream);font-weight:500}
.po-row.po-total{padding-top:8px;margin-top:4px;border-top:1px solid var(--bs);border-bottom:none}.po-row.po-total .po-label{font-weight:600;color:var(--cream)}.po-row.po-total .po-val{font-size:16px;color:var(--al)}
.ppb{margin-top:8px}.ppb .ppbr{display:flex;justify-content:space-between;align-items:center;padding:4px 0;font-size:12px;border-bottom:1px solid var(--border)}.ppb .ppbr:last-child{border-bottom:none}
.ppb .ppn{color:var(--ts)}.ppb .ppv{font-family:'JetBrains Mono',monospace;color:var(--cream);font-size:11px}
/* Propose button */
.propose-row{display:flex;gap:12px;align-items:center;margin-top:16px}
.propose-btn{font-family:'JetBrains Mono',monospace;font-size:11px;text-transform:uppercase;letter-spacing:2px;color:var(--amber);border:1px solid var(--ad);background:rgba(var(--amber-rgb),0.08);border-radius:6px;padding:8px 20px;cursor:pointer;transition:background-color var(--dur-base)}
.propose-btn:disabled{opacity:.3;cursor:not-allowed}
.propose-hint{font-size:11px;color:var(--tm)}
/* Proposed & locked bets (preserved) */
.prop-bet{background:var(--pm);border:1px solid var(--border);border-radius:10px;padding:16px;margin-bottom:12px}
.prop-bet .pb-hd{display:flex;justify-content:space-between;align-items:center;margin-bottom:10px}
.prop-bet .pb-lines{font-size:12px;color:var(--ts);margin-bottom:8px}
.prop-bet .pb-sides{display:flex;gap:16px;margin-bottom:8px;flex-wrap:wrap}
.prop-bet .pb-side{flex:1;min-width:120px}
.prop-bet .pb-side .pb-sl{font-family:'JetBrains Mono',monospace;font-size:10px;letter-spacing:1px;text-transform:uppercase;color:var(--tm);margin-bottom:4px}
.prop-bet .pb-party{display:flex;justify-content:space-between;align-items:center;font-size:12px;padding:3px 0}
.pb-confirmed{color:var(--tal)}.pb-pending{color:var(--ad)}.pb-declined{color:var(--rs)}
.pb-actions{display:flex;gap:8px;margin-top:8px;flex-wrap:wrap}
.pb-confirm-btn{font-family:'JetBrains Mono',monospace;font-size:11px;color:var(--tal);border:1px solid var(--ta);border-radius:6px;padding:6px 14px;background:none;cursor:pointer}
.pb-decline-btn{font-family:'JetBrains Mono',monospace;font-size:11px;color:var(--rs);border:1px solid rgba(var(--rs-rgb),0.3);border-radius:6px;padding:6px 14px;background:none;cursor:pointer}
.net-badge{font-family:'JetBrains Mono',monospace;font-size:9px;letter-spacing:1px;text-transform:uppercase;background:rgba(var(--ta-rgb),0.15);color:var(--tal);padding:2px 6px;border-radius:3px;margin-left:6px}
/* PIN */
/* Task B token audit: left un-tokenized deliberately. A modal scrim's job
   is dimming whatever's underneath, not matching the page's own polarity --
   flipping this to a light wash in sunlight would mean a near-white veil
   over a near-white page, i.e. no dimming at all. Same reasoning covers
   setup.css's .pk-overlay and every plain box-shadow:rgba(0,0,0,..) literal
   in this file (a shadow that flipped to white on a light theme would read
   as a glow, not a shadow). */
.pin-overlay{position:fixed;inset:0;background:rgba(12,26,18,0.85);z-index:100;display:flex;align-items:center;justify-content:center}
.pin-modal{background:var(--pm);border:1px solid var(--bs);border-radius:16px;padding:32px;max-width:320px;width:90%;text-align:center}
.pin-modal h3{font-family:'Cormorant Garamond',serif;font-size:24px;color:var(--cream);margin-bottom:4px}
.pin-modal p{font-size:12px;color:var(--tm);margin-bottom:20px}
.pin-input{display:flex;justify-content:center;gap:8px;margin-bottom:16px}
.pin-input input{font-family:'JetBrains Mono',monospace;font-size:24px;width:48px;height:56px;text-align:center;background:var(--pl);border:1px solid var(--border);border-radius:10px;color:var(--amber);outline:none;-webkit-text-security:disc}.pin-input input:focus{border-color:var(--ad)}
.pin-err{font-size:11px;color:var(--rs);margin-bottom:12px;min-height:16px}
.pin-actions{display:flex;gap:8px;justify-content:center}
.pin-ok{font-family:'JetBrains Mono',monospace;font-size:12px;text-transform:uppercase;letter-spacing:2px;color:var(--amber);background:rgba(var(--amber-rgb),0.08);border:1px solid var(--ad);border-radius:8px;padding:10px 24px;cursor:pointer}
.pin-cancel{font-family:'JetBrains Mono',monospace;font-size:12px;text-transform:uppercase;letter-spacing:2px;color:var(--tm);background:none;border:1px solid var(--border);border-radius:8px;padding:10px 24px;cursor:pointer}
/* Classic props grid */
.pg{display:grid;grid-template-columns:repeat(3,1fr);gap:14px}@media(max-width:800px){.pg{grid-template-columns:repeat(2,1fr)}}@media(max-width:500px){.pg{grid-template-columns:1fr}}
.pk{background:var(--pm);border:1px solid var(--border);border-radius:10px;padding:16px}
.pk .pi{font-size:22px;margin-bottom:8px}.pk .pn{font-family:'Cormorant Garamond',serif;font-size:16px;font-weight:700;color:var(--cream);margin-bottom:4px}.pk .pd2{font-size:12px;color:var(--tm);margin-bottom:12px;line-height:1.3}
.pk .po{list-style:none}.pk .po li{display:flex;justify-content:space-between;align-items:center;padding:5px 0;border-bottom:1px solid rgba(var(--amber-rgb),0.06);font-size:12px}.pk .po li:last-child{border-bottom:none}
.po .on{color:var(--ts)}.po .oo{font-family:'JetBrains Mono',monospace;color:var(--amber);font-size:11px}
.clickable{cursor:pointer;transition:background var(--dur-fast),border-color var(--dur-fast)}
/* Locked bets */
.flc{background:var(--pm);border:1px solid var(--border);border-radius:10px;padding:14px 16px;margin-bottom:10px;display:grid;grid-template-columns:1fr auto 1fr 1fr;gap:12px;align-items:center}
@media(max-width:640px){.flc{grid-template-columns:1fr;gap:6px;text-align:center}}
.flc .fr{font-size:9px;text-transform:uppercase;letter-spacing:2px;color:var(--tm)}.flc .fn{font-family:'Cormorant Garamond',serif;font-size:14px;font-weight:700;color:var(--cream)}.flc .fa{font-family:'JetBrains Mono',monospace;font-size:11px;color:var(--amber);margin-top:1px}
.flv{font-family:'Cormorant Garamond',serif;font-style:italic;color:var(--tm);font-size:14px}
.fld{text-align:right}@media(max-width:640px){.fld{text-align:center}}
.fld .fb{font-size:12px;font-weight:600;color:var(--cream)}.fld .ft{font-size:11px;color:var(--tm)}.fld .fo{font-family:'JetBrains Mono',monospace;font-size:11px;color:var(--amber);margin-top:1px}
/* Roster */
.rg{display:grid;grid-template-columns:repeat(4,1fr);gap:14px}@media(max-width:900px){.rg{grid-template-columns:repeat(2,1fr)}}@media(max-width:500px){.rg{grid-template-columns:1fr}}
.pc{background:var(--pm);border:1px solid var(--border);border-radius:10px;padding:16px;transition:border-color var(--dur-base),transform var(--dur-base)}
.pc .pck{font-family:'JetBrains Mono',monospace;font-size:10px;letter-spacing:2px;text-transform:uppercase;color:var(--ad);margin-bottom:3px}
.pc .pcn{font-family:'Cormorant Garamond',serif;font-size:20px;font-weight:700;color:var(--cream);margin-bottom:2px}
.pc .pct{font-size:11px;color:var(--tm);margin-bottom:10px;line-height:1.3}
.pc .pch{display:flex;align-items:center;gap:8px;padding-top:8px;border-top:1px solid var(--border)}
.pc .pch label{font-size:10px;text-transform:uppercase;letter-spacing:1.5px;color:var(--tm)}
.pc .pch input{font-family:'JetBrains Mono',monospace;font-size:14px;color:var(--amber);background:transparent;border:none;border-bottom:1px dashed var(--border);width:40px;text-align:center;outline:none}.pc .pch input:focus{border-color:var(--ad)}
.pc .pcl{font-size:10px;color:var(--tm);margin-top:8px;font-style:italic;line-height:1.3}
/* Lore */
.lrg{display:grid;grid-template-columns:1fr 1fr;gap:14px}@media(max-width:700px){.lrg{grid-template-columns:1fr}}
.lrc{background:var(--pm);border:1px solid var(--border);border-radius:10px;padding:16px}
.lrc .li{font-size:24px;margin-bottom:6px}.lrc .lt{font-family:'Cormorant Garamond',serif;font-size:17px;font-weight:700;color:var(--cream);margin-bottom:4px}.lrc .lx{font-size:12px;color:var(--ts);line-height:1.5}
/* History */
.gg{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:12px}
.gc{background:var(--pm);border:1px solid var(--border);border-radius:10px;padding:16px}
.gc .gn{font-family:'Cormorant Garamond',serif;font-size:18px;font-weight:700;color:var(--cream)}.gc .gt{font-size:11px;color:var(--tm);margin-top:2px}.gc .gy{font-family:'JetBrains Mono',monospace;font-size:10px;color:var(--ad);margin-top:6px}
/* Team setup */
.ts-chip{font-family:'JetBrains Mono',monospace;font-size:11px;padding:8px 14px;border:1px solid var(--border);border-radius:8px;color:var(--cream);cursor:pointer;transition:border-color var(--dur-fast),background-color var(--dur-fast);user-select:none;display:inline-flex;align-items:center;gap:6px}
.ts-chip .ts-x{font-size:13px;color:var(--tm);margin-left:4px}
.ts-assign{display:flex;gap:4px}
.ts-assign button{font-family:'JetBrains Mono',monospace;font-size:9px;padding:3px 8px;border-radius:4px;border:1px solid var(--border);background:none;cursor:pointer;letter-spacing:1px;text-transform:uppercase}
.ts-assign .ts-a{color:var(--tal);border-color:var(--ta)}
.ts-assign .ts-b{color:var(--tbl);border-color:var(--tb)}
footer{text-align:center;padding:32px 0;border-top:1px solid var(--border);margin-top:16px}
footer p{font-family:'Cormorant Garamond',serif;font-style:italic;font-size:14px;color:var(--tm);max-width:500px;margin:0 auto}
footer .fs{font-family:'JetBrains Mono',monospace;font-size:10px;letter-spacing:1px;text-transform:uppercase;color:var(--tm);margin-top:8px;opacity:.5}


/* History round results */
.hist-rounds{margin-top:16px;border-top:1px solid var(--border);padding-top:12px}
.hist-rd{margin-bottom:10px}
.hist-rd-hdr{display:flex;justify-content:space-between;align-items:center;padding:6px 10px;background:rgba(var(--amber-rgb),0.04);border:1px solid var(--border);border-radius:8px 8px 0 0;cursor:pointer;user-select:none;transition:background var(--dur-fast)}
.hist-rd-name{font-family:'JetBrains Mono',monospace;font-size:10px;letter-spacing:1.5px;text-transform:uppercase;color:var(--amber)}
.hist-rd-course{font-size:11px;color:var(--tm);font-style:italic}
.hist-rd-score{font-family:'JetBrains Mono',monospace;font-size:11px;font-weight:600}
.hist-rd-body{border:1px solid var(--border);border-top:none;border-radius:0 0 8px 8px;overflow:hidden}
.hist-rd-body.collapsed{display:none}
.hist-m{display:grid;grid-template-columns:1fr auto 1fr;align-items:center;padding:6px 10px;border-bottom:1px solid rgba(var(--amber-rgb),0.06);gap:8px;font-size:11px}
.hist-m:last-child{border-bottom:none}
.hist-m-l{text-align:right;color:var(--cream);font-weight:500}.hist-m-r{text-align:left;color:var(--cream);font-weight:500}
.hist-m-tag{font-family:'JetBrains Mono',monospace;font-size:7px;letter-spacing:1px;text-transform:uppercase;padding:1px 5px;border-radius:3px;vertical-align:middle;font-weight:600}
.hist-m-tag.tag-a{color:var(--tal);background:rgba(var(--tal-rgb),0.1);border:1px solid rgba(var(--tal-rgb),0.2)}
.hist-m-tag.tag-b{color:var(--tbl);background:rgba(var(--tbl-rgb),0.1);border:1px solid rgba(var(--tbl-rgb),0.2)}
.hist-m-res{text-align:center;font-family:'JetBrains Mono',monospace;font-size:9px;min-width:80px;padding:3px 8px;border-radius:4px;font-weight:600;letter-spacing:0.5px}
.hist-m-res.res-a{color:var(--tal);background:rgba(var(--tal-rgb),0.12);border:1px solid rgba(var(--tal-rgb),0.2)}
.hist-m-res.res-b{color:var(--tbl);background:rgba(var(--tbl-rgb),0.12);border:1px solid rgba(var(--tbl-rgb),0.2)}
.hist-m-res.res-t{color:var(--tm);background:rgba(var(--tm-rgb),0.08);border:1px solid rgba(var(--tm-rgb),0.15)}
/* Winner banner */
.hist-winner{text-align:center;padding:16px 12px;margin-bottom:12px;border-radius:10px}
.hist-winner.hw-a{background:linear-gradient(135deg,rgba(var(--ta-rgb),0.12) 0%,rgba(var(--ta-rgb),0.04) 100%);border:1px solid rgba(var(--tal-rgb),0.25)}
.hist-winner.hw-b{background:linear-gradient(135deg,rgba(var(--tb-rgb),0.12) 0%,rgba(var(--tb-rgb),0.04) 100%);border:1px solid rgba(var(--tbl-rgb),0.25)}
.hist-winner .hw-trophy{font-size:28px;margin-bottom:4px}
.hist-winner .hw-team{font-family:'Cormorant Garamond',serif;font-size:24px;font-weight:700;line-height:1.2}
.hist-winner.hw-a .hw-team{color:var(--tal)}.hist-winner.hw-b .hw-team{color:var(--tbl)}
.hist-winner .hw-sub{font-family:'JetBrains Mono',monospace;font-size:10px;letter-spacing:2px;text-transform:uppercase;color:var(--tm);margin-top:4px}
/* Final score in results */
.hist-final{display:flex;justify-content:center;align-items:center;gap:16px;padding:14px;background:rgba(var(--amber-rgb),0.04);border:1px solid var(--bs);border-radius:10px;margin-top:10px}
.hist-final-team{text-align:center;min-width:60px}
.hist-final-name{font-family:'JetBrains Mono',monospace;font-size:9px;letter-spacing:2px;text-transform:uppercase;color:var(--tm)}
.hist-final-pts{font-family:'Cormorant Garamond',serif;font-size:32px;font-weight:700;line-height:1}
.hist-final-pts.fw{color:var(--amber)}.hist-final-pts.fl{color:var(--tm)}
.hist-final-vs{font-family:'Cormorant Garamond',serif;font-style:italic;color:var(--tm);font-size:14px}
.hist-toggle{font-family:'JetBrains Mono',monospace;font-size:10px;color:var(--ad);cursor:pointer;padding:6px 0;text-align:center;letter-spacing:1px;text-transform:uppercase;transition:color var(--dur-fast)}
@media(max-width:640px){.hist-m{grid-template-columns:1fr;text-align:center;gap:2px}.hist-m-l,.hist-m-r{text-align:center}}
/* All-time records */
.atr-section{margin-bottom:24px}
.atr-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:10px}
@media(max-width:700px){.atr-grid{grid-template-columns:repeat(2,1fr)}}
.atr-card{background:var(--pm);border:1px solid var(--border);border-radius:10px;padding:14px;transition:border-color var(--dur-fast)}
.atr-card.has-title{border-color:rgba(var(--amber-rgb),0.35)}
.atr-name{font-family:'Cormorant Garamond',serif;font-size:17px;font-weight:700;color:var(--cream);margin-bottom:8px}
.atr-rec{display:flex;align-items:baseline;gap:6px;margin-bottom:10px}
.atr-wlt{font-family:'JetBrains Mono',monospace;font-size:20px;font-weight:600;color:var(--al)}
.atr-pct{font-family:'JetBrains Mono',monospace;font-size:11px;color:var(--tm)}
.atr-stats{margin-bottom:8px}
.atr-row{display:flex;justify-content:space-between;padding:3px 0;border-bottom:1px solid rgba(var(--amber-rgb),0.06);font-size:11px}
.atr-row:last-child{border-bottom:none}
.atr-row .al{color:var(--tm)}.atr-row .av{font-family:'JetBrains Mono',monospace;color:var(--ts);font-size:10px}
.atr-titles{font-family:'JetBrains Mono',monospace;font-size:9px;color:var(--amber);margin-bottom:6px;letter-spacing:0.5px}
.atr-tags{display:flex;flex-wrap:wrap;gap:3px;margin-top:6px}
.atr-tag{font-family:'JetBrains Mono',monospace;font-size:7px;letter-spacing:0.3px;padding:2px 5px;border-radius:3px}
.atr-tag.tt{background:rgba(var(--ta-rgb),0.1);color:var(--tal);border:1px solid rgba(var(--ta-rgb),0.2)}
.atr-tag.tj{background:rgba(var(--tb-rgb),0.1);color:var(--tbl);border:1px solid rgba(var(--tb-rgb),0.2)}
.atr-sep{height:1px;background:var(--border);margin:16px 0}
.atr-pair-title{font-family:'JetBrains Mono',monospace;font-size:10px;letter-spacing:2px;text-transform:uppercase;color:var(--ad);margin-bottom:10px}
.atr-pairs{display:grid;grid-template-columns:1fr 1fr;gap:8px}
@media(max-width:500px){.atr-pairs{grid-template-columns:1fr}}
.atr-pair{display:flex;justify-content:space-between;align-items:center;padding:6px 10px;background:var(--pl);border-radius:6px;font-size:11px}
.atr-pair-name{color:var(--cream);font-weight:500}
.atr-pair-rec{font-family:'JetBrains Mono',monospace;color:var(--al);font-size:11px}
/* Quick links */
.ql-bar{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:20px;padding:10px 0;border-bottom:1px solid var(--border)}
.ql-link{font-family:'JetBrains Mono',monospace;font-size:10px;letter-spacing:1px;padding:5px 10px;border-radius:6px;cursor:pointer;transition:background-color var(--dur-fast);user-select:none;white-space:nowrap}
.ql-link.ql-t{color:var(--tal);border:1px solid rgba(var(--ta-rgb),0.2);background:rgba(var(--ta-rgb),0.06)}
.ql-link.ql-j{color:var(--tbl);border:1px solid rgba(var(--tb-rgb),0.2);background:rgba(var(--tb-rgb),0.06)}


/* ══════════════════════════════════════════
   MATCH PLAY SCORECARD — v3
   ══════════════════════════════════════════ */
/* Match cards */
.mc-card{background:var(--pm);border:1px solid var(--border);border-radius:10px;padding:14px;margin-bottom:10px;cursor:pointer;transition:border-color var(--dur-fast),background-color var(--dur-fast)}
.mc-hdr{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px}
.mc-num{font-family:'JetBrains Mono',monospace;font-size:10px;letter-spacing:2px;text-transform:uppercase;color:var(--amber)}
.badge{font-family:'JetBrains Mono',monospace;font-size:9px;letter-spacing:1px;text-transform:uppercase;padding:3px 8px;border-radius:4px;font-weight:600}
.badge-ready{color:var(--tal);background:rgba(var(--tal-rgb),0.12)}.badge-draft{color:var(--ad);background:rgba(var(--amber-rgb),0.1)}
.badge-live{color:var(--al);background:rgba(var(--al-rgb),0.15);animation:pulse 2s infinite}.badge-final{color:var(--tal);background:rgba(var(--tal-rgb),0.15)}
@keyframes pulse{0%,100%{opacity:1}50%{opacity:.6}}
@media (prefers-reduced-motion:reduce){.badge-live{animation:none}}
.mc-vs{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.mc-side{flex:1;min-width:100px}
.mc-tl{font-family:'JetBrains Mono',monospace;font-size:9px;letter-spacing:2px;text-transform:uppercase;margin-bottom:2px}
.mc-tl.ta{color:var(--tal)}.mc-tl.tb{color:var(--tbl)}
.mc-pn{font-size:13px;color:var(--cream);font-weight:500}
.mc-divider{font-family:'Cormorant Garamond',serif;font-style:italic;color:var(--tm);font-size:14px;flex-shrink:0}
.mc-go{font-family:'JetBrains Mono',monospace;font-size:10px;letter-spacing:2px;text-transform:uppercase;color:var(--amber);white-space:nowrap;flex-shrink:0}
.mc-assign select{font-family:'JetBrains Mono',monospace;font-size:11px;background:var(--pl);border:1px solid var(--border);border-radius:6px;color:var(--cream);padding:5px 8px;outline:none;width:100%;margin-bottom:4px}
.mc-assign select:focus{border-color:var(--ad)}.mc-assign select option{background:var(--pm)}
.mc-actions{display:flex;gap:8px;margin-top:10px}
.mc-btn{font-family:'JetBrains Mono',monospace;font-size:10px;letter-spacing:2px;text-transform:uppercase;padding:6px 14px;border-radius:6px;cursor:pointer;border:1px solid;transition:color var(--dur-fast),border-color var(--dur-fast),background-color var(--dur-fast)}
.mc-btn-fin{color:var(--amber);border-color:var(--ad);background:rgba(var(--amber-rgb),0.08)}
.mc-btn-edit{color:var(--tm);border-color:var(--border);background:none}
.mc-btn-go{color:var(--tal);border-color:var(--ta);background:rgba(var(--ta-rgb),0.08)}
/* Back button. M2: padding 8px->15px vertical brings this from 30px to the
   44px floor (14px measured 42px, short of the floor -- 15px clears it) --
   the recovery action after a mis-navigation. */
.sc-back{font-family:'JetBrains Mono',monospace;font-size:11px;letter-spacing:1px;color:var(--tm);background:none;border:none;cursor:pointer;padding:15px 0;display:flex;align-items:center;gap:6px;margin-bottom:12px}
/* Match header */
/* --bw: match header -- named surface, see .sb above. */
.msc-hdr{background:var(--pm);border:var(--bw) solid var(--bs);border-radius:12px;padding:16px;margin-bottom:12px;text-align:center}
.msc-fmt{font-family:'JetBrains Mono',monospace;font-size:10px;letter-spacing:2px;text-transform:uppercase;color:var(--ad);margin-bottom:6px}
.msc-teams{display:flex;align-items:center;justify-content:center;gap:14px;margin-bottom:4px}
.msc-tn{font-family:'Cormorant Garamond',serif;font-size:22px;font-weight:700}.msc-tn.ta{color:var(--tal)}.msc-tn.tb{color:var(--tbl)}
.msc-live{font-family:'JetBrains Mono',monospace;font-size:13px;font-weight:600;margin-top:4px}
/* Intel bar */
.intel-bar{margin-bottom:12px}
.intel-toggle{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px;cursor:pointer;user-select:none}
.intel-label{font-family:'JetBrains Mono',monospace;font-size:10px;letter-spacing:2px;text-transform:uppercase;color:var(--ad)}
.intel-arrow{font-size:12px;color:var(--tm);transition:transform var(--dur-base);padding:4px 8px}
.intel-arrow.collapsed{transform:rotate(-90deg)}
.intel-grid{display:grid;grid-template-columns:1fr 1fr 1fr;gap:8px}
.intel-grid.hidden{display:none}
@media(max-width:640px){.intel-grid{grid-template-columns:1fr}}
.intel-box{background:var(--pm);border:1px solid var(--border);border-radius:10px;padding:10px 12px}
.intel-box-title{font-family:'JetBrains Mono',monospace;font-size:9px;letter-spacing:2px;text-transform:uppercase;color:var(--ad);margin-bottom:6px}
.ib-more{font-family:'JetBrains Mono',monospace;font-size:9px;color:var(--amber);cursor:pointer;padding:4px 0;text-align:center;margin-top:4px}
.ib-expand{background:var(--pm);border:1px solid var(--border);border-radius:10px;padding:12px;margin-top:-4px;margin-bottom:12px;display:none}
.ib-expand.open{display:block}
/* Other matches (compact) */
.om-row{display:flex;align-items:center;gap:6px;padding:4px 0;border-bottom:1px solid var(--border);font-size:11px}
.om-row:last-child{border-bottom:none}
.om-ta{color:var(--tal);flex:1;text-align:right;font-weight:500;font-size:10px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.om-tb{color:var(--tbl);flex:1;text-align:left;font-weight:500;font-size:10px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.om-st{text-align:center;min-width:52px;flex-shrink:0}
.om-st-text{font-family:'JetBrains Mono',monospace;font-size:9px;font-weight:600;padding:2px 6px;border-radius:3px}
.om-st-text.s-a{color:var(--tal);background:rgba(var(--tal-rgb),0.1)}.om-st-text.s-b{color:var(--tbl);background:rgba(var(--tbl-rgb),0.1)}.om-st-text.s-t{color:var(--tm);background:rgba(var(--tm-rgb),0.1)}
.om-thru{font-family:'JetBrains Mono',monospace;font-size:8px;color:var(--tm);margin-top:1px}
/* Team projection */
.tp-scores{display:flex;align-items:center;justify-content:center;gap:10px;margin-bottom:4px}
.tp-team{text-align:center}.tp-name{font-family:'JetBrains Mono',monospace;font-size:8px;letter-spacing:1.5px;text-transform:uppercase}
.tp-name.ta{color:var(--tal)}.tp-name.tb{color:var(--tbl)}
.tp-num{font-family:'Cormorant Garamond',serif;font-size:24px;font-weight:700;line-height:1.1}.tp-num.ta{color:var(--tal)}.tp-num.tb{color:var(--tbl)}
.tp-of{font-family:'JetBrains Mono',monospace;font-size:9px;color:var(--tm)}
.tp-proj{font-family:'JetBrains Mono',monospace;font-size:9px;color:var(--ad);text-align:center;font-style:italic;margin-top:4px;line-height:1.3}
/* Notable */
.egg-item{display:flex;align-items:flex-start;gap:6px;padding:4px 0;border-bottom:1px solid var(--border)}
.egg-item:last-child{border-bottom:none}
.egg-vmarquee{height:84px;overflow:hidden;position:relative;-webkit-mask-image:linear-gradient(180deg,transparent,#000 12%,#000 88%,transparent);mask-image:linear-gradient(180deg,transparent,#000 12%,#000 88%,transparent)}
.egg-vtrack{display:flex;flex-direction:column;will-change:transform;animation:eggvscroll var(--egg-dur,16s) linear infinite}
@keyframes eggvscroll{from{transform:translateY(0)}to{transform:translateY(-50%)}}
.egg-latest .egg-main{color:var(--amber)}
@media (prefers-reduced-motion:reduce){.egg-vtrack{animation:none}.egg-vmarquee{height:auto;overflow:visible}}
.egg-icon{font-size:13px;flex-shrink:0;line-height:1.2}
.egg-main{font-size:10px;color:var(--cream);font-weight:500;line-height:1.3}
.egg-sub{font-size:9px;color:var(--tm);line-height:1.3}
.egg-bet{font-size:9px;color:var(--amber);font-style:italic;line-height:1.3}
/* Nine card scorecard */
.nine-card{background:var(--pm);border:1px solid var(--border);border-radius:12px;margin-bottom:12px;overflow:hidden}
.nine-lbl{font-family:'JetBrains Mono',monospace;font-size:10px;letter-spacing:3px;text-transform:uppercase;color:var(--amber);padding:8px 12px;background:rgba(var(--amber-rgb),0.04);border-bottom:1px solid var(--border)}
.nine-wrap{overflow-x:auto;-webkit-overflow-scrolling:touch}
.nine-tbl{width:100%;border-collapse:collapse;min-width:520px}
.nine-tbl th,.nine-tbl td{padding:4px 3px;text-align:center;font-size:11px;white-space:nowrap}
.nine-tbl th{font-family:'JetBrains Mono',monospace;font-size:9px;letter-spacing:1px;text-transform:uppercase;color:var(--tm);padding:5px 3px}
.r-hole td{color:var(--ad);font-weight:600;border-bottom:1px solid var(--border)}
.r-par td{color:var(--tm);font-size:10px;border-bottom:2px solid var(--bs)}
.r-player td{border-bottom:1px solid rgba(var(--amber-rgb),0.06);height:38px}
.r-best td{font-weight:700;font-size:11px;border-bottom:1px solid var(--border);background:rgba(var(--amber-rgb),0.02)}
.r-best.ba td{color:var(--tal)}.r-best.bb td{color:var(--tbl)}
.r-sep td{height:3px;padding:0;border:none}
.r-sep.sep-a td{background:var(--tal);opacity:.25}
.r-sep.sep-b td{background:var(--tbl);opacity:.25}
.r-sep.sep-status td{background:var(--bs)}
.r-status td{font-family:'JetBrains Mono',monospace;padding:6px 3px;font-weight:600;font-size:10px}
.mp-lbl{text-align:left!important;padding-left:8px!important;font-weight:600;font-size:11px;min-width:64px;max-width:80px;overflow:hidden;text-overflow:ellipsis}
.mp-lbl.ta{color:var(--tal)}.mp-lbl.tb{color:var(--tbl)}.mp-lbl.st{color:var(--amber)}
.mp-lbl-sub{display:block;font-size:8px;font-weight:400;color:var(--tm);line-height:1.2;margin-top:1px}
.mp-tot{font-weight:700!important;font-size:12px!important;border-left:2px solid var(--border)!important;min-width:34px;color:var(--cream)}
/* Golf symbols */
.gs{display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;font-family:'JetBrains Mono',monospace;font-size:12px;font-weight:600;line-height:1}
.gs-eagle{border-radius:50%;border:1.5px solid var(--cream);box-shadow:0 0 0 2px var(--pm),0 0 0 3.5px var(--cream);color:var(--cream)}
.gs-birdie{border-radius:50%;border:1.5px solid var(--cream);color:var(--cream)}
.gs-par{color:var(--cream)}
.gs-bogey{border:1.5px solid var(--cream);border-radius:2px;color:var(--cream)}
.gs-dbl{border:1.5px solid var(--cream);border-radius:2px;box-shadow:0 0 0 2px var(--pm),0 0 0 3.5px var(--cream);color:var(--cream)}
.gs-max{color:var(--cream);position:relative;z-index:1}
.gs-max::before{content:'';position:absolute;inset:-3px;background:var(--cream);clip-path:var(--star);z-index:-1}
.hc-dot{display:inline-block;width:5px;height:5px;background:var(--amber);border-radius:50%;vertical-align:super;margin-left:1px}
/* Score cell: symbol overlays invisible select */
.sc-cell{position:relative;cursor:pointer;min-width:30px}
.sc-cell select{position:absolute;inset:0;opacity:0;width:100%;height:100%;cursor:pointer;font-size:16px}
.sc-cell .gs{pointer-events:none}
.sc-empty{color:var(--tm);opacity:.3;font-size:14px}
/* Status dots */
.st-d{display:inline-block;width:7px;height:7px;border-radius:50%}
.st-d.da{background:var(--tal)}.st-d.db{background:var(--tbl)}.st-d.dh{background:var(--tm);opacity:.4}
/* Round selector */
.sc-sel{display:flex;gap:8px;margin-bottom:14px;flex-wrap:wrap}
/* H2: padding 8px->13px vertical brings the round chip (tap #2 in the
   critical scoring loop) from 34.5px to the 44px tap-target floor (12px
   measured 42.5px, short of the floor -- 13px clears it with a hair of
   margin). */
.sc-rd{font-family:'JetBrains Mono',monospace;font-size:11px;letter-spacing:1px;text-transform:uppercase;padding:13px 16px;border:1px solid var(--border);border-radius:8px;color:var(--tm);cursor:pointer;transition:color var(--dur-fast),border-color var(--dur-fast),background-color var(--dur-fast);user-select:none}.sc-rd.on{color:var(--amber);border-color:var(--ad);background:rgba(var(--amber-rgb),0.08)}
/* Mode toggle */
.sc-mode{display:flex;margin-bottom:14px;border:1px solid var(--border);border-radius:8px;overflow:hidden}
.sc-mode-btn{flex:1;font-family:'JetBrains Mono',monospace;font-size:10px;letter-spacing:1px;text-transform:uppercase;padding:8px 12px;background:none;border:none;color:var(--tm);cursor:pointer;text-align:center;transition:color var(--dur-fast),background-color var(--dur-fast)}
.sc-mode-btn:first-child{border-right:1px solid var(--border)}
.sc-mode-btn.on{color:var(--amber);background:rgba(var(--amber-rgb),0.08)}
/* Finalize btn */
.btn-finalize{font-family:'JetBrains Mono',monospace;font-size:12px;letter-spacing:2px;text-transform:uppercase;padding:12px 28px;border-radius:8px;cursor:pointer;border:1px solid var(--ta);color:var(--tal);background:rgba(var(--ta-rgb),0.08);display:block;margin:0 auto;transition:background-color var(--dur-fast)}
.btn-finalize:disabled{opacity:.35;cursor:not-allowed}

/* ══════════════════════════════════════════
   MOBILE VERTICAL SCORECARD
   ══════════════════════════════════════════ */
/* View toggle (hole-by-hole vs grid) */
.mv-toggle{display:flex;gap:0;margin-bottom:12px;border:1px solid var(--border);border-radius:8px;overflow:hidden}
.mv-btn{flex:1;font-family:'JetBrains Mono',monospace;font-size:10px;letter-spacing:1px;text-transform:uppercase;padding:8px 10px;background:none;border:none;color:var(--tm);cursor:pointer;text-align:center;transition:color var(--dur-fast),background-color var(--dur-fast)}
.mv-btn:not(:last-child){border-right:1px solid var(--border)}
.mv-btn.on{color:var(--amber);background:rgba(var(--amber-rgb),0.08)}
/* Intel pills (compact for mobile) */
.m-intel{display:flex;gap:6px;margin-bottom:10px}
.m-intel-pill{flex:1;background:var(--pm);border:1px solid var(--border);border-radius:6px;padding:6px 8px;text-align:center;cursor:pointer;transition:border-color var(--dur-fast)}
.m-intel-pill .il{font-family:'JetBrains Mono',monospace;color:var(--tm);font-size:8px;letter-spacing:1px;text-transform:uppercase;margin-bottom:2px}
.m-intel-pill .iv{color:var(--cream);font-weight:600;font-size:10px}
/* Nine label */
.mv-nine{font-family:'JetBrains Mono',monospace;font-size:9px;letter-spacing:3px;text-transform:uppercase;color:var(--amber);padding:10px 0 4px;border-bottom:1px solid var(--bs);margin-bottom:0}
/* Hole card */
/* --bw: hole cards carry the score pad -- named surface, see .sb above. */
.hole-card{background:var(--pm);border:var(--bw) solid var(--border);border-left:var(--bw) solid var(--border);border-right:var(--bw) solid var(--border);padding:10px 12px;border-bottom:none}
.hole-card:first-of-type{border-radius:10px 10px 0 0}
.hole-card:last-of-type{border-bottom:1px solid var(--border);border-radius:0 0 10px 10px}
.hole-card.hc-active{border-color:var(--ad);background:rgba(var(--amber-rgb),0.04);border-bottom:1px solid var(--ad)}
.hole-card.hc-active+.hole-card{border-top:none}
.hole-card.hc-future{opacity:.45}
.hole-card.hc-done{cursor:pointer;transition:background var(--dur-fast)}
.hole-card.hc-editing{border-color:var(--ad);background:rgba(var(--amber-rgb),0.03)}
/* Hole header */
.hc-top{display:flex;align-items:center;justify-content:space-between;margin-bottom:6px}
/* H5/L1: --ad (#8a6228) measured 3.03-3.14:1 on the hole-card backgrounds
   here -- under the 4.5:1 floor, on the readout a rushed golfer uses to
   confirm which hole they're scoring. --ad itself stays put (it's reused for
   several other "dim amber" accents/labels the audit didn't flag); --ad-bright
   is a dedicated, brighter gold scoped to just this pair of labels. Measures
   5.46:1 on --pm and 4.64:1 on --pl (both card backgrounds .hc-num/.hc-scoring-label
   can render on), verified computationally. */
/* Input-rework port (design/input-forge, "Promoted hole header" porting
   note): hole number large, PAR a prominent chip, S.I. clearly legible --
   the header line a rushed golfer reads to confirm which hole they're on.
   Markup is unchanged (renderVerticalNine's plain span trio); this is a
   CSS-only promotion, applied uniformly to every hole-card state (done/
   future/active/editing all share .hc-top), not just the on-deck card. */
.hc-top>div:first-child{display:flex;align-items:center}
.hc-num{font-family:'JetBrains Mono',monospace;font-size:22px;font-weight:700;color:var(--ad-bright);line-height:1}
.hc-par{display:inline-block;font-family:'JetBrains Mono',monospace;font-size:11px;font-weight:700;letter-spacing:.5px;color:var(--pine);background:var(--amber);border-radius:5px;padding:3px 8px;margin-left:8px}
.hc-si{display:inline-block;font-family:'JetBrains Mono',monospace;font-size:10px;font-weight:600;color:var(--ts);letter-spacing:.5px;margin-left:6px}
.hc-result{min-width:24px;text-align:right}
.hc-scoring-label{font-family:'JetBrains Mono',monospace;font-size:9px;color:var(--ad-bright);letter-spacing:1px}
/* Player grid inside hole card */
.hc-players{display:grid;grid-template-columns:1fr 1fr;gap:6px}
/* Input-rework port: while a hole shows its inputs (active or editing), the
   real estate a slide rail needs beats the 2-column side-by-side layout --
   design/input-forge's porting note ("renderVerticalNine's .hc-players
   two-column grid becomes stacked full-width player blocks while inputs
   show"). Sealed/future holes (no .hc-players-input) keep the original
   2-column grid untouched. */
.hc-players.hc-players-input{display:flex;flex-direction:column;gap:8px}
.hc-players.hc-players-input .hc-side{width:100%}
.hc-side{background:var(--pl);border-radius:6px;padding:6px 8px}
.hc-side.hc-sa{border-left:3px solid var(--tal)}
.hc-side.hc-sb{border-left:3px solid var(--tbl)}
.hc-player{display:flex;align-items:center;justify-content:space-between;padding:2px 0}
.hc-player:not(:last-child){border-bottom:1px solid var(--border);padding-bottom:4px;margin-bottom:4px}
.hc-pname{font-size:11px;font-weight:500;color:var(--cream)}
.hc-pname .hc-dot{display:inline-block;width:5px;height:5px;background:var(--amber);border-radius:50%;margin-left:3px;vertical-align:super}
.hc-pscore{display:flex;align-items:center;gap:3px}
/* Compact golf symbols for mobile */
.gs-sm{position:relative;display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;font-family:'JetBrains Mono',monospace;font-size:11px;font-weight:600;line-height:1}
.gs-sm.gs-eagle{border-radius:50%;border:1.5px solid var(--cream);box-shadow:0 0 0 2px var(--pl),0 0 0 3.5px var(--cream);color:var(--cream)}
.gs-sm.gs-birdie{border-radius:50%;border:1.5px solid var(--cream);color:var(--cream)}
.gs-sm.gs-par{color:var(--cream)}
.gs-sm.gs-bogey{border:1.5px solid var(--cream);border-radius:2px;color:var(--cream)}
.gs-sm.gs-dbl{border:1.5px solid var(--cream);border-radius:2px;box-shadow:0 0 0 2px var(--pl),0 0 0 3.5px var(--cream);color:var(--cream)}
.gs-sm.gs-max{color:var(--cream);position:relative;z-index:1}
/* Star fix (see base.css --star) — same filled-outline polygon, sm inset. */
.gs-sm.gs-max::before{content:'';position:absolute;inset:-2px;background:var(--cream);clip-path:var(--star);z-index:-1}
/* The Steward — stamp-settle + notation draw-in (Phase 3 Task 1 port of
   design/motion-forge/score-entry.html variant A, stampBig()). .gs-new is
   the Phase-2 acknowledgment floor; this extends it rather than replacing
   its trigger (renderVerticalNine still sets it via justScoredKey, byte-
   identical to before). Split into two independently-timed layers instead
   of one whole-element pop:
     1. the number (.gs-num) stamps in first, on --ease-spring (already
        overshoots past 1.0 before settling -- that overshoot IS the
        "stamp" hitting the page, no separate keyframe stop needed).
     2. the notation -- border for birdie/bogey, the double box-shadow ring
        for eagle/double, the clip-path star for worse -- draws in behind
        it. All four notated classes share border-color:var(--cream) and
        (where present) the same two box-shadow layers, so one pair of
        keyframes covers every case; .gs-par has no border to draw, so no
        rule targets it and it's untouched.
   Durations: the base.css "Motion tokens" comment rules three canonical
   durations (--dur-fast 120ms/--dur-base 200ms/--dur-slow 300ms), so the
   number-stamp (200ms) and reduced-motion fade (120ms) snap onto
   --dur-base/--dur-fast exactly. The 90ms delay and the 180ms ring/star
   duration don't land on any of the three -- kept as bespoke literals
   rather than forced onto a token that would change the feel (90ms is
   deliberately shorter than --dur-fast so the ring visibly trails the
   number rather than reading as simultaneous; 180ms is deliberately
   shorter than --dur-base so ring+delay finishes before the stamp settles
   would look sluggish at --dur-base's 200ms). Total worst case:
   var(--dur-base) 200ms + 90ms delay + 180ms = 270ms, under the 300ms
   ceiling.
   Known losses vs. the prototype (both accepted, not fixed, in this pass):
   stampBig() delays each ring child individually (i*70ms) so a double
   ring/square draws stroke-by-stroke; here eagle/dbl's two box-shadow
   layers animate as one unit, so the stagger between the inner and outer
   ring is gone. stampBig()'s ring keyframe also scales in from 1.5x
   (`transform:scale(1.5)→scale(1)`) as well as fading opacity; the
   border/box-shadow color transition here has no scale-settle motion of
   its own, only the color reveal. */
@keyframes gsNumStamp{from{transform:scale(.6) rotate(-4deg);opacity:0}to{transform:scale(1) rotate(0);opacity:1}}
@keyframes gsRingBorder{from{border-color:transparent}to{border-color:var(--cream)}}
@keyframes gsRingShadow{from{border-color:transparent;box-shadow:0 0 0 2px transparent,0 0 0 3.5px transparent}to{border-color:var(--cream);box-shadow:0 0 0 2px var(--pl),0 0 0 3.5px var(--cream)}}
@keyframes gsStarDraw{from{opacity:0;transform:scale(1.4)}to{opacity:1;transform:scale(1)}}
.gs-sm.gs-new .gs-num{display:inline-block;animation:gsNumStamp var(--dur-base) var(--ease-spring) both}
.gs-sm.gs-new.gs-birdie,.gs-sm.gs-new.gs-bogey{animation:gsRingBorder 180ms var(--ease-out) 90ms both}
.gs-sm.gs-new.gs-eagle,.gs-sm.gs-new.gs-dbl{animation:gsRingShadow 180ms var(--ease-out) 90ms both}
.gs-sm.gs-new.gs-max::before{animation:gsStarDraw 180ms var(--ease-out) 90ms both}
@media (prefers-reduced-motion:reduce){
  /* Upgrades the old blanket animation:none (carried finding) -- the stamp
     still gets a --dur-fast (120ms) opacity fade so entry still registers
     as an event; the notation classes simply never receive their draw-in
     animation, so their always-present static border/box-shadow/star
     renders immediately -- "pre-drawn" is the absence of the delayed
     keyframe, not new CSS. */
  @keyframes gsFade{from{opacity:.25}to{opacity:1}}
  .gs-sm.gs-new .gs-num{animation:gsFade var(--dur-fast) linear both}
  .gs-sm.gs-new.gs-birdie,.gs-sm.gs-new.gs-bogey,.gs-sm.gs-new.gs-eagle,.gs-sm.gs-new.gs-dbl,.gs-sm.gs-new.gs-max::before{animation:none}
}
/* The Steward's thumb pad — replaces the invisible select.sc-tap picker
   (was 32x28px pre-fix, then 46x46 select, then a fixed 2x5 number grid)
   with direct number taps. .hc-player-pad switches that player row from
   the default name-left/score-right flex row to a stacked column so the
   pad can use the full player-block width; .hc-pscore inherits that width
   via align-items:stretch rather than a hardcoded width. PAD_VALUES
   (js/ui-scorecard.js) is fixed 1-10, not par-derived (Fix round 1,
   Critical 1) -- every value must stay reachable regardless of par.
   ── INPUT REWORK (design/input-forge, variant B "Slide" -- Nick's cut,
   README.md §The Cut, 2026-08-14: "sliding is definitely the better and
   more intuitive mechanic") ── the fixed 2x5 grid above is replaced by a
   single horizontally-scrolling rail carrying all 10 keys, centered on par
   (or the posted value) when rendered/re-rendered so the par-relative keys
   sit in the middle of the visible window with the extremes peeking at
   the edges. Native overflow-x:auto + scroll-snap, not a custom pointer-
   drag handler -- touch-action:pan-x lets an ancestor still own vertical
   page scroll, so a horizontal pan here never hijacks it. .score-pad is
   kept as the outer wrapper class (tests assert one per side) around the
   new .slide-wrap. */
.hc-player.hc-player-pad{flex-direction:column;align-items:stretch;gap:6px}
.hc-player.hc-player-pad .hc-pscore{display:flex;flex-direction:column;align-items:stretch;width:100%}
.score-pad{display:block}
.slide-wrap{position:relative}
.slide-row{display:flex;gap:5px;overflow-x:auto;scroll-snap-type:x proximity;touch-action:pan-x;scrollbar-width:none;-ms-overflow-style:none;scroll-behavior:smooth;padding:2px 0 4px}
.slide-row::-webkit-scrollbar{display:none}
/* min-height 64px / flex-basis 60px -- both comfortably over the 44px
   floor. Carried forward for the pad's own keys, the control now actually
   tapped ~72 times/round. */
/* --bw: the score pad key itself -- named surface, see .sb above. */
.pad-key{--keybg:var(--pine);position:relative;flex:0 0 60px;scroll-snap-align:center;min-height:64px;background:var(--keybg);border:var(--bw) solid var(--ad);border-radius:8px;color:var(--cream);font-family:'JetBrains Mono',monospace;cursor:pointer;-webkit-appearance:none;appearance:none;outline:none;touch-action:manipulation;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;padding:6px 2px 5px;transition:transform .09s var(--ease-out),background-color .09s,border-color .09s}
.pad-key:active{transform:scale(.93);background:var(--pl)}
.pad-key.on{--keybg:var(--pl);border-color:var(--al);background:var(--pl);color:var(--al)}
.pk-lbl{font-size:8px;font-weight:600;letter-spacing:.5px;color:var(--tm);text-transform:uppercase;line-height:1}
.pad-key.on .pk-lbl{color:var(--al)}
/* Sunlight: the dark theme's "selected" signal (gold --al border on a lifted
   --pl fill) dies in the light remap — sunlight --al (#5c380a) sits within a
   hair of --ad (#6b4a14) and --pl (#eae3cd) of --pine (#f4efe1), so .on read
   as beige-on-beige (Nick, live review 2026-08-15). Invert instead: the
   picked key becomes the one ink block on the paper. --keybg -> ink keeps
   the eagle/double ring-gap arithmetic right for free; the scoped --cream
   re-declaration flips every descendant notation rule (.pk-glyph color, ring
   borders, the .gs-max star's ::before fill) to paper without touching them.
   --mo-ink/--mo-paper are the theme-invariant pair (base.css) — the same
   fixed-polarity trick the moment card documents. Dark theme untouched. */
[data-theme="sunlight"] .pad-key.on{--keybg:var(--mo-ink);--cream:var(--mo-paper);background:var(--mo-ink);border-color:var(--mo-ink);color:var(--mo-paper)}
[data-theme="sunlight"] .pad-key.on .pk-lbl{color:var(--mo-paper)}
/* Notation glyph -- the number wrapped in the real .gs-* vocabulary (same
   classify used everywhere else: gsClass, js/scoring.js), doubled for a
   thumb-scale key. Ring-gap color rides --keybg so a double ring reads on
   any key background (default vs .on). */
.pk-glyph{display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;font-size:16px;font-weight:700;line-height:1;color:var(--cream)}
.pk-glyph.gs-eagle{border-radius:50%;border:var(--gsw) solid var(--cream);box-shadow:0 0 0 var(--gsg) var(--keybg),0 0 0 calc(var(--gsg) + var(--gsw)) var(--cream)}
.pk-glyph.gs-birdie{border-radius:50%;border:var(--gsw) solid var(--cream)}
.pk-glyph.gs-bogey{border:var(--gsw) solid var(--cream);border-radius:3px}
.pk-glyph.gs-dbl{border:var(--gsw) solid var(--cream);border-radius:3px;box-shadow:0 0 0 var(--gsg) var(--keybg),0 0 0 calc(var(--gsg) + var(--gsw)) var(--cream)}
/* Nick's refinement, ruled with the cut but not yet landed in the forge
   page itself (2026-08-14): on the double-glyph keys (eagle, double) the
   outer ring's box-shadow spread extends calc(--gsg + --gsw) beyond the
   glyph's own border edge -- with the key's flat 4px gap, that ring was
   overlapping the top of the .pk-lbl word label below it. Reserve that
   same distance as extra clearance so the ring never touches the label,
   token-driven so it stays correct if --gsg/--gsw ever change. */
.pk-glyph.gs-eagle,.pk-glyph.gs-dbl{margin-bottom:calc(var(--gsg) + var(--gsw))}
.pk-glyph.gs-max{position:relative;z-index:1;margin-bottom:calc(var(--gsg) + var(--gsw))}
.pk-glyph.gs-max::before{content:'';position:absolute;inset:-6px;background:var(--cream);clip-path:var(--star);z-index:-1}
/* Edge-fade affordance: extremes peek at the rail's edges, chevrons fade
   in/out honestly -- .at-start/.at-end (toggled in JS off the rail's own
   scrollLeft) turn the matching fade off exactly at the rail's true ends,
   so "more exists off-canvas" is never a lie. */
.slide-fade{position:absolute;top:0;bottom:4px;width:28px;pointer-events:none;display:flex;align-items:center;font-family:'JetBrains Mono',monospace;font-size:14px;color:var(--ad-bright);opacity:1;transition:opacity var(--dur-base)}
.slide-fade.sf-l{left:-4px;background:linear-gradient(90deg,var(--pl) 25%,transparent);justify-content:flex-start;padding-left:1px}
.slide-fade.sf-r{right:-4px;background:linear-gradient(270deg,var(--pl) 25%,transparent);justify-content:flex-end;padding-right:1px}
.slide-wrap.at-start .sf-l,.slide-wrap.at-end .sf-r{opacity:0}
/* Fix round 1 (Important 4): was min-height:32px, under the 44px floor.
   Clear is rarer than the number keys but still a real tap target once a
   value exists to clear, not exempt from the floor. Sits below the rail
   as a plain block button, not a rail item -- .pad-key's flex-basis is
   inert outside a flex container, so no separate override is needed for
   that; min-height still needs its own since .pad-key's 64px would
   otherwise win (later, same specificity, always applies) -- kept
   explicit here to stay honestly self-documenting. */
.pad-clear{display:block;width:100%;margin-top:6px;min-height:44px;background:none;border:1px solid var(--border);border-radius:6px;color:var(--tm);font-family:'JetBrains Mono',monospace;font-size:10px;letter-spacing:1px;text-transform:uppercase;cursor:pointer}
.pad-clear:active{transform:scale(.97)}
@media(prefers-reduced-motion:reduce){
  .slide-row{scroll-behavior:auto}
  .pad-key:active,.pad-clear:active{transform:none}
}
/* Best ball row in hole card */
.hc-bb{display:flex;justify-content:space-between;margin-top:4px;padding-top:4px;border-top:1px solid var(--border);font-size:10px}
.hc-bb-label{color:var(--tm)}.hc-bb-val.ta{color:var(--tal);font-weight:700}.hc-bb-val.tb{color:var(--tbl);font-weight:700}
/* Nine summary */
.mv-nine-sum{background:var(--pm);border:1px solid var(--bs);border-radius:10px;padding:10px 12px;margin:10px 0;display:flex;justify-content:space-between;align-items:center}
.mv-ns-label{font-family:'JetBrains Mono',monospace;font-size:10px;letter-spacing:2px;text-transform:uppercase;color:var(--amber)}
.mv-ns-scores{display:flex;gap:10px;font-family:'JetBrains Mono',monospace;font-size:12px;font-weight:600}
.mv-ns-team.ta{color:var(--tal)}.mv-ns-team.tb{color:var(--tbl)}
.mv-ns-result{font-family:'JetBrains Mono',monospace;font-size:11px;font-weight:700}
@media (hover: hover) and (pointer: fine) {
  .mre-result:hover{background:rgba(var(--amber-rgb),0.06)}
  .mre-result:hover .mre-edit{opacity:.7}
  .lpb:hover{background:rgba(var(--amber-rgb),0.18);border-color:var(--amber)}
  .pl-chip:hover{color:var(--cream);border-color:var(--bs);background:rgba(var(--amber-rgb),0.04)}
  .ticker-link:hover{color:var(--al)}
  .lm-card:hover{border-color:var(--bs);transform:translateY(-1px)}
  .field-card:hover{border-color:var(--bs)}
  .bb-title .bb-clear:hover{color:var(--rs);border-color:var(--rs)}
  .line-preview .lp-add:hover{background:rgba(var(--amber-rgb),0.18)}
  .chip:hover{color:var(--cream);border-color:var(--bs);background:rgba(var(--amber-rgb),0.04)}
  .chip.vs-indicator:hover{background:transparent;color:var(--tm)}
  .slip-item .si-rm:hover{color:var(--rs)}
  .side-rm:hover{color:var(--rs)}
  .side-add button:hover{background:rgba(var(--amber-rgb),0.1)}
  .propose-btn:hover{background:rgba(var(--amber-rgb),0.18)}
  .pb-confirm-btn:hover{background:rgba(var(--ta-rgb),0.1)}
  .pb-decline-btn:hover{background:rgba(var(--rs-rgb),0.1)}
  .pin-ok:hover{background:rgba(var(--amber-rgb),0.18)}
  .pin-cancel:hover{color:var(--ts)}
  .clickable:hover{background:rgba(var(--amber-rgb),0.08)!important}
  .pc:hover{border-color:var(--bs);transform:translateY(-2px)}
  .ts-chip:hover{border-color:var(--bs);background:rgba(var(--amber-rgb),0.05)}
  .ts-chip .ts-x:hover{color:var(--rs)}
  .ts-assign .ts-a:hover{background:rgba(var(--ta-rgb),0.1)}
  .ts-assign .ts-b:hover{background:rgba(var(--tb-rgb),0.1)}
  .hist-rd-hdr:hover{background:rgba(var(--amber-rgb),0.08)}
  .hist-toggle:hover{color:var(--amber)}
  .atr-card:hover{border-color:var(--bs)}
  .ql-link:hover{background:rgba(var(--amber-rgb),0.12)}
  .ql-link.ql-t:hover{background:rgba(var(--ta-rgb),0.15)}
  .ql-link.ql-j:hover{background:rgba(var(--tb-rgb),0.15)}
  .mc-card:hover{border-color:var(--bs);background:rgba(var(--amber-rgb),0.03)}
  .mc-btn-fin:hover{background:rgba(var(--amber-rgb),0.18)}
  .mc-btn-edit:hover{color:var(--ts);border-color:var(--bs)}
  .mc-btn-go:hover{background:rgba(var(--ta-rgb),0.15)}
  .sc-back:hover{color:var(--amber)}
  .ib-more:hover{text-decoration:underline}
  .sc-rd:hover{color:var(--ts);border-color:var(--bs)}
  .btn-finalize:hover{background:rgba(var(--ta-rgb),0.15)}
  .m-intel-pill:hover{border-color:var(--bs)}
  .hole-card.hc-done:hover{background:rgba(var(--amber-rgb),0.03)}
}
.mre-result:active{transform:scale(0.97);transition:transform var(--dur-fast) var(--ease-out)}
.lpb:active{transform:scale(0.97);transition:transform var(--dur-fast) var(--ease-out)}
.pl-chip:active{transform:scale(0.97);transition:transform var(--dur-fast) var(--ease-out)}
.ticker-link:active{transform:scale(0.97);transition:transform var(--dur-fast) var(--ease-out)}
.lm-card:active{transform:scale(0.97);transition:transform var(--dur-fast) var(--ease-out)}
.bb-title .bb-clear:active{transform:scale(0.97);transition:transform var(--dur-fast) var(--ease-out)}
.line-preview .lp-add:active{transform:scale(0.97);transition:transform var(--dur-fast) var(--ease-out)}
.chip:active{transform:scale(0.97);transition:transform var(--dur-fast) var(--ease-out)}
.slip-item .si-rm:active{transform:scale(0.97);transition:transform var(--dur-fast) var(--ease-out)}
.side-rm:active{transform:scale(0.97);transition:transform var(--dur-fast) var(--ease-out)}
.side-add button:active{transform:scale(0.97);transition:transform var(--dur-fast) var(--ease-out)}
.propose-btn:active{transform:scale(0.97);transition:transform var(--dur-fast) var(--ease-out)}
.pb-confirm-btn:active{transform:scale(0.97);transition:transform var(--dur-fast) var(--ease-out)}
.pb-decline-btn:active{transform:scale(0.97);transition:transform var(--dur-fast) var(--ease-out)}
.pin-ok:active{transform:scale(0.97);transition:transform var(--dur-fast) var(--ease-out)}
.pin-cancel:active{transform:scale(0.97);transition:transform var(--dur-fast) var(--ease-out)}
.clickable:active{transform:scale(0.97);transition:transform var(--dur-fast) var(--ease-out)}
.ts-chip:active{transform:scale(0.97);transition:transform var(--dur-fast) var(--ease-out)}
.ts-chip .ts-x:active{transform:scale(0.97);transition:transform var(--dur-fast) var(--ease-out)}
.ts-assign .ts-a:active{transform:scale(0.97);transition:transform var(--dur-fast) var(--ease-out)}
.ts-assign .ts-b:active{transform:scale(0.97);transition:transform var(--dur-fast) var(--ease-out)}
.hist-rd-hdr:active{transform:scale(0.97);transition:transform var(--dur-fast) var(--ease-out)}
.hist-toggle:active{transform:scale(0.97);transition:transform var(--dur-fast) var(--ease-out)}
.ql-link:active{transform:scale(0.97);transition:transform var(--dur-fast) var(--ease-out)}
.mc-card:active{transform:scale(0.97);transition:transform var(--dur-fast) var(--ease-out)}
.mc-btn:active{transform:scale(0.97);transition:transform var(--dur-fast) var(--ease-out)}
.sc-back:active{transform:scale(0.97);transition:transform var(--dur-fast) var(--ease-out)}
.ib-more:active{transform:scale(0.97);transition:transform var(--dur-fast) var(--ease-out)}
.sc-rd:active{transform:scale(0.97);transition:transform var(--dur-fast) var(--ease-out)}
.sc-mode-btn:active{transform:scale(0.97);transition:transform var(--dur-fast) var(--ease-out)}
.btn-finalize:active{transform:scale(0.97);transition:transform var(--dur-fast) var(--ease-out)}
.mv-btn:active{transform:scale(0.97);transition:transform var(--dur-fast) var(--ease-out)}
.m-intel-pill:active{transform:scale(0.97);transition:transform var(--dur-fast) var(--ease-out)}
.hole-card.hc-done:active{transform:scale(0.97);transition:transform var(--dur-fast) var(--ease-out)}
.mre select:active{transform:scale(0.97);transition:transform var(--dur-fast) var(--ease-out)}
.mre-manual select:active{transform:scale(0.97);transition:transform var(--dur-fast) var(--ease-out)}

/* ── THE LEDGER ENTRY (Phase 3 Task 3) — big moments overlay, ported from
   design/motion-forge/big-moments.html variant C ONLY (Nick's cut,
   README.md §The Cut, 2026-08-13 — A/B discarded). The palette inverts: a
   paper card rises, the moment types itself into the record line by line, a
   wax seal stamps it "recorded". Built/driven entirely by js/moments.js —
   .mo-ovl starts (and normally sits) display:none, so it is never present
   in the hit-testing tree and can never eat a score tap (Global Constraint:
   delight rides on the interaction, never in front of it). z-index 200 —
   above .pin-overlay's 100, the topmost surface in the app; a Ledger Entry
   always wins any other modal on screen.
   Fix round 1 (Controller ruling 1): the root and the scrim are both
   `pointer-events:none` — a tap over the scrim is never captured by the
   overlay at all, it falls straight through to the real element underneath
   (e.g. a score-pad key). js/moments.js's document-level pointerdown
   listener dismisses the card off that SAME event, without
   preventDefault()/stopPropagation(), so the tap that dismisses is the tap
   that lands. `.mo-card` re-enables pointer-events so its own sound toggle
   still receives taps, and tapping the card's own (opaque) paper correctly
   dismisses without anything passing through it. */
.mo-ovl{position:fixed;inset:0;z-index:200;display:none;align-items:center;justify-content:center;padding:0 24px;pointer-events:none}
.mo-ovl.on{display:flex}
.mo-scrim{position:absolute;inset:0;background:rgba(8,15,11,.72);pointer-events:none}
/* Task B: background/color pinned to --mo-paper/--mo-ink (base.css), not
   --cream/--pine -- those two swap semantic roles under [data-theme=
   "sunlight"], which would flip this fixed paper card to ink-on-ink. See
   base.css's --mo-paper/--mo-ink comment for the full decision. */
.mo-card{position:relative;background:var(--mo-paper);color:var(--mo-ink);border-radius:6px;width:min(330px,86vw);padding:26px 24px 30px;text-align:left;box-shadow:0 24px 60px rgba(0,0,0,.55);background-image:repeating-linear-gradient(0deg,transparent 0 27px,rgba(12,26,18,.05) 27px 28px);pointer-events:auto}
.mo-card::before{content:'';position:absolute;left:14px;top:0;bottom:0;width:1px;background:rgba(224,96,80,.25)}
.mo-sound{position:absolute;top:10px;right:10px;font-family:'JetBrains Mono',monospace;font-size:9px;letter-spacing:1px;text-transform:uppercase;background:none;border:1px solid rgba(12,26,18,.3);border-radius:14px;color:#3d3320;padding:5px 9px;cursor:pointer}
.mo-sound[aria-pressed="true"]{color:#8a5a1e;border-color:#8a5a1e}
.mo-sound:focus-visible{outline:2px solid var(--ad);outline-offset:2px}
.mo-sound:active{transform:scale(0.97)}
.mo-head{font-family:'JetBrains Mono',monospace;font-size:9px;letter-spacing:3px;text-transform:uppercase;color:var(--ad);margin-bottom:10px;padding-right:70px}
/* Minor 10: text-overflow:ellipsis alongside the existing nowrap/hidden —
   a long player-name pairing on a narrow phone now truncates with an
   ellipsis instead of a hard, no-warning clip. */
.mo-line{font-family:'JetBrains Mono',monospace;font-size:12px;letter-spacing:.5px;color:#22352a;min-height:20px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.mo-line.mo-title{font-family:'Cormorant Garamond',serif;font-size:24px;font-weight:700;letter-spacing:0;color:var(--mo-ink);white-space:normal;line-height:1.2;margin:6px 0}
.mo-cursor{display:inline-block;width:7px;height:13px;background:var(--mo-ink);vertical-align:-2px;animation:moBlink .7s steps(1) infinite}
@keyframes moBlink{50%{opacity:0}}
.mo-seal{position:absolute;right:18px;bottom:14px;width:64px;height:64px;border-radius:50%;background:radial-gradient(circle at 35% 30%,#d99a4d,var(--amber) 55%,#8a5a24);display:flex;align-items:center;justify-content:center;font-family:'Cormorant Garamond',serif;font-style:italic;font-weight:700;font-size:30px;color:var(--mo-ink);box-shadow:0 4px 14px rgba(0,0,0,.35),inset 0 0 0 3px rgba(12,26,18,.25);opacity:0}
.mo-recorded{font-family:'JetBrains Mono',monospace;font-size:9px;letter-spacing:3px;text-transform:uppercase;color:var(--ad);margin-top:14px;opacity:0}
/* Minor 6: the visible typed lines carry aria-hidden (js/moments.js) — this
   is the actual announcement target, a standard visually-hidden-but-
   screen-reader-audible clip, updated once per COMPLETED line rather than
   per keystroke. */
.mo-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}
/* Reduced motion: js/moments.js's own branch skips the typing/seal-stamp
   keyframes above entirely (fully-typed text set via textContent, seal
   opacity set directly) — this media query only has to stop the cursor
   blink, since no reduced-motion path ever leaves a .mo-cursor node
   in the DOM long enough for it to matter, but the guard costs nothing. */
@media(prefers-reduced-motion:reduce){
  .mo-cursor{animation:none}
}
.press:active{transform:scale(0.97);transition:transform var(--dur-fast) var(--ease-out)}

/* ── LIST STAGGER (Phase 3 Task 4) — 30ms/item, ported from design/motion-
   forge/personality.html variant A's grammar. Pure CSS: elements freshly
   created by an .innerHTML= render (every list on this page) always start
   their animation on insertion, so no JS trigger is needed -- apply .stagger
   to a list's own container in the STATIC markup once (index.html) and every
   future re-render replays it automatically, because the old children are
   destroyed and new ones are created, not reused. Capped at 10 items/300ms
   (nth-child(n+11) shares the last delay) so a long list doesn't take
   seconds to finish arriving. Deliberately NOT applied to containers that
   re-render on every realtime score event (#roundBlocks, #liveMatchCards) --
   replaying a fade-in on every tap would fight Momentum's own diff-then-
   animate design (Phase 3 Task 2) and the "intensity inverse to frequency"
   principle those tabs are tuned to (design/motion-forge/README.md §The Cut).
*/
.stagger>*{animation:staggerIn var(--dur-slow) var(--ease-out) both}
.stagger>*:nth-child(1){animation-delay:0ms}
.stagger>*:nth-child(2){animation-delay:30ms}
.stagger>*:nth-child(3){animation-delay:60ms}
.stagger>*:nth-child(4){animation-delay:90ms}
.stagger>*:nth-child(5){animation-delay:120ms}
.stagger>*:nth-child(6){animation-delay:150ms}
.stagger>*:nth-child(7){animation-delay:180ms}
.stagger>*:nth-child(8){animation-delay:210ms}
.stagger>*:nth-child(9){animation-delay:240ms}
.stagger>*:nth-child(10){animation-delay:270ms}
.stagger>*:nth-child(n+11){animation-delay:270ms}
@keyframes staggerIn{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}
@media(prefers-reduced-motion:reduce){
  .stagger>*{animation:none}
}

/* ── EMPTY STATES (Phase 3 Task 4) — one shared grammar, ported from design/
   motion-forge/personality.html variant A's dry serif line (Nick's cut,
   README.md §The Cut, 2026-08-13). Built by js/ui-tournament.js's
   emptyState(icon, line, sub) and adopted at the render sites listed in the
   Task 4 report -- replaces bare "No X yet" placeholder strings. */
.empty-state{text-align:center;padding:36px 12px}
.empty-state .es-icon{font-size:20px;margin-bottom:10px;line-height:1}
.empty-state .es-rule{width:52px;height:1px;background:var(--ad);margin:0 auto 16px}
.empty-state .es-line{font-family:'Cormorant Garamond',serif;font-style:italic;font-size:17px;color:var(--sand);line-height:1.5}
.empty-state .es-sub{font-family:'JetBrains Mono',monospace;font-size:9px;letter-spacing:3px;text-transform:uppercase;color:var(--tm);margin-top:14px}

/* ══════════ THE SCORING SHELL (2026-08-15 spec §4 Task 2) ══════════
   body.scoring-mode: a match scorecard is open. The ceremonial header and
   the six tabs give way to a compact sticky app bar; the scorecards pane's
   own navigation chrome (heading, round selector, mode toggle, the in-pane
   back button) hides too — the bar's own <- is the one exit. Safe-area
   padding mirrors .tabs (base.css). */
.shell-bar{display:none}
.scoring-mode header{display:none}
.scoring-mode .tabs{display:none}
.scoring-mode #tab-scorecards .sh,.scoring-mode #scRoundSel,.scoring-mode .sc-back{display:none}
/* #scModeToggle needs !important: selectScRound (ui-scorecard.js) sets an
   INLINE style.display='flex' on this node on every path into the shell,
   including relaunch-restore (shellMaybeRestore calls selectScRound right
   before shellEnter) — an unqualified rule here loses the cascade to that
   inline style and leaves a second, live exit sitting in the bar (fix round
   1, Important finding 1, 2026-08-15). */
.scoring-mode #scModeToggle{display:none!important}
.scoring-mode .shell-bar{display:block;position:sticky;top:0;z-index:10;background:var(--pine);padding:calc(8px + env(safe-area-inset-top)) 0 8px;border-bottom:var(--bw) solid var(--border)}
.shell-row{display:flex;align-items:center;gap:8px}
.shell-back{min-width:44px;min-height:44px;background:none;border:var(--bw) solid var(--border);border-radius:8px;color:var(--text);font-size:18px;cursor:pointer;transition:transform var(--dur-fast) var(--ease-out)}
.shell-back:active{transform:scale(.93)}
.shell-ctx{flex:1;font-family:'JetBrains Mono',monospace;font-size:11px;letter-spacing:1px;text-transform:uppercase;color:var(--ts);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.shell-tools{display:flex;align-items:center;gap:6px}
.scoring-mode .shell-tools .sync-status{margin-top:0}
/* Reduced motion: same convention as .pad-key/.pad-clear above -- the tap
   still registers (border/background are untouched) but the scale-down
   itself is dropped rather than just shortened, honestly non-animated. */
@media(prefers-reduced-motion:reduce){
  .shell-back:active{transform:none}
}

/* Pad focus (Task 3). Soft blur + dim on the unfocused rails — filter, not
   backdrop-filter (spec §6: cheap at this scale on iOS WebKit; if a real
   device stutters, the documented fallback is the reduced-motion branch
   becoming universal). Dimmed rails stay interactive on purpose: the tap
   is intercepted at capture phase and converts to focus, never a post. */
.hc-player-pad.pf-dim{opacity:.45;filter:blur(1.5px);transition:opacity var(--dur-base) var(--ease-out),filter var(--dur-base) var(--ease-out)}
@media(prefers-reduced-motion:reduce){.hc-player-pad.pf-dim{filter:none;transition:none}}

/* Fix round 1 (Important 1a): a commit advances focus to the NEXT unscored
   player in the SAME render pass that stamps the just-scored player's own
   flame -- that player's rail is freshly-inserted DOM already carrying
   .pf-dim (focus moved on), so without this the flame was born at 45%
   opacity behind a 1.5px blur on a 16x16px glyph, with no transition to
   rescue it from (filter on the ancestor rasterizes the whole subtree, so
   nothing inside .hc-player can escape it). .pf-fresh is stamped only on
   the just-scored player's own rail (keyed off justScoredKey, at the same
   four render sites in ui-scorecard.js that apply .pf-dim) and defers the
   dim-in until AFTER the flame's own animation (.pk-flame, below) has had
   a chance to play, instead of landing in the same render pass. `both` fill
   mode makes the FROM keyframe (undimmed) the effective style for the whole
   1.2s delay -- CSS animations win over a plain property declaration for
   the properties they target, so this need not out-specificity
   .hc-player-pad.pf-dim's own opacity/filter. After the animation completes
   its TO keyframe matches .pf-dim's static resting values exactly, so the
   rail ends up in the same dimmed state either way, just later. */
.pf-dim.pf-fresh{animation:pfDimIn .3s var(--ease-out) 1.2s both}
@keyframes pfDimIn{from{opacity:1;filter:none}to{opacity:.45;filter:blur(1.5px)}}
/* Honest non-animated variant: skip the deferred dim-in and let the rail
   read as plain .pf-dim (dimmed immediately, no blur, no transition) --
   same convention as the reduced-motion rule directly above. */
@media(prefers-reduced-motion:reduce){.pf-dim.pf-fresh{animation:none}}

/* Birdie flame (Task 4) — rides the .gs-new stamp slot's timing family:
   pop on the spring curve, hold, fade. Ends at opacity:0 (fill both), so
   the span needs no JS teardown — the next render rebuilds the rail
   without it anyway (justScoredKey is nulled per pass). Durations (1.1s /
   1s reduced-motion) are deliberately bespoke, not --dur-* tokens: the
   token family tops out at --dur-slow (300ms), sized for entry
   acknowledgment (see the gs-new comment above, ~270ms worst case) — a
   flame meant to be noticed and held would flash past unseen at that
   length, so it keeps its own literal instead of being forced onto a token
   that would change the feel. */
.pk-flame{position:absolute;top:2px;right:2px;width:16px;height:16px;pointer-events:none;z-index:2;animation:pkFlame 1.1s var(--ease-spring) both}
@keyframes pkFlame{0%{opacity:0;transform:scale(.3) rotate(-8deg)}22%{opacity:1;transform:scale(1.18) rotate(3deg)}45%{transform:scale(1)}80%{opacity:1}100%{opacity:0;transform:scale(.85)}}
@media(prefers-reduced-motion:reduce){.pk-flame{animation:pkFlameFade 1s linear both}}
@keyframes pkFlameFade{0%{opacity:0}15%{opacity:1}85%{opacity:1}100%{opacity:0}}

/* Shell toast (Task 5) — remote birdie, slim, self-dismissing, untouchable
   (pointer-events:none: it must never cost a tap). Sits just under the
   shell bar. One at a time; the latest replaces. The `top` here is only the
   fallback for when #shellBar is somehow absent — shellShowToast (shell.js)
   positions it from the live bar geometry at show time instead of a
   hardcoded offset, so a later shell-bar row (Task 6's segment control)
   never sits under it. */
#shellToast{position:fixed;top:calc(64px + env(safe-area-inset-top));left:50%;transform:translateX(-50%) translateY(-8px);opacity:0;pointer-events:none;z-index:60;background:var(--pm);border:var(--bw) solid var(--bs);color:var(--text);font-family:'JetBrains Mono',monospace;font-size:11px;letter-spacing:1px;padding:8px 14px;border-radius:20px;white-space:nowrap;transition:opacity var(--dur-base) var(--ease-out),transform var(--dur-base) var(--ease-out)}
#shellToast.on{opacity:1;transform:translateX(-50%) translateY(0)}
@media(prefers-reduced-motion:reduce){#shellToast{transition:opacity var(--dur-fast) linear;transform:translateX(-50%)}#shellToast.on{transform:translateX(-50%)}}

/* The Round (Task 6) — the shell's broadcast pane. It hosts the REAL
   #tugSection/#liveMatchesSection nodes (reparented, not cloned — every
   render targets them by id and keeps painting wherever they sit). */
.shell-seg{display:flex;gap:0;margin-top:8px;border:var(--bw) solid var(--border);border-radius:8px;overflow:hidden}
.shell-seg-btn{flex:1;min-height:44px;background:none;border:none;color:var(--tm);font-family:'JetBrains Mono',monospace;font-size:10px;letter-spacing:1px;text-transform:uppercase;cursor:pointer;transition:color var(--dur-base),background-color var(--dur-base)}
.shell-seg-btn.on{color:var(--amber);background:rgba(var(--amber-rgb),0.08)}
#shellRoundPane{padding:16px 0}
