
*{box-sizing:border-box;margin:0;padding:0}
/* SURFACE LADDER, MEASURED OFF THE COMPETITION RATHER THAN GUESSED.
   Sampled from a 9m32s capture of William Hill, BetMGM and Pikkit: every one of them keeps the card within
   a few points of the page and lets a single hairline do the separating --
       Pikkit   page #141519  card #17181C  border #323337
       BetMGM   page #060606  card #1A1A1A  border #343434
       W.Hill   page #000D16  card #01111E  border #152534
   MIDAS was jumping #070912 -> #141726 -> #1b1f30 on a strongly blue-violet ramp, so every panel read as a
   separate lit box and the page looked like stacked cards rather than one surface. The ground lifts slightly
   so the cards can sit close to it without going black-on-black, the steps tighten, and the hairline loses
   most of its purple. Gold is untouched -- it is the brand. */
:root{--bg:#0B0D12;--surf:#14161D;--surf2:#1A1D25;--line:#2A2E39;--line2:#1E222B;--txt:#eceef7;--mut:#8C92A3;--gold:#ffd166;--gold2:#f5a623;--good:#34d399;--bad:#fb7185;
 /* 4pt spacing scale and the tap/row floors the same capture measured: 44px minimum touch target, ~56px
    list row, 12px between cards, 16px gutters. These are the numbers that force the density down. */
 --s-1:4px;--s-2:8px;--s-3:12px;--s-4:16px;--s-5:24px;--s-6:32px;
 --gutter:16px;--card-gap:12px;--card-pad:16px;--tap:44px;--row-h:56px;
 --r-sm:6px;--r-md:10px;--r-lg:12px;--r-pill:999px;
 --ease-spring:cubic-bezier(.34,1.56,.64,1);--ease-out:cubic-bezier(.22,.8,.28,1);--ease-io:cubic-bezier(.4,0,.2,1);--d1:.11s;--d2:.18s;--d3:.28s;--d4:.42s;--hdr-h:56px}
/* ---- 5-GROUP NAV + contextual sub-nav ---- */
.navg{cursor:pointer;padding:7px 13px;border-radius:10px;font-size:var(--fs-2);font-weight:600;color:var(--mut);white-space:nowrap;display:inline-flex;align-items:center;gap:6px;transition:color .14s,background .14s}
.navg .ti{width:17px;height:17px;opacity:.8}
.navg:hover{color:var(--txt)}
.navg.on{color:var(--gold);background:rgba(var(--gold-rgb),.1)}
.navg.on .ti{opacity:1}
.subnav{display:none;justify-content:center;position:sticky;top:var(--hdr-h,52px);z-index:30;padding:8px 0;background:rgba(9,11,19,.92);backdrop-filter:blur(10px);border-bottom:1px solid var(--line)}
.subnav-in{display:flex;gap:6px;min-width:0;max-width:100%;padding:0 14px;overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none}
.subnav:not(:empty){display:flex}
.store-free{margin:10px 0 4px;padding:11px 13px;border-radius:10px;font-size:12px;line-height:1.55;background:rgba(16,185,129,.07);border:1px solid rgba(16,185,129,.22);color:var(--txt)}
.store-free b{color:var(--win)}
.store-cos{font-size:11.5px;font-weight:700;letter-spacing:.08em;color:var(--mut);border:1px solid var(--line);border-radius:4px;padding:1px 5px;margin-left:6px;vertical-align:middle}
.viptag{display:inline-block;margin-left:6px;padding:1px 5px;border-radius:4px;font-size:11px;font-style:normal;font-weight:800;letter-spacing:.08em;vertical-align:middle;background:rgba(255,209,102,.16);color:var(--gold);border:1px solid rgba(255,209,102,.34)}
.subnav-in::-webkit-scrollbar{display:none}
.subnav::-webkit-scrollbar{display:none}
.subtab{flex:0 0 auto;cursor:pointer;padding:7px 13px;border-radius:999px;font-size:var(--fs-2);font-weight:600;color:var(--mut);background:var(--surf2);border:1px solid var(--line2);white-space:nowrap;transition:color .12s,background .12s,border-color .12s;min-height:36px;display:inline-flex;align-items:center}
.subtab:hover{color:var(--txt);border-color:var(--line)}
.subtab.on{color:var(--bg);background:var(--gold);border-color:var(--gold)}
.subadd{color:var(--bg);background:linear-gradient(120deg,var(--gold),var(--gold2));border-color:var(--gold);font-weight:800}
@media(max-width:768px){.subtab{min-height:40px;padding:9px 14px}}
/* ---- MOTION LAYER: give the whole app one modern, springy tempo (App Design v2). Reduced-motion safe. ---- */
.tab,.chip,.segbtn,.bt,.mi,.btn,.pm-opt,.tailbtn,.who-me,.slipbtn,.addbig,.setseg .segbtn{will-change:transform}
button,.tab,.chip,.segbtn,.mi,.pm-opt,.dayhdr,summary{-webkit-tap-highlight-color:transparent}
.card,.layer,.bcard,.pm-card,.setcard{transition:transform var(--d2) var(--ease-out),border-color var(--d2) var(--ease-io),box-shadow var(--d2) var(--ease-out)}
@media(hover:hover){.pm-card:hover,.bcard:hover{transform:translateY(-2px);border-color:#33406a}}
.btn,.chip,.segbtn,.mi,.slipbtn,.tab{transition:transform var(--d1) var(--ease-spring),color var(--d2) var(--ease-io),background var(--d2) var(--ease-io),box-shadow var(--d2) var(--ease-out),filter var(--d2) var(--ease-io)}
.btn:active,.chip:active,.segbtn:active,.mi:active,.slipbtn:active,.pm-opt:active,.addbig:active{transform:scale(.955)}
@media(hover:hover){.btn:hover,.slipbtn:hover{transform:translateY(-1px)}}
:focus-visible{outline:2px solid var(--gold);outline-offset:2px;border-radius:8px}
@media(prefers-reduced-motion:reduce){.card,.layer,.bcard,.pm-card,.setcard,.btn,.chip,.segbtn,.mi,.slipbtn,.tab{transition:none!important}.pm-card:hover,.bcard:hover,.btn:hover,.slipbtn:hover,.btn:active,.chip:active,.segbtn:active,.mi:active,.slipbtn:active,.pm-opt:active,.addbig:active{transform:none!important}}
html,html{overflow-x:clip;touch-action:manipulation}body{overflow-x:clip;max-width:100%;overscroll-behavior-y:none}
img,svg,video,canvas,table{max-width:100%}   /* clip (not hidden) so the fixed bottom nav doesn't scroll with the page on mobile */
body{background:radial-gradient(1000px 520px at 8% -10%,rgba(var(--gold-rgb),.055),transparent 60%),radial-gradient(1100px 640px at 102% -4%,rgba(var(--good-rgb),.045),transparent 55%),var(--bg);background-attachment:fixed;color:var(--txt);font:14px/1.55 -apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}
::selection{background:rgba(var(--gold-rgb),.28);color:#fff}
::-webkit-scrollbar{width:11px;height:11px}::-webkit-scrollbar-thumb{background:var(--line);border-radius:8px;border:2px solid var(--bg)}::-webkit-scrollbar-thumb:hover{background:var(--line3)}
.pos{color:var(--good)}.neg{color:var(--bad)}.mut{color:var(--mut)}
.wrap{max-width:1080px;margin:0 auto;padding:0 16px 70px}
header{position:sticky;top:0;z-index:30;background:rgba(8,10,18,.80);backdrop-filter:blur(16px) saturate(1.3);-webkit-backdrop-filter:blur(16px) saturate(1.3);border-bottom:1px solid rgba(var(--gold-rgb),.11);box-shadow:0 10px 34px -22px rgba(0,0,0,.95)}
.bar{max-width:1080px;margin:0 auto;padding:12px 16px;display:flex;align-items:center;gap:14px;flex-wrap:wrap;position:relative}
.brand{font-weight:800;letter-spacing:3px;font-size:20px;background:linear-gradient(120deg,var(--gold-hi),var(--gold) 45%,var(--gold2));-webkit-background-clip:text;background-clip:text;color:transparent}
.brand small{display:block;font-size:11.5px;letter-spacing:1px;color:var(--mut);font-weight:400;-webkit-text-fill-color:var(--mut)}
.nav{display:flex;gap:4px;flex-wrap:wrap;overflow-x:auto;flex-basis:100%;order:5;justify-content:center;margin-top:6px}
.tab{cursor:pointer;padding:7px 14px;border-radius:10px;font-size:13px;font-weight:600;color:var(--mut);white-space:nowrap;transition:color .14s,background .14s,box-shadow .14s}
.tab.on{background:rgba(var(--gold-rgb),.10);color:var(--gold);box-shadow:inset 0 -2px 0 var(--gold)}.tab:hover{color:var(--txt);background:rgba(255,255,255,.045)}
.tab{display:inline-flex;align-items:center;gap:6px}
.ti{width:16px;height:16px;flex:none;opacity:.7}
.tab.on .ti,.tab:hover .ti{opacity:1}
section{padding-top:18px}h2{font-size:15px;margin:20px 0 8px;color:#bcc3f0;font-weight:600}
.grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:11px}
.card{background:linear-gradient(165deg,var(--surf),var(--surf));border:1px solid var(--line);border-radius:15px;padding:14px 16px;box-shadow:inset 0 1px 0 rgba(255,255,255,.03);transition:transform .15s,border-color .15s,box-shadow .15s}
.card:hover{transform:translateY(-2px);border-color:var(--line3);box-shadow:0 16px 36px -26px rgba(0,0,0,.9)}
.card .k{font-size:11.5px;letter-spacing:1px;text-transform:uppercase;color:var(--mut)}
.card .v{font-size:24px;font-weight:750;margin-top:3px;font-variant-numeric:tabular-nums}.card .sub{font-size:11px;color:var(--mut);margin-top:2px}
.grid-primary{margin-bottom:10px}
.grid-primary .card{border-color:#2f3556;background:linear-gradient(165deg,#171d30,#0f131f)}
.grid-primary .v{font-size:27px;font-weight:800}
.grid-sub .card{padding:11px 13px}
.grid-sub .k{font-size:11.5px}
.grid-sub .v{font-size:18px;font-weight:700}
.card.hero{background:linear-gradient(135deg,#1a1e33,var(--surf));border-color:#34d39944}
.panel{background:var(--surf);border:1px solid var(--line);border-radius:14px;padding:16px;margin-top:14px}
.panel h3{font-size:13px;color:var(--mut);text-transform:uppercase;letter-spacing:1px;margin-bottom:8px;font-weight:600}
.tbl-scroll{overflow-x:auto;-webkit-overflow-scrolling:touch;margin:0 -4px}
.tbl-scroll table{min-width:440px}
table{width:100%;border-collapse:collapse;font-size:13px}
th,td{text-align:left;padding:8px 10px;border-bottom:1px solid #1e2236}
th{color:var(--mut);font-size:11px;text-transform:uppercase;letter-spacing:.5px}
tr:hover td{background:#161a2c}
.chip{cursor:pointer;font-size:12px;padding:5px 12px;border-radius:16px;background:var(--surf);border:1px solid var(--line);color:#b8bdd8;user-select:none}
.chip.on{background:var(--gold);color:var(--gold-bg);border-color:var(--gold);font-weight:700}
#q{background:var(--surf);border:1px solid var(--line);border-radius:9px;color:var(--txt);padding:8px 12px;font-size:13px;min-width:180px;flex:1}
.filters{display:flex;gap:7px;flex-wrap:wrap;align-items:center;margin:10px 0 4px}
.gsep{flex-basis:100%;height:0}
.datehdr{color:var(--gold);font-size:13px;letter-spacing:1px;margin:18px 0 6px}
.game{margin:9px 0;border:1px solid var(--line);border-radius:12px;overflow:hidden;background:var(--bg2)}
.gamehdr{cursor:pointer;list-style:none;display:flex;align-items:center;gap:10px;padding:11px 14px;background:var(--surf2)}
.gamehdr::-webkit-details-marker{display:none}.game[open] .gamehdr{border-bottom:1px solid var(--line)}
.gmu{font-weight:700;font-size:14px}.gmeta{margin-left:auto;font-size:12px;color:var(--txt2)}
.pick{border-top:1px solid var(--surf2);border-left:3px solid #3a3e6a;padding:9px 14px;background:var(--bg2)}
.pick.tracked{border-left-color:var(--gold)}
/* UNPROVEN / SHADOW. Deliberately readable, not buried: dimmed and de-goldened so it cannot be mistaken
   for a play we stand behind, but every price, reason and result stays legible. */
.pick.unproven{border-left-color:#5a5f7a;background:#0f111a;opacity:.82}
.pick.unproven:hover{opacity:1}
.badge.unprovenb{background:#5a5f7a22;color:#9aa0bb;border:1px solid #5a5f7a55;letter-spacing:.02em}
/* STAKE + EDGE. The stake is the loudest thing after the price, because it is the part a tailer most
   often gets wrong. hi/lo shift the weight so 2.5u and 0.5u are distinguishable at a glance. */
.badge.stakeb{background:rgba(var(--gold-rgb),.13);color:var(--gold);border:1px solid rgba(var(--gold-rgb),.34);font-weight:700}
.badge.stakeb.hi{background:rgba(var(--gold-rgb),.22);border-color:rgba(var(--gold-rgb),.55)}
.badge.stakeb.lo{background:rgba(var(--gold-rgb),.07);color:var(--goldsoft);border-color:rgba(var(--gold-rgb),.20);font-weight:600}
.badge.nvb{background:rgba(94,234,212,.10);color:#5eead4;border:1px solid rgba(94,234,212,.28)}
.badge.nvb.neg{background:rgba(var(--bad-rgb),.10);color:var(--bad);border-color:rgba(var(--bad-rgb),.30)}
.badge.nvb.flat{background:rgba(var(--push-rgb),.10);color:var(--mut);border-color:rgba(var(--push-rgb),.26)}
/* BEST-3 DAY DETAIL. The point of this panel is that a stranger can check the claim, so the result reads
   first and the money reads last, with the bet itself carrying the weight in between. Rows are a grid rather
   than a table so they reflow on a phone instead of forcing a horizontal scroll. */
.b3day{font:inherit;cursor:pointer;border:0;padding:0}
.b3day.on{outline:2px solid var(--gold);outline-offset:1px}
.b3detail{margin-top:10px}
.b3d-h{display:flex;flex-wrap:wrap;gap:10px;align-items:baseline;justify-content:space-between;
 padding:9px 11px;border:1px solid var(--line);border-bottom:0;border-radius:11px 11px 0 0;background:var(--bg2,var(--bg2))}
.b3d-h span{font-size:12px;color:var(--mut)}
.b3d-hit{color:var(--gold);font-weight:700}
.b3d-rows{border:1px solid var(--line);border-radius:0 0 11px 11px;overflow:hidden}
.b3d-row{display:grid;grid-template-columns:64px 1fr auto;gap:4px 10px;align-items:baseline;
 padding:9px 11px;border-top:1px solid var(--line)}
.b3d-row:first-child{border-top:0}
.b3d-row.w{background:linear-gradient(90deg,rgba(var(--good-rgb),.07),transparent 55%)}
.b3d-row.l{background:linear-gradient(90deg,rgba(var(--bad-rgb),.06),transparent 55%)}
.b3d-res{font-size:11.5px;font-weight:800;letter-spacing:.06em}
.b3d-row.w .b3d-res{color:var(--good-hi)}
.b3d-row.l .b3d-res{color:var(--bad-hi)}
.b3d-row.p .b3d-res{color:var(--mut)}
.b3d-bet{font-size:13.5px;font-weight:600;min-width:0}
.b3d-mk{grid-column:2;font-size:11px;color:var(--mut)}
.b3d-u{font-size:13px;font-weight:800;font-variant-numeric:tabular-nums;grid-row:1;grid-column:3}
.b3d-empty{padding:11px;color:var(--mut);font-size:12.5px}
/* THE SETTLEMENT LINE. First thing inside a graded card, above the reasoning: what actually happened
   outranks what we thought would happen. Green-ish neutral so it reads as fact, not as a verdict. */
.settline{margin:0 0 7px;padding:7px 9px;border-radius:8px;background:rgba(94,234,212,.07);
 border:1px solid rgba(94,234,212,.18);font-size:12.5px;line-height:1.45;color:var(--txt)}
.settline .sl-k{font-size:11.5px;font-weight:800;letter-spacing:.06em;text-transform:uppercase;
 color:#5eead4;margin-right:7px}
.settline.void{background:rgba(var(--push-rgb),.08);border-color:rgba(var(--push-rgb),.20)}
.settline.void .sl-k{color:var(--mut)}
@media (max-width:520px){.b3d-row{grid-template-columns:56px 1fr auto}.b3d-bet{font-size:13px}}
/* One-tap share row. Pill buttons, gold on dark, sized so five fit on a phone without wrapping badly. */
.sharerow{display:flex;flex-wrap:wrap;gap:7px;margin-top:10px}
/* The bot share row is appended AFTER the profile page-card, so it needs its own inset and breathing
   room rather than inheriting the card's padding. */
.sharerow.pf-share{margin:14px 2px 4px;justify-content:center}

/* ==========================================================================================================
   AURORA TIGHT — Practice
   One blurred surface per group, rows inside it, stake inline. See the density study for why.
   ========================================================================================================== */
/* THE WASH, APP-WIDE. One fixed element behind the whole product rather than one per section: it is the
   cheapest possible way to make five tabs feel like one thing, and it costs a single composited layer.
   Fixed, not absolute, so it does not scroll away and never needs repainting. */
/* REMOVED. Fixed means it does not move, and a soft coloured blur holding still behind a page that is
   scrolling reads as a smudge on the screen rather than as atmosphere — the "shading" half of the report.
   body already paints two gradients of its own, so the ground survives this intact. */
body::before{display:none}
body::before.disabled-wash{
  content:'';position:fixed;inset:-10% -20%;z-index:0;pointer-events:none;
  background:
    radial-gradient(42% 26% at 16% 4%,rgba(var(--gold-rgb),.30),transparent 68%),
    radial-gradient(36% 24% at 88% 24%,rgba(var(--good-rgb),.22),transparent 68%),
    radial-gradient(48% 30% at 42% 76%,rgba(122,150,255,.24),transparent 68%);
  /* Blur reduced from 30px: body already paints two gradients of its own, and a heavy blur over a
     low-alpha wash is an expensive way to draw nothing. This is roughly double the alpha at half the
     blur, which is both cheaper and actually visible. */
  filter:blur(16px);animation:auDrift 30s ease-in-out infinite alternate;opacity:1}
@keyframes auDrift{from{transform:translate3d(-2%,-1%,0) scale(1)}to{transform:translate3d(3%,2%,0) scale(1.06)}}
/* Everything the app draws sits above the wash. ONLY the elements that are statically positioned are
   touched here: z-index requires a positioned element, and header/.subnav/.botnav are already sticky or
   fixed with their own z-index. Setting position:relative on them overrode that — it cost the sub-nav its
   stickiness on desktop, which is a regression this comment exists to stop anyone repeating. */
.wrap,footer.sitefoot{position:relative;z-index:1}
@media(pointer:coarse){
  /* A 30px blur over a full-screen element is the one thing here that can cost a phone a frame. Bake it
     smaller and drop the animation: the colour is what does the work, the movement is a luxury. */
  body::before{filter:blur(12px);animation:none;opacity:.9}
}

/* The one glass surface. Rows live inside it and are separated by hairlines. */
.au-sheet{
  background:rgba(255,255,255,.05);border:1px solid rgba(255,255,255,.12);border-radius:14px;
  backdrop-filter:blur(14px) saturate(1.25);-webkit-backdrop-filter:blur(14px) saturate(1.25);
  overflow:hidden;margin-bottom:12px}
.au-row{display:flex;align-items:center;justify-content:space-between;gap:10px;
  padding:9px 12px;border-top:1px solid rgba(255,255,255,.08)}
.au-row:first-child{border-top:0}
.au-row:active{background:rgba(255,255,255,.04)}
.au-t{font-weight:700;font-size:13.5px;letter-spacing:-.01em;min-width:0;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.au-m{color:var(--mut);font-size:11px;margin-top:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.au-right{display:flex;align-items:center;gap:8px;flex:0 0 auto}
.au-odds{font:700 14px/1 var(--font-mono,ui-monospace),monospace;font-variant-numeric:tabular-nums;color:var(--gold-hi)}
.au-stake{border:1px solid rgba(var(--gold-rgb),.5);background:transparent;color:var(--gold);
  border-radius:9px;padding:7px 11px;font:800 11.5px/1 inherit;cursor:pointer;white-space:nowrap;
  -webkit-tap-highlight-color:transparent}
.au-stake:active{transform:scale(.94)}
.au-stake.on{background:var(--gold);color:#241A05}

/* Section labels inside Practice: quieter than a seghead, louder than body. */
.au-lab{font:700 9.5px/1 var(--font-mono,ui-monospace),monospace;letter-spacing:.2em;text-transform:uppercase;
  color:var(--mut);margin:18px 2px 7px}
.au-hero{padding:13px 14px}
.au-hero .au-big{font-size:26px;font-weight:800;letter-spacing:-.03em;font-variant-numeric:tabular-nums}
.au-hero .au-sub{color:var(--mut);font-size:12px;margin-top:2px}
.au-note{color:var(--mut);font-size:11px;line-height:1.5;margin:8px 2px 0}

/* Dissolve on scroll: distance from the middle of the viewport drives --f. Set by JS; the default of 1
   means a browser that never runs it still shows everything at full strength.
   Deeper than the first pass (.18 rather than .42 at the extremes) and carrying a small scale, so a row
   arriving reads as coming FORWARD rather than merely brightening. Only opacity and transform, both
   composited — no filter, which is what keeps this affordable on a phone. */
.au-row,.au-sheet.au-hero{
  opacity:calc(.77 + .23*var(--f,1));
  filter:blur(calc((1 - var(--f,1)) * 2px));
  transform:scale(calc(.82 + .18*var(--f,1))) translateY(calc((1 - var(--f,1)) * 14px));
  will-change:opacity,transform,filter}

@media(pointer:coarse){
  /* The SHEET's backdrop-filter goes: it blurs everything behind a large surface every frame and is the
     expensive one. The ROW's 2px blur stays — it was tuned on a phone and it is part of the effect.
     If scrolling ever feels heavy on an older device, drop the row blur before touching the scale. */
  .au-sheet{backdrop-filter:none;-webkit-backdrop-filter:none;background:rgba(255,255,255,.065)}
}
@media(prefers-reduced-motion:reduce){
  /* The wash lives on body now, so this had to follow it — it was still naming #sim::before, which no
     longer exists, and a reader who asked for no motion would have kept the drifting gradient. */
  body::before{animation:none}
  .au-row,.au-sheet.au-hero{opacity:1!important;transform:none!important;filter:none!important}
}
/* The fleet aggregate, kept and explained rather than led with. Collapsed by default: it is a footnote to
   the record, not a headline, and anyone who wants it is one tap away. */
.fleetblk{border:1px solid var(--line);border-radius:12px;margin:12px 0 4px;background:var(--surf)}
.fleetblk>summary{cursor:pointer;padding:11px 14px;font-size:13px;font-weight:700;color:var(--mut);
  list-style:none}
.fleetblk>summary::-webkit-details-marker{display:none}
.fleetblk>summary::before{content:'▸ ';color:var(--mut)}
.fleetblk[open]>summary::before{content:'▾ '}
.fb-b{padding:0 14px 6px;font-size:13.5px}
.fb-n{padding:0 14px 13px;font-size:12.5px;color:var(--mut);line-height:1.55}
.pl-url{background:#1c1f31;border:1px solid var(--line);border-radius:10px;padding:10px 12px;margin:8px 0;
  overflow-x:auto}
.pl-url code{font-size:13.5px;color:var(--gold);white-space:nowrap}
.pl-url.off code{color:var(--mut)}
.pl-acts{display:flex;gap:8px;flex-wrap:wrap}
.ref-funnel{display:grid;grid-template-columns:repeat(auto-fit,minmax(78px,1fr));gap:8px;margin:10px 0}
.rf{background:#1c1f31;border:1px solid var(--line);border-radius:10px;padding:9px 6px;text-align:center}
.rf em{display:block;font-style:normal;font-size:11.5px;text-transform:uppercase;letter-spacing:.04em;color:var(--mut)}
.rf b{display:block;font-size:19px;margin-top:3px;font-variant-numeric:tabular-nums}
/* The row's share strip is a sibling of .trackrow, not a child, so it spans the full width instead of
   being squeezed into the actions column. */
.tr-sharewrap{padding:0 10px 10px}
.sharerow.tr-share{margin-top:0}
.sharebtn.on{background:rgba(var(--gold-rgb),.28);border-color:rgba(var(--gold-rgb),.7)}
.sbtn{font:inherit;font-size:12px;font-weight:700;letter-spacing:.01em;padding:7px 12px;border-radius:999px;
 background:rgba(var(--gold-rgb),.10);color:var(--gold);border:1px solid rgba(var(--gold-rgb),.28);cursor:pointer;
 transition:background .15s ease,border-color .15s ease,transform .12s ease}
.sbtn:hover{background:rgba(var(--gold-rgb),.18);border-color:rgba(var(--gold-rgb),.5);transform:translateY(-1px)}
.sbtn:active{transform:translateY(0)}
.sbtn:focus-visible{outline:2px solid var(--gold);outline-offset:2px}
/* The real record inside the headline box. Same box, same prominence tier -- deliberately not tucked into
   a muted footnote, because the whole point is that it is not a footnote. */
.rb-real{margin-top:10px;padding-top:10px;border-top:1px solid var(--line);font-size:13px;line-height:1.55;color:var(--txt)}
.rb-real b{font-size:16px;font-variant-numeric:tabular-nums}
/* Current engine reads first and brightest; the retired one stays visible but clearly secondary. */
.eng{display:flex;flex-wrap:wrap;gap:8px;align-items:baseline;padding:6px 0}
.eng-k{font-size:11.5px;font-weight:800;letter-spacing:.07em;text-transform:uppercase;min-width:118px}
.eng.cur .eng-k{color:var(--gold)}
.eng.old{opacity:.62}
.eng.old .eng-k{color:var(--mut)}
.eng-n{font-size:11.5px;color:var(--mut);font-variant-numeric:tabular-nums}
.eng-note{margin-top:6px;font-size:11.5px;line-height:1.5;color:var(--mut)}
.subcat.unvgroup{border-top:1px dashed var(--line);margin-top:6px}
.subcat.unvgroup>.subhdr .submeta{color:var(--mut);font-style:italic}
.pick.win{border-left-color:var(--good);background:var(--good-bg)}.pick.loss{border-left-color:var(--bad);background:var(--bad-bg)}.pick.logged{opacity:.68}
.pick summary{cursor:pointer;list-style:none;display:flex;flex-wrap:wrap;align-items:center;gap:8px}
.pick summary::-webkit-details-marker{display:none}
.play{font-weight:600;font-size:14px;min-width:230px}.gm{color:var(--mut);font-size:12px}
.price{color:var(--gold);font-weight:700}.book{color:var(--mut);font-size:12px}
.badge{font-size:11.5px;padding:2px 7px;border-radius:9px;background:#262a40;color:#b8bdd8;text-transform:uppercase;letter-spacing:.4px;white-space:nowrap}
.badge.shop{background:var(--good-bg);color:var(--good-hi)}.badge.vsin{background:#2f2450;color:#c4b5fd}.badge.live{background:var(--line);color:var(--blue2)}
.badge.res-w{background:var(--good-bg);color:var(--good-hi)}.badge.res-l{background:var(--bad-bg);color:var(--bad-hi)}
.reason{margin-top:9px;padding-top:9px;border-top:1px dashed #262a44;color:#cbcfe6;font-size:13px}
.ctxline{margin-bottom:8px;padding:8px 10px;background:#0f1626;border:1px solid #1e2a44;border-radius:8px;color:#9fb4dc;font-size:12px;line-height:1.55}
.fabline{margin-top:7px;color:#c4b5fd;font-size:12px;line-height:1.5}
.fabkeys{display:flex;flex-wrap:wrap;gap:6px;margin-top:7px}
.kchip{font-size:11px;padding:2px 8px;border-radius:8px;background:#221b3a;color:#c9bdf2;border:1px solid #362a5c}
.frisk{margin-top:6px;color:#e6a5a5;font-size:11.5px}
.badge.altb{background:var(--gold-bg);color:var(--gold-hi);border:1px solid var(--gold-bg)}
.altline{margin-top:6px;padding:7px 10px;background:#241d0a;border:1px solid var(--gold-bg);border-radius:8px;color:var(--gold-hi);font-size:12px}
.altline b{color:var(--gold-hi)}
.altsum{margin:2px 14px 6px;background:var(--gold-bg);border:1px solid var(--gold-bg);border-radius:8px;font-size:12px}
.altsum summary{cursor:pointer;color:var(--gold-hi);padding:8px 12px;list-style:none}.altsum summary::-webkit-details-marker{display:none}
.altrow{display:flex;justify-content:space-between;gap:10px;padding:6px 12px;border-top:1px solid var(--gold-bg);color:#d9c9a0}
.altrow .altv{color:var(--gold-hi);font-weight:600;white-space:nowrap}
.moreblk{padding:6px 14px 10px;background:#0d0f18}.moresum{cursor:pointer;color:#6f74a0;font-size:12px;list-style:none}.moresum::-webkit-details-marker{display:none}
.fabsec{margin-top:16px;border:1px solid var(--line);border-radius:14px;overflow:hidden;background:var(--surf)}
.fabhdr{display:flex;align-items:center;gap:10px;padding:12px 16px;background:var(--surf2);border-bottom:1px solid var(--line);flex-wrap:wrap;cursor:pointer;list-style:none}
.fabhdr::-webkit-details-marker{display:none}
.fabicon{font-size:18px}.fabname{font-weight:800;font-size:15px;letter-spacing:.5px}
.fabrec{margin-left:auto;font-size:12px;color:var(--txt2)}
.zeus-slate-note{padding:10px 14px;color:var(--mut);font-size:12.5px}.zeus-slate-note b{color:var(--gold-hi)}
.zsp-head,.zsp-row{display:grid;grid-template-columns:1fr 66px 52px 74px 62px;gap:8px;align-items:center;padding:7px 14px;font-size:12.5px}
.zsp-head{color:var(--mut);font-weight:700;font-size:11px;text-transform:uppercase;letter-spacing:.04em;border-bottom:1px solid var(--line)}
.zsp-name{font-weight:600;color:var(--txt);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.zsp-rec,.zsp-wr,.zsp-u{font-variant-numeric:tabular-nums}.zsp-u{font-weight:700;text-align:right}.zsp-wr{color:#cdd6f0}
.zsp-p{font-size:11.5px;color:var(--gold-hi);text-align:right}
.zsp-grp{border-top:1px solid rgba(255,255,255,.05)}
.zsp-parent{cursor:pointer;list-style:none;background:rgba(255,255,255,.015)}.zsp-parent::-webkit-details-marker{display:none}
.zsp-parent .zsp-name{font-weight:800;font-size:14px}
.zsp-parent .zsp-name::before{content:'▸ ';color:#7a86b8;font-size:11px}
.zsp-grp[open]>.zsp-parent .zsp-name::before{content:'▾ '}
.zsp-nlg{font-weight:400;font-size:11.5px;color:var(--mut);margin-left:4px}
.zsp-sub{background:var(--bg)}.zsp-sub .zsp-name{padding-left:18px;color:var(--txt2);font-weight:500}
.zsp-sub:hover{background:rgba(255,255,255,.02)}
.fabsec:first-of-type .fabhdr{background:linear-gradient(90deg,var(--good-bg),var(--surf2))}
.calnav{display:flex;align-items:center;gap:14px;margin:8px 0}
.calnav button{background:var(--surf);border:1px solid var(--line);color:var(--txt);border-radius:9px;padding:6px 13px;cursor:pointer;font-size:15px}
.cal-title{font-weight:700;font-size:16px;min-width:150px;text-align:center}
table.cal{table-layout:fixed;margin-top:8px}
table.cal th{text-align:center;font-size:11.5px;color:var(--mut)}
.cal-day{height:66px;vertical-align:top;border:1px solid var(--surf2);border-radius:8px;padding:5px 6px;cursor:pointer}
.cal-day:hover{border-color:var(--line3)}.cal-empty{border:none}
.cal-day.cal-off{opacity:.28;cursor:default}.cal-day.cal-off:hover{border-color:var(--surf2)}
#pcal-day{margin-top:14px}
#cal-detail{margin-top:16px}
.cald-hdr{font-size:16px;font-weight:800;color:#eaf7ff;padding:0 2px 10px;border-bottom:1px solid var(--line);margin-bottom:10px}
.cald-sport{background:var(--bg2);border:1px solid var(--surf3);border-radius:12px;padding:6px 12px 8px;margin-bottom:8px}
.cald-shd{display:flex;justify-content:space-between;align-items:center;cursor:pointer;list-style:none;padding:5px 0}
.cald-shd::-webkit-details-marker{display:none}
.cald-sn{font-size:14px;font-weight:700;color:var(--txt)}
.cald-sm{font-size:12px;color:var(--mut)}
.cald-bt{display:flex;align-items:center;gap:10px;padding:5px 0 5px 12px;font-size:12.5px;border-top:1px solid rgba(255,255,255,.04)}
.cald-btn{flex:1;color:var(--txt2)}.cald-btr{color:var(--push)}.cald-btu{font-weight:700;font-variant-numeric:tabular-nums;min-width:52px;text-align:right}
/* bet-type sub-groups inside a league on the calendar day drill-down */
.cbt-grp{margin-top:6px}
.cbt-hd{display:flex;justify-content:space-between;align-items:center;padding:4px 2px 2px;border-top:1px solid rgba(255,255,255,.05)}
.cbt-n{font-size:11px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--mut)}
.cbt-m{font-size:11px;color:var(--mut);font-variant-numeric:tabular-nums}
body.theme-light .cbt-n,body.theme-light .cbt-m{color:#5a6478}
/* individual play rows in the calendar day drill-down (full transparency: exactly what was bet) */
.cplay{display:flex;align-items:center;gap:10px;padding:6px 0 6px 2px;border-top:1px solid rgba(255,255,255,.045)}
.cbadge{flex:none;width:22px;height:22px;border-radius:6px;font-size:11px;font-weight:800;display:flex;align-items:center;justify-content:center}
.cbadge.w{background:rgba(var(--good-rgb),.18);color:var(--good)}.cbadge.l{background:rgba(var(--bad-rgb),.16);color:var(--bad)}
.cbadge.p{background:rgba(139,144,173,.18);color:var(--mut)}.cbadge.pd{background:var(--surf2);color:var(--gold)}
.cplay-m{flex:1;min-width:0}
.cplay-p{font-size:13px;color:#dfe4f2;font-weight:600;line-height:1.25;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.cplay-g{font-size:11px;color:var(--push);line-height:1.2;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.cplay-u{font-weight:800;font-variant-numeric:tabular-nums;min-width:56px;text-align:right;font-size:12.5px}
body.theme-light .cplay-p{color:#1b2333}body.theme-light .cplay-g{color:#5a6478}
/* GAME FOLD inside a calendar day. The matchup lives here once instead of on every row beneath it. */
.cgm{border-top:1px solid var(--line)}
.cgm-hd{display:flex;align-items:center;gap:8px;cursor:pointer;list-style:none;padding:7px 2px}
.cgm-hd::-webkit-details-marker{display:none}
.cgm-n{font-family:var(--font-display);font-size:12.5px;font-weight:700;color:var(--txt);flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.cgm-m{font-size:11px;color:var(--mut);font-variant-numeric:tabular-nums;white-space:nowrap}
.cgm-m b{color:var(--txt)}
.cgm-live{margin-left:7px;color:var(--goldsoft)}
.cgm>.cgm-hd .chev{transition:transform .14s;font-size:11.5px;color:var(--mut)}
.cgm[open]>.cgm-hd .chev{transform:rotate(90deg)}
.pcal-dayhdr{font-size:14px;font-weight:800;color:#eaf7ff;padding:8px 2px 10px;border-bottom:1px solid var(--line);margin-bottom:8px}
.cal-n{font-size:12px;color:#c3c8e6}.cal-n.mut{color:#454a68}
.calfilter{display:flex;flex-wrap:wrap;gap:6px;margin:2px 0 10px}
.calfilter.calsub{margin-top:-4px;padding-left:2px}
.calchip{font-size:12px;font-weight:700;padding:5px 11px;border-radius:999px;background:var(--surf);border:1px solid var(--line);color:var(--mut,var(--mut));cursor:pointer;white-space:nowrap;-webkit-tap-highlight-color:transparent}
.calchip.sm{font-size:11px;padding:4px 9px}
.calchip:hover{border-color:var(--line3)}
.calchip.on{background:rgba(var(--gold-rgb),.14);border-color:rgba(var(--gold-rgb),.4);color:var(--gold,var(--gold))}
.cal-wl{display:block;font-size:12px;font-weight:700;margin-top:6px}.cal-u{display:block;font-size:11px;font-weight:600}
.cal-green{background:var(--good-bg)}.cal-red{background:var(--bad-bg)}.cal-flat{background:#1a1c28}
/* heatmap intensity by day magnitude (Pikkit-style) */
.cal-g1{background:var(--good-bg)}.cal-g2{background:#154a2a}.cal-g3{background:#1c6b3a}
.cal-r1{background:var(--bad-bg)}.cal-r2{background:var(--bad-bg)}.cal-r3{background:#6a1f2e}
.legend{display:flex;gap:14px;font-size:11px;color:var(--mut);margin-top:8px;flex-wrap:wrap}
.dot{display:inline-block;width:10px;height:10px;border-radius:3px;vertical-align:middle;margin-right:4px}
.dbanner{display:none;background:var(--line);color:#cdd6ff;padding:8px 12px;border-radius:9px;margin:8px 0;font-size:13px}
.dbanner b{color:#fff}.dbanner span{cursor:pointer;color:var(--gold);margin-left:8px;text-decoration:underline}
.logo{vertical-align:middle;margin-right:8px}
/* The mark is the home button. Sites that do this are the ones people stop feeling lost in, and it costs
   one anchor. Focus ring included because it is now a real control, not decoration. */
/* HEADER HIDES ON THE WAY DOWN. Header + sub-nav sticky + a fixed bottom bar is three pinned rows around
   a phone screen, which reads as being trapped in chrome. Scrolling down slides the header away;
   scrolling up brings it straight back. The sub-nav stays — it says where you are. */
header{transition:transform .22s cubic-bezier(.22,.8,.28,1)}
body.hdr-away header{transform:translateY(-100%)}
/* The sub-nav goes with it. Keeping it pinned was a deliberate call — it says where you are — but
   header + sub-nav + a fixed bottom bar is three permanent bands around a phone screen, and it was
   reported as feeling trapped and unable to focus on the content. Both come straight back on the
   first upward scroll, so nothing is lost, and the top of the page is never truncated. */
.subnav{transition:transform .22s cubic-bezier(.22,.8,.28,1)}
body.hdr-away .subnav{transform:translateY(calc(-1 * var(--hdr-h,56px)))}
@media(prefers-reduced-motion:reduce){.subnav{transition:none}}
@media(prefers-reduced-motion:reduce){header{transition:none}}
.homelink{display:inline-flex;align-items:center;border-radius:10px;text-decoration:none;
  -webkit-tap-highlight-color:transparent}
.homelink:focus-visible{outline:2px solid var(--gold);outline-offset:3px}
.homelink:active{transform:scale(.94)}
.brandrow{display:flex;align-items:center}
.hero{position:relative;overflow:hidden;border-radius:16px;padding:22px;margin-bottom:14px;background:radial-gradient(1200px 200px at 10% -20%,#ffd16622,transparent),linear-gradient(135deg,var(--surf2),var(--bg2));border:1px solid var(--line)}
.hero h1{font-size:26px;font-weight:800;letter-spacing:1px;margin-bottom:4px}
.hero p{color:var(--mut);font-size:13px;max-width:560px}
.hero .glow{position:absolute;right:-40px;top:-40px;width:180px;height:180px;background:radial-gradient(circle,#34d39933,transparent 70%);border-radius:50%}
.tailbtn{margin-left:auto;flex-shrink:0;width:32px;height:32px;border-radius:50%;border:1.5px solid var(--good);background:var(--good-bg);color:var(--good);font-size:20px;font-weight:700;line-height:1;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;user-select:none;padding:0;transition:transform .1s,background .1s}
.tailbtn.on{background:var(--good);color:var(--good-bg);border-color:var(--good);box-shadow:0 0 0 3px #35c46a22}
.sharebtn{margin-left:6px;padding:4px 10px;border-radius:7px;border:1px solid rgba(var(--gold-rgb),.35);background:rgba(var(--gold-rgb),.09);color:var(--gold);font-size:11px;font-weight:700;cursor:pointer;line-height:1.4;white-space:nowrap;display:inline-flex;align-items:center;gap:4px;transition:transform var(--d1) var(--ease-spring),background var(--d2)}
@media(hover:hover){.sharebtn:hover{background:rgba(var(--gold-rgb),.18);border-color:rgba(var(--gold-rgb),.6)}}
.sharebtn:active{transform:scale(.94)}
.shareopts{position:fixed;inset:0;z-index:130;display:flex;align-items:center;justify-content:center;padding:20px;background:rgba(6,8,15,.82);backdrop-filter:blur(6px);opacity:0;pointer-events:none;transition:opacity .18s}
.shareopts.on{opacity:1;pointer-events:auto}
.so-card{background:linear-gradient(160deg,var(--surf2),var(--bg2));border:1px solid var(--line);border-radius:18px;padding:22px;width:100%;max-width:320px;text-align:center;box-shadow:0 24px 70px rgba(0,0,0,.6)}
.so-h{font-size:18px;font-weight:800;color:var(--txt)}
.so-p{font-size:12.5px;color:var(--mut);line-height:1.5;margin:6px 0 16px}
.so-btn{display:block;width:100%;margin:8px 0;padding:12px;border-radius:11px;font-size:13.5px;font-weight:700;cursor:pointer;text-decoration:none;border:1px solid var(--line);background:var(--surf2);color:var(--txt);transition:transform var(--d1) var(--ease-spring),filter var(--d2)}
.so-btn:active{transform:scale(.97)}
.so-x{background:#111;border-color:#333;color:#fff}
.so-fb{background:#1877f2;border-color:#1877f2;color:#fff}
.so-note{font-size:11px;color:var(--mut);line-height:1.5;margin:12px 0 4px;padding:9px 10px;border:1px solid var(--line);border-radius:9px}
.so-close{background:none;border:none;color:var(--mut);font-size:12.5px;font-weight:600;cursor:pointer;margin-top:8px}
.tailbtn.live{border-color:var(--gold2);background:var(--gold-bg);color:var(--gold-hi);font-size:15px;animation:tailpulse 1.8s ease-in-out infinite}
@keyframes tailpulse{0%,100%{box-shadow:0 0 0 0 #f0a02055}50%{box-shadow:0 0 0 4px #f0a02011}}
@media (prefers-reduced-motion:reduce){.tailbtn.live{animation:none}}
.tailbtn:hover{transform:scale(1.1);filter:brightness(1.1)}
.tailhint{background:var(--good-bg);border:1px solid #24503a;border-radius:10px;padding:9px 13px;margin-bottom:12px;font-size:13px;color:#bfe9cf}
.tailhint b{color:var(--good-hi)}.tailhint .pill{display:inline-flex;width:22px;height:22px;border-radius:50%;background:var(--good);color:var(--good-bg);align-items:center;justify-content:center;font-weight:800;vertical-align:middle;margin:0 3px}
.who{margin-left:8px;font-size:12px;color:var(--mut);display:inline-flex;align-items:center}.who b{color:#e8ecf7}.who a{color:#8fa9ff;cursor:pointer;margin-left:6px}
.who-me{display:inline-flex;align-items:center;gap:7px;cursor:pointer;padding:3px 12px 3px 3px;border-radius:999px;background:rgba(255,255,255,.05);border:1px solid var(--line);transition:border-color .12s}
.who-me:hover{border-color:var(--gold)}
.who-me b{font-size:12.5px;font-weight:800}
.who-ava{width:27px;height:27px;border-radius:50%;object-fit:cover;display:inline-flex;align-items:center;justify-content:center;font-weight:800;font-size:12px;background:#2a3350;color:#fff;flex:none}
.who-lock{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;margin-left:6px;border-radius:50%;border:1px solid var(--line);background:rgba(255,255,255,.03);color:var(--mut);cursor:pointer;transition:color .15s,background .15s,border-color .15s,transform var(--d1) var(--ease-spring)}
.who-lock svg{width:16px;height:16px}
.who-lock:hover{color:var(--bad);border-color:rgba(var(--bad-rgb),.5);background:rgba(var(--bad-rgb),.1)}
.who-lock:active{transform:scale(.9)}
/* margin-left:auto, NOT margin:0 auto. In a wrapping flex row, auto on BOTH sides centres the item and
   forces it onto a line of its own — which is exactly how the balances ended up centred on their own row.
   One auto pushes them to the right of the brand and keeps them in the top row. */
.dwallet{display:flex;align-items:center;gap:8px;margin-left:auto;z-index:6}
/* The mode switch is the same control as Settings > Bet type, and "Shop" is a destination that has its own
   entry on the profile. It was already hidden on phones; a desktop header short of vertical room has the
   same problem, so it goes everywhere rather than being a phone-only exception. */
.dw-toggle{display:none !important}
.dw-bal{display:inline-flex;align-items:center;gap:5px;font-size:13px;font-weight:800;color:var(--info);background:rgba(var(--info-rgb),.1);border:1px solid rgba(var(--info-rgb),.32);border-radius:999px;padding:5px 12px;cursor:pointer;white-space:nowrap}
.dw-bal:hover{background:rgba(var(--info-rgb),.18)}
.cn-ic{width:16px;height:16px;vertical-align:-3px;display:inline-block;filter:drop-shadow(0 1px 2px rgba(0,0,0,.4))}
.fly-coin{position:fixed;width:26px;height:26px;z-index:99999;pointer-events:none;will-change:transform,opacity;filter:drop-shadow(0 2px 5px rgba(0,0,0,.45))}
@keyframes _pulseUp{0%{transform:scale(1)}32%{transform:scale(1.16);color:var(--good-hi)}100%{transform:scale(1)}}
@keyframes _pulseDn{0%{transform:scale(1)}32%{transform:scale(.9);color:var(--bad-hi)}100%{transform:scale(1)}}
.pulse-up{animation:_pulseUp .6s ease;display:inline-block}
.pulse-dn{animation:_pulseDn .5s ease;display:inline-block}
/* modern feel: tabular numerals stop the digit "wiggle" on count-ups + smoother interactive motion */
.dw-bal b,.card .v,.zoo-stats b,.obs-odds,.ocell,.ob-o,.pf-stat b,.amt{font-variant-numeric:tabular-nums}
@media(prefers-reduced-motion:reduce){.pulse-up,.pulse-dn{animation:none}}
/* ===== MIDAS MOTION CORE (window.MZ) — struck-not-sprayed, brand-only, poll-safe ===== */
.mz-live-dot{animation:mz-livepulse 1.7s ease-in-out infinite}
@keyframes mz-livepulse{0%,100%{opacity:1;transform:scale(1)}50%{opacity:.55;transform:scale(.86)}}
.mz-in{opacity:0}
.mz-in.mz-go{animation:mz-rise .4s cubic-bezier(.2,.9,.25,1) both;animation-delay:calc(var(--i,0)*42ms)}
@keyframes mz-rise{from{opacity:0;transform:translateY(11px)}to{opacity:1;transform:none}}
@keyframes mz-flash-win{0%{background:rgba(var(--good-rgb),0)}18%{background:rgba(var(--good-rgb),.26)}100%{background:rgba(var(--good-rgb),0)}}
@keyframes mz-flash-loss{0%{background:rgba(255,120,120,0)}20%{background:rgba(255,120,120,.16)}100%{background:rgba(255,120,120,0)}}
@keyframes mz-flash-live{0%{background:rgba(255,138,90,0)}18%{background:rgba(255,138,90,.18)}100%{background:rgba(255,138,90,0)}}
.mz-flash-win{animation:mz-flash-win 1s ease-out}.mz-flash-loss{animation:mz-flash-loss 1.1s ease-out}.mz-flash-live{animation:mz-flash-live 1s ease-out}
.mz-sheen{position:relative;overflow:hidden}
.mz-sheen::after{content:"";position:absolute;top:0;left:-60%;width:45%;height:100%;background:linear-gradient(105deg,transparent,rgba(255,224,150,.4),transparent);transform:skewX(-18deg);animation:mz-sweep .85s ease-out forwards;pointer-events:none}
@keyframes mz-sweep{to{left:130%}}
@keyframes mz-stamp{0%{transform:scale(1.8);opacity:0}55%{transform:scale(.9)}100%{transform:scale(1);opacity:1}}
.mz-stamp{display:inline-block;animation:mz-stamp .34s cubic-bezier(.2,1.4,.4,1) both}
@keyframes mz-morph{0%{transform:scale(1)}40%{transform:scale(.82)}100%{transform:scale(1)}}
.mz-morph{animation:mz-morph .3s ease}
.mz-fly{position:fixed;width:24px;height:24px;z-index:99999;pointer-events:none;will-change:transform,opacity;filter:drop-shadow(0 2px 5px rgba(0,0,0,.45))}
.mz-skel{position:relative;overflow:hidden;background:rgba(255,255,255,.05);border-radius:8px}
.mz-skel::after{content:"";position:absolute;inset:0;transform:translateX(-100%);background:linear-gradient(90deg,transparent,rgba(255,255,255,.09),transparent);animation:mz-shimmer 1.25s infinite}
@keyframes mz-shimmer{100%{transform:translateX(100%)}}
.mz-skel-line{height:12px;margin:9px 0;border-radius:6px}
.mz-skel-card{padding:14px;border:1px solid rgba(255,255,255,.06);border-radius:12px;margin:8px 0}
@media(prefers-reduced-motion:reduce){.mz-in{opacity:1!important}.mz-sheen::after,.mz-skel::after,.mz-live-dot{animation:none}}
.dw-coin{color:var(--gold-hi);background:rgba(255,207,106,.1);border-color:rgba(255,207,106,.34)}
.dw-coin:hover{background:rgba(255,207,106,.18)}
.dw-dia{color:var(--info);background:rgba(var(--info-rgb),.1);border-color:rgba(var(--info-rgb),.32)}
/* Both balances live in the header at all times. Unselected sits back; the one you'd actually spend
   is lit — so the "which currency am I betting" answer is visible rather than remembered. */
.dw-bal{cursor:pointer;opacity:.62;transition:opacity .14s,box-shadow .14s,transform .1s}
.dw-bal:hover{opacity:.9}
.dw-bal:active{transform:translateY(1px)}
.dw-bal.on{opacity:1}
.dw-bal.dw-coin.on{box-shadow:0 0 0 2px rgba(255,207,106,.28)}
.dw-bal.dw-dia.on{box-shadow:0 0 0 2px rgba(var(--info-rgb),.28)}
.dw-bal:focus-visible{outline:2px solid var(--gold);outline-offset:2px}
/* Shop reads as a destination, not a mode — it opens the store rather than switching the board */
#dwm-shop{color:var(--gold)}
#dwm-shop:hover{background:rgba(var(--gold-rgb),.16)}
.dw-swap{display:none}   /* replaced: you now tap the balance you want instead of a swap arrow */
.dw-dia:hover{background:rgba(var(--info-rgb),.18)}
.dw-ico{display:inline-flex;align-items:center;font-size:15px;line-height:1}
.dw-swap{display:inline-flex;align-items:center;justify-content:center;min-width:22px;min-height:22px;margin-left:2px;border-radius:50%;font-size:12px;color:inherit;opacity:.6;cursor:pointer;transition:transform var(--d1) var(--ease-spring),opacity .15s}
.dw-swap:hover{opacity:1;background:rgba(255,255,255,.08)}.dw-swap:active{transform:rotate(180deg) scale(.9)}
.who-avwrap{position:relative;display:inline-flex;flex:none;align-items:center;justify-content:center;line-height:0;overflow:visible}
.who-avplain{display:inline-flex;flex:none;line-height:0}   /* no-border case: plain wrapper so the level bubble positions the same */
.who-lvl{position:absolute;top:-5px;left:-5px;z-index:3;display:inline-flex;align-items:center;justify-content:center;min-width:16px;height:16px;padding:0 4px;border-radius:999px;font-size:11.5px;font-weight:900;line-height:1;color:var(--gold-bg);background:linear-gradient(135deg,var(--gold),var(--gold2));box-shadow:0 1px 3px rgba(0,0,0,.5);border:1.5px solid var(--bg,#0b0d16);transition:transform .3s cubic-bezier(.2,1.4,.4,1)}
.who-lvl.bump{transform:scale(1.5)}
/* ---- daily-claim bubbles (top of screen) + RuneScape-style XP float / level-up ---- */
.claimbar{z-index:28;display:none;justify-content:center;gap:8px;padding:8px 12px 2px;flex-wrap:wrap;pointer-events:none}
/* sticky sport chip bar — fast nav (jump/filter to a sport) stays reachable while scrolling a long breakdown */
/* The worst of them: an opaque fill AND a fade shadow, both only meaningful while pinned. Where this bar
   genuinely needs to be divided from the board below it, one hairline does the job that 12px of blurred
   black was doing badly. */
.spbar{position:static;background:none;padding:6px 0 8px;margin-bottom:8px;border-bottom:1px solid var(--line);display:flex;flex-wrap:nowrap;gap:6px;overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none}
/* ONE ROW, SCROLLED -- NOT A WRAPPING TAG SOUP.
   These bars inherit .filters{flex-wrap:wrap}, and History carries a chip per sport with its lifetime
   count (MLB 1308, WNBA 204, USC Basketball 376, ...). Two dozen chips wrapped into five or six rows and
   pushed the actual bet list below the fold before a single bet was read. .jumpbar already sets
   overflow-x:auto, so refusing the wrap turns the same chips into a single swipeable line and the vertical
   bloat disappears without touching the data or the filter logic. */
.spbar,.jumpbar{flex-wrap:nowrap;overflow-x:auto;-webkit-overflow-scrolling:touch}
.spbar::-webkit-scrollbar,.jumpbar::-webkit-scrollbar{height:0}
.spbar>.chip,.jumpbar>.chip{flex:0 0 auto}
/* 44px TAP TARGETS, ON TOUCH DEVICES ONLY.
   Apple and Google both require ~44px, and chips and segmented buttons sit near 27px (5px padding on a
   12px face). Gated behind pointer:coarse so it applies where a finger is used and leaves the desktop
   density alone -- the compaction elsewhere in this pass is for a mouse, and growing every pill on a
   1440px screen would undo it. Vertical padding only: the visible pill keeps its shape, the touch box
   grows to meet it. */
@media (pointer:coarse){
  .chip,.segbtn,.jump,.sp{min-height:44px;display:inline-flex;align-items:center}
  .tabbar button,.nav button{min-height:44px}
}
.spbar::-webkit-scrollbar{display:none}
.spbar>.chip{flex:none}
.spbar>.chip.spy:not(.on){color:var(--gold);border-color:rgba(var(--gold-rgb),.5);background:rgba(var(--gold-rgb),.06)}
body.theme-light /* This re-applied the opaque fill the rule above just dropped. It existed so the pinned bar could hide
   content sliding beneath it; the bar is static now and the hairline does the dividing. */
.spbar{background:none}
.claimbub{pointer-events:auto;display:inline-flex;align-items:center;gap:6px;font-size:12.5px;font-weight:700;color:var(--gold-bg);background:linear-gradient(135deg,var(--gold),var(--gold2));border:none;border-radius:999px;padding:8px 15px;cursor:pointer;box-shadow:0 6px 18px -6px rgba(var(--gold2-rgb),.75);animation:claimpulse 1.7s ease-in-out infinite}
.claimbub b{font-weight:900}
.claimbub.cb-spin{background:linear-gradient(135deg,#c9a3ff,var(--info));color:var(--bg);box-shadow:0 6px 18px -6px rgba(140,90,255,.7)}
.claimbub:active{transform:scale(.95)}
@keyframes claimpulse{0%,100%{transform:translateY(0)}50%{transform:translateY(-2px)}}
.xp-float{position:fixed;z-index:120;transform:translate(-50%,-50%);font-size:15px;font-weight:900;color:var(--gold);text-shadow:0 2px 6px rgba(0,0,0,.75);pointer-events:none;animation:xprise 1.4s ease-out forwards;font-variant-numeric:tabular-nums;white-space:nowrap}
@keyframes xprise{0%{opacity:0;transform:translate(-50%,-30%) scale(.7)}18%{opacity:1;transform:translate(-50%,-70%) scale(1.06)}100%{opacity:0;transform:translate(-50%,-200%) scale(1)}}
.levelup-overlay{position:fixed;inset:0;z-index:130;display:none;align-items:center;justify-content:center;background:radial-gradient(circle at 50% 42%,rgba(var(--gold-rgb),.2),rgba(0,0,0,.74));backdrop-filter:blur(3px);cursor:pointer}
.levelup-overlay.on{display:flex;animation:lufade .28s ease-out}
@keyframes lufade{from{opacity:0}to{opacity:1}}
.lu-card{position:relative;text-align:center;padding:30px 46px;border-radius:22px;background:linear-gradient(160deg,#1b2136,var(--bg2));border:1px solid rgba(var(--gold-rgb),.5);box-shadow:0 30px 80px rgba(0,0,0,.7),0 0 60px rgba(var(--gold-rgb),.25);animation:lupop .5s cubic-bezier(.2,1.3,.4,1)}
@keyframes lupop{0%{transform:scale(.5);opacity:0}100%{transform:scale(1);opacity:1}}
.lu-ttl{font-size:14px;font-weight:900;letter-spacing:.28em;color:var(--gold);margin-bottom:6px}
.lu-lvl{font-size:42px;font-weight:900;color:#fff;line-height:1}.lu-lvl b{color:var(--gold)}
.lu-sub{font-size:12px;color:var(--mut);margin-top:12px}
.lu-burst{position:absolute;inset:-46px;border-radius:50%;background:radial-gradient(circle,rgba(var(--gold-rgb),.4),transparent 62%);animation:luburst 1.2s ease-out forwards;pointer-events:none}
@keyframes luburst{0%{transform:scale(.3);opacity:.9}100%{transform:scale(1.7);opacity:0}}
@media(prefers-reduced-motion:reduce){.claimbub,.xp-float,.lu-card,.lu-burst{animation:none!important}}
@media(prefers-reduced-motion:reduce){.dw-swap:active{transform:none}}
@media(max-width:768px){.dw-swap{min-width:40px;min-height:40px}}
.dw-toggle{display:inline-flex}
.dw-toggle .segbtn{padding:5px 12px;font-size:12px}
/* Shop is an action, not a third mode -- separate it so the switch reads as a binary. */
.dw-toggle .dwm-shop{margin-left:6px;border-left:1px solid var(--line);color:var(--gold,var(--gold-hi))}
.dw-toggle .dwm-shop.on{background:none}
@media(max-width:768px){.bar{gap:8px;row-gap:8px}.dwallet{order:0;flex-basis:auto;margin:0 0 0 auto;justify-content:flex-end;gap:6px}.who{margin-left:auto}.dw-toggle .segbtn{padding:8px 12px;font-size:12px;min-height:40px}.who-me{min-height:40px}}
@media(max-width:560px){.brand small{display:none}.who-me b{max-width:92px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}}
@media(max-width:400px){.dw-bal{padding:5px 9px}}
#overlay{position:fixed;inset:0;background:rgba(6,8,15,.86);backdrop-filter:blur(6px);z-index:100;display:flex;align-items:center;justify-content:center;padding:20px;overflow-y:auto;-webkit-overflow-scrolling:touch}
.loginbox{background:var(--surf);border:1px solid var(--line);border-radius:18px;padding:22px;max-width:360px;width:100%;text-align:center;max-height:calc(100dvh - 40px);overflow-y:auto;margin:auto;scrollbar-width:thin}
@supports not (height:100dvh){.loginbox{max-height:calc(100vh - 40px)}}
/* tighten the auth box so it fits a phone without scrolling in the first place */
.loginbox input,.loginbox select{margin-bottom:8px}
/* Age + Terms consent. Left-aligned and readable rather than fine print -- a box someone has to tick is
   also the last thing they read before committing, so it should not look like something to skip. The
   checkbox keeps its own 24px coarse-pointer floor from the pointer:coarse block. */
.sg-agree{display:flex;align-items:flex-start;gap:9px;text-align:left;margin:4px 0 10px;
  font-size:12px;line-height:1.5;color:var(--mut);cursor:pointer}
.sg-agree input{margin:0;flex:none;width:18px;height:18px;accent-color:var(--gold)}
.sg-agree b{color:var(--txt)}
.sg-agree a{color:var(--gold);text-decoration:underline}
.loginbox h2{font-size:15px}
.loginbox>p{font-size:12px;line-height:1.45;margin-bottom:10px}
@media(max-height:720px){.loginbox{padding:16px}.ck-or{margin:10px 0 8px}.ck-hd{margin-bottom:8px}.vq{margin:2px 0 8px}.claim-card{padding:11px;margin:8px 0}}
/* ---- Clerk claim / new-account chooser ---- */
.claim-card{border:1px solid var(--line);border-radius:12px;padding:14px;margin:12px 0;text-align:left;background:rgba(255,255,255,.02)}
.claim-hd{font-size:13.5px;font-weight:800;color:var(--gold);margin-bottom:4px}
.claim-sub{font-size:11.5px;line-height:1.5;color:var(--mut);margin:0 0 10px}
.claim-or{font-size:11px;font-weight:700;letter-spacing:.1em;text-transform:uppercase;color:var(--mut);margin:2px 0}
.claim-help{font-size:11px;line-height:1.5;color:var(--mut);margin-top:12px}
/* history date index — one row per day, detail on demand */
.hd-row{display:flex;align-items:center;gap:12px;padding:12px 14px;margin-bottom:6px;cursor:pointer;
  border:1px solid var(--line);border-radius:10px;background:var(--surf);transition:border-color .12s}
.hd-row:hover{border-color:rgba(var(--gold-rgb),.45)}
.hd-row.on{border-color:var(--gold);background:rgba(var(--gold-rgb),.06)}
/* A day row whose numbers describe only the filtered slice of that day, not the whole day. */
.hd-row.hd-sub{border-left:2px solid var(--goldsoft)}
.hd-date{font-weight:700;font-size:13.5px;min-width:132px}
.hd-n{font-size:12px;color:var(--mut)}
.hd-rec{font-size:12px;font-variant-numeric:tabular-nums;color:var(--mut)}
.hd-nr{font-size:11.5px;color:var(--mut);opacity:.85;font-variant-numeric:tabular-nums;white-space:nowrap}
.hd-pend{font-size:11.5px;font-weight:700;color:var(--goldsoft);background:rgba(217,164,65,.13);
  border:1px solid rgba(217,164,65,.32);border-radius:999px;padding:2px 7px}
.hd-u{margin-left:auto;font-weight:800;font-variant-numeric:tabular-nums;font-size:13.5px}
.hd-go{color:var(--mut);font-size:16px}
.hd-detail-hdr{display:flex;align-items:center;gap:10px;font-size:13.5px;font-weight:800;
  margin:14px 0 8px;padding-top:10px;border-top:1px solid var(--line)}
.hd-close{margin-left:auto;font-size:11.5px;font-weight:600;color:var(--gold);cursor:pointer}
@media(max-width:560px){.hd-date{min-width:0;flex:1}.hd-rec,.hd-n,.hd-nr{display:none!important}}
/* AI rows in the social feed — labelled at every appearance, never mistakable for a person */
.fd-ai{font-size:11px;font-weight:800;letter-spacing:.07em;padding:2px 6px;border-radius:5px;
  color:var(--info);background:rgba(var(--info-rgb),.13);border:1px solid rgba(var(--info-rgb),.4)}
.fd-isai{border-left:2px solid rgba(var(--info-rgb),.45)}
.fd-method{display:block;font-size:11.5px;line-height:1.4;color:var(--mut);margin-top:3px;font-style:italic}
.fd-ainote{border-color:rgba(var(--info-rgb),.28);background:rgba(var(--info-rgb),.06)}
/* ---- shop modal: cosmetics pane first, diamonds second ---- */
.shoptabs{display:flex;gap:6px;margin:2px 0 14px}
.shoptabs .segbtn{flex:1;text-align:center;padding:9px 10px;font-size:12.5px;font-weight:800}
.shop-bal{display:flex;align-items:center;gap:14px;flex-wrap:wrap;padding:10px 12px;margin-bottom:12px;
  border:1px solid var(--line);border-radius:11px;background:rgba(255,255,255,.03)}
.shop-bal span{display:inline-flex;align-items:center;gap:6px;font-size:14px;font-weight:800;
  font-variant-numeric:tabular-nums}
.shop-bal .btn{margin-left:auto}
/* balance still loading — a shimmer, never a zero */
.wal-load{display:inline-block;min-width:34px;height:11px;border-radius:6px;
  background:linear-gradient(90deg,rgba(255,255,255,.09),rgba(255,255,255,.22),rgba(255,255,255,.09));
  background-size:200% 100%;animation:walsh 1.1s linear infinite;vertical-align:-1px}
@keyframes walsh{to{background-position:-200% 0}}
@media(prefers-reduced-motion:reduce){.wal-load{animation:none}}
/* ---- prediction-market portfolio ---- */
.pmstats{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:10px;margin-bottom:12px}
.pms{border:1px solid var(--line);border-radius:11px;padding:11px 13px;background:rgba(255,255,255,.02);display:flex;flex-direction:column;gap:3px}
.pms .k{font-size:11.5px;letter-spacing:.09em;text-transform:uppercase;color:var(--mut);font-weight:700}
.pms .v{font-size:17px;font-weight:800;font-variant-numeric:tabular-nums}
.pmsplit{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:10px;margin-bottom:12px}
.pmv-card{border:1px solid var(--line);border-radius:11px;padding:11px 13px;background:rgba(255,255,255,.02)}
.pmv-h{font-size:12.5px;font-weight:800}
.pmv-n{font-size:11px;color:var(--mut);margin:2px 0 4px}
.pmv-r{font-size:16px;font-weight:800;font-variant-numeric:tabular-nums}
.pmv-tag{display:inline-block;margin-top:6px;font-size:11px;font-weight:800;letter-spacing:.07em;text-transform:uppercase;padding:2px 7px;border-radius:999px}
.pmv-tag.live{color:var(--good);background:rgba(79,178,134,.14);border:1px solid rgba(79,178,134,.35)}
.pmv-tag.cost{color:var(--goldsoft);background:rgba(217,164,65,.13);border:1px solid rgba(217,164,65,.34)}
.pmnote{font-size:11.5px;line-height:1.55;color:var(--mut);border:1px solid rgba(217,164,65,.3);
  background:rgba(217,164,65,.07);border-radius:10px;padding:9px 11px;margin-bottom:12px}
.pmlist{display:flex;flex-direction:column;gap:8px}
.pmrow{border:1px solid var(--line);border-radius:11px;padding:11px 13px;background:var(--surf)}
.pmrow.done{opacity:.72}
.pmr-top{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:6px}
.pmr-v{font-size:11px;font-weight:800;letter-spacing:.06em;text-transform:uppercase;padding:2px 7px;border-radius:999px;flex:none}
.pv-polymarket{color:var(--info);background:rgba(var(--info-rgb),.13);border:1px solid rgba(var(--info-rgb),.34)}
.pv-kalshi{color:var(--goldsoft);background:rgba(217,164,65,.13);border:1px solid rgba(217,164,65,.34)}
.pmr-q{font-size:13px;font-weight:700;line-height:1.35}
.pmr-mid{display:flex;align-items:center;gap:12px;flex-wrap:wrap;font-size:12px;font-variant-numeric:tabular-nums}
.pmr-side{font-weight:800;color:var(--gold)}
.pmr-e{color:var(--mut)}
.pmr-sz{font-weight:700}
.pmr-p{font-weight:800;margin-left:auto}
.pmr-act{display:flex;gap:6px;margin-top:9px;flex-wrap:wrap}
.pmr-res{margin-top:8px;font-size:11.5px;font-weight:800;letter-spacing:.08em}
.pmr-res.win{color:var(--good)}.pmr-res.loss{color:#e0655a}.pmr-res.void{color:var(--mut)}
.pmadd{border:1px solid var(--line);border-radius:12px;padding:14px;margin-top:16px;background:rgba(255,255,255,.02)}
.pmadd-h{font-size:12.5px;font-weight:800;margin-bottom:9px}
.pmadd-row{display:flex;gap:8px;margin-bottom:8px}
.pmadd .tinput{width:100%;margin-bottom:8px;padding:10px 12px}
.pmadd-row .tinput{margin-bottom:0}
/* item descriptions — what it is, or exactly how it's earned */
.sh-desc{font-size:11.5px;line-height:1.45;color:var(--mut);margin:4px 0 2px;min-height:26px}
.bg-desc{font-size:11px;line-height:1.4;color:var(--mut);margin:3px 2px 0}
.bg-cell{padding-bottom:6px}
/* ---- first-run welcome ---- */
#li-welcome{text-align:left}
#li-welcome h2{font-size:17px;margin-bottom:4px;text-align:center}
#li-welcome>p{font-size:12.5px;color:var(--mut);text-align:center;margin-bottom:14px}
.wn-step{display:flex;flex-direction:column;gap:3px;padding:10px 12px;margin-bottom:8px;
  border:1px solid var(--line);border-radius:11px;background:rgba(255,255,255,.02)}
.wn-step b{font-size:12.5px;color:var(--gold)}
.wn-step span{font-size:11.5px;line-height:1.5;color:var(--mut)}
#li-welcome button{width:100%;margin-top:8px}
/* ---- shop bar: cosmetics <-> diamonds, the way a game app splits "wear" from "buy with" ---- */
.shopbar{display:flex;align-items:center;gap:8px;margin:14px 0 10px;flex-wrap:wrap}
.shoptab{padding:9px 16px;border-radius:999px;font-family:inherit;font-size:12.5px;font-weight:800;
  cursor:pointer;border:1px solid var(--line);background:transparent;color:var(--mut);
  transition:background .14s,color .14s,border-color .14s}
.shoptab:hover{border-color:rgba(var(--gold-rgb),.5);color:var(--ink)}
.shoptab.on{background:var(--gold);border-color:var(--gold);color:var(--gold-bg)}
.shoptab:focus-visible{outline:2px solid var(--gold);outline-offset:2px}
.shopbar-bal{margin-left:auto;display:flex;gap:10px}
.sb-c{font-size:12px;font-weight:800;font-variant-numeric:tabular-nums;color:var(--ink);
  background:rgba(255,255,255,.05);border:1px solid var(--line);border-radius:999px;padding:5px 11px}
/* the pack that actually covers what they're short */
.store-need{font-size:12px;font-weight:700;color:var(--gold);background:rgba(var(--gold-rgb),.1);
  border:1px solid rgba(var(--gold-rgb),.3);border-radius:9px;padding:8px 11px;margin:8px 0 10px;text-align:center}
.store-card.store-pick{border-color:var(--gold);box-shadow:0 0 0 2px rgba(var(--gold-rgb),.28)}
.loginbox .ghost{background:transparent;border:1px solid var(--line);color:var(--ink)}
/* ---- Clerk block: give it a heading + a real divider so it doesn't float above the form orphaned ---- */
.ck-hd{font-size:15px;font-weight:800;margin:2px 0 12px;color:var(--ink)}
#clerk-btns .btn.wide{width:100%;margin-bottom:8px}
.ck-or{display:flex;align-items:center;gap:10px;margin:16px 0 14px;color:var(--mut);
  font-size:11.5px;font-weight:700;letter-spacing:.1em;text-transform:uppercase}
.ck-or::before,.ck-or::after{content:'';flex:1;height:1px;background:var(--line)}
#li-new h2,#li-login h2{font-size:15px;margin-bottom:4px}
/* ---- "where do you bet?" — replaces the bankroll/book prompt, which asked for work before any value ---- */
.vq{margin:4px 0 12px;text-align:left}
.vq-q{font-size:11.5px;font-weight:700;color:var(--mut);margin-bottom:7px}
.vq-row{display:flex;gap:6px}
.vq-opt{flex:1;padding:9px 4px;font-family:inherit;font-size:11px;font-weight:700;cursor:pointer;
  border-radius:9px;border:1px solid var(--line);background:transparent;color:var(--mut);
  transition:border-color .12s,color .12s,background .12s}
.vq-opt:hover{border-color:rgba(var(--gold-rgb),.5)}
.vq-opt.on{border-color:var(--gold);background:rgba(var(--gold-rgb),.12);color:var(--gold)}
.vq-opt:focus-visible{outline:2px solid var(--gold);outline-offset:2px}
.loginbox h2{font-size:20px;margin:12px 0 6px;color:var(--gold)}
.loginbox p{color:var(--mut);font-size:13px;margin-bottom:16px}
.loginbox input{width:100%;background:var(--bg2);border:1px solid var(--line);border-radius:10px;color:var(--txt);padding:11px 13px;font-size:14px;margin-bottom:10px}
.loginbox button,.btn{background:linear-gradient(135deg,var(--gold),var(--gold2));color:var(--gold-bg);border:none;border-radius:10px;padding:11px 18px;font-size:14px;font-weight:700;cursor:pointer;width:100%}
.li-swap{color:#8fa9ff;cursor:pointer;display:inline-block;padding:8px 4px;font-weight:700;min-height:40px;line-height:24px}
.btn.sm{width:auto;padding:6px 12px;font-size:12px}
.trackrow{display:flex;align-items:center;gap:8px;flex-wrap:wrap;border-top:1px solid #1e2236;padding:10px 0}
/* GAME BLOCK in the active list. Holds every open bet on one game so the matchup is stated once above them
   instead of on each row. Only appears when a game actually carries more than one open bet. */
.trk-gm{border-top:1px solid var(--line);padding-top:2px}
.trk-gm-h{display:flex;align-items:baseline;justify-content:space-between;gap:10px;padding:9px 2px 3px}
.trk-gm-n{font-family:var(--font-display);font-size:13px;font-weight:800;color:var(--txt);letter-spacing:-.01em}
.trk-gm-c{font-size:11px;color:var(--mut);font-variant-numeric:tabular-nums;white-space:nowrap}
.trk-gm .trackrow:first-of-type{border-top:0}
.trackrow.locked{background:var(--surf);border:1px solid #222a44;border-radius:12px;padding:13px 15px;margin:8px 0;align-items:flex-start;gap:14px}
.tr-info{flex:1;min-width:0;display:flex;flex-direction:column;gap:6px}
.tr-side{font-weight:650;font-size:14.5px;color:var(--txt);line-height:1.35}
.tr-badges{display:flex;flex-wrap:wrap;gap:5px;align-items:center}
.tr-meta{color:var(--mut);font-size:11.5px;font-variant-numeric:tabular-nums;letter-spacing:.2px}
.tr-right{display:flex;flex-direction:column;align-items:flex-end;gap:9px;flex:none}
.tr-out{display:flex;align-items:center;gap:8px;white-space:nowrap}
.tr-acts{display:flex;align-items:center;gap:10px}
.histbars{background:var(--bg2);border:1px solid var(--line);border-radius:13px;padding:13px 15px;margin-bottom:16px}
.hb-title{font-size:11px;text-transform:uppercase;letter-spacing:.5px;color:var(--mut);margin-bottom:9px;font-weight:700}
.hb-scroll{overflow-x:auto}
.daygrp{border:1px solid var(--line);border-radius:13px;background:var(--surf);margin-bottom:11px;overflow:hidden}
.dayhdr{display:flex;align-items:center;gap:10px;padding:12px 16px;cursor:pointer;list-style:none;background:var(--surf2)}
.dayhdr::-webkit-details-marker{display:none}
.daygrp[open] .dayhdr .chev{transform:rotate(90deg)}
.dayhdr .chev{color:var(--mut);transition:transform .15s;font-size:11px}
.daydate{font-weight:700;font-size:13.5px;color:var(--gold)}
.daymeta{margin-left:auto;font-size:12px;color:var(--mut);font-variant-numeric:tabular-nums}
.daygrp .trackrow.locked{border:none;border-top:1px solid var(--surf2);border-radius:0;margin:0;background:transparent}
.lk-odds{font-weight:700;color:#e6e6f0;font-size:13px;white-space:nowrap}
.lk-win{font-size:12px;color:var(--txt2);white-space:nowrap}.lk-win b{color:var(--good-hi)}
.mini{background:var(--surf2);border:1px solid var(--line);color:#a5b4fc;border-radius:8px;padding:5px 12px;font-size:12px;cursor:pointer;font-weight:600}
.mini:hover{border-color:#4a5a8c}
.mini.lockbtn{background:linear-gradient(135deg,var(--gold),var(--gold2));color:var(--gold-bg);border:none}
.trackrow .side{font-weight:600;min-width:200px}
.tinput{background:var(--bg2);border:1px solid var(--line);border-radius:8px;color:var(--txt);padding:5px 8px;font-size:13px;width:74px}
.tsel{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:var(--bg2) url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'><path d='M1 1l4 4 4-4' fill='none' stroke='%238b90ad' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/></svg>") no-repeat right 9px center;border:1px solid var(--line);border-radius:8px;color:var(--txt);padding:6px 26px 6px 11px;font-size:12px;font-weight:600;cursor:pointer;transition:border-color .14s}
.tsel:hover{border-color:var(--line3)}.tsel:focus{outline:none;border-color:var(--gold)}
/* ---- unified app controls: consistent fields, custom selects, gold focus — less "raw form", more app ---- */
input[type=text],input[type=number],input[type=password],input[type=search],input:not([type]),textarea{
 background:var(--bg2);border:1px solid var(--line);border-radius:11px;color:var(--txt);font-family:inherit;
 font-size:13.5px;padding:10px 13px;outline:none;transition:border-color .15s,box-shadow .15s}
input:focus,textarea:focus,select:focus,.tinput:focus,.tsel:focus{border-color:var(--gold);box-shadow:0 0 0 3px rgba(var(--gold-rgb),.13)}
input::placeholder,textarea::placeholder{color:#565b78}
select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--bg2);
 background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'><path d='M1 1l4 4 4-4' fill='none' stroke='%238b90ad' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/></svg>");
 background-repeat:no-repeat;background-position:right 11px center;border:1px solid var(--line);border-radius:11px;color:var(--txt);
 font-family:inherit;font-size:13px;font-weight:600;padding:10px 30px 10px 13px;cursor:pointer;outline:none;transition:border-color .15s,box-shadow .15s}
input[type=checkbox]{accent-color:var(--gold);width:15px;height:15px;cursor:pointer}
.pb-form{display:flex;flex-wrap:wrap;gap:10px;align-items:center;margin-top:12px}
.pb-form input{flex:1;min-width:150px}
.btn{transition:transform .12s,box-shadow .15s,filter .15s}
.btn:hover{filter:brightness(1.06)}.btn:active{transform:translateY(1px)}
.card:hover{border-color:#2f3556}
.tsel option{background:var(--surf);color:var(--txt)}
.autog{font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.4px;color:var(--info-hi);background:#0e2a38;border:1px solid #1d4d63;border-radius:6px;padding:2px 6px;vertical-align:middle;cursor:help}
.tlab{font-size:11.5px;color:var(--mut);text-transform:uppercase;letter-spacing:.5px}
.rm{cursor:pointer;color:var(--bad);font-size:12px}
.pl-pos{color:var(--good);font-weight:700}.pl-neg{color:var(--bad);font-weight:700}
.chip .cnt{opacity:.6;font-size:11px}
.chip.jump{background:#15203a;border-color:var(--line3);color:#cdd6f5}.chip.jump:hover{border-color:#4a5a8c}
.jumpbar{overflow-x:auto;-webkit-overflow-scrolling:touch}
/* parent-sport group wrapper — collapses the flat league list into ~10 expandable sports */
.sportgrp{margin:9px 0;border:1px solid var(--line);border-radius:15px;overflow:hidden;background:#0c0e17}
.grphdr{cursor:pointer;list-style:none;display:flex;align-items:center;gap:10px;padding:13px 16px;background:linear-gradient(90deg,#1b2036,var(--bg2))}
.grphdr::-webkit-details-marker{display:none}
.grphdr::before{content:'▸';color:#7a86b8;font-size:12px;transition:transform .15s}
.sportgrp[open]>.grphdr::before{transform:rotate(90deg)}
.grpname{font-weight:800;font-size:17px;letter-spacing:.3px;color:#eaf7ff}
.grpmeta{margin-left:auto;font-size:12px;color:var(--txt2)}
.osportgrp{margin:9px 0;border:1px solid var(--line);border-radius:14px;overflow:hidden;background:#0c0e17}
.osgrp-hdr{cursor:pointer;list-style:none;display:flex;align-items:center;gap:9px;padding:8px 13px;background:linear-gradient(90deg,#1b2036,var(--bg2))}
.osgrp-hdr::-webkit-details-marker{display:none}
.osgrp-hdr::before{content:'▸';color:#7a86b8;font-size:12px;transition:transform .15s}
.osportgrp[open]>.osgrp-hdr::before{transform:rotate(90deg)}
.osgrp-name{font-weight:800;font-size:13.5px;letter-spacing:.03em;color:#eaf7ff;display:inline-flex;align-items:center;gap:7px}
.osgrp-name .ti{width:18px;height:18px;opacity:.85}
.ochip .ti{width:13px;height:13px;opacity:.8;vertical-align:-2px;margin-right:3px}.osgrp-hdr .mut{margin-left:auto;font-size:12px}
.osportgrp .ogrp{margin:0;padding:6px 10px 10px}
.sportgrp>.sport{margin:0;border-radius:0;border-left:none;border-right:none;border-top:none}
.sportgrp>.sport:first-of-type{border-top:1px solid #1e2440}
.sport{margin:10px 0;border:1px solid var(--line);border-radius:13px;overflow:hidden;background:var(--bg2)}
.sporthdr{cursor:pointer;list-style:none;display:flex;align-items:center;gap:10px;padding:12px 15px 12px 26px;background:linear-gradient(90deg,#191d30,var(--bg2))}
.sporthdr::-webkit-details-marker{display:none}
.sportname{font-weight:800;font-size:16px;letter-spacing:.5px}.sportmeta{margin-left:auto;font-size:12px;color:var(--txt2)}
.subcat{border-top:1px solid var(--surf2)}
.subhdr{display:flex;align-items:center;gap:8px;padding:10px 15px;background:var(--bg2);cursor:pointer;list-style:none;user-select:none}
.subhdr::-webkit-details-marker{display:none}
.subhdr:hover{background:#171b2a}
details.subcat[open] .subhdr{background:#171b2a;border-bottom:1px solid var(--surf2)}
.chev{color:var(--mut);font-size:11px;transition:transform .15s;display:inline-block}
details.subcat[open] .chev{transform:rotate(90deg)}
.submeta{margin-left:auto;font-size:11px;color:var(--mut)}
.submeta .n,.sportmeta .n{font-weight:700;color:#c7cde6}.pu{color:var(--mut)}.wr{color:#cdd6f0;font-weight:700}.live-c{color:var(--gold-hi)}
/* ====== StatCluster — calm, scannable record/win%/units/ROI/live atoms (replaces the "·"-separated text run) ====== */
.sc{display:inline-flex;align-items:center;gap:7px;flex-wrap:wrap;justify-content:flex-end;font-variant-numeric:tabular-nums;font-feature-settings:"tnum" 1;line-height:1}
.sc-rec{display:inline-flex;align-items:center;background:#191d2a;border:1px solid var(--line);border-radius:999px;height:21px;padding:0 9px;font-size:12.5px}
.sc-rec b{font-weight:800}
.sc-rec b+b{padding-left:6px;margin-left:5px;border-left:1px solid #2b3048}
.sc-wr{display:inline-flex;align-items:center;gap:6px}
.sc-mtr{width:38px;height:4px;border-radius:4px;background:#20243400;background-color:#242a3d;overflow:hidden;display:inline-block;flex:none}
.sc-mtr>i{display:block;height:100%;border-radius:4px}
.sc-mtr>i.scq-hi{background:var(--good)}.sc-mtr>i.scq-mid{background:#b8912e}.sc-mtr>i.scq-lo{background:var(--bad)}
.sc-wr b{font-size:12.5px;font-weight:700;color:var(--txt)}
.sc-u,.sc-roi{height:21px;display:inline-flex;align-items:center;border-radius:999px;padding:0 9px;font-weight:800;font-size:12px;white-space:nowrap}
.sc-u.pos{color:var(--good);background:rgba(var(--good-rgb),.13)}.sc-u.neg{color:var(--bad);background:rgba(var(--bad-rgb),.13)}.sc-u.flat{color:var(--mut);background:#191d2a}
.sc-roi{padding:0 8px;background:transparent;border:1px solid}
.sc-roi.pos{color:var(--good);border-color:rgba(var(--good-rgb),.42)}.sc-roi.neg{color:var(--bad);border-color:rgba(var(--bad-rgb),.42)}.sc-roi.flat{color:var(--mut);border-color:var(--line)}
.sc-live{display:inline-flex;align-items:center;gap:5px;color:#7fb2ff;font-size:12px;font-weight:600}
.sc-live::before{content:'';width:6px;height:6px;border-radius:50%;background:#4ca6ff;animation:sclivepulse 2s ease-in-out infinite}
.sc-live.pend{font-weight:700}.sc-live.pend::before{content:none}
.sc-pend{color:var(--mut);font-size:12px}
@keyframes sclivepulse{0%,100%{opacity:1}50%{opacity:.4}}
@media(prefers-reduced-motion:reduce){.sc-live::before{animation:none}}
/* calm digits everywhere numbers matter */
.card .v,.pf-stats,.lbtable td,.cmb-rec,.cmb-hero-v,.stat,.grid .v{font-variant-numeric:tabular-nums;font-feature-settings:"tnum" 1}
/* "Show N more" gate on a truncated bet-type leaf */
.pk-more{margin:6px 8px 8px;padding:9px 12px;text-align:center;font-size:12.5px;font-weight:700;color:var(--gold);background:rgba(var(--gold-rgb),.06);border:1px dashed rgba(var(--gold-rgb),.32);border-radius:10px;cursor:pointer;transition:background .15s,border-color .15s}
.pk-more:hover{background:rgba(var(--gold-rgb),.13);border-color:rgba(var(--gold-rgb),.55)}
.sportmeta .pos,.sportmeta .neg,.submeta .pos,.submeta .neg{font-weight:700}
.gapwarn{margin-left:10px;font-size:11.5px;font-weight:700;color:var(--gold-hi);background:rgba(255,180,84,.1);border:1px solid rgba(255,180,84,.3);border-radius:7px;padding:2px 7px;white-space:nowrap;cursor:help}
.tbadge{margin-left:9px;font-size:11.5px;font-weight:800;letter-spacing:.03em;border-radius:6px;padding:2px 7px;white-space:nowrap;cursor:help;vertical-align:middle}
.tbadge.tunv{color:var(--bad-hi);background:rgba(var(--bad-rgb),.12);border:1px solid rgba(var(--bad-rgb),.34)}
.tbadge.thold{color:#9ac4ff;background:rgba(90,160,255,.12);border:1px solid rgba(90,160,255,.32)}
.beta-tag{font-size:11px;font-weight:800;letter-spacing:.06em;color:var(--gold-hi);background:rgba(var(--gold-rgb),.14);border:1px solid rgba(var(--gold-rgb),.34);border-radius:5px;padding:1px 5px;vertical-align:middle;margin-left:5px}
.card.unvcard{border-color:rgba(var(--bad-rgb),.34);background:linear-gradient(135deg,#221722,#181320)}.card.unvcard .k{color:var(--bad-hi)}
.unv-sep{display:flex;flex-direction:column;gap:2px;margin:26px 0 12px;padding:12px 15px;border-radius:12px;border:1px dashed rgba(var(--bad-rgb),.4);background:rgba(var(--bad-rgb),.06)}
.unv-sep-t{font-size:14px;font-weight:800;color:var(--bad-hi);letter-spacing:.02em}
.unv-sep-d{font-size:12px;color:#c99aa6}.unv-sep-d b{color:var(--bad-hi)}
.chatbox{background:var(--bg2);border:1px solid var(--line);border-radius:14px;padding:14px;height:52vh;height:52dvh;overflow-y:auto;display:flex;flex-direction:column;gap:10px}
/* Ask MIDAS as an OVERLAY (Stake-style) — opens over the current page, never navigates */
.chatoverlay{position:fixed;inset:0;z-index:300;background:rgba(4,6,12,.7);backdrop-filter:blur(5px);-webkit-backdrop-filter:blur(5px);display:flex;align-items:center;justify-content:center;padding:20px}
.chatpanel{width:100%;max-width:540px;max-height:88vh;max-height:88dvh;display:flex;flex-direction:column;background:linear-gradient(168deg,var(--surf),var(--bg));border:1px solid var(--line);border-radius:20px;padding:15px 16px 14px;box-shadow:0 40px 100px -30px rgba(0,0,0,.95)}
.chatpanel-hd{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:11px}
.cp-title{font-size:16px;font-weight:800;color:var(--txt)}.cp-sub{font-size:11px;font-weight:400;color:var(--mut)}
.cp-x{background:none;border:none;color:var(--mut);font-size:27px;line-height:1;cursor:pointer;padding:0 4px}.cp-x:hover{color:var(--txt)}
.chatpanel .chatbox{flex:1;height:auto;min-height:220px}
@media(max-width:560px){.chatoverlay{padding:0;align-items:flex-end}.chatpanel{max-width:none;max-height:93vh;max-height:93dvh;border-radius:20px 20px 0 0}}
.msg{max-width:82%;padding:9px 13px;border-radius:14px;font-size:13px;line-height:1.5;white-space:pre-wrap}
.msg.me{align-self:flex-end;background:#243056;color:#eaf0ff;border-bottom-right-radius:4px}
.msg.bot{align-self:flex-start;background:#161a2c;border:1px solid #262c48;border-bottom-left-radius:4px}
.msg .nm{display:block;font-size:11.5px;color:var(--mut);margin-bottom:2px;text-transform:uppercase;letter-spacing:.5px}
.msg.bot .nm{color:var(--gold)}
.chatinput{display:flex;gap:8px;align-items:center;margin-top:10px}
.chatinput #chat-text{flex:1;background:var(--surf);border:1px solid var(--line);border-radius:10px;color:var(--txt);padding:11px 13px;font-size:14px}
.attach{cursor:pointer;font-size:20px;padding:4px 8px;border:1px solid var(--line);border-radius:10px;background:var(--surf)}
#chat-preview img{max-height:60px;border-radius:8px;margin:6px 0;border:1px solid var(--line)}
#chat-preview span{color:var(--bad);cursor:pointer;margin-left:8px;font-size:12px}
/* CONTENT OUTRANKS CHROME. Section headings step up to --fs-6 and nav steps down to --fs-2, so the
   thing you came to read is visibly louder than the thing you used to get there. */
.seghead{font-size:var(--fs-6);font-weight:700;margin:24px 0 10px;letter-spacing:-.01em}
/* ---- Verified public pick ledger ("Track Record" / Proof) ---- */
.pl-hero{display:grid;grid-template-columns:repeat(6,1fr);gap:10px;background:radial-gradient(700px 240px at 8% -30%,rgba(var(--gold-rgb),.10),transparent 60%),linear-gradient(160deg,#161b2c,var(--bg));border:1px solid var(--line);border-radius:18px;padding:20px 22px;margin-bottom:14px}
.pl-hs{display:flex;flex-direction:column;gap:3px}
.pl-hs .k{font-size:11px;letter-spacing:.04em;text-transform:uppercase;color:var(--push);font-weight:600}
.pl-hs .v{font-size:26px;font-weight:850;font-variant-numeric:tabular-nums;letter-spacing:-.6px;line-height:1}
.pl-hs .v.g{background:linear-gradient(120deg,var(--gold-hi),var(--gold));-webkit-background-clip:text;background-clip:text;color:transparent}
.pl-hs .v.pos{color:var(--good)}.pl-hs .v.neg{color:var(--bad)}
.pl-hs .s{font-size:11px;color:#7a80a6}
.pl-method{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-bottom:16px}
.pl-mstep{display:flex;gap:10px;align-items:flex-start;background:var(--bg2);border:1px solid var(--line);border-radius:13px;padding:12px 13px;font-size:12.5px;color:var(--txt2);line-height:1.4}
.pl-mstep b{color:var(--txt)}
.pl-mnum{flex:none;width:22px;height:22px;border-radius:50%;background:linear-gradient(120deg,var(--gold-hi),var(--gold));color:var(--bg);font-weight:800;font-size:12px;display:flex;align-items:center;justify-content:center;margin-top:1px}
.pl-filters{display:flex;flex-wrap:wrap;gap:10px;align-items:center;margin-bottom:12px}
.pl-r{display:flex;flex-direction:column;gap:6px;background:var(--bg2);border:1px solid var(--line);border-left-width:3px;border-radius:12px;padding:12px 14px;margin-bottom:8px}
.pl-r.w{border-left-color:var(--good)}.pl-r.l{border-left-color:var(--bad)}.pl-r.push{border-left-color:var(--push)}
.pl-r-top{display:flex;align-items:center;gap:9px;flex-wrap:wrap}
.pl-badge{flex:none;font-size:11px;font-weight:800;padding:3px 9px;border-radius:7px;letter-spacing:.03em}
.pl-badge.w{background:rgba(var(--good-rgb),.16);color:var(--good)}.pl-badge.l{background:rgba(var(--bad-rgb),.16);color:var(--bad)}.pl-badge.push{background:rgba(139,145,182,.16);color:var(--txt2)}
.pl-play{font-weight:750;font-size:14.5px;color:var(--txt)}
.pl-od{font-variant-numeric:tabular-nums;color:var(--txt2);font-weight:650;font-size:13px}
.pl-sport{font-size:11px;color:var(--push);background:var(--surf);border:1px solid var(--line);padding:2px 8px;border-radius:6px}
.pl-r-mid{font-size:13px;color:#aeb4d6;margin-top:5px}
.pl-r-mid .gm{color:#cbd0ea;font-weight:550}
.pl-r-bot{display:flex;flex-wrap:wrap;gap:12px;font-size:11.5px;color:#7a80a6;margin-top:6px}
.pl-r-bot .fin{color:var(--txt2)}
.pl-lv.pos{color:var(--good)}.pl-lv.neg{color:var(--bad)}
@media(max-width:768px){.pl-hero{grid-template-columns:repeat(3,1fr);row-gap:16px}.pl-method{grid-template-columns:1fr}}
/* ---- Zoo "Top performers" hero (best numbers = the star; green good / red bad) ---- */
/* id beats the .zoo-top CARD-HEADER rule defined later in this sheet. Same specificity meant the later rule
   won and the page-level rail became display:flex -- heading beside the tiles, 5-col winner grid crushed.
   The most winners-forward module on the site was being mis-laid-out by a name collision. */
#zoo-top{display:block;margin:8px 0 18px}
/* Windowed top-performers: 3d / 7d / 30d / lifetime, plus the reversion warning that ships with the
   shorter windows. Scrolls on its own axis so the row never widens the page on a phone. */
.zt-winrow{display:flex;gap:6px;margin:9px 0 11px;overflow-x:auto;-webkit-overflow-scrolling:touch;
  scrollbar-width:none}
.zt-winrow::-webkit-scrollbar{display:none}
.zt-win{flex:0 0 auto;background:transparent;border:1px solid var(--line);color:var(--mut);
  border-radius:999px;padding:5px 12px;font-size:12.5px;font-weight:600;cursor:pointer;white-space:nowrap}
.zt-win:hover{color:var(--ink);border-color:var(--rule-2,var(--line))}
.zt-win.on{color:var(--ink);border-color:rgba(var(--gold-rgb),.5);background:rgba(var(--gold-rgb),.08)}
.zt-warn{font-size:11.5px;line-height:1.5;margin-top:9px;padding:8px 11px;border-radius:8px;
  border:1px solid var(--line);background:rgba(255,255,255,.02)}
.zt-warn b{color:var(--ink)}
.zoo-grouprow{display:flex;gap:8px;margin:2px 0 16px}
.zgbtn{flex:1;text-align:center;padding:10px 12px;border:1px solid var(--line);border-radius:11px;background:var(--bg2);color:#9aa2bd;font-weight:700;font-size:13.5px;cursor:pointer;transition:all .13s;user-select:none}
.zgbtn:hover{border-color:#3a4a6c;color:#cdd6f5}
.zgbtn.on{background:linear-gradient(135deg,rgba(127,90,240,.22),rgba(var(--good-rgb),.1));border-color:#7f5af0;color:#fff}
.zt-lead{font-size:13px;color:var(--txt2);margin-bottom:10px}
.zt-grid{display:grid;grid-template-columns:repeat(5,1fr);gap:10px}
.zt-card{position:relative;background:linear-gradient(160deg,var(--surf),var(--bg2));border:1px solid #262b45;border-radius:15px;padding:14px 13px 13px;transition:transform .12s,border-color .12s}
.zt-card:hover{transform:translateY(-2px);border-color:#3a4166}
.zt-flag{background:radial-gradient(360px 140px at 20% -40%,rgba(var(--gold-rgb),.14),transparent 60%),linear-gradient(160deg,#191d30,var(--bg2));border-color:#3a3f66}
.zt-rank{position:absolute;top:10px;right:12px;font-size:12px;font-weight:800;color:var(--push)}
.zt-star{position:absolute;top:9px;right:11px;color:var(--gold);font-size:14px}
.zt-name{font-size:13px;font-weight:700;color:var(--txt);margin-bottom:8px;display:flex;align-items:center;gap:5px;padding-right:16px;line-height:1.2}
.zt-e{font-size:15px}
.zt-badge{font-size:11px;font-weight:800;letter-spacing:.05em;background:linear-gradient(120deg,var(--gold-hi),var(--gold));color:var(--bg);padding:2px 6px;border-radius:5px}
.zt-u{font-size:26px;font-weight:850;font-variant-numeric:tabular-nums;letter-spacing:-.6px;line-height:1}
.zt-u.pos{color:var(--good)}.zt-u.neg{color:var(--bad)}
.zt-sub{font-size:11.5px;color:#9096ba;margin-top:5px}
.zt-sub .pos{color:var(--good)}.zt-sub .neg{color:var(--bad)}
@media(max-width:768px){.zt-grid{grid-template-columns:repeat(2,1fr)}}
.port{position:relative;overflow:hidden;background:radial-gradient(760px 260px at 6% -34%,rgba(var(--gold-rgb),.11),transparent 62%),linear-gradient(160deg,#171c2f,var(--bg));border:1px solid var(--line);border-radius:22px;padding:24px 26px 12px;margin-bottom:22px;box-shadow:0 30px 70px -40px rgba(0,0,0,.95)}
.port::before{content:'';position:absolute;left:0;right:0;top:0;height:1px;background:linear-gradient(90deg,transparent,rgba(var(--gold-rgb),.5),transparent)}
.port-label{font-size:11px;color:var(--goldsoft);letter-spacing:1.5px;text-transform:uppercase;font-weight:600}
.port-big{font-size:56px;font-weight:850;letter-spacing:-2.5px;margin:6px 0 7px;line-height:1;width:fit-content}
.port-big.pos{background:linear-gradient(120deg,var(--good-hi),var(--good));-webkit-background-clip:text;background-clip:text;color:transparent;filter:drop-shadow(0 3px 22px rgba(var(--good-rgb),.32))}
.port-big.neg{background:linear-gradient(120deg,var(--bad-hi),var(--bad));-webkit-background-clip:text;background-clip:text;color:transparent;filter:drop-shadow(0 3px 22px rgba(var(--bad-rgb),.28))}
.port-big .u{font-size:26px;font-weight:700;margin-left:2px;opacity:.6}
.port-sub{font-size:13px;color:var(--mut);max-width:62ch}.port-sub .pos,.port-sub .neg{font-weight:700}
/* demoted, always-tagged shadow P&L — size = trustworthiness (Fable design spec) */
.shadowline{margin-top:16px;font-size:12.5px;color:var(--mut);font-variant-numeric:tabular-nums;display:flex;flex-wrap:wrap;align-items:center;gap:7px}
.shadowline .pos{color:var(--good);font-weight:700}.shadowline .neg{color:var(--bad);font-weight:700}
.unproven{font-size:11px;font-weight:800;letter-spacing:.5px;text-transform:uppercase;background:#20233a;color:var(--mut);border:1px solid #333a56;border-radius:6px;padding:2px 7px}
.sitefoot{max-width:1180px;margin:44px auto 26px;padding:22px 22px 0;border-top:1px solid var(--line);text-align:center}
/* THE COMPLIANCE ROW IS NOT NEGOTIABLE and does not collapse: 21+, 1-800-GAMBLER, RG, Terms,
   Privacy stay visible on every page. The long disclaimer and the data attributions sit behind an
   expander instead of eating most of a phone screen on every view -- published, one tap away, and
   no longer competing with the product. */
.sitefoot .foot-rg{font-size:var(--fs-2);line-height:1.7}
.foot-more{margin:10px auto 0;max-width:640px;text-align:left}
.foot-more>summary{cursor:pointer;list-style:none;text-align:center;font-size:var(--fs-1);
  color:var(--mut);padding:6px 0}
.foot-more>summary::-webkit-details-marker{display:none}
.foot-more>summary::after{content:' \25be'}
.foot-more[open]>summary::after{content:' \25b4'}
.foot-more .foot-disc,.foot-more .foot-attr{font-size:var(--fs-1);color:var(--mut);line-height:1.6;
  margin:8px 0 0}
.foot-disc{font-size:11.5px;color:#6f7498;line-height:1.65;max-width:830px;margin:0 auto 11px}
.foot-rg{font-size:12px;color:var(--mut);font-weight:600}.foot-rg a{color:var(--blue2);text-decoration:none}.foot-rg a:hover{text-decoration:underline}
.picksflag{font-size:11px;font-weight:800;letter-spacing:.5px;text-transform:uppercase;color:var(--mut);background:var(--surf2);border:1px solid var(--line);border-radius:7px;padding:5px 10px;display:inline-block;margin-bottom:14px}
.picksflag-foot{display:block;margin:22px 0 2px;background:transparent;border:0;border-top:1px solid var(--line);border-radius:0;padding:12px 0 0;color:#6f748f;text-align:center;letter-spacing:.4px}
/* motion: precise, not playful (fade-up on load, staggered cards) */
@keyframes fadeUp{from{opacity:0;transform:translateY(9px)}to{opacity:1;transform:none}}
.port-big{animation:fadeUp .5s cubic-bezier(.2,.7,.2,1) both}
.grid>.card,.layers>*{animation:fadeUp .42s cubic-bezier(.2,.7,.2,1) both}
.grid>.card:nth-child(2),.layers>*:nth-child(2){animation-delay:.04s}
.grid>.card:nth-child(3),.layers>*:nth-child(3){animation-delay:.08s}
.grid>.card:nth-child(4),.layers>*:nth-child(4){animation-delay:.12s}
.grid>.card:nth-child(n+5),.layers>*:nth-child(n+5){animation-delay:.16s}
/* tables: tabular numbers + subtle zebra + tidy header (Fable spec §3) */
table{font-variant-numeric:tabular-nums}
.lbtable tbody tr:nth-child(even) td,.crtable tr:nth-child(even) td,.jtable tr:nth-child(even) td{background:rgba(255,255,255,.018)}
/* The blanket `*{animation:none!important}` that lived here was removed 2026-08-16. `animation` is a
   SHORTHAND, so it also set animation-name:none. That killed every animation outright and made the
   twenty-plus deliberate, targeted reduced-motion rules elsewhere in this sheet dead code: they could
   never do anything the blanket had not already done more bluntly.
   The three-tier block near the end of this stylesheet governs reduced motion now: durations clamped to
   120ms, iteration counts capped at 1 so nothing can loop, movement removed, colour and opacity kept
   because they carry meaning. Skeleton shimmer is still stopped there, deliberately and by name, since a
   skeleton communicates "loading" through its SHAPE and the shimmer on top of it is decoration. */
.port-chart{margin-top:18px}
.chartwrap{position:relative;width:100%}
.chartwrap svg{display:block}
.yax{position:absolute;left:0;font-size:11.5px;font-weight:600;color:#7a80a0;font-variant-numeric:tabular-nums;background:rgba(9,11,20,.55);padding:0 5px;border-radius:5px;transform:translateY(-50%);pointer-events:none;letter-spacing:.2px}
.yax.yzero{color:var(--txt2)}
.chartend{position:absolute;right:6px;font-size:12px;font-weight:800;padding:2px 9px;border-radius:9px;transform:translateY(-50%);pointer-events:none;white-space:nowrap;box-shadow:0 4px 14px -6px rgba(0,0,0,.8)}
.chartend.pos{background:var(--good-bg);color:var(--good-hi)}.chartend.neg{background:var(--bad-bg);color:var(--bad-hi)}
.layers{display:grid;grid-template-columns:repeat(auto-fill,minmax(210px,1fr));gap:12px}
.bestgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:12px}
.bcard{position:relative;background:linear-gradient(165deg,#141c1a,#101614);border:1px solid var(--good-bg);border-radius:16px;padding:14px 15px;transition:transform .16s,border-color .16s}
.bcard.soft{background:linear-gradient(165deg,#1a1620,#141019);border-color:#3a2440}
.bcard:hover{transform:translateY(-3px)}
.bctop{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px}
.bcsport{font-size:14px;font-weight:700;color:var(--txt)}
.bctag{font-size:11px;font-weight:800;letter-spacing:.08em;text-transform:uppercase;color:var(--good-hi);background:rgba(var(--good-rgb),.12);border:1px solid rgba(var(--good-rgb),.3);border-radius:6px;padding:2px 7px}
.bcard.soft .bctag{color:#c79ad8;background:rgba(199,154,216,.1);border-color:rgba(199,154,216,.28)}
.bcbest{display:flex;justify-content:space-between;align-items:baseline;gap:8px}
.bcbt{font-size:16px;font-weight:800;color:#f2f6ff}
.bcnet{font-size:17px;font-weight:800;font-variant-numeric:tabular-nums}
.bcsub{font-size:11px;color:var(--push);margin-top:2px}
.bcmore{margin-top:9px}
.bcmore>summary{cursor:pointer;list-style:none;font-size:11px;color:var(--mut);padding:3px 0}
.bcmore>summary::-webkit-details-marker{display:none}
.bcmore>summary:hover{color:var(--txt)}
.bcothers{display:flex;flex-wrap:wrap;gap:5px;margin-top:10px;padding-top:9px;border-top:1px solid rgba(255,255,255,.06)}
.bcm{font-size:11.5px;font-weight:600;color:var(--txt2);background:rgba(255,255,255,.04);border-radius:6px;padding:2px 7px;font-variant-numeric:tabular-nums}
.bcm .bcmn{color:var(--faint);font-weight:500;margin-left:3px}
.layer{position:relative;overflow:hidden;background:linear-gradient(165deg,#161a2b,#111420);border:1px solid var(--line);border-radius:16px;padding:15px 16px;transition:transform .16s,border-color .16s,box-shadow .16s}
.layer:hover{transform:translateY(-3px);border-color:var(--line3);box-shadow:0 20px 44px -28px rgba(0,0,0,.92)}
.layer.up::before,.layer.down::before{content:'';position:absolute;left:0;top:0;height:100%;width:3px;border-radius:3px}
.layer.up::before{background:linear-gradient(var(--good),#0c6f4a)}.layer.down::before{background:linear-gradient(var(--bad),#7a1226)}
.layer.up:hover{box-shadow:0 20px 46px -26px rgba(var(--good-rgb),.34)}
.layer.clickable{cursor:pointer}
.layer.clickable::after{content:'⤢';position:absolute;top:9px;right:11px;font-size:11px;color:var(--mut);opacity:0;transition:opacity .15s}
.layer.clickable:hover::after{opacity:.7}
.lrow{display:flex;align-items:center;justify-content:space-between}
.lname{font-weight:700;font-size:14px}.lnet{font-weight:800;font-size:17px}
.idlefold{margin-top:12px}
.idlefold summary{cursor:pointer;list-style:none;color:var(--mut);font-size:12px;padding:8px 13px;border:1px dashed var(--line);border-radius:11px;display:inline-block;transition:color .14s,border-color .14s}
.idlefold summary::-webkit-details-marker{display:none}
.idlefold summary:hover{color:var(--txt);border-color:var(--line3)}
/* The edge section leads the Overview, so it gets the only accent rule on the page — everything below it is
   reference material. Both folds reuse the .idlefold dashed-summary pattern so "there is more here" reads the
   same way everywhere rather than inventing a second disclosure language. */
.edgehead{margin-top:4px}
.edgesum{font-size:13px;color:var(--mut);margin:2px 0 13px;padding-left:11px;border-left:3px solid var(--good)}
.edgesum b{color:var(--txt);font-size:15px}
.softfold,.breakfold{margin-top:15px}
.breakfold{border-top:1px solid #1e2338;padding-top:15px}
.softfold .bestgrid,.breakfold .seghead{margin-top:13px}
.idlewrap{display:flex;flex-wrap:wrap;gap:7px;margin-top:11px}
.idlechip{font-size:11px;color:#7d83a0;background:var(--bg2);border:1px solid var(--line);border-radius:8px;padding:5px 10px}
.lspark{height:40px;margin:9px 0 5px}.lsub{font-size:12px;color:var(--mut)}
.dotc{display:inline-block;width:9px;height:9px;border-radius:3px;margin-right:6px;vertical-align:middle}
.pdate{font-size:11.5px;color:var(--mut);background:var(--surf2);padding:2px 6px;border-radius:6px;margin-right:2px;font-variant-numeric:tabular-nums}
.pstart{font-size:11.5px;color:var(--blue2);background:#1a2440;padding:2px 7px;border-radius:6px;margin-right:2px;white-space:nowrap}
.pstart.done{color:var(--mut);background:var(--surf2)}
/* My Tracker portfolio header */
.bankhero{position:relative;overflow:hidden;background:radial-gradient(640px 220px at 6% -34%,rgba(var(--gold-rgb),.10),transparent 62%),linear-gradient(160deg,#161c2f,var(--bg));border:1px solid var(--line);border-radius:20px;padding:22px 24px;margin-bottom:14px;box-shadow:0 26px 64px -40px rgba(0,0,0,.95)}
/* Pikkit-style toggle hero: one big number, flip metric x timeframe */
.dash-hero{background:linear-gradient(160deg,#141a2b,var(--bg));border:1px solid #232a45;border-radius:18px;padding:16px 18px 15px;margin-bottom:14px}
.dh-top{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap;margin-bottom:6px}
.dh-metrics,.dh-tfs{display:flex;gap:5px}
.dh-chip{font-size:11.5px;font-weight:700;color:var(--mut);background:rgba(255,255,255,.04);border:1px solid transparent;border-radius:999px;padding:5px 11px;cursor:pointer;transition:all .12s}
.dh-chip:hover{color:var(--txt)} .dh-chip.on{color:var(--bg);background:var(--gold);border-color:var(--gold)}
.dh-tfs .dh-chip.on{background:var(--blue2,var(--blue2));color:var(--bg)}
.dh-big{font-size:46px;font-weight:800;line-height:1.05;letter-spacing:-.5px;font-variant-numeric:tabular-nums;margin:2px 0 3px}
.dh-sub{display:flex;align-items:center;justify-content:space-between;gap:10px;font-size:12px}
.dh-rec{font-weight:700;font-variant-numeric:tabular-nums;color:var(--mut)}
body.theme-light .dash-hero{background:linear-gradient(160deg,#fbfcfe,#f2f5fb);border-color:#dde3f1}
.bankhero::before{content:'';position:absolute;left:0;right:0;top:0;height:1px;background:linear-gradient(90deg,transparent,rgba(var(--gold-rgb),.5),transparent)}
.bankhero .bk-lab{font-size:11px;color:var(--goldsoft);letter-spacing:1.5px;text-transform:uppercase;font-weight:600}
.bankhero .bk-big{font-size:46px;font-weight:850;letter-spacing:-1.5px;margin:4px 0 5px;line-height:1;width:fit-content}
.bankhero .bk-big.pos{background:linear-gradient(120deg,var(--good-hi),var(--good));-webkit-background-clip:text;background-clip:text;color:transparent;filter:drop-shadow(0 3px 20px rgba(var(--good-rgb),.30))}
.bankhero .bk-big.neg{background:linear-gradient(120deg,var(--bad-hi),var(--bad));-webkit-background-clip:text;background-clip:text;color:transparent}
.trk-lbl{font-size:12px;font-weight:700;letter-spacing:.6px;text-transform:uppercase;color:var(--txt2);margin:14px 2px 7px}
.srcb{font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.5px;padding:2px 7px;border-radius:7px;vertical-align:middle;white-space:nowrap}
.srcb.midas{background:linear-gradient(135deg,var(--gold-bg),var(--gold-bg));color:var(--gold);border:1px solid var(--gold-bg)}
.srcb.personal{background:#12233f;color:#7fb0ff;border:1px solid #274a72}
.livechip{font-size:11.5px;font-weight:700;color:var(--bad-hi);background:var(--bad-bg);border:1px solid var(--bad-bg);border-radius:7px;padding:2px 7px;vertical-align:middle;white-space:nowrap;animation:livepulse 2.2s ease-in-out infinite}
.parlaytag{font-size:11px;font-weight:800;letter-spacing:.5px;padding:2px 7px;border-radius:7px;background:#2f2450;color:#c4b5fd;vertical-align:middle}
.parlaytag.bad{background:rgba(var(--bad-rgb),.16);color:var(--bad-hi);border:1px solid rgba(var(--bad-rgb),.4)}
.slipwarn{margin:7px 0 4px;padding:9px 11px;background:rgba(255,180,84,.1);border:1px solid rgba(255,180,84,.4);border-radius:9px;color:var(--gold-hi);font-size:12px;line-height:1.5}
.slipwarn b{color:var(--gold-hi)}
.ts-row.ts-warn{border-left:3px solid var(--gold-hi);padding-left:8px}
.tmg{font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.4px;padding:2px 7px;border-radius:7px;vertical-align:middle;white-space:nowrap;margin-left:2px}
.tmg-pre{background:#16233a;color:#8fb3e6}
.tmg-live{background:var(--bad-bg);color:var(--bad-hi);border:1px solid var(--bad-bg)}
.tmg-set{background:#20233a;color:#a6accb}
.vbadge{font-weight:800}
.vbadge.vpre{background:var(--good-bg);color:var(--good-hi);border:1px solid #1c5c39}
.vbadge.vlive{background:var(--bad-bg);color:var(--bad-hi);border:1px solid var(--bad-bg)}
.vbadge.vself{background:#20233a;color:#9298bb;border:1px dashed var(--line3)}
.tmg.bonusb{background:var(--good-bg);color:var(--good-hi)}
.tmg.boostb{background:var(--gold-bg);color:var(--gold-hi)}
.bbtog{display:inline-flex;align-items:center;gap:4px;font-size:11px;color:var(--txt2);white-space:nowrap;cursor:pointer}
.bbtog input{margin:0;accent-color:var(--gold-hi)}
.setl{margin-top:7px;padding:7px 10px;background:#0f1626;border:1px solid #1e2a44;border-radius:8px;color:#9fb4dc;font-size:12px;line-height:1.5}
.setl b{color:#c3d0ee}
.setlmini{font-size:11px;color:var(--mut)}
.badge.res-cash{background:#243044;color:#a9c6f0}
.sc-league{margin-bottom:22px}
.sc-lhd{font-weight:800;font-size:14px;letter-spacing:.3px;margin-bottom:10px;color:var(--gold)}
.sc-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:12px}
.sc-card{border:1px solid var(--line);border-radius:12px;background:var(--surf);padding:11px 13px}
/* LIVE prediction-market price strip (Polymarket) on an in-play scorecard */
.pml{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:7px 0 2px;padding:6px 8px;
     border:1px solid var(--line);border-radius:8px;background:var(--bg2,rgba(127,127,127,.06))}
.pml-lbl{font-size:11px;font-weight:800;letter-spacing:.09em;color:var(--mut);white-space:nowrap}
.pml-c{display:flex;align-items:baseline;gap:5px;min-width:0}
.pml-t{font-size:11px;color:var(--mut);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:82px}
.pml-v{font-size:13px;font-weight:800;font-variant-numeric:tabular-nums}
.pml-v.pml-hi{color:var(--pos,#1C7A52)} .pml-v.pml-lo{color:var(--neg,#BC3B2E)}
.pml-src{margin-left:auto;font-size:11px;color:var(--mut);text-decoration:none;white-space:nowrap}
.pml-src:hover{text-decoration:underline}
.sc-card.sc-mine{border-color:var(--gold-bg);box-shadow:0 0 0 1px #6a551855}
.sc-stat{font-size:11px;font-weight:700;margin-bottom:8px;display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.sc-live{color:var(--bad-hi)}.sc-fin{color:var(--mut)}.sc-pre{color:var(--blue2)}
.sc-badge{font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.4px;background:var(--gold-bg);color:var(--gold-hi);border-radius:6px;padding:2px 6px}
.sc-tm{display:flex;align-items:center;gap:8px;padding:3px 0;color:var(--txt2)}
.sc-tm.scw{color:#fff;font-weight:700}
.sc-ab{font-size:11.5px;font-weight:800;width:40px;color:var(--txt2);flex:none}
.sc-nm{flex:1;font-size:13px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.sc-sco{font-weight:800;font-size:16px;font-variant-numeric:tabular-nums;min-width:24px;text-align:right}
.lb-controls{display:flex;flex-wrap:wrap;gap:10px;margin-bottom:18px}
.segrp{display:inline-flex;background:var(--bg2);border:1px solid var(--line);border-radius:11px;padding:3px;gap:2px}
.segbtn{border:none;background:transparent;color:var(--txt2);font-size:12.5px;font-weight:600;padding:7px 15px;border-radius:8px;cursor:pointer;transition:background .15s,color .15s;font-family:inherit}
.segbtn:hover{color:var(--txt2)}
.segbtn.on{background:var(--gold);color:var(--gold-bg)}
.lbwrap{overflow-x:auto;border:1px solid var(--line);border-radius:14px}
.lbtable{width:100%;border-collapse:collapse;font-size:13px}
.lbtable th{text-align:left;color:var(--mut);font-size:11px;text-transform:uppercase;letter-spacing:.4px;padding:10px 14px;border-bottom:1px solid var(--line)}
.lbtable td{padding:11px 14px;border-bottom:1px solid var(--surf2);font-variant-numeric:tabular-nums}
.lbtable tr:last-child td{border-bottom:none}
.lbtable tbody tr:hover td,.lbtable tr:hover td{background:var(--bg2)}
/* clickable table rows (e.g. Trends → By bet type → drill into those bets) */
.clk-row{cursor:pointer}
.clk-row:hover td{background:rgba(var(--gold-rgb),.06)}
.clk-caret{color:var(--gold);font-weight:800;opacity:.55;margin-left:2px}
.clk-row:hover .clk-caret{opacity:1}
.lbrank{font-weight:800;color:var(--gold);width:38px}
/* ---- research center ---- */
.rc-card{background:var(--surf);border:1px solid var(--line);border-radius:14px;padding:16px;margin-bottom:14px}
.rc-h{font-weight:750;font-size:14px;margin-bottom:10px;color:var(--gold)}
.rc-phead{display:flex;align-items:center;gap:14px;margin:4px 0 14px}
.rc-phs{width:64px;height:64px;border-radius:50%;object-fit:cover;object-position:top;background:var(--bg2);border:1px solid var(--line);flex:none}
.rc-pn{font-size:20px;font-weight:800}
.rc-hs{width:30px;height:30px;border-radius:50%;object-fit:cover;object-position:top;flex:none;background:var(--bg2)}
.rc-hs0{display:inline-block}
.rc-hit-n{font-weight:600}.rc-hit-t{margin-left:auto;font-size:11.5px}
.rc-scroll{overflow-x:auto;-webkit-overflow-scrolling:touch;border-radius:8px}
.rc-stat{font-size:12px;white-space:nowrap;font-variant-numeric:tabular-nums;min-width:100%}
.rc-stat th{position:sticky;top:0;background:var(--surf);font-size:11.5px;padding:6px 8px;text-align:right}
.rc-stat th:first-child,.rc-stat th:nth-child(2){text-align:left}
.rc-stat td{padding:5px 8px;border-bottom:1px solid var(--surf2);text-align:right}
.rc-stat td:first-child,.rc-stat td:nth-child(2){text-align:left}
.rc-stat .rc-tot td{border-top:2px solid var(--line);background:rgba(var(--gold-rgb),.05)}
.rc-hstat{vertical-align:top;font-weight:800;border-right:1px solid var(--surf2);background:rgba(255,255,255,.015)}
.rc-gday{margin-bottom:12px}
.rc-gd-h{font-size:12.5px;font-weight:700;margin-bottom:5px;color:var(--txt2)}
.rc-gd-h .mut{font-weight:400}
.trk-grp{margin-bottom:12px}
.trk-gh{font-size:11.5px;font-weight:700;color:#aeb4d0;margin-bottom:7px}
.trk-chips{display:flex;flex-wrap:wrap;gap:7px}
.trk-chip{display:inline-flex;align-items:center;gap:5px;font-size:12px;font-weight:600;padding:6px 11px;border-radius:999px;cursor:pointer;border:1px solid var(--line);background:var(--bg2);transition:border-color .12s}
.trk-chip:hover{border-color:var(--line3)}
.trk-chip b{font-weight:800;font-variant-numeric:tabular-nums}
.trk-chip.hot{border-color:rgba(var(--good-rgb),.35)}.trk-chip.hot b{color:var(--good)}
.trk-chip.cold{border-color:rgba(var(--bad-rgb),.32)}.trk-chip.cold b{color:var(--bad)}
.rc-kpis{display:grid;grid-template-columns:repeat(4,1fr);gap:10px;margin-bottom:12px}
.rc-kpi{background:var(--bg2);border:1px solid var(--line);border-radius:11px;padding:10px 12px}
.rc-kpi .mut{font-size:11.5px;text-transform:uppercase;letter-spacing:.4px}
.rc-kpi>div:last-child{font-size:18px;font-weight:800;font-variant-numeric:tabular-nums;margin-top:2px}
.rc-formrow{display:flex;align-items:center;gap:5px;flex-wrap:wrap;margin:2px 0 2px}
.fchip{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;border-radius:6px;font-size:11px;font-weight:800}
.fchip.fW{background:rgba(var(--good-rgb),.14);color:var(--good)}.fchip.fL{background:rgba(var(--bad-rgb),.14);color:var(--bad)}.fchip.fT{background:rgba(var(--push-rgb),.14);color:var(--mut)}
.rc-grid2{display:grid;grid-template-columns:1fr 1fr;gap:14px}
/* ---- Research Center hero + mode picker (make the tool self-explanatory) ---- */
.rc-hero{background:radial-gradient(120% 140% at 0% 0%,rgba(var(--gold-rgb),.10),transparent 55%),linear-gradient(160deg,var(--surf),var(--bg2));border:1px solid var(--line);border-radius:16px;padding:18px 20px;margin-bottom:16px}
.rc-hero-t{font-size:20px;font-weight:800;letter-spacing:-.01em}
.rc-hero-s{font-size:13px;color:var(--mut);margin-top:6px;max-width:640px;line-height:1.5}
.rc-modes{display:grid;grid-template-columns:repeat(4,1fr);gap:10px;margin-bottom:16px}
.rc-modecard{display:flex;flex-direction:column;align-items:flex-start;gap:3px;text-align:left;background:var(--surf);border:1px solid var(--line);border-radius:13px;padding:12px 13px;cursor:pointer;transition:border-color .15s,transform .12s,background .15s;color:inherit}
.rc-modecard:hover{transform:translateY(-2px);border-color:var(--line3)}
.rc-modecard.on{border-color:var(--gold);background:rgba(var(--gold-rgb),.07);box-shadow:inset 0 0 0 1px rgba(var(--gold-rgb),.4)}
.rc-mc-ic{font-size:19px;line-height:1}
.rc-mc-n{font-size:13.5px;font-weight:750;margin-top:2px}
.rc-mc-d{font-size:11px;color:var(--mut);line-height:1.35}
.rc-modecard.on .rc-mc-n{color:var(--gold)}
.rc-howto{font-size:12px;color:var(--mut);background:rgba(var(--info-rgb),.06);border:1px solid rgba(var(--info-rgb),.16);border-radius:10px;padding:9px 12px;margin-bottom:12px;line-height:1.45}
.rc-howto b{color:var(--txt)}
@media(max-width:640px){.rc-kpis{grid-template-columns:repeat(2,1fr)}.rc-grid2{grid-template-columns:1fr}.rc-modes{grid-template-columns:repeat(2,1fr)}}
.rc-hits{border:1px solid var(--line);border-radius:10px;overflow:hidden;margin:6px 0 14px;max-width:360px}
.rc-hit{display:flex;align-items:center;gap:10px;padding:9px 12px;cursor:pointer;font-size:13px;border-bottom:1px solid var(--surf2)}
.rc-hit:last-child{border-bottom:none}.rc-hit:hover{background:var(--bg2)}
.rc-mkts{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:16px}
.rc-mkt{border:1px solid var(--line);background:var(--bg2);color:var(--txt2);font:inherit;font-size:12.5px;font-weight:600;padding:8px 13px;border-radius:10px;cursor:pointer;transition:border-color .14s}
.rc-mkt:hover{border-color:var(--gold)}.rc-mkt.on{background:var(--gold);color:var(--gold-bg);border-color:var(--gold)}
/* ---- The Zoo ---- */
.zoo-controls{margin-bottom:16px}
/* Ideas Box — request a bot */
.ideabox{margin-top:26px;background:linear-gradient(165deg,rgba(var(--gold-rgb),.06),var(--surf) 60%);border:1px solid var(--line);border-radius:18px;padding:16px 18px}
.idea-h{font-size:14px;margin-bottom:11px}.idea-h b{color:var(--txt)}.idea-h .mut{font-size:12px}
.idea-form{display:flex;gap:9px;align-items:flex-start;flex-wrap:wrap}
.idea-ta{flex:1;min-width:220px;min-height:46px;max-height:120px;resize:vertical;background:var(--surf2);border:1px solid var(--line);border-radius:11px;padding:10px 12px;color:var(--txt);font:inherit;font-size:13px}
.idea-ta:focus{outline:none;border-color:var(--gold)}
.idea-send{flex:none;font-size:12.5px;font-weight:800;color:var(--bg);background:var(--gold);border:none;border-radius:11px;padding:11px 16px;cursor:pointer}
.idea-send:active{transform:scale(.96)}
.idea-err{color:var(--bad);font-size:12px;margin-top:7px}
.idea-list{display:flex;flex-direction:column;gap:8px;margin-top:14px}
.idea-row{display:flex;gap:11px;align-items:flex-start;padding:9px 2px;border-top:1px solid rgba(255,255,255,.05)}
.idea-vote{flex:none;display:flex;flex-direction:column;align-items:center;gap:1px;min-width:40px;font-size:12px;font-weight:800;color:var(--mut);background:var(--surf2);border:1px solid var(--line);border-radius:9px;padding:5px 0;cursor:pointer;line-height:1}
.idea-vote span{font-size:13px}.idea-vote.on{color:var(--gold);border-color:var(--gold);background:rgba(var(--gold-rgb),.12)}
.idea-vote:active{transform:scale(.94)}
.idea-txt{flex:1;font-size:13px;line-height:1.4;color:var(--txt)}
.idea-by{font-size:11px;margin-top:3px}.idea-del{cursor:pointer;text-decoration:underline}.idea-del:hover{color:var(--bad)}
body.theme-light .ideabox{background:linear-gradient(165deg,rgba(214,158,46,.08),var(--surf) 60%)}
.zoo-chiprow{display:flex;flex-wrap:wrap;gap:6px;align-items:center}
/* Unit size sits ON the tracker, directly under the bankroll hero — the scale and the numbers it scales
   belong on the same screen. Deliberately quiet: one row, one note, no card chrome competing with the hero. */
.unitbox{margin:12px 0 4px;padding:12px 14px;border:1px solid var(--line);border-radius:13px;background:var(--bg2,var(--bg2))}
.ub-row{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.ub-lab{font-size:11px;font-weight:800;letter-spacing:.10em;text-transform:uppercase;color:var(--mut)}
.ub-in{display:inline-flex;align-items:center;gap:5px}
.ub-in .tinput{width:120px;margin-bottom:0}
.ub-clr{padding:6px 11px;font-size:12px}
.ub-note{font-size:12px;color:var(--mut);margin-top:9px;line-height:1.55}
.ub-note b{color:var(--txt)}
.setbtn{display:inline-flex;align-items:center;gap:7px;cursor:pointer;font-size:13px;font-weight:600;
 padding:9px 14px;border-radius:11px;background:var(--surf2,#171b28);border:1px solid var(--line);color:var(--txt)}
.xtag{display:inline-block;font-size:11px;font-weight:800;letter-spacing:.05em;text-transform:uppercase;
 padding:2px 6px;border-radius:6px;margin-left:6px;background:rgba(124,131,255,.13);color:#9aa3ff;
 border:1px solid rgba(124,131,255,.28);vertical-align:middle}
.unv-note{font-size:11.5px;line-height:1.6;color:var(--mut);background:var(--bg2,var(--bg2));
 border:1px solid var(--line);border-radius:11px;padding:10px 12px;margin-top:10px}
.ref-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-bottom:9px}
.ref-list{margin-top:12px;border:1px solid var(--line);border-radius:11px;overflow:hidden}
.ref-hd{font-size:11px;font-weight:800;letter-spacing:.07em;text-transform:uppercase;color:var(--mut);
 padding:8px 12px;border-bottom:1px solid var(--line)}
.ref-item{display:flex;justify-content:space-between;gap:10px;padding:9px 12px;font-size:13px;
 border-bottom:1px solid var(--line)}
.daygrp.deck{transition:border-color .18s ease}
.daygrp.deck-pos{border-color:rgba(var(--good-rgb),.24)}
.daygrp.deck-neg{border-color:rgba(var(--bad-rgb),.22)}
.decknet{font-weight:800;font-size:13.5px;font-variant-numeric:tabular-nums;margin-left:auto;padding-right:10px}
/* html L476 */
.mailwrap{display:grid;grid-template-columns:minmax(0,340px) minmax(0,1fr);gap:14px}
/* html L478 */
.mailcol{background:var(--surf);border:1px solid var(--line);border-radius:13px;overflow:hidden}
/* html L479 */
.mailhd{padding:10px 13px;background:var(--surf2);border-bottom:1px solid var(--line);font-weight:700;font-size:12.5px;
  display:flex;justify-content:space-between;align-items:center;gap:8px}
/* html L481 */
.mailrow{padding:10px 13px;border-bottom:1px solid var(--line);cursor:pointer}
/* html L483 */
.mailfrom{font-weight:600;font-size:12.5px}
/* html L484 */
.mailsubj{font-size:12px;color:var(--txt);margin-top:2px}
/* html L485 */
.mailmeta{font-size:11.5px;color:var(--mut);margin-top:3px;display:flex;gap:6px;flex-wrap:wrap}
/* html L486 */
.mtag{background:#222840;border-radius:5px;padding:1px 6px;font-size:11.5px}
/* html L487 */
.mtag.legal{background:rgba(var(--gold-rgb),.16);color:var(--gold)}
/* html L488 */
.mtag.urgent{background:rgba(var(--bad-rgb),.18);color:var(--bad)}
/* html L491 */
.mst.drafted{background:rgba(var(--gold-rgb),.16);color:var(--gold)}
/* html L492 */
.mst.approved{background:rgba(var(--good-rgb),.16);color:var(--good)}
/* html L493 */
.mst.sent{background:rgba(var(--good-rgb),.28);color:var(--good)}
/* html L494 */
.mst.rejected,.mst.archived{background:rgba(139,144,173,.16);color:var(--mut)}
/* html L495 */
.mailbody{padding:13px;white-space:pre-wrap;font-size:12.5px;line-height:1.5;max-height:230px;overflow:auto;
  border-bottom:1px solid var(--line);color:var(--mut)}
/* html L497 */
.mailedit{width:100%;background:var(--bg2);border:1px solid var(--line);color:var(--txt);border-radius:9px;
  padding:10px;font:inherit;font-size:12.5px;line-height:1.5;min-height:190px;resize:vertical}
/* html L499 */
.mailacts{display:flex;gap:8px;flex-wrap:wrap;padding:11px 13px}
/* html L500 */
.mailwarn{padding:9px 13px;font-size:11.5px;color:var(--gold);background:rgba(var(--gold-rgb),.07);
  border-bottom:1px solid var(--line)}
/* html L2337 */
.crmailsum{cursor:pointer;font-size:12.5px;font-weight:600;color:var(--mut);padding:8px 10px;list-style:none;
 border:1px solid var(--line);border-radius:11px;background:var(--surf);display:flex;align-items:center;gap:8px}
/* html L2342 */
.rep-wrap{border:1px solid var(--line);border-radius:14px;background:var(--surf);overflow:hidden}
/* html L2343 */
.rep-hd{display:flex;align-items:center;gap:9px;padding:10px 13px;border-bottom:1px solid var(--line);
 font-size:12px;font-weight:700;color:var(--mut);text-transform:uppercase;letter-spacing:.07em}
/* html L2345 */
.rep-n{background:var(--gold);color:var(--gold-bg);border-radius:20px;padding:1px 8px;font-size:11px;font-weight:800}
/* html L2346 */
.rep-row{padding:12px 14px;border-bottom:1px solid var(--line)}
/* html L2348 */
.rep-top{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:6px}
/* html L2349 */
.rep-who{font-weight:700;font-size:13px;color:var(--txt)}
/* html L2350 */
.rep-meta{font-size:11px;color:var(--mut)}
/* html L2351 */
.rep-body{font-size:13px;line-height:1.6;color:var(--txt);white-space:pre-wrap;word-break:break-word;margin-bottom:8px}
/* html L2352 */
.rep-thread{border-left:2px solid var(--gold);padding:6px 0 6px 10px;margin:8px 0}
/* html L2353 */
.rep-msg{font-size:12.5px;line-height:1.55;margin-bottom:6px}
/* html L2356 */
.rep-reply{display:flex;gap:7px;margin-top:8px}
/* html L2359 */
.rep-guest{font-size:11px;color:var(--mut);margin-top:6px}
/* html L2360 */
.rep-empty{padding:18px 14px;font-size:13px;color:var(--mut)}
/* html L2304 */
.pml-note{font-size:12px;line-height:1.6;color:var(--mut);background:var(--bg2,var(--bg2));
 border:1px solid var(--line);border-left:3px solid var(--good);border-radius:11px;padding:11px 13px;margin-bottom:12px}
/* html L2307 */
.pml-card{border:1px solid var(--line);border-radius:13px;padding:13px;margin-bottom:10px;background:var(--surf)}
/* html L2309 */
.pml-hd{display:flex;align-items:center;gap:9px;font-size:14px;margin-bottom:5px}
/* html L2310 */
.pml-ok{font-size:11.5px;font-weight:800;letter-spacing:.05em;text-transform:uppercase;color:var(--good-bg);
 background:var(--good);border-radius:20px;padding:2px 8px}
/* html L2312 */
.pml-soon{font-size:11.5px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--mut);
 border:1px solid var(--line);border-radius:20px;padding:2px 8px}
/* html L2314 */
.pml-hint{font-size:12px;color:var(--mut);line-height:1.55;margin-bottom:9px}
/* html L2315 */
.pml-meta{font-size:11.5px;color:var(--mut);margin-bottom:9px;line-height:1.55}
/* html L2317 */
.pml-steps{margin:4px 0 8px;padding-left:20px;font-size:12.5px;line-height:1.7;color:var(--txt)}
/* html L2319 */
.pml-where{display:inline-block;font-size:12px;font-weight:600;color:var(--gold);margin-bottom:10px}
/* html L2320 */
.pml-safe{font-size:11.5px;line-height:1.55;color:var(--mut);background:var(--bg2,var(--bg2));
 border:1px solid var(--line);border-radius:9px;padding:8px 10px;margin-bottom:10px}
/* html L2323 */
.pml-form-col{flex-direction:column;align-items:stretch}
/* html L2324 */
.pml-secta{min-height:96px;font-family:ui-monospace,Menlo,Consolas,monospace;font-size:12px;
 line-height:1.45;resize:vertical;width:100%}
/* html L2326 */
.pml-form{display:flex;gap:8px;flex-wrap:wrap;align-items:center}
/* html L2328 */
.pml-act{display:flex;gap:8px;flex-wrap:wrap}
/* html L2329 */
.pml-poshd{font-size:11px;font-weight:800;letter-spacing:.07em;text-transform:uppercase;color:var(--mut);margin:14px 0 8px}
/* html L2330 */
.pml-pos{background:var(--surf);border:1px solid var(--line);border-radius:11px;padding:10px 12px}
/* html L2331 */
.pml-pm{font-size:13px;font-weight:600;line-height:1.35;margin-bottom:3px}
/* html L2332 */
.pml-pd{font-size:12px;color:var(--mut);font-variant-numeric:tabular-nums}
/* html L506 */
 .btick{display:none!important}          /* 60px of scrolling marquee, zero actionable content */
/* html L513 */
.btick-in{display:flex;gap:9px;align-items:center;height:100%;padding:0 12px;
  animation:btickscroll 64s linear infinite;width:max-content}
/* html L530 */
.btick-lbl{position:absolute;left:0;top:0;height:100%;display:flex;align-items:center;padding:0 10px;
  background:linear-gradient(90deg,var(--surf) 70%,transparent);z-index:2;font-size:11.5px;font-weight:700;
  letter-spacing:.06em;color:var(--gold);text-transform:uppercase;pointer-events:none}
/* html L522 */
.btk-emo{font-size:14px;line-height:1}
/* html L523 */
.btk-bot{font-weight:700;font-size:11.5px}
/* html L524 */
.btk-u{font-size:11.5px;font-variant-numeric:tabular-nums;padding:1px 5px;border-radius:5px}
/* html L527 */
.btk-pick{font-size:11.5px;color:var(--txt)}
/* html L528 */
.btk-tag{font-size:11.5px;color:var(--mut);background:#222840;border-radius:5px;padding:1px 6px}
/* html L529 */
.btk-od{font-size:11px;font-variant-numeric:tabular-nums;color:var(--gold)}
/* html L2285 */
.btk-game{color:var(--mut);font-size:11.5px;margin-left:6px;white-space:nowrap}
/* html L543 */
.pfcal{background:var(--surf);border:1px solid var(--line);border-radius:13px;padding:12px 14px;margin-bottom:12px}
/* html L544 */
.pfcal-hd{display:flex;align-items:center;justify-content:space-between;margin-bottom:9px}
/* html L545 */
.pfcal-mo{font-weight:700;font-size:13.5px}
/* html L546 */
.pfcal-nav{display:flex;gap:6px}
/* html L549 */
.pfcal-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:4px}
/* html L550 */
.pfcal-dow{font-size:11.5px;color:var(--mut);text-align:center;padding-bottom:2px;letter-spacing:.04em}
/* html L551 */
.pfcal-d{aspect-ratio:1;border-radius:8px;background:var(--surf);border:1px solid transparent;display:flex;
  flex-direction:column;align-items:center;justify-content:center;gap:1px;font-size:11.5px;cursor:default}
/* html L560 */
.pfcal-empty{aspect-ratio:1}
/* html L542 */
.pf-tm{color:var(--mut);font-size:11.5px;font-variant-numeric:tabular-nums;margin-right:7px}
/* html L540 */
.pf-type-rest{opacity:.72}
/* html L533 */
.ip-grp{margin-bottom:14px}
/* html L534 */
.ip-grph{display:flex;align-items:baseline;justify-content:space-between;gap:10px;padding:7px 12px;
  background:var(--surf2);border:1px solid var(--line);border-radius:10px;margin-bottom:7px;
  position:static;top:calc(var(--hdr-h,56px) + var(--subnav-h,0px) + 4px);}
/* html L537 */
.ip-grpn{font-weight:700;font-size:12.5px;letter-spacing:.02em}
/* html L538 */
.ip-grpc{font-size:11px;color:var(--mut);font-variant-numeric:tabular-nums}
/* html L1223 */
.ip-note{font-size:12px;line-height:1.55;color:var(--mut);background:var(--bg2,var(--bg2));
  border:1px solid var(--line);border-left:3px solid var(--gold2);border-radius:10px;padding:9px 12px;margin-bottom:10px}
.setgrp{display:flex;align-items:center;gap:10px;margin:26px 0 10px;font-size:11px;font-weight:800;
 letter-spacing:.10em;text-transform:uppercase;color:var(--mut)}
.setrow{display:flex;align-items:flex-start;gap:12px;margin-bottom:10px}
.seticon{flex:none;width:32px;height:32px;border-radius:10px;background:var(--bg2,var(--bg2));border:1px solid var(--line);
 display:flex;align-items:center;justify-content:center;color:var(--gold)}
.setmeta{min-width:0;flex:1}
.setnote{font-size:11px;color:var(--mut);margin-top:9px;line-height:1.5}
.setauto{font-size:11.5px;font-weight:700;letter-spacing:.05em;text-transform:uppercase;color:var(--mut);
 border:1px solid var(--line);border-radius:20px;padding:2px 8px;margin-left:8px}
.setprev{margin-top:12px;border:1px solid var(--line);border-radius:12px;background:var(--bg2,var(--bg2));overflow:hidden}
.setprev-h{font-size:11.5px;font-weight:800;letter-spacing:.09em;text-transform:uppercase;color:var(--mut);
 padding:8px 12px;border-bottom:1px solid var(--line)}
.spvs{display:grid;grid-template-columns:repeat(4,1fr)}
.trackrow.locked.res-v{background:linear-gradient(90deg,rgba(139,144,173,.10),var(--surf) 38%);border-color:rgba(139,144,173,.28)}
.pmcal-hd{display:flex;align-items:center;gap:10px;margin-bottom:10px}
.pmcal-t{flex:1;font-size:14px;font-weight:700}
.pmcal-dayhd{font-size:11px;font-weight:800;letter-spacing:.07em;text-transform:uppercase;color:var(--mut);margin:14px 0 8px}
/* Bot picks lead the Overview. The count column is the whole point -- it is the only number on the page that
   says "several independent methods reached this same side", which is different in kind from one bot's opinion. */
.ovp{margin-bottom:18px}
.ovp-note{font-size:12px;color:var(--mut);margin-bottom:10px;line-height:1.55}
.ovp-list{border:1px solid var(--line);border-radius:13px;overflow:hidden}
.ovp-row{display:flex;align-items:center;gap:12px;padding:10px 13px;border-bottom:1px solid var(--line)}
.ovp-row:last-child{border-bottom:none}
.ovp-hot{background:linear-gradient(90deg,rgba(var(--gold-rgb),.07),transparent 60%)}
.ovp-n{flex:none;width:34px;height:34px;border-radius:10px;background:var(--bg2,var(--bg2));border:1px solid var(--line);
 display:flex;align-items:center;justify-content:center;font-weight:800;font-variant-numeric:tabular-nums;color:var(--gold)}
.ovp-m{min-width:0;flex:1}
.ovp-bet{font-size:13.5px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ovp-sub{font-size:11.5px;color:var(--mut);margin-top:2px}
.ovp-midas{font-size:11px;font-weight:800;letter-spacing:.05em;padding:1px 5px;border-radius:5px;margin-left:5px;
 background:rgba(var(--gold-rgb),.14);color:var(--gold);border:1px solid rgba(var(--gold-rgb),.3)}
/* No border, no box. A 32px outlined square beside a round avatar reads as a stray control; at header
   scale this only has to be an icon that brightens when you reach for it. */
.hdr-gear{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;margin-left:6px;
  /* `border:0 !important;background:none !important` REMOVED 2026-08-19. Those two beat the later
     unification rule (which gives every bar control one 30px pill shape) no matter the order or
     specificity, so the gear was the one control still drawn as a bare glyph among four pills. */
  opacity:.62;
 border-radius:10px;color:var(--mut);cursor:pointer;border:1px solid transparent;transition:color .14s,border-color .14s,background .14s}
.hdr-gear:hover{color:var(--gold);opacity:1;background:none}
.hdr-gear:focus-visible{outline:2px solid var(--gold);outline-offset:2px;border-radius:8px}
/* 18px on a 32px hit area, and a lighter stroke: the new gear has 32 segments where the old one had a
   dozen, so 2px reads as a solid blob at this size. */
.hdr-gear .ti{width:18px;height:18px;stroke-width:1.55;opacity:1}
/* The bot ticker's scroll animation. Its CSS was ported back but this keyframe was not, so the strip
   rendered and then sat perfectly still -- an animation referencing an undefined keyframe just no-ops. */
@keyframes btickscroll{from{transform:translateX(0)}to{transform:translateX(-50%)}}
/* ---- ROLLBACK CASUALTIES: CSS whose markup survived but whose styling did not -----------------------
   Recovered verbatim from the pre-loss render. Several are LIVE-referenced by markup already on the page
   (.spv/.spk drive the Settings region preview; .setrow/.seticon the settings rows; .res-w/.res-l/.res-v
   the tracker's win/loss/void row tint), so without them those surfaces render unstyled rather than
   missing -- which is harder to notice and easier to ship. */
@keyframes btickscroll{from{transform:translateX(0)}to{transform:translateX(-50%)}}
.trackrow.locked::before{content:'';position:absolute;left:0;top:0;bottom:0;width:3px;background:#2a3350}
.trackrow.locked.res-w{background:linear-gradient(90deg,rgba(var(--good-rgb),.09),var(--surf) 38%);border-color:rgba(var(--good-rgb),.30)}
.trackrow.locked.res-w::before{background:var(--good)}
.trackrow.locked.res-l{background:linear-gradient(90deg,rgba(var(--bad-rgb),.09),var(--surf) 38%);border-color:rgba(var(--bad-rgb),.28)}
.trackrow.locked.res-l::before{background:var(--bad)}
.trackrow.locked.res-v::before{background:var(--mut)}
.trackrow.locked.res-o::before{background:var(--gold)}
.trackrow.locked:hover{border-color:var(--gold)}
.mailrow:hover{background:#161a2a}
.mailrow.on{background:#1b2137;border-left:3px solid var(--gold)}
.mst{font-size:11.5px;border-radius:5px;padding:1px 6px;text-transform:uppercase;letter-spacing:.04em}
.mst.new{background:rgba(127,181,255,.18);color:var(--blue2)}
/* THE RULE THAT ACTUALLY WINS. `.dwallet{margin-left:auto}` was set earlier and never applied, because
   this one is later and more specific (0,1,1 vs 0,1,0). flex-basis:100% is what forced the balances onto
   their own line and order:5 is what dropped them below the nav. Both go: the balances belong at the right
   end of row one, next to the avatar, which is where a balance sits in every product that has one. */
header .dwallet{order:0;flex-basis:auto;margin-left:auto;justify-content:flex-end;padding-top:0}
header .dwallet .dw-toggle{max-width:100%}
.btick:hover .btick-in{animation-play-state:paused}
.btk:hover{border-color:var(--gold)}
.btk-u.pos{background:rgba(var(--good-rgb),.16);color:var(--good)}
.btk-u.neg{background:rgba(var(--bad-rgb),.16);color:var(--bad)}
.pf-type-rest .pf-tn{font-style:italic}
.pfcal-nav button{background:#1b2032;border:1px solid var(--line);color:var(--txt);border-radius:8px;width:26px;height:26px;cursor:pointer;line-height:1}
.pfcal-nav button:disabled{opacity:.35;cursor:default}
.pfcal-d.has{cursor:pointer;border-color:var(--line)}
.pfcal-d.has:hover{border-color:var(--gold)}
.pfcal-d.pos{background:rgba(var(--good-rgb),.13)}
.pfcal-d.neg{background:rgba(var(--bad-rgb),.13)}
.pfcal-d.flat{background:rgba(139,144,173,.10)}
.pfcal-d .dn{color:var(--mut);font-size:11px}
.pfcal-d .du{font-weight:700;font-variant-numeric:tabular-nums}
.pfcal-d.sel{outline:2px solid var(--gold);outline-offset:1px}
.daygrp.deck>.dayhdr{position:relative;padding-left:19px}
.daygrp.deck>.dayhdr::before{content:'';position:absolute;left:0;top:0;bottom:0;width:4px;background:#2a3350}
.daygrp.deck-pos>.dayhdr::before{background:var(--good)}
.daygrp.deck-neg>.dayhdr::before{background:var(--bad)}
.daygrp.deck:hover{border-color:var(--gold)}
.decknet.pos{color:var(--good)}
.decknet.neg{color:var(--bad)}
.segrp::-webkit-scrollbar{display:none}
.segrp>.segbtn{flex:0 0 auto;white-space:nowrap}
.setgrp::after{content:'';flex:1;height:1px;background:var(--line)}
.setgrp:first-of-type{margin-top:4px}
.seticon svg{width:16px;height:16px}
.setrow .setlab{margin-bottom:3px}
.setrow .setsub{margin:0}
.spv{padding:10px 12px;border-right:1px solid var(--line)}
.spv:last-child{border-right:0}
.spk{display:block;font-size:11.5px;color:var(--mut);margin-bottom:3px;text-transform:uppercase;letter-spacing:.06em}
.spv b{font-size:14px;font-weight:700;font-variant-numeric:tabular-nums;color:var(--txt)}
.spv:nth-child(2){border-right:0}
.spv:nth-child(1),.spv:nth-child(2){border-bottom:1px solid var(--line)}
.setcard.wide{padding:16px 18px 18px}
.setbtn:hover{border-color:var(--gold);color:var(--gold)}
.setbtn svg{width:14px;height:14px}
.ref-row .tinput{flex:1;min-width:200px;margin-bottom:0;font-size:12.5px}
.ref-item:last-child{border-bottom:0}
.ref-item .mut{font-size:11.5px}
.pml-note svg{width:13px;height:13px;vertical-align:-2px}
.pml-card.on{border-color:rgba(94,214,143,.45)}
.pml-meta code{background:var(--bg2,var(--bg2));padding:2px 6px;border-radius:5px;font-size:11px;word-break:break-all}
.pml-steps li{margin-bottom:3px}
.pml-safe svg{width:12px;height:12px;vertical-align:-2px}
.pml-form .tinput{flex:1;min-width:180px;margin-bottom:0}
.crmailsum::-webkit-details-marker{display:none}
.crmailsum svg{width:14px;height:14px}
.crmailsum:hover{border-color:var(--gold);color:var(--txt)}
.rep-row:last-child{border-bottom:0}
.rep-msg:last-child{margin-bottom:0}
.rep-msg b{color:var(--gold)}
/* bot-ticker chip: markup and the ticker JS both survived, the chip styling did not. */
.btk{display:flex;align-items:center;gap:7px;padding:5px 11px;border-radius:9px;background:#1b2137;
  border:1px solid var(--line);cursor:pointer;white-space:nowrap;flex:0 0 auto}
.btk:hover{border-color:var(--gold)}
.btk-u.pos{background:rgba(var(--good-rgb),.16);color:var(--good)}
.btk-u.neg{background:rgba(var(--bad-rgb),.16);color:var(--bad)}
/* Only ever rendered when the server says the count is meaningful, so this style is dormant by design. */
.constag{display:inline-flex;align-items:center;gap:4px;font-size:11.5px;font-weight:700;margin-left:7px;
 padding:2px 7px;border-radius:7px;background:rgba(124,131,255,.13);color:#9aa3ff;border:1px solid rgba(124,131,255,.26);
 vertical-align:middle}
.constag .ti{width:11px;height:11px}
.cons-b{margin-left:4px;color:var(--gold);font-variant-numeric:tabular-nums}
/* The @media(max-width:560px) fix for the by-sport tree's truncated bet-type labels USED to live here, and
   never applied: every one of its declarations is overridden by the base .bd-sport rules further down the
   sheet, which carry the SAME specificity and simply come later. It has been moved to sit after them --
   see "BY-SPORT TREE, MOBILE" below. Order, not specificity, was the whole bug. */
/* Two horizontal rails (sub-nav + 50-odd sport chips) shared the Zoo tab with no scroll affordance. */
#zoo-sportrow{overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none}
#zoo-sportrow::-webkit-scrollbar{display:none}
/* PERF: two sections are ~55% of the page's tags. content-visibility lets the browser skip style/layout/paint
   for off-screen instances; contain-intrinsic-size keeps the scrollbar honest. Does not cut parse cost -- that
   needs server-side deferral -- but it makes scrolling usable on a mid-range Android. */
@media(max-width:768px){
 .fabsec,.sportgrp,.zoo-card,.jentry{content-visibility:auto;contain-intrinsic-size:auto 140px}
}
/* The realistic-volume box leads the Overview. It is the only number on the page that describes what a PERSON
   following MIDAS would have experienced, as opposed to what the whole 300-bot firehose did. */
.realbox{border:1px solid rgba(var(--good-rgb),.28);background:linear-gradient(160deg,rgba(var(--good-rgb),.07),transparent 60%);
 border-radius:16px;padding:16px 18px;margin-bottom:16px}
.rb-lab{font-size:11px;font-weight:800;letter-spacing:.09em;text-transform:uppercase;color:var(--mut)}
.rb-big{font-size:40px;font-weight:850;letter-spacing:-1.5px;line-height:1.05;margin:5px 0 4px}
.rb-big .u{font-size:20px;margin-left:2px;opacity:.75}
.rb-sub{font-size:13px;color:var(--mut)}
.rb-sub b{color:var(--txt)}
.rb-note{font-size:11.5px;color:var(--mut);margin-top:9px;line-height:1.55;max-width:70ch}
/* Today's Best 3 — the shortlist a real bettor can actually act on, plus the parlay most of them build. */
/* REBUILT 2026-08-09. This was a flex ROW: a rank chip, a one-line bet, then six facts (league, type, price,
   break-even, stake, market record, bot count) run together in one 11.5px muted subtitle at identical weight.
   Everything looked equally important, which means nothing did -- and this box is the single thing on the site
   a visitor is meant to act on. Rebuilt as three cards with a real hierarchy: what to bet, at what price, for
   how much, and only then the evidence that earned the slot. */
.b3{margin-bottom:18px}
.b3grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(268px,1fr));gap:12px}
.b3card{position:relative;display:flex;flex-direction:column;gap:10px;padding:15px 15px 13px;
 border:1px solid var(--line);border-radius:16px;background:var(--bg2,var(--bg2));
 transition:border-color .18s ease,transform .18s ease,box-shadow .18s ease}
.b3card:hover{transform:translateY(-2px);border-color:rgba(var(--gold-rgb),.34);
 box-shadow:0 14px 34px -22px rgba(0,0,0,.9)}
.b3card.on{border-color:rgba(var(--gold-rgb),.55);background:linear-gradient(180deg,rgba(var(--gold-rgb),.07),transparent 62%),var(--bg2,var(--bg2))}
.b3head{display:flex;align-items:center;gap:9px}
.b3n{width:21px;height:21px;border-radius:6px;background:rgba(var(--gold-rgb),.12);border:1px solid rgba(var(--gold-rgb),.3);
 display:flex;align-items:center;justify-content:center;font-size:11.5px;font-weight:800;color:var(--gold);flex:none}
.b3-plmore>summary{cursor:pointer;list-style:none;opacity:.72}.b3-plmore>summary::-webkit-details-marker{display:none}.b3-plmore[open]>summary{opacity:1}.b3-plday>summary{cursor:pointer;list-style:none}.b3-plday>summary::-webkit-details-marker{display:none}.b3-plday[open]>summary{background:rgba(255,255,255,.02)}.b3-pllegs{padding:2px 0 8px 10px;border-left:2px solid var(--line);margin:0 0 6px 10px}.b3-plrow{display:flex;align-items:center;gap:8px;padding:4px 8px;font-size:12px}.b3-plmark{flex:0 0 auto;min-width:52px;font-size:11.5px;font-weight:800;text-transform:uppercase;letter-spacing:.04em}.b3-plbet{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.b3-plwho{flex:0 0 auto;font-size:11px}.b3-plprice{flex:0 0 auto;font-variant-numeric:tabular-nums;font-size:11.5px;color:var(--mut)}.b3lg{font-size:11.5px;font-weight:800;letter-spacing:.09em;text-transform:uppercase;color:var(--mut);
 overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.b3pick{display:flex;align-items:center;cursor:pointer;flex:none;margin-left:auto}
.b3bet{font-size:16px;font-weight:650;line-height:1.28;letter-spacing:-.01em;text-wrap:balance}
/* The price and the stake are the two numbers a tailer copies, so they get the size and the tabular figures. */
.b3nums{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap}
/* ---- ROLLING RECORD STRIP ----------------------------------------------------------------------------
   Three equal columns, because they are three readings of one thing and none of them outranks the others.
   Deliberately NOT a hero number: it sits above the picks at label size, so a good week informs without
   becoming the headline. Tabular figures so the three units columns line up. */
.rollrec{display:grid;grid-template-columns:repeat(3,1fr);gap:1px;background:var(--line);
 border:1px solid var(--line);border-radius:12px;overflow:hidden;margin:0 0 12px}
.rr-c{background:var(--surf);padding:9px 11px;min-width:0}
.rr-k{font-size:11px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--mut);
 white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.rr-v{font-size:18px;font-weight:850;font-variant-numeric:tabular-nums;line-height:1.15;margin-top:3px}
.rr-u{font-size:11px;font-weight:700;margin-left:1px;opacity:.75}
.rr-s{font-size:11.5px;color:var(--mut);font-variant-numeric:tabular-nums;margin-top:2px;
 white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.rr-note{grid-column:1/-1;background:var(--surf);padding:7px 11px;font-size:11.5px;line-height:1.45;
 color:var(--mut);border-top:1px solid var(--line)}
@media(max-width:430px){.rr-v{font-size:16px}.rr-c{padding:8px 9px}}
.b3odds{font-size:21px;font-weight:850;color:var(--gold);font-variant-numeric:tabular-nums;line-height:1}
.b3u{font-size:12px;font-weight:800;padding:3px 9px;border-radius:999px;font-variant-numeric:tabular-nums;
 background:rgba(var(--gold-rgb),.13);color:var(--gold);border:1px solid rgba(var(--gold-rgb),.32)}
.b3u.hi{background:rgba(var(--gold-rgb),.24);border-color:rgba(var(--gold-rgb),.6)}
.b3u.lo{background:rgba(var(--gold-rgb),.06);color:var(--goldsoft);border-color:rgba(var(--gold-rgb),.18);font-weight:700}
/* Evidence, deliberately quiet and deliberately present: the claim is checkable or it is not a claim. */
/* RENAMED FROM .b3ev 2026-08-12 — the SECOND same-name collision found in this card in one day.
   `.b3ev` is also the parlay EV VERDICT (a sentence, with .pos/.neg modifiers and its own padding and
   border, declared later so it wins). Sharing the name meant the card's chip ROW inherited a box it should
   not have, and the verdict SENTENCE inherited display:flex from here -- breaking a paragraph into
   6px-gapped chunks. Two components, one name, both wrong.
   Check a class is unused before you use it. This is now three instances (pl-sport, b3rec, b3ev). */
.b3facts{display:flex;flex-wrap:wrap;gap:6px;font-size:11.5px}
.b3chip{padding:2px 7px;border-radius:7px;background:rgba(var(--push-rgb),.10);color:var(--mut);
 border:1px solid rgba(var(--push-rgb),.20);font-variant-numeric:tabular-nums}
.b3chip b{color:var(--txt);font-weight:750}
.b3chip.under{background:rgba(var(--bad-rgb),.10);color:var(--bad-hi);border-color:rgba(var(--bad-rgb),.26)}
.b3bots{padding:2px 7px;border-radius:7px;background:rgba(var(--good-rgb),.11);
 color:var(--good-hi);border:1px solid rgba(var(--good-rgb),.24);font-weight:700;font-size:11.5px}
/* THE GREEN BLOB, FIXED (2026-08-09). .tailbtn is a 32px circle (border-radius:50%) built for the little
   + on a pick row. Setting width:100% on it stretched that circle into a full-width ELLIPSE 32px tall --
   the "ugly tail bubbles". A primary call-to-action needs its own shape, not a stretched icon button. */
.b3tail{width:100%;margin-top:6px;height:auto;min-height:44px;border-radius:12px;
 font-size:13.5px;font-weight:800;letter-spacing:.01em;padding:11px 14px;
 background:linear-gradient(180deg,rgba(var(--good-rgb),.20),rgba(var(--good-rgb),.10));
 border:1px solid rgba(var(--good-rgb),.45);color:var(--good-hi)}
.b3tail:hover{background:linear-gradient(180deg,rgba(var(--good-rgb),.30),rgba(var(--good-rgb),.16));
 border-color:rgba(var(--good-rgb),.7);transform:translateY(-1px)}
.b3tail.on,.b3card .b3tail[data-on]{background:rgba(var(--good-rgb),.13);color:var(--good)}
@media (max-width:520px){.b3bet{font-size:15px}.b3odds{font-size:19px}}
.b3par{padding:12px 13px;background:var(--bg2,var(--bg2))}
.b3par-hint{font-size:12px;color:var(--mut)}
.b3par-in{display:flex;flex-wrap:wrap;align-items:center;gap:10px}
.b3par-l{font-size:11px;font-weight:800;letter-spacing:.08em;text-transform:uppercase;color:var(--mut)}
.b3par-odds{font-size:22px;font-weight:850;color:var(--gold);font-variant-numeric:tabular-nums}
.b3par-sub{flex:1 1 100%;font-size:11.5px;color:var(--mut);line-height:1.5}
.b3par-sub b{color:var(--txt)}
/* Hot-streak chip. Rendered UNDER the record and the tier on purpose: it is a "what is running now" signal and
   must never be mistakable for the quality verdict the tier gives. */
.zc-streak{margin-top:7px;font-size:11.5px;font-weight:800;letter-spacing:.03em;padding:3px 8px;border-radius:7px;
 display:inline-block;background:rgba(255,140,66,.12);color:#ffab6b;border:1px solid rgba(255,140,66,.3);cursor:help}
/* An EARLY cell is a real positive result on a thin sample. Muted rather than hidden: it is still evidence,
   just not evidence anyone should stake a bankroll on yet. The tag carries the n so the reader sees why. */
.bcard.early{opacity:.82;border-color:rgba(255,255,255,.09)}
.bcard.early .bctag{background:rgba(var(--push-rgb),.14);color:var(--mut);border-color:rgba(var(--push-rgb),.28)}
.bcard.proven .bctag{background:rgba(var(--good-rgb),.16);color:var(--good-hi);border-color:rgba(var(--good-rgb),.34)}
/* The board is where logged-in users land, and it carried no evidence that anything here wins. One line of
   proof plus a route to the shortlist -- the full record stays a tab away, unchanged. */
/* This tab's own job, stated once, in one line. It replaced a proofstrip carrying Best 3's record and a
   full-width button to that tab -- another screen's content holding this screen's fold. */
.boardwhat{display:flex;flex-direction:column;gap:3px;margin:0 0 12px}
.bw-k{font-size:13px;font-weight:800;letter-spacing:.02em;color:var(--txt)}
.bw-m{font-size:12px;color:var(--mut);line-height:1.5;max-width:78ch}
.bw-m a{color:var(--gold);text-decoration:none;border-bottom:1px solid rgba(255,209,102,.4)}
.bw-m a:hover{border-bottom-color:var(--gold)}
.ps-k{font-size:11.5px;font-weight:800;letter-spacing:.08em;text-transform:uppercase;color:var(--mut);display:block}
.ps-v{font-size:21px;font-weight:850;letter-spacing:-.5px;margin-right:8px}
.ps-s{font-size:11.5px;color:var(--mut)}
.ps-go{flex:none;cursor:pointer;font-size:12px;font-weight:700;padding:8px 13px;border-radius:10px;
 background:var(--surf2,#171b28);border:1px solid var(--line);color:var(--txt)}
.ps-go:hover{border-color:var(--gold);color:var(--gold)}
/* Stated plainly and permanently rather than as an interrupting banner: people look for billing in Settings. */
.betacard{border-color:rgba(var(--gold-rgb),.26)}
.betacard .setlab{color:var(--gold)}
/* A visible focus ring is the other half of keyboard access — being able to reach a control is useless if you
   cannot see where you are. :focus-visible so it appears for keyboard users without ringing every mouse click. */
[role="button"]:focus-visible,button:focus-visible,a:focus-visible,input:focus-visible,
textarea:focus-visible,select:focus-visible,summary:focus-visible{
 outline:2px solid var(--gold);outline-offset:2px;border-radius:8px}
.zoo-sortrow{margin-top:7px}
/* Sport chips sit under the divisions row; a second axis, so it reads as a refinement not a competing nav. */
.zoo-sportrow{margin-top:6px;opacity:.95}
.zoo-sportrow .zchip{font-size:11.5px}
.zchip{font-size:12.5px;font-weight:700;padding:6px 12px;border-radius:999px;background:var(--surf);border:1px solid var(--line);color:var(--mut,var(--mut));cursor:pointer;white-space:nowrap;-webkit-tap-highlight-color:transparent;display:inline-flex;align-items:center;gap:5px}
.zchip.zs{font-size:12px;padding:5px 10px}
.zchip:hover{border-color:var(--line3)}
.zchip.on{background:rgba(var(--gold-rgb),.14);border-color:rgba(var(--gold-rgb),.4);color:var(--gold,var(--gold))}
.zct{font-size:11.5px;font-weight:800;opacity:.7;background:rgba(255,255,255,.06);border-radius:6px;padding:1px 5px}
.zsl{font-size:11px;text-transform:uppercase;letter-spacing:.5px;color:var(--mut,var(--mut));margin-right:2px;font-weight:700}
.zoo-idlewrap{margin-top:22px;border-top:1px solid var(--line);padding-top:6px}
.zoo-idlewrap>summary{list-style:none;cursor:pointer;padding:10px 2px}
.zoo-idlewrap>summary::-webkit-details-marker{display:none}
.zoo-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:14px}
.zoo-intro{font-size:13px;color:var(--mut);margin-bottom:16px;line-height:1.5}
.zoo-cat{margin:22px 0 12px}
.zoo-cat:first-of-type{margin-top:4px}
.zoo-cat-h{font-size:16px;font-weight:800;letter-spacing:-.2px}
.zoo-cat-sub{font-size:12px;color:var(--mut);margin-top:2px}
.zoo-card{position:relative;background:linear-gradient(165deg,var(--surf),#0f1320);border:1px solid var(--line);border-radius:16px;padding:16px;transition:border-color .15s}
.zoo-card:hover{border-color:#2f3556}
.zoo-card.zc-pos{box-shadow:inset 3px 0 0 rgba(var(--good-rgb),.85)}
.zoo-card.zc-neg{box-shadow:inset 3px 0 0 rgba(var(--bad-rgb),.8)}
.zoo-card.zc-even{box-shadow:inset 3px 0 0 rgba(var(--push-rgb),.5)}
.zc-rank{position:absolute;top:10px;right:12px;font-size:12px;font-weight:800;color:var(--mut);font-variant-numeric:tabular-nums}
.zc-rank.medal{font-size:18px}
.zc-livewrap{margin-top:6px}
.zc-live{display:inline-block;font-size:11px;font-weight:700;color:var(--bad-hi);background:rgba(255,80,80,.12);border:1px solid rgba(255,80,80,.34);border-radius:7px;padding:2px 8px}
.zc-today{display:inline-block;font-size:11px;font-weight:700;color:var(--info);background:rgba(var(--info-rgb),.1);border:1px solid rgba(var(--info-rgb),.28);border-radius:7px;padding:2px 8px}
.zc-tier{display:block;width:fit-content;font-size:11px;font-weight:800;letter-spacing:.02em;border-radius:8px;padding:4px 10px;margin:9px 0 2px;cursor:help}
.zc-tier.te-edge{color:var(--good-hi);background:rgba(var(--good-rgb),.12);border:1px solid rgba(var(--good-rgb),.35)}
.zc-tier.te-hot{color:var(--gold-hi);background:rgba(255,207,107,.1);border:1px solid rgba(255,207,107,.3)}
.zc-tier.te-build{color:var(--blue2);background:rgba(127,181,255,.1);border:1px solid rgba(127,181,255,.3)}
.zc-tier.te-cold{color:var(--mut);background:rgba(154,163,184,.08);border:1px solid rgba(154,163,184,.22)}
.zoo-clvbar{background:linear-gradient(120deg,rgba(var(--good-rgb),.07),rgba(127,181,255,.05));border:1px solid #223047;border-radius:12px;padding:12px 15px;margin-bottom:14px;font-size:12.5px;color:var(--txt2);line-height:1.6}
.zoo-clvbar b{color:var(--txt)}
.zchip.ztoday.on{background:rgba(var(--info-rgb),.16);border-color:var(--info);color:#cde4ff}
.midaspx{display:inline-flex;align-items:center;font-size:11.5px;font-weight:800;color:var(--gold);background:rgba(var(--gold-rgb),.12);border:1px solid rgba(var(--gold-rgb),.3);border-radius:6px;padding:1px 6px;margin-right:5px;letter-spacing:.3px}
.botpx{display:inline-flex;gap:4px;flex-wrap:wrap;margin-right:5px;vertical-align:middle}
.botpx-tag{font-size:11.5px;font-weight:700;color:#c9b8ff;background:rgba(150,120,255,.14);border:1px solid rgba(150,120,255,.32);border-radius:6px;padding:1px 6px;cursor:pointer;text-decoration:none;white-space:nowrap}
.botpx-tag:hover{background:rgba(150,120,255,.26)}
.botpx-more{font-size:11.5px;color:var(--mut);align-self:center}
.botpx-n{font-size:11.5px;font-weight:800;color:var(--bg);background:#8b93c4;border-radius:6px;padding:1px 7px;white-space:nowrap;letter-spacing:.02em}
.botpx-n.hot{background:linear-gradient(120deg,var(--gold-hi),var(--gold))}
.bets-ctrl{display:flex;gap:10px;align-items:center;flex-wrap:wrap;margin-bottom:10px}
.bets-cons{cursor:pointer;border:1px solid var(--line);background:var(--bg2)}
.bets-cons.on{background:linear-gradient(120deg,var(--gold-hi),var(--gold));color:var(--bg);border-color:transparent}
.lgtag{font-weight:700;color:#9fb8d8;background:rgba(159,184,216,.1);border-radius:5px;padding:0 5px;font-size:.92em}
.pf-meta{display:flex;flex-wrap:wrap;align-items:center;gap:5px;margin-top:4px}
.pf-bt{font-size:11px;color:var(--push)}
.pf-gd{font-size:11px;color:#aeb4d6;background:var(--surf);border:1px solid var(--line);border-radius:5px;padding:1px 6px}
.fd-note{font-size:12.5px;color:#9aa2bd;background:var(--bg2);border:1px solid var(--line);border-radius:10px;padding:10px 12px;margin:0 0 12px}
.fd-item{display:flex;gap:11px;align-items:flex-start;padding:12px;border:1px solid var(--line);border-radius:13px;background:#0f111b;margin-bottom:9px}
.fd-ava{width:44px;height:44px;flex:0 0 44px;border-radius:50%;overflow:hidden;cursor:pointer;display:flex;align-items:center;justify-content:center;background:#1a1d2b}
.fd-ava img{width:100%;height:100%;object-fit:cover}
.fd-ini{font-weight:800;font-size:17px;color:#c7cce6}
.fd-main{flex:1;min-width:0}
.fd-hd{display:flex;align-items:center;gap:7px;flex-wrap:wrap;font-size:13px}
.fd-hd b{cursor:pointer}.fd-hd b:hover{text-decoration:underline}
.fd-lvl{font-size:11.5px;font-weight:700;color:var(--push);background:#171a28;border:1px solid var(--line);border-radius:5px;padding:0 5px}
.fd-when{font-size:11px;color:var(--faint);margin-left:auto}
.fd-bet{font-size:13.5px;color:#e6e9f5;margin-top:4px;line-height:1.4}
.fd-badge{font-size:11.5px;font-weight:800;letter-spacing:.3px;border-radius:5px;padding:1px 6px;vertical-align:middle}
.fd-badge.w{color:var(--good-bg);background:var(--good)}.fd-badge.l{color:#fff;background:var(--bad)}
.fd-badge.push{color:#0c111c;background:var(--push)}.fd-badge.pend{color:#0c111c;background:var(--gold-hi)}
.fd-od{font-size:12px;color:#9aa2bd;margin-left:2px}
.fd-sub{margin-top:5px}
.fd-sp{font-size:11.5px;color:var(--push);background:#171a28;border:1px solid var(--line);border-radius:5px;padding:1px 6px}
.fd-tail{flex:0 0 auto;align-self:center;font-size:12px;font-weight:700;color:var(--blue2);background:#141a26;border:1px solid #2a3550;border-radius:9px;padding:6px 10px;cursor:pointer;white-space:nowrap}
.fd-tail:hover{background:#1a2334}.fd-tail.on{color:var(--good-bg);background:var(--good);border-color:var(--good)}
.pf-odds{font-size:11px;font-weight:800;color:var(--gold-hi);background:rgba(var(--gold-rgb),.1);border:1px solid rgba(var(--gold-rgb),.25);border-radius:5px;padding:0 6px;font-variant-numeric:tabular-nums}
.pf-stk{font-size:11px;font-weight:700;color:#9be7c4;background:rgba(155,231,196,.1);border:1px solid rgba(155,231,196,.22);border-radius:5px;padding:0 6px}
.pf-when{font-size:11px;color:var(--faint)}
.pf-clvm{font-size:11.5px;color:var(--faint)}
.oddsbar{display:flex;flex-wrap:wrap;gap:10px;align-items:center;margin-bottom:12px}
.oddssearch{flex:1;min-width:180px;background:var(--bg2);border:1px solid var(--line);border-radius:10px;padding:9px 13px;color:var(--txt);font-size:14px}
.oddschips{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:14px}
/* ============ EVENT STATUS ============
   The single most-asked question on a board is "is this on now, next, or done?" — so status gets a real
   pill, not a colour cue alone. Icon + word + colour, so it reads the same to a colour-blind user, at a
   glance, and in a screenshot. */
/* ============ PM MODE: Today's prediction-market board ============
   The sportsbook board shows consensus by counting bots on a pick. The PM board answers the same question
   for prediction markets, which is the surface PM mode never had — it was inheriting the sportsbook board,
   which is why switching modes looked like it did nothing. */
.pmo-chart{background:var(--surf);border:1px solid var(--line);border-radius:12px;padding:11px 13px;margin-bottom:12px}
.pmo-h{font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.5px;color:var(--mut);margin-bottom:7px}
.pmo-svg{width:100%;height:46px;display:block}
.pmo-foot{display:flex;justify-content:space-between;font-size:11.5px;color:var(--mut);margin-top:5px;font-variant-numeric:tabular-nums}
.pmo-foot .pos{color:var(--good-hi)}.pmo-foot .neg{color:var(--bad-hi)}
.pmk-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(108px,1fr));gap:9px;margin-bottom:12px}
.pmk-c{background:var(--surf);border:1px solid var(--line);border-radius:11px;padding:10px 11px}
.pmk-c .k{display:block;font-size:11.5px;font-weight:800;text-transform:uppercase;letter-spacing:.5px;color:var(--mut)}
.pmk-c .v{display:block;font-size:16px;font-weight:800;font-variant-numeric:tabular-nums;margin-top:3px}
.pmk-note{font-size:11.5px;color:var(--mut);background:var(--surf);border:1px solid var(--line);border-radius:10px;
  padding:8px 11px;margin-bottom:9px}
.pmk-sec{font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.5px;color:var(--mut);margin:14px 0 8px}
.pmk-list{display:flex;flex-direction:column;gap:8px}
.pmk-row{display:flex;align-items:flex-start;gap:9px;background:var(--surf);border:1px solid var(--line);
  border-radius:11px;padding:10px 12px}
.pmk-main{flex:1;min-width:0}
.pmk-q{font-size:12.5px;font-weight:650;line-height:1.35;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.pmk-meta{display:flex;align-items:center;gap:7px;flex-wrap:wrap;font-size:11.5px;font-weight:700;color:var(--mut);margin-top:4px}
.pmk-px{font-variant-numeric:tabular-nums;color:var(--txt)}
.pmk-cat{opacity:.8}
.pmk-tr{font-size:11px;font-weight:800;letter-spacing:.4px;text-transform:uppercase;border:1px solid var(--line);
  border-radius:999px;padding:1px 7px}
.pmk-tr.ok{color:var(--good-hi);border-color:rgba(134,239,172,.4)}
.pmk-pnl{flex:none;font-size:13px;font-weight:800;font-variant-numeric:tabular-nums}
/* ============ COMPOSER + USER POSTS ============ */
/* ============ MARKET MODE IDENTITY ============
   The switch changes what the product IS, so it has to change how the product LOOKS. Accent only -- the
   layout, spacing and type stay identical, because this is the same app in a different domain, not a
   different app. Retinting the accent is enough to be unmistakable without being disorienting. */
body.mkt-pm{--gold:#7fd7ff;--gold2:#3aa6d8}
body.mkt-pm .navg.on,body.mkt-pm .bt.on{color:#7fd7ff}
body.mkt-pm .subtab.on{border-color:#7fd7ff;color:#a9e5ff}
body.mkt-pm header{box-shadow:inset 0 -2px 0 rgba(127,215,255,.35)}
body.mkt-pm .seghead{color:#d8f6ff}
/* A standing marker, so you always know which book you're reading even mid-scroll. */
/* -webkit-text-fill-color IS REQUIRED HERE. .brand paints a gradient with background-clip:text and
   color:transparent, and this pill sits inside it, so it inherited the transparent fill: the label
   disappeared and all that rendered was the rounded box. .brand small carries the same override for the
   same reason — that bug was found once and fixed on only one of the two children.
   nowrap for the second half of it: at narrow widths the label wrapped to two lines inside a pill and
   read as a square block beside the wordmark. */
.mkt-flag{display:none;align-items:center;gap:6px;font-size:11px;font-weight:800;letter-spacing:.6px;
  text-transform:uppercase;color:var(--info-hi);-webkit-text-fill-color:var(--info-hi);white-space:nowrap;
  background:rgba(var(--info-rgb),.12);border:1px solid rgba(var(--info-rgb),.35);
  border-radius:999px;padding:2px 9px;margin-left:8px;vertical-align:2px}
body.mkt-pm .mkt-flag{display:inline-flex}
.mq-sum{font-size:12px;color:var(--mut);margin-bottom:10px;font-variant-numeric:tabular-nums}
.mq-warn{background:rgba(255,107,107,.1);border:1px solid rgba(255,107,107,.35);color:var(--bad-hi);
  border-radius:11px;padding:11px 13px;font-size:12.5px;line-height:1.45;margin-bottom:12px}
.mq-row{display:flex;align-items:flex-start;gap:11px;background:var(--surf);border:1px solid var(--line);
  border-radius:12px;padding:11px 13px;margin-bottom:8px}
.mq-main{flex:1;min-width:0}
.mq-meta{display:flex;align-items:center;gap:7px;flex-wrap:wrap;font-size:11px;color:var(--mut);margin-bottom:5px}
.mq-kind{font-size:11px;font-weight:800;letter-spacing:.4px;text-transform:uppercase;border:1px solid var(--line);
  border-radius:999px;padding:1px 7px}
.mq-v{font-size:11px;font-weight:800;letter-spacing:.4px;text-transform:uppercase;border-radius:999px;padding:1px 7px}
.mqv-pending{color:var(--goldsoft);border:1px solid rgba(201,168,106,.4)}
.mqv-blocked{color:var(--bad-hi);border:1px solid rgba(255,107,107,.4)}
.mq-text{font-size:13px;line-height:1.45;white-space:pre-wrap;word-break:break-word}
.mq-reason{font-size:11px;color:var(--mut);margin-top:5px;font-style:italic}
.mq-acts{display:flex;flex-direction:column;gap:6px;flex:none}
.mq-acts .btn{min-height:34px;padding:0 12px;white-space:nowrap}
.mq-ok{background:var(--good-bg);color:var(--good-hi);border-color:var(--good-bg)}
.mq-no{background:var(--bad-bg);color:var(--bad-hi);border-color:var(--bad-bg)}
@media(max-width:520px){.mq-row{flex-direction:column}.mq-acts{flex-direction:row;width:100%}.mq-acts .btn{flex:1}}
.pf-fc{background:none;border:0;color:var(--mut);font:inherit;font-size:12.5px;cursor:pointer;padding:6px 8px;
  border-radius:8px;min-height:36px}
.pf-fc:hover{background:var(--surf);color:var(--txt)}
.pf-fc>b{color:var(--txt)}
.pf-tabs{margin:14px 0 10px}
.fl-row{display:flex;align-items:center;gap:10px;background:var(--surf);border:1px solid var(--line);
  border-radius:11px;padding:9px 11px;margin-bottom:7px}
.fl-row .fd-ava{width:36px;height:36px;flex:none;cursor:pointer}
.fl-main{flex:1;min-width:0}
.fl-main>b{font-size:13px;cursor:pointer}
.fl-bio{font-size:11px;color:var(--mut);margin-top:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.fl-rec{display:block;font-size:11.5px;color:var(--mut);margin-top:2px;font-variant-numeric:tabular-nums}
.pf-followbtn.sm{min-width:40px;min-height:36px;padding:0 10px;flex:none}
.fd-comp{display:flex;align-items:center;gap:10px;background:var(--surf);border:1px solid var(--line);
  border-radius:14px;padding:11px 13px;margin-bottom:12px;cursor:pointer}
.fd-comp:hover{border-color:var(--line3)}
.fd-comp .fd-ava{width:34px;height:34px;flex:none}
.fd-comp-line{color:var(--mut);font-size:13px}
.fd-comp-out{justify-content:center}
.fd-comp-on{display:block;cursor:default}
.fd-comp-on textarea{width:100%;background:#0d1520;border:1px solid var(--line);border-radius:10px;color:var(--txt);
  font:inherit;font-size:14px;padding:10px 12px;resize:vertical;min-height:74px}
.fd-comp-on textarea:focus{outline:none;border-color:var(--gold,var(--gold-hi))}
.fd-comp-row{display:flex;align-items:center;gap:8px;margin-top:9px}
.fd-comp-b{display:inline-flex;align-items:center;gap:6px;background:transparent;border:1px solid var(--line);
  color:var(--mut);border-radius:999px;padding:7px 12px;font:inherit;font-size:11.5px;font-weight:700;cursor:pointer;min-height:36px}
.fd-comp-b:hover{border-color:var(--info);color:var(--info-hi)}
.fd-comp-b .ti{width:14px;height:14px}
.fd-comp-n{margin-left:auto;font-size:11.5px;color:var(--mut);font-variant-numeric:tabular-nums}
.fd-comp-go{min-height:36px}
.fd-comp-att{display:flex;align-items:center;gap:7px;margin-top:8px;font-size:11.5px;color:var(--mut);
  background:var(--surf);border:1px solid var(--line);border-radius:9px;padding:7px 10px}
.fd-comp-att .ti{width:13px;height:13px;flex:none}
.fd-comp-x{margin-left:auto;background:none;border:0;color:var(--mut);font-size:16px;cursor:pointer;line-height:1}
/* The error sits under the box and KEEPS the draft — never a toast that vanishes with their words. */
.fd-comp-err{margin-top:8px;font-size:12px;line-height:1.4;color:var(--mut)}
.fd-comp-err.bad{color:var(--bad-hi);background:rgba(255,107,107,.08);border:1px solid rgba(255,107,107,.28);
  border-radius:9px;padding:8px 11px}
.fd-post .fd-text{font-size:13.5px;line-height:1.45;margin:2px 0 0;white-space:pre-wrap;word-break:break-word}
.fd-pend{font-size:11px;font-weight:800;letter-spacing:.4px;text-transform:uppercase;color:var(--goldsoft);
  border:1px solid rgba(201,168,106,.4);border-radius:999px;padding:1px 7px;margin-left:6px}
.fd-attach{display:flex;align-items:center;gap:9px;margin-top:9px;background:var(--surf);border:1px solid var(--line);
  border-radius:10px;padding:9px 11px}
.fd-att-b{font-size:12.5px;font-weight:700}
.fd-att-m{font-size:11px;color:var(--mut);flex:1;min-width:0}
.fd-acts{display:flex;align-items:center;gap:6px;margin-top:9px}
.fd-act{display:inline-flex;align-items:center;gap:5px;background:transparent;border:0;color:var(--mut);
  font:inherit;font-size:12px;cursor:pointer;padding:8px 10px;border-radius:9px;min-height:40px}
.fd-act:hover{background:var(--surf);color:var(--txt)}
.fd-act.on{color:var(--bad-hi)}
.fd-act .ti{width:14px;height:14px}
.fd-more{margin-left:auto;font-size:15px}
.fd-thread{margin-top:6px}
.fd-cmt{border-left:2px solid var(--line);padding:7px 0 7px 10px;margin-top:6px;font-size:12.5px;line-height:1.4}
.fd-cmt>b{font-size:12px}
.fd-cmt-in{display:flex;gap:7px;margin-top:8px}
.fd-cmt-in input{flex:1;min-width:0;background:#0d1520;border:1px solid var(--line);border-radius:9px;
  color:var(--txt);font:inherit;font-size:13px;padding:9px 11px;min-height:40px}
.fd-cmt-in input:focus{outline:none;border-color:var(--gold,var(--gold-hi))}
/* Options/report as a bottom sheet — a modal in the middle of the screen is the wrong shape on a phone. */
.fd-sheet{position:fixed;inset:0;z-index:80;background:rgba(4,6,12,.6);backdrop-filter:blur(3px);
  align-items:flex-end;justify-content:center}
.fd-pick-in{width:100%;max-width:520px;background:var(--surf);border:1px solid var(--line);
  border-radius:16px 16px 0 0;padding:14px 15px calc(14px + env(safe-area-inset-bottom));max-height:70vh;max-height:70dvh;overflow-y:auto}
.fd-pick-h{font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.5px;color:var(--mut);margin-bottom:9px}
.fd-pick-row{display:block;width:100%;text-align:left;background:var(--surf);border:1px solid var(--line);
  border-radius:10px;padding:11px 12px;margin-bottom:7px;color:var(--txt);font:inherit;cursor:pointer;min-height:44px}
.fd-pick-row:hover{border-color:var(--line3)}
.fd-pick-row>b{display:block;font-size:13px}
.fd-pick-row>span{display:block;font-size:11px;color:var(--mut);margin-top:2px}
@media(max-width:520px){
  .fd-post .fd-tail{margin-left:0}
  .fd-acts{gap:2px}
  .fd-act{padding:8px 8px}
}
.rm-chip{display:inline-flex;align-items:center;gap:6px;margin-top:8px;min-height:34px;padding:6px 12px;
  border-radius:999px;border:1px dashed var(--line);background:transparent;color:var(--mut);
  font:inherit;font-size:11.5px;font-weight:700;cursor:pointer;transition:border-color .15s,color .15s}
.rm-chip:hover{border-color:var(--info);color:var(--info-hi)}
.rm-chip .ti{width:14px;height:14px}
/* A room with people in it earns a solid border — an empty one still shows, but reads as an invitation. */
.rm-chip.hot{border-style:solid;border-color:rgba(var(--info-rgb),.45);color:var(--info-hi);background:rgba(var(--info-rgb),.08)}
.rm-chip.hot>b{color:#d8f6ff}
.ip-list{display:flex;flex-direction:column;gap:9px}
.ip-row{display:flex;align-items:flex-start;gap:10px;background:var(--surf);border:1px solid var(--line);
  border-radius:12px;padding:11px 13px}
.ip-main{flex:1;min-width:0}
.ip-mu{font-size:13px;font-weight:700;line-height:1.3}
.ip-bet{font-size:12px;color:var(--mut);margin-top:3px}
.ip-price{margin-left:7px;font-weight:800;color:var(--txt);font-variant-numeric:tabular-nums}
.ip-odds{display:flex;align-items:center;gap:7px;flex-wrap:wrap;margin-top:7px}
.ip-o{display:inline-flex;align-items:center;gap:5px;font-size:11.5px;background:var(--surf);border:1px solid var(--line);
  border-radius:999px;padding:4px 10px;font-variant-numeric:tabular-nums}
.ip-o>b{font-weight:700;color:var(--mut)}
.ip-src{font-size:11px;font-weight:800;letter-spacing:.4px;text-transform:uppercase;color:var(--info-hi)}
/* Saying "no live odds available" is the honest state; showing a frozen pre-game price would not be. */
.ip-odds.ip-none{font-size:11px;color:var(--mut);font-style:italic}
.ip-right{text-align:right;flex:none}
.ip-score{display:block;font-size:16px;font-weight:800;font-variant-numeric:tabular-nums}
.ip-clock{display:block;font-size:11.5px;color:var(--bad-hi);font-weight:700;margin-top:1px}
.ip-res{flex:none;width:26px;height:26px;border-radius:8px;display:flex;align-items:center;justify-content:center;
  font-size:11px;font-weight:800}
.ip-res.w{background:rgba(134,239,172,.15);color:var(--good-hi)}
.ip-res.l{background:rgba(255,107,107,.15);color:var(--bad-hi)}
.ip-res.p{background:rgba(138,162,184,.15);color:var(--mut)}
.ip-gd{font-size:11px;color:var(--mut);margin-top:4px}
@media(max-width:520px){.ip-row{padding:10px 11px}.ip-score{font-size:15px}}
.pmt-sum{font-size:12.5px;color:var(--mut);padding:10px 12px;background:var(--surf);border:1px solid var(--line);
  border-radius:11px;margin-bottom:12px}
.pmt-sum b{color:var(--txt);font-variant-numeric:tabular-nums}
.pmt-list{display:flex;flex-direction:column;gap:9px}
.pmt-row{background:var(--surf);border:1px solid var(--line);border-radius:12px;padding:11px 13px;position:relative;padding-right:52px}
.pmt-row>.tailbtn{position:absolute;right:11px;top:11px}
/* PM outcome rows are a label+price+tail triplet now, not one undifferentiated button */
.pm-opt{display:flex;align-items:center;gap:8px}
.pm-opt>.tailbtn{margin-left:auto;flex:none}
.pmtail{min-width:32px;min-height:32px}
/* touch target: this sat at ~30px, under the 44px minimum used everywhere else */
.pm-evmore{min-height:44px}
/* long questions were truncating unpredictably; clamp them consistently */
.pm-q,.pmt-q{display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}
.pm-mq{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.pm-chd{flex-wrap:wrap}
/* an expanded event used an inner scrollbox, which nests a scroll region inside the page scroll —
   a known mobile trap. Let it grow instead; the page already scrolls. */
.pm-evcard{max-height:none;overflow:visible}
.pmt-top{display:flex;align-items:center;gap:7px;flex-wrap:wrap;margin-bottom:5px}
.pmt-bt{font-size:11px;font-weight:800;letter-spacing:.5px;text-transform:uppercase;color:var(--mut)}
.pmt-live{font-size:11px;font-weight:800;color:var(--bad-hi)}
.pmt-cons{font-size:11px;font-weight:800;color:var(--gold,var(--gold-hi));background:rgba(var(--gold-rgb),.12);
  border-radius:999px;padding:2px 8px}
.pmt-q{font-size:13px;font-weight:650;line-height:1.35;color:var(--txt)}
.pmt-foot{display:flex;align-items:center;gap:4px;margin-top:7px}
.pmt-bot{font-size:14px;line-height:1}
.pmt-more{font-size:11.5px;font-weight:700;color:var(--mut);margin-left:2px}
.pmt-odds{margin-left:auto;font-size:12px;font-weight:800;font-variant-numeric:tabular-nums;color:var(--txt)}
/* NO MARKET DATA — a pick we made but provably cannot grade, because the results feed for its league
   isn't sold. Dimmed and labelled so it reads as "unresolvable", never as "still playing". */
.sc-nofeed{color:var(--goldsoft)}
.pick.nofeed{opacity:.62}
.pick.nofeed:hover{opacity:.95}
.pick.nofeed .badge::after{content:'no market data';display:inline-block;margin-left:6px;font-size:11px;
  font-weight:800;letter-spacing:.4px;text-transform:uppercase;color:var(--goldsoft);border:1px solid rgba(201,168,106,.45);
  border-radius:999px;padding:1px 6px;vertical-align:1px}
.oddsstatus{display:flex;flex-wrap:wrap;gap:7px;margin:0 0 10px}
.ostat{display:inline-flex;align-items:center;gap:5px;font:inherit;font-size:12px;font-weight:700;
  padding:7px 12px;border-radius:999px;cursor:pointer;color:var(--mut,var(--mut));
  background:var(--surf);border:1px solid var(--line,var(--surf3));transition:border-color .15s,color .15s,background .15s}
.ostat:hover{border-color:var(--line3)}
.ostat>i{font-style:normal;font-size:11px;line-height:1}
.ostat>b{font-variant-numeric:tabular-nums;color:var(--txt,#e8eef6)}
.ostat.on{background:#17202f;color:var(--txt,#e8eef6)}
.ostat.os-live>i{color:var(--bad-hi)}
.ostat.os-live.on{border-color:var(--bad-hi);color:var(--bad-hi)}
.ostat.os-upcoming>i{color:var(--info)}
.ostat.os-upcoming.on{border-color:var(--info);color:var(--info-hi)}
.ostat.os-final>i{color:var(--good-hi)}
.ostat.os-final.on{border-color:var(--good-hi);color:var(--good-hi)}
.ostat.os-all.on{border-color:var(--gold,var(--gold-hi));color:var(--gold,var(--gold-hi))}
.evp{display:inline-flex;align-items:center;gap:5px;font-size:11.5px;font-weight:800;letter-spacing:.5px;
  padding:3px 8px;border-radius:999px;border:1px solid transparent;white-space:nowrap;vertical-align:1px}
.evp>.evp-i{font-style:normal;font-size:11px;line-height:1}
.evp-d{font-weight:700;letter-spacing:0;opacity:.85;padding-left:4px;border-left:1px solid currentColor;margin-left:1px}
.evp-q{font-weight:900;opacity:.7;margin-left:1px}
.evp-live{color:var(--bad-hi);background:rgba(255,107,107,.13);border-color:rgba(255,107,107,.4)}
.evp-live>.evp-i{animation:tailpulse 1.8s ease-in-out infinite}
.evp-upcoming{color:var(--info-hi);background:rgba(var(--info-rgb),.11);border-color:rgba(var(--info-rgb),.32)}
.evp-final{color:var(--good-hi);background:rgba(134,239,172,.11);border-color:rgba(134,239,172,.3)}
.evp-est{opacity:.82;border-style:dashed}   /* estimated from the clock, not confirmed by a feed */
/* a finished game is context, not an opportunity — quiet it down so live/upcoming lead the eye */
.ogame.og-final{opacity:.72}
.ogame.og-final:hover{opacity:1}
.ogame.og-live{border-color:rgba(255,107,107,.28)}
@media(prefers-reduced-motion:reduce){.evp-live>.evp-i{animation:none}}
.ochip{font-size:11.5px;font-weight:600;color:var(--txt2);background:var(--surf);border:1px solid var(--line);border-radius:20px;padding:4px 11px;cursor:pointer;transition:all .12s}
.ochip:hover{border-color:var(--line3)}.ochip.on{background:var(--surf3);border-color:#4a7bd0;color:#dbe6ff}.ochip b{color:#7f93b8;margin-left:2px}
.ogrp{margin-bottom:20px}
.oghdr{font-size:13px;font-weight:700;color:var(--txt2);text-transform:uppercase;letter-spacing:.04em;padding:0 2px 8px}
.orow{display:flex;gap:14px;align-items:stretch;background:linear-gradient(165deg,var(--surf),var(--bg2));border:1px solid var(--surf3);border-radius:12px;padding:11px 14px;margin-bottom:7px}
.orow.orlive{border-color:var(--gold-bg);background:linear-gradient(165deg,#1c1710,#14100a)}
.oteams{flex:1;min-width:0}
.otop{display:flex;flex-wrap:wrap;gap:6px;align-items:center;margin-bottom:5px}
.owhen{font-size:11px;color:var(--faint)}.olive{font-size:11px;font-weight:800;color:var(--bad-hi);animation:tailpulse 1.8s ease-in-out infinite}
.oaway,.ohome{font-size:14px;font-weight:600;color:var(--txt);line-height:1.35;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.otag{font-size:11px;font-weight:800;letter-spacing:.05em;text-transform:uppercase;border-radius:5px;padding:2px 6px}
.ot-midas{color:var(--gold-hi);background:rgba(var(--gold-rgb),.12);border:1px solid rgba(var(--gold-rgb),.3)}
.ot-zeus{color:#c79ad8;background:rgba(199,154,216,.12);border:1px solid rgba(199,154,216,.3)}
.ot-vsin,.ot-pro{color:var(--info);background:rgba(var(--info-rgb),.12);border:1px solid rgba(var(--info-rgb),.3)}
.oplays{display:flex;flex-wrap:wrap;gap:5px;margin-top:6px}
.oplay{font-size:11px;color:var(--txt2);background:rgba(255,255,255,.03);border:1px solid var(--line);border-radius:6px;padding:2px 8px}
.oplay b{color:#f2f6ff;font-weight:700}
.oplay.op-midas{border-color:rgba(var(--gold-rgb),.3)}.oplay.op-midas b{color:var(--gold-hi)}
.oplay.op-zeus{border-color:rgba(199,154,216,.3)}.oplay.op-zeus b{color:#e2c4f0}
/* sportsbook grid */
.ogame{background:linear-gradient(180deg,var(--surf),var(--bg2));border:1px solid var(--surf3);border-radius:14px;padding:12px 14px 10px;margin-bottom:9px}
.ogame.oglive{border-color:var(--gold-bg);background:linear-gradient(180deg,#1c1710,#14100a)}
.og-head{display:flex;flex-wrap:wrap;gap:7px;align-items:center;margin-bottom:8px}
.og-grid{display:flex;flex-direction:column;gap:6px}
.og-row{display:grid;grid-template-columns:minmax(90px,1.4fr) 1fr 1fr 1fr;gap:6px;align-items:center}
.og-hdr{margin-bottom:1px}
.og-hdr .og-c{font-size:11px;font-weight:800;letter-spacing:.06em;text-transform:uppercase;color:var(--faint);text-align:center;padding:0}
.og-tm{font-size:14px;font-weight:600;color:var(--txt);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-right:4px}
.og-c{display:flex}
.obtn{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:1px;min-height:46px;
  background:var(--surf2);border:1px solid var(--line);border-radius:10px;cursor:pointer;transition:all .12s;font-family:inherit;padding:5px 4px}
.obtn:hover{background:#22305a;border-color:#4a7bd0;transform:translateY(-1px)}
.obtn:active{transform:scale(.97)}
.obtn.dis{background:transparent;border-color:var(--surf2);cursor:default}
.ob-l{font-size:11px;color:var(--mut);font-weight:600;line-height:1}
.ob-o{font-size:15px;font-weight:800;color:#eaf0fb;font-variant-numeric:tabular-nums;line-height:1.1}
.obtn.dis .ob-o{color:#454b5e;font-weight:600}
.ogame.oglive .obtn:hover{border-color:var(--gold2);background:var(--gold-bg)}
.obtn.obsharp{opacity:.62}.obtn.obsharp .ob-o{color:var(--txt2)}
/* best-odds line shopping + live prediction-market pricing */
.ob-best{font-size:11px;font-weight:800;letter-spacing:.2px;line-height:1;margin-top:2px;color:var(--good-hi);background:rgba(var(--good-rgb),.12);border:1px solid rgba(var(--good-rgb),.32);border-radius:5px;padding:2px 5px;white-space:nowrap;max-width:100%;overflow:hidden;text-overflow:ellipsis}
.ob-best.ob-onbest{color:var(--txt2);background:rgba(160,170,200,.1);border-color:rgba(160,170,200,.28)}
.obtn.obhasbest{border-color:rgba(var(--good-rgb),.4)}
.obtn.obhasbest:hover{border-color:var(--good);background:var(--good-bg)}
.ob-pm{font-size:11px;font-weight:800;letter-spacing:.2px;line-height:1;margin-top:2px;color:var(--bad-hi);background:rgba(var(--bad-rgb),.13);border:1px solid rgba(var(--bad-rgb),.34);border-radius:5px;padding:2px 5px;white-space:nowrap;max-width:100%;overflow:hidden;text-overflow:ellipsis}
.obtn.oblive{border-color:rgba(var(--bad-rgb),.34)}
.obtn.oblive .ob-o{color:var(--bad-hi)}
.obk-change{color:var(--blue2);cursor:pointer;font-weight:600;white-space:nowrap}
/* pregame → live comparison strip (live games we have a prediction-market price on) */
.lcbar{margin:2px 0 10px;padding:9px 11px;border:1px solid rgba(var(--bad-rgb),.3);border-radius:11px;background:linear-gradient(180deg,rgba(var(--bad-rgb),.08),rgba(var(--bad-rgb),.02))}
.lc-h{font-size:11.5px;font-weight:700;letter-spacing:.3px;color:var(--bad-hi);margin-bottom:6px}
.lc-h b{color:var(--bad-hi)}.lc-h .mut{font-weight:400;letter-spacing:0}
.lc-row{display:flex;align-items:center;gap:8px;font-size:13px;padding:2px 0}
.lc-tm{flex:1;min-width:0;color:#e6e9f5;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.lc-pre{color:var(--push);font-variant-numeric:tabular-nums}
.lc-arr{color:var(--faint);font-size:11px}
.lc-live{color:#fff;font-weight:800;font-variant-numeric:tabular-nums}
.lc-up{color:var(--good);font-size:11px;font-weight:800}
.lc-dn{color:var(--bad);font-size:11px;font-weight:800}
.lc-sc{min-width:20px;text-align:center;font-weight:800;color:var(--bad-hi);font-variant-numeric:tabular-nums;background:rgba(var(--bad-rgb),.16);border-radius:5px;padding:0 6px}
.og-score{margin-left:8px;font-weight:800;font-size:12px;color:#e6e9f5;font-variant-numeric:tabular-nums;background:var(--surf2);border:1px solid var(--line);border-radius:5px;padding:1px 7px}
.og-score.ogsc-live{color:var(--bad-hi);background:rgba(var(--bad-rgb),.14);border-color:rgba(var(--bad-rgb),.3)}
.lc-gc,.trk-gc,.gc-link{margin-left:8px;font-size:11.5px;font-weight:700;color:var(--blue2);background:transparent;border:0;cursor:pointer;padding:0;font-family:inherit;white-space:nowrap}
.lc-gc:hover,.trk-gc:hover,.gc-link:hover{text-decoration:underline}
.lc-gc{float:right}
.trk-score{display:inline-block;font-size:11px;font-weight:800;color:var(--bad-hi);background:rgba(var(--bad-rgb),.14);border:1px solid rgba(var(--bad-rgb),.3);border-radius:5px;padding:0 6px;font-variant-numeric:tabular-nums;margin-left:4px}
.gm-score{display:inline-block;margin-left:7px;font-size:11.5px;font-weight:800;color:var(--txt2);background:var(--surf2);border:1px solid var(--line);border-radius:5px;padding:0 6px;font-variant-numeric:tabular-nums;vertical-align:middle}
.gm-score.gms-live{color:var(--bad-hi);background:rgba(var(--bad-rgb),.14);border-color:rgba(var(--bad-rgb),.3)}
.pf-livesc{font-size:11px;font-weight:800;color:var(--txt2);background:var(--surf);border:1px solid var(--line);border-radius:5px;padding:1px 6px;font-variant-numeric:tabular-nums}
.pf-livesc.pfs-live{color:var(--bad-hi);background:rgba(var(--bad-rgb),.14);border-color:rgba(var(--bad-rgb),.3)}
.pf-gc{font-size:11.5px;font-weight:700;color:var(--blue2);background:transparent;border:0;cursor:pointer;padding:0;font-family:inherit;white-space:nowrap}
.pf-gc:hover{text-decoration:underline}
.fd-score{display:flex;align-items:center;gap:8px;margin-top:5px}
.fd-livesc{font-size:11px;font-weight:800;color:var(--txt2);background:var(--surf);border:1px solid var(--line);border-radius:5px;padding:1px 6px;font-variant-numeric:tabular-nums}
.fd-livesc.fds-live{color:var(--bad-hi);background:rgba(var(--bad-rgb),.14);border-color:rgba(var(--bad-rgb),.3)}
.fd-gc{font-size:11.5px;font-weight:700;color:var(--blue2);background:transparent;border:0;cursor:pointer;padding:0;font-family:inherit;white-space:nowrap}
.fd-gc:hover{text-decoration:underline}
.lb-livenow{font-size:11px;font-weight:800;letter-spacing:.3px;color:var(--bad-hi);background:rgba(var(--bad-rgb),.14);border:1px solid rgba(var(--bad-rgb),.3);border-radius:5px;padding:0 5px;vertical-align:middle;white-space:nowrap}
.zc-livescores{display:flex;flex-wrap:wrap;gap:5px;margin-top:5px}
.zc-gsc{font-size:11.5px;font-weight:600;color:var(--bad-hi);background:rgba(var(--bad-rgb),.12);border:1px solid rgba(var(--bad-rgb),.28);border-radius:5px;padding:1px 6px;font-variant-numeric:tabular-nums}
.zc-gsc b{font-weight:800;color:#fff}
.obk-change:hover{text-decoration:underline}
/* pick'em — free daily parlay at real odds */
.pe-boardhd{font-size:12px;color:var(--push);margin-bottom:10px}
.pe-topbar{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:12px}
.pe-freepill{font-size:12px;font-weight:700;color:var(--info-hi);background:rgba(var(--info-rgb),.1);border:1px solid rgba(var(--info-rgb),.28);border-radius:999px;padding:6px 13px}
.pe-freepill.pe-out{color:var(--mut);background:rgba(139,147,167,.1);border-color:rgba(139,147,167,.24)}
.pe-rewpill{font-size:12px;font-weight:700;color:var(--gold-hi);background:rgba(var(--gold-rgb),.09);border:1px solid rgba(var(--gold-rgb),.26);border-radius:999px;padding:6px 13px}
.pe-game{margin-bottom:9px;border:1px solid var(--surf3);border-radius:13px;overflow:hidden;background:linear-gradient(180deg,var(--bg2),var(--bg2))}
.pe-ghead{display:flex;align-items:center;gap:9px;padding:11px 13px;cursor:pointer;user-select:none;transition:background .12s;min-height:44px}
.pe-ghead:hover{background:var(--surf)}
.pe-ghead.pe-glive{background:linear-gradient(180deg,#1c1710,#14100a)}
.pe-gcar{font-size:11px;color:var(--faint);width:11px;flex-shrink:0}
.pe-gmu{font-size:13.5px;font-weight:700;color:var(--txt);flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.pe-gwhen{font-size:11px;font-weight:700;color:var(--push);white-space:nowrap}
.pe-ghead.pe-glive .pe-gwhen{color:var(--gold2)}
.pe-oo{font-size:11px;opacity:.85;font-weight:600;margin-left:3px}
.pe-lockstrip{text-align:center;font-size:11px;font-weight:800;letter-spacing:.05em;color:#7a7059;background:#17130b;border:1px solid #2a2110;border-radius:8px;padding:8px 0;margin-top:2px}
.pe-prop.pe-locked{opacity:.55;background:#0d0f18;border-color:#191c28}
.pe-prop.pe-locked .pe-pstat{color:#6a6a55}
.pe-add{font-size:11.5px;font-weight:700;color:var(--info-hi)}
.pe-slip-foot{text-align:center;font-size:11px;color:var(--push);margin-top:7px}
.pe-game .pe-grid{padding:0 11px 11px}
.pe-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(178px,1fr));gap:7px}
.pe-prop{background:linear-gradient(165deg,var(--surf),var(--bg2));border:1px solid var(--surf3);border-radius:11px;padding:8px 10px}
.pe-pname{font-size:13px;font-weight:700;color:var(--txt);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.pe-pstat{font-size:12px;font-weight:600;color:var(--gold-hi);margin-top:1px}
.pe-pmu{font-size:11.5px;margin:1px 0 7px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.pe-ou{display:flex;gap:6px}
.pe-ob,.pe-ub{flex:1;padding:7px 0;border-radius:8px;border:1px solid var(--line);background:var(--surf2);color:#dbe6ff;font-size:12px;font-weight:700;cursor:pointer;transition:all .12s;font-family:inherit;touch-action:manipulation}
/* on wide screens let the board breathe past the 1080 column so it reads as a dense board, not a tall stack of huge tiles */
@media(min-width:1120px){#pickem .pe-grid{grid-template-columns:repeat(auto-fill,minmax(184px,1fr))}}
@media(max-width:560px){.pe-grid{grid-template-columns:repeat(auto-fill,minmax(150px,1fr))}.pe-ob,.pe-ub{padding:9px 0;font-size:12.5px}}
.pe-ob:hover{border-color:var(--good)}.pe-ub:hover{border-color:var(--gold2)}
.pe-ob.on{background:var(--good-bg);border-color:var(--good);color:var(--good-hi)}
.pe-ub.on{background:var(--gold-bg);border-color:var(--gold2);color:var(--gold-hi)}
.pe-ob:active,.pe-ub:active{transform:scale(.96)}
.pe-entry{background:var(--bg2);border:1px solid var(--surf3);border-radius:11px;padding:11px 13px;margin-bottom:8px}
.pe-entry.pe-w{border-color:rgba(var(--good-rgb),.35)}.pe-entry.pe-l{border-color:rgba(var(--bad-rgb),.3)}
.pe-ehead{font-size:13px;font-weight:800;color:var(--txt);margin-bottom:6px}
.pe-leg{font-size:12px;color:var(--txt2);line-height:1.7}
.pe-slip{position:fixed;left:50%;transform:translate(-50%,135%);bottom:0;width:min(560px,100%);z-index:80;transition:transform .28s cubic-bezier(.22,1,.36,1);padding:0 10px calc(10px + env(safe-area-inset-bottom))}
.pe-slip.open{transform:translate(-50%,0)}
.pe-slip-in{background:linear-gradient(180deg,#171c2c,var(--bg2));border:1px solid #2a3152;border-radius:16px;padding:12px 15px;box-shadow:0 -16px 44px -18px rgba(0,0,0,.9)}
.pe-slip-top{display:flex;align-items:center;gap:8px;font-size:14px;color:var(--txt)}
.pe-mult{color:var(--gold-hi);font-weight:800}
.pe-clear{margin-left:auto;color:var(--push);font-size:12px;cursor:pointer}
.pe-legs{display:flex;flex-wrap:wrap;gap:6px;margin:9px 0}
.pe-chip{font-size:11.5px;font-weight:600;color:#dbe6ff;background:var(--surf3);border:1px solid #2a3552;border-radius:7px;padding:3px 8px;cursor:pointer}
.pe-stakerow{display:flex;gap:8px;align-items:center;margin-bottom:8px}
.pe-qs{display:flex;gap:5px}
.pe-qs button{background:var(--surf);border:1px solid var(--line);border-radius:8px;padding:8px 10px;color:#dbe6ff;font-size:12px;font-weight:700;cursor:pointer}
.pe-qs button:active{transform:scale(.95)}
.pe-stakerow input{flex:1;min-width:60px;background:var(--bg2);border:1px solid var(--line);border-radius:9px;padding:9px 12px;color:var(--txt);font-size:14px}
.pe-payout{min-height:16px;font-size:13px;color:var(--mut);text-align:center;margin-bottom:8px}
.pe-go{width:100%;background:linear-gradient(180deg,var(--gold-hi),var(--gold2));color:var(--gold-bg);border:none;border-radius:12px;padding:14px;font-size:15px;font-weight:800;cursor:pointer}
.pe-go:disabled{opacity:.5;cursor:default}.pe-go:not(:disabled):active{transform:scale(.98)}
.sim-diachip{display:inline-flex;align-items:center;gap:6px;font-size:13px;color:#cfe4f5;background:rgba(var(--info-rgb),.08);border:1px solid rgba(var(--info-rgb),.24);border-radius:999px;padding:6px 14px;margin-top:11px;cursor:default}
.sd-gem{font-size:15px}.sim-diachip b{color:var(--info)}
.compete-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:10px}
.compete-card{display:flex;gap:12px;align-items:flex-start;background:linear-gradient(165deg,#161a2b,#111420);border:1px solid var(--line);border-radius:14px;padding:14px;cursor:pointer;transition:transform .14s,border-color .14s}
.compete-card:hover{transform:translateY(-2px);border-color:var(--line3)}
.compete-card.live{border-color:rgba(var(--gold-rgb),.3)}
.compete-card:active{transform:scale(.98)}
.cc-ic{font-size:26px;line-height:1;flex-shrink:0}
.cc-t{font-size:15px;font-weight:800;color:var(--txt);margin-bottom:3px}
.cc-d{font-size:12px;color:var(--mut);line-height:1.5}
.cc-soon{font-size:11px;font-weight:800;letter-spacing:.06em;color:var(--push);background:rgba(139,147,167,.14);border-radius:5px;padding:2px 6px;margin-left:4px}
.cc-livetag{font-size:11px;font-weight:800;letter-spacing:.06em;color:var(--good-hi);background:rgba(var(--good-rgb),.14);border-radius:5px;padding:2px 6px;margin-left:4px}
.m-card{background:linear-gradient(180deg,var(--surf),var(--bg2));border:1px solid var(--line);border-radius:14px;padding:14px 16px;margin-bottom:10px}
.m-hd{font-size:15px;font-weight:800;color:var(--txt);margin-bottom:4px}
.m-hd2{font-size:14px;font-weight:700;color:var(--txt2);margin:16px 0 8px}
.m-sub{font-size:12px;color:var(--mut);margin-bottom:12px}
.m-opt-row{display:flex;align-items:center;gap:10px;margin-bottom:10px;flex-wrap:wrap}
.m-lbl{font-size:12px;color:var(--mut);width:74px;flex-shrink:0}
.m-pool{max-height:340px;overflow-y:auto;margin-bottom:12px}
.m-game{padding:8px 0;border-bottom:1px solid var(--surf2)}
.m-mu{font-size:13px;font-weight:600;color:#dbe6ff;margin-bottom:5px}
.m-opts{display:flex;flex-wrap:wrap;gap:6px}
.m-opt{background:var(--surf2);border:1px solid var(--line);border-radius:8px;padding:7px 10px;color:#dbe6ff;font-size:12px;cursor:pointer;font-family:inherit;transition:all .12s}
.m-opt:hover{border-color:#4a7bd0}.m-opt.on{background:var(--good-bg);border-color:var(--good);color:var(--good-hi)}
.m-opt:active{transform:scale(.96)}
.m-lock{width:100%;background:linear-gradient(180deg,var(--gold-hi),var(--gold2));color:var(--gold-bg);border:none;border-radius:12px;padding:14px;font-size:15px;font-weight:800;cursor:pointer;margin-top:4px}
.m-lock:disabled{opacity:.5;cursor:default}.m-lock:not(:disabled):active{transform:scale(.98)}
.m-match{background:var(--bg2);border:1px solid var(--surf3);border-radius:12px;padding:12px 14px;margin-bottom:8px}
.m-match.mw{border-color:rgba(var(--good-rgb),.35)}.m-match.ml{border-color:rgba(var(--bad-rgb),.3)}
.m-mhd{font-size:13px;font-weight:800;color:var(--txt);margin-bottom:8px}
.m-cols{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.m-cw{font-size:11px;font-weight:700;color:var(--mut);text-transform:uppercase;letter-spacing:.04em;margin-bottom:5px}
.m-leg{font-size:12px;color:var(--txt2);line-height:1.7;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* progress tab */
.pg-hero{background:linear-gradient(150deg,#1a1530,#12162a);border:1px solid #2a2450;border-radius:16px;padding:18px;margin-bottom:14px}
.pg-lvl{font-size:22px;font-weight:800;color:#f2f6ff;margin-bottom:10px}.pg-lvl b{color:var(--gold-hi)}
.pg-xpbar{height:12px;background:var(--bg2);border-radius:8px;overflow:hidden;border:1px solid var(--line)}
.pg-xpfill{height:100%;background:linear-gradient(90deg,var(--gold-hi),var(--gold2));border-radius:8px;transition:width .8s cubic-bezier(.2,.9,.25,1)}
.pg-xptxt{font-size:12px;color:var(--mut);margin-top:6px}
.pg-ladder{background:var(--surf);border:1px solid var(--line);border-radius:14px;padding:14px;margin-bottom:14px}
.pg-ladh{font-size:13px;font-weight:700;color:var(--txt);margin-bottom:10px}
.pg-ladrow{display:flex;gap:8px;overflow-x:auto;-webkit-overflow-scrolling:touch;padding-bottom:2px}
.pg-tier{flex:0 0 auto;min-width:58px;text-align:center;background:var(--surf2);border:1px solid var(--line2);border-radius:10px;padding:9px 8px;opacity:.5}
.pg-tier.got{opacity:1;border-color:rgba(var(--gold-rgb),.45);background:rgba(var(--gold-rgb),.07)}
.pg-tl{font-size:11px;font-weight:800;color:var(--mut)}
.pg-tier.got .pg-tl{color:var(--gold)}
.pg-tr{font-size:12px;font-weight:700;color:var(--txt);margin-top:3px;white-space:nowrap}
.pg-ladnote{font-size:11px;color:var(--mut);margin-top:9px;line-height:1.5}
.pg-streaks{display:grid;grid-template-columns:repeat(3,1fr);gap:9px;margin-bottom:16px}
.pg-st{background:var(--bg2);border:1px solid var(--surf3);border-radius:12px;padding:12px;text-align:center}
.pg-stn{font-size:19px;font-weight:800;color:var(--txt)}.pg-stl{font-size:11px;color:var(--mut);margin-top:2px}.pg-stb{font-size:11.5px;color:var(--faint);margin-top:2px}
.pg-hd{font-size:16px;font-weight:800;color:var(--txt);margin:18px 0 10px}
.pg-cat{font-size:12px;font-weight:700;color:var(--txt2);text-transform:uppercase;letter-spacing:.04em;margin:14px 0 8px}
.pg-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(238px,1fr));gap:9px}
.pg-ach{background:var(--bg2);border:1px solid var(--surf3);border-radius:12px;padding:11px 13px}
.pg-ach.pg-done{border-color:rgba(var(--good-rgb),.3);background:rgba(var(--good-rgb),.05)}
.pg-atop{display:flex;justify-content:space-between;align-items:baseline;gap:8px;margin-bottom:6px}
.pg-aname{font-size:13px;font-weight:700;color:var(--txt)}
.pg-axp{font-size:11.5px;color:var(--gold-hi);white-space:nowrap;flex-shrink:0}
.pg-bar{height:6px;background:var(--bg2);border-radius:4px;overflow:hidden;margin-bottom:4px}
.pg-fill{height:100%;background:linear-gradient(90deg,#4a7bd0,var(--blue2));border-radius:4px}
.pg-prog{font-size:11.5px;color:var(--push)}
/* bet-slip confirm sheet */
.obetscrim{position:fixed;inset:0;background:rgba(2,4,10,.62);opacity:0;pointer-events:none;transition:opacity .2s;z-index:120}
.obetscrim.on{opacity:1;pointer-events:auto}
/* KEYBOARD OVERLAP. .obetsheet is position:fixed;bottom:0, so on a phone the on-screen keyboard covered
   the stake field AND the confirm button -- you typed blind and could not reach 'Add to my tracker'.
   interactive-widget=resizes-content (added to the viewport meta) makes Android shrink the viewport
   instead of overlaying; this cap is what lets the sheet actually fit in what is left, and matches the
   treatment .moresheet already had. dvh rather than vh so it tracks the live viewport. */
.obetsheet{max-height:88dvh;overflow-y:auto;position:fixed;left:50%;bottom:0;transform:translate(-50%,110%);width:min(460px,100%);z-index:121;
  background:linear-gradient(180deg,#161b2b,var(--bg2));border:1px solid #2a3152;border-bottom:none;border-radius:20px 20px 0 0;
  padding:10px 20px calc(22px + env(safe-area-inset-bottom));box-shadow:0 -20px 60px -20px rgba(0,0,0,.9);transition:transform .26s cubic-bezier(.22,1,.36,1)}
.obetsheet.open{transform:translate(-50%,0)}
.obs-grab{width:38px;height:4px;border-radius:3px;background:var(--line3);margin:2px auto 14px}
.obs-live{font-size:12px;font-weight:700;color:var(--gold-hi);background:rgba(240,160,32,.1);border:1px solid rgba(240,160,32,.3);border-radius:9px;padding:7px 11px;margin-bottom:12px}
.obs-pick{font-size:22px;font-weight:800;color:#f4f7ff;line-height:1.15;text-wrap:balance}
.obs-game{font-size:13px;color:var(--push);margin:3px 0 14px}
.obs-odrow{display:flex;justify-content:space-between;align-items:center;background:var(--bg2);border:1px solid var(--line);border-radius:11px;padding:11px 15px;margin-bottom:14px}
.obs-odrow span{font-size:13px;color:var(--mut)}
.obs-odds{font-size:22px;font-weight:800;color:var(--gold-hi);font-variant-numeric:tabular-nums}
.obs-chips{display:flex;gap:8px;margin-bottom:10px}
.obs-chips button{flex:1;background:var(--surf);border:1px solid var(--line);border-radius:10px;padding:11px 0;color:#dbe6ff;font-size:14px;font-weight:700;cursor:pointer;transition:all .1s}
.obs-chips button:hover{background:var(--surf3);border-color:#4a7bd0}.obs-chips button:active{transform:scale(.95)}
.obs-payout{min-height:18px;font-size:13px;color:var(--mut);margin:-2px 0 12px;text-align:center}.obs-payout b{color:var(--txt)}
.obs-stake{width:100%;background:var(--bg2);border:1px solid var(--line);border-radius:11px;padding:13px 15px;color:var(--txt);font-size:15px;margin-bottom:10px}
/* smoothness: active-squish + no tap delay everywhere */
.btn:active,.obtn:active,.tailbtn:active,.obs-lock:active,.tab:active,.bt:active,.segbtn:active,.chip:active,.zoo-follow:active,.ochip:active{transform:scale(.96)}
.btn,.obtn,.tailbtn,.tab,.bt,.segbtn,.chip,.obs-lock,.obs-cancel,.zoo-follow,.ochip,.obs-chips button{touch-action:manipulation}
@media(prefers-reduced-motion:reduce){.btn:active,.obtn:active,.tailbtn:active,.tab:active,.bt:active,.segbtn:active,.chip:active{transform:none}}
@supports (view-transition-name:none){::view-transition-old(root){animation:120ms both _vtout}::view-transition-new(root){animation:200ms both _vtin}}
@keyframes _vtin{from{opacity:0}to{opacity:1}}@keyframes _vtout{from{opacity:1}to{opacity:0}}
@media(prefers-reduced-motion:reduce){::view-transition-old(root),::view-transition-new(root){animation:none}}
.obs-lock{width:100%;background:linear-gradient(180deg,var(--gold-hi),var(--gold2));color:var(--gold-bg);border:none;border-radius:13px;padding:17px;font-size:17px;font-weight:800;cursor:pointer;transition:filter .12s,transform .1s}
.obs-lock:hover{filter:brightness(1.06)}.obs-lock:active{transform:scale(.98)}
.obs-cancel{width:100%;background:transparent;color:var(--push);border:none;padding:12px;font-size:14px;cursor:pointer;margin-top:2px}
@media(max-width:520px){.og-tm{font-size:13px}.ob-o{font-size:14px}}
.omls{display:flex;gap:8px;align-items:flex-start}
.ocol{display:flex;flex-direction:column;align-items:center;gap:3px;min-width:52px}
.olbl{font-size:11px;font-weight:700;color:var(--faint);text-transform:uppercase;letter-spacing:.04em}
.ocell{font-size:13px;font-weight:700;color:#eaf0fb;font-variant-numeric:tabular-nums;line-height:1.5;text-align:center}
.ocell.mut{color:var(--faint)}
button.ocell.otail{background:rgba(255,255,255,.03);border:1px solid var(--line);border-radius:7px;padding:3px 8px;cursor:pointer;transition:all .12s;font-family:inherit}
button.ocell.otail:hover{background:var(--surf3);border-color:#4a7bd0;color:#dbe6ff;transform:translateY(-1px)}
button.ocell.otail.ou{margin-top:3px;font-size:11px;color:var(--txt2)}
.orow.orlive button.ocell.otail:hover{border-color:var(--gold2);background:var(--gold-bg);color:var(--gold-hi)}
.oopen{display:block;font-size:11px;font-weight:500;color:var(--faint);text-decoration:line-through}
@media(max-width:640px){.orow{flex-direction:column;gap:8px}.omls{overflow-x:auto}.ocol{min-width:46px}}
.zc-idle-tag{display:inline-block;font-size:11px;font-weight:600;color:var(--mut);background:rgba(var(--push-rgb),.1);border-radius:7px;padding:2px 8px}
.zoo-card.zc-idle{opacity:.6}
.zoo-card.zc-idle:hover{opacity:1}
.zoo-top{display:flex;gap:12px;align-items:flex-start;margin-bottom:13px}
.zoo-ava{width:52px;height:52px;border-radius:14px;background:#161a2c;border:1px solid var(--line);display:flex;align-items:center;justify-content:center;font-size:26px;flex:none}
.zoo-nm{font-weight:800;font-size:15px}
.zoo-method{font-size:12px;color:var(--mut);line-height:1.45;margin-top:4px}
.zoo-stats{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin-bottom:12px;font-variant-numeric:tabular-nums}
.zoo-st{background:var(--bg2);border:1px solid var(--line);border-radius:10px;padding:8px 6px;text-align:center}
.zoo-st .mut{font-size:11px;text-transform:uppercase;letter-spacing:.4px}
.zoo-st div:last-child{font-weight:800;font-size:15px;margin-top:2px}
.zoo-actions{display:flex;gap:8px}
.zoo-follow{flex:1;border:1px solid var(--gold);background:transparent;color:var(--gold);font:inherit;font-size:12.5px;font-weight:700;padding:7px;border-radius:9px;cursor:pointer;transition:background .14s}
.zoo-follow.on{background:var(--gold);color:var(--gold-bg)}
/* TAIL IS GOLD, FADE IS RED, AND THE COLOURS ARE NOT DECORATION -- they are the same two colours the rest
   of the product uses for "with us" and "against us", so a fade button reads as the opposite action at a
   glance rather than as a second, equal-looking follow.
   The action row now holds three controls on a card that is often 320px wide, so View profile gives up its
   equal share: it is the least-used of the three and the only one that still makes sense as a small link. */
.zoo-actions .btn.sm{flex:0 0 auto}
.zoo-follow.zf-fade{border-color:var(--bad);color:var(--bad)}
.zoo-follow.zf-fade.on{background:var(--bad);color:#fff}

/* ---- YOUR STABLE -------------------------------------------------------------------------------------
   The running total for the set you follow, at the top of the tab, because a follow with no visible
   consequence is the button we just replaced. */
.zoo-stable{border:1px solid var(--line);border-radius:14px;padding:13px 14px;margin:0 0 12px}
.zoo-stable.zs-empty{border-style:dashed;opacity:.85}
.zs-top{display:flex;align-items:center;gap:9px;flex-wrap:wrap;margin-bottom:9px}
.zs-h{font-weight:800;font-size:14px}
.zs-c{font-size:12.5px;color:var(--mut)}
.zs-only{margin-left:auto;border:1px solid var(--line);background:transparent;color:inherit;font:inherit;
  font-size:12px;font-weight:700;padding:5px 11px;border-radius:999px;cursor:pointer}
.zs-only.on{background:var(--gold);border-color:var(--gold);color:var(--gold-bg)}
.zs-row{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}
.zs-t{border:1px solid var(--line);border-radius:10px;padding:8px 6px;text-align:center}
.zs-t em{display:block;font-style:normal;font-size:11px;color:var(--mut);text-transform:uppercase;letter-spacing:.04em}
.zs-t b{display:block;font-size:17px;font-variant-numeric:tabular-nums;margin-top:3px}
.zs-b,.zs-n{font-size:12.5px;color:var(--mut);line-height:1.5}
.zs-b{margin-top:2px}
.zs-n{margin-top:8px}
.zoo-form{font-size:11px;font-weight:700;color:var(--goldsoft);margin-top:7px;letter-spacing:.2px}
.bd-sport{border:1px solid var(--line);border-radius:12px;background:var(--surf);margin-bottom:10px;overflow:hidden}
.bd-hdr{display:flex;align-items:center;gap:10px;padding:11px 15px;cursor:pointer;list-style:none;background:var(--surf2)}
.bd-hdr::-webkit-details-marker{display:none}
.bd-sport[open] .bd-hdr .chev{transform:rotate(90deg)}
/* by-sport edge tables: shared fixed column layout so Rec/Win%/Units line up across EVERY sport (not ragged) */
.bd-sport .lbwrap{overflow-x:hidden;border:none;border-radius:0}
.bd-sport .lbtable{table-layout:fixed}
.bd-sport .lbtable th:first-child,.bd-sport .lbtable td:first-child{width:40%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.bd-sport .lbtable th:nth-child(n+2),.bd-sport .lbtable td:nth-child(n+2){width:20%;text-align:right;white-space:nowrap}
/* ---- BY-SPORT TREE, MOBILE -----------------------------------------------------------------------------
   MUST sit AFTER the four base rules above. It was written ~700 lines earlier, with identical specificity,
   so every declaration lost on source order and the fix never ran once.
   The symptom it is for: at 375px, table-layout:fixed + width:40% leaves ~103px of text room in column one,
   while "No Run 1st Inn (NRFI)" needs ~143px. It ellipsed -- AND .lbwrap{overflow-x:hidden} meant the row
   could not be scrolled to read the rest. 158 cells across 11 blocks. Data you cannot reach is data loss,
   not density, which is why the answer is to let column one wrap rather than to shrink the type. */
@media(max-width:560px){
 .bd-sport .lbwrap{overflow-x:auto}
 .bd-sport .lbtable{table-layout:auto}
 .bd-sport .lbtable th:first-child,.bd-sport .lbtable td:first-child{
   width:auto;white-space:normal;overflow:visible;text-overflow:clip;word-break:break-word}
}
/* .bd-lg-m is NOT in the block above on purpose: its base rule (white-space:nowrap) is a few lines below,
   and the type-scale pass sets its line-height ~2,200 lines later still. Overriding it here would lose to
   both. See the .bd-lg-m media rule at the end of the type-scale section. */
.bd-sp{font-weight:700;color:var(--gold);font-size:13.5px}
.bd-meta{margin-left:auto;font-size:12px;color:var(--mut);font-variant-numeric:tabular-nums}
/* league tier nested inside a parent sport: MLB / NPB / KBO each get their own labeled sub-block + table */
.bd-lgcap{padding:7px 15px 1px;font-size:11.5px;font-weight:700;letter-spacing:.5px;text-transform:uppercase;color:var(--mut)}
.bd-lg{border-top:1px solid var(--line)}
.bd-lg-h{display:flex;align-items:baseline;justify-content:space-between;gap:10px;padding:9px 15px 3px}
.bd-lg-n{font-weight:700;color:var(--txt);font-size:12.5px}
.bd-lg-m{font-size:11.5px;color:var(--mut);font-variant-numeric:tabular-nums;white-space:nowrap}
.pf-form{font-size:12.5px;font-weight:700;color:var(--goldsoft);margin:2px 0 12px}
img.zoo-ava,img.pf-ava{object-fit:cover}
/* ---- profiles ---- */
.pf-link{cursor:pointer;color:inherit}.pf-link:hover{color:var(--gold);text-decoration:underline}
.pf-head{display:flex;align-items:center;gap:14px;margin-bottom:12px}
.pf-lvl{font-size:11.5px;font-weight:800;letter-spacing:.05em;color:var(--gold-hi);background:rgba(var(--gold-rgb),.13);border:1px solid rgba(var(--gold-rgb),.3);border-radius:6px;padding:2px 7px;vertical-align:middle}
.pf-owner{display:flex;gap:8px;flex-wrap:wrap;margin:-4px 0 14px}
.pf-obtn{background:#1a2233;border:1px solid #2a3552;border-radius:10px;padding:9px 14px;color:#dbe6ff;font-size:13px;font-weight:600;cursor:pointer;transition:all .12s}
.pf-obtn:hover{border-color:#4a7bd0;background:#22305a}.pf-obtn:active{transform:scale(.97)}
.pf-ava{width:58px;height:58px;border-radius:16px;display:flex;align-items:center;justify-content:center;font-weight:800;font-size:20px;color:#fff;flex:none;box-shadow:0 4px 16px rgba(0,0,0,.35)}
.pf-name{font-weight:800;font-size:19px}
.pf-bot{font-size:11px;font-weight:800;letter-spacing:.5px;background:#2f2450;color:#c4b5fd;border-radius:6px;padding:2px 7px;vertical-align:middle}
.crtag{font-size:11px;font-weight:800;letter-spacing:.5px;background:var(--good-bg);color:var(--good-hi);border-radius:6px;padding:2px 7px;vertical-align:middle}
.pf-bio{font-size:13.5px;color:var(--txt2);line-height:1.55;margin-bottom:10px}
.pf-edit{margin:6px 0 4px}.pf-edit textarea{width:100%;min-height:52px;margin-bottom:8px}
.pf-followrow{display:flex;align-items:center;gap:16px;margin:4px 0 12px;flex-wrap:wrap}
.pf-fc{font-size:12.5px;color:var(--mut);cursor:default}.pf-fc b{color:#e8ecf7;font-size:14.5px;font-weight:800}
.pf-followbtn{margin-left:auto;background:var(--gold);color:#1a1400;border:none;font-weight:800;font-size:12.5px;padding:7px 18px;border-radius:999px;cursor:pointer;transition:transform .1s}
.pf-followbtn:active{transform:scale(.95)}
.pf-followbtn.on{background:rgba(255,255,255,.07);color:var(--txt2);border:1px solid var(--line)}
.pf-clv{border-radius:12px;padding:11px 14px;margin:0 0 14px;font-size:13px;border:1px solid var(--line);line-height:1.5}
.pf-clv.pos{background:rgba(var(--good-rgb),.08);border-color:rgba(var(--good-rgb),.32)}.pf-clv.pos b{color:var(--good)}
.pf-clv.neg{background:rgba(var(--bad-rgb),.07);border-color:rgba(var(--bad-rgb),.28)}.pf-clv.neg b{color:var(--bad)}
.pf-clv .mut b{color:inherit}
.pf-tail1{background:var(--good-bg);color:var(--good-hi);border:1px solid var(--good-bg);border-radius:8px;font-size:11.5px;font-weight:700;padding:6px 12px;cursor:pointer;white-space:nowrap;flex:none;min-height:36px}
.pf-tail1:hover{background:#164023;border-color:#2a6340}
.pf-tail1.on{background:var(--good);color:var(--good-bg);border-color:var(--good)}
.ppl-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(232px,1fr));gap:12px}
.ppl-card{background:var(--bg2);border:1px solid var(--line);border-radius:14px;padding:14px;cursor:pointer;transition:border-color .12s;display:flex;flex-direction:column;gap:10px;min-height:152px}
.ppl-card:hover{border-color:var(--line3)}
.ppl-top{display:flex;align-items:center;gap:11px}
.ppl-top .pf-ava{width:44px;height:44px;font-size:16px;border-radius:13px}
.ppl-top .avwrap{border-radius:14px;padding:2.5px}.ppl-top .avwrap>.pf-ava{border-radius:11px}
.ppl-id{min-width:0;flex:1}
.ppl-nm{font-size:14px;font-weight:800;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ppl-pin{font-size:13px}
.ppl-bio{font-size:12px;color:#aab2c8;line-height:1.5;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.ppl-foot{display:flex;justify-content:flex-end;margin-top:auto}
.ppl-foot .pf-followbtn{margin-left:0}
.ppl-you{font-size:11px;color:var(--mut);font-weight:700;padding:6px 12px;border:1px dashed var(--line);border-radius:999px}
.pf-stats{display:grid;grid-template-columns:repeat(4,1fr);gap:10px;margin:14px 0}
.pf-st{background:var(--bg2);border:1px solid var(--line);border-radius:12px;padding:11px 10px;text-align:center}
.pf-sk{font-size:11.5px;text-transform:uppercase;letter-spacing:.4px;color:var(--mut);font-weight:700}
.pf-sv{font-size:18px;font-weight:800;margin-top:3px;font-variant-numeric:tabular-nums}
.pf-sech{font-size:11px;text-transform:uppercase;letter-spacing:.5px;color:var(--mut);font-weight:700;margin:16px 0 8px}
.pf-types{display:grid;gap:6px}
.pf-type{display:flex;align-items:center;gap:10px;font-size:13px;padding:7px 11px;background:var(--surf);border:1px solid var(--line);border-radius:9px;font-variant-numeric:tabular-nums}
.pf-tn{flex:1;font-weight:600}
.pf-spark svg{height:72px;width:100%;display:block}
@media(max-width:520px){.pf-stats{grid-template-columns:repeat(2,1fr)}}
.pf-full{margin-top:14px}
.pf-page-card{max-width:760px;margin:0 auto}
.pf-bet{display:flex;align-items:center;gap:10px;padding:9px 12px;border-bottom:1px solid var(--line)}
.pf-bet:last-child{border-bottom:0}
.pf-bet-l{flex:1;min-width:0;font-size:13px}
.pf-bet-u{font-weight:800;font-variant-numeric:tabular-nums;white-space:nowrap}
/* ---- game center (ESPN-style detail) ---- */
.sc-click{cursor:pointer}.sc-click:hover{border-color:var(--gold);transform:translateY(-1px)}
.sc-lines{margin-top:9px;padding-top:9px;border-top:1px solid var(--line2,var(--line2));font-variant-numeric:tabular-nums;display:flex;flex-direction:column;gap:6px}
.sc-mkrow{display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.sc-mk{font-size:11px;font-weight:800;letter-spacing:.4px;color:var(--mut);background:var(--line2);border-radius:4px;padding:2px 5px;flex:none;min-width:32px;text-align:center}
.sc-bet{background:#12203a;border:1px solid #31517d;color:#cfe0ff;font-size:11.5px;font-weight:600;padding:4px 10px;border-radius:8px;cursor:pointer;box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);transition:background .12s,border-color .12s;font-variant-numeric:tabular-nums}
.sc-bet b{color:#fff;font-weight:800;margin-left:3px}
.sc-bet:hover{background:#1a2d4f;border-color:#4a6da3}
.sc-bet:active{transform:scale(.96)}
.sc-bet.started{opacity:.62}
.sc-dot{color:var(--line3);margin:0 4px}
.sc-more{margin-top:8px;font-size:11.5px;color:#7a80a4;font-weight:600;letter-spacing:.3px;opacity:0;transition:opacity .12s}
.sc-click:hover .sc-more{opacity:1;color:var(--gold)}
@media(hover:none){.sc-more{opacity:.7}}
/* CENTRED. These were pinned to the top with align-items:flex-start, so the daily-spin wheel opened as a
   strip hugging the header instead of the centred moment it was designed as. `auto` margins on the child
   keep it centred while still allowing a tall modal to scroll rather than clip. */
.gcoverlay{position:fixed;inset:0;z-index:200;background:rgba(4,6,12,.72);backdrop-filter:blur(4px);display:flex;align-items:center;justify-content:center;padding:24px 14px;overflow-y:auto}
.gcoverlay>*{margin:auto 0}
.gcbox{position:relative;width:100%;max-width:680px;background:linear-gradient(180deg,var(--surf),#0d1119);border:1px solid var(--line);border-radius:18px;padding:22px;box-shadow:0 30px 80px rgba(0,0,0,.6)}
.gcclose{position:absolute;top:14px;right:18px;font-size:26px;color:var(--mut);cursor:pointer;line-height:1}.gcclose:hover{color:#fff}
.gc-teams{display:grid;grid-template-columns:1fr auto 1fr;align-items:center;gap:14px;margin:4px 0 6px}
.gc-tm{display:flex;flex-direction:column;gap:3px}.gc-tm:last-child{align-items:flex-end;text-align:right}
.gc-nm{font-weight:750;font-size:16px}.gc-rec{font-size:11.5px;color:var(--mut)}
.gc-sc{font-size:34px;font-weight:850;font-variant-numeric:tabular-nums;letter-spacing:-1px}.gc-dash{color:var(--mut);margin:0 8px;font-weight:400}
.gc-status{font-size:12.5px;color:var(--mut);display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.gc-livedot{width:7px;height:7px;border-radius:50%;background:var(--bad);animation:livepulse 2s infinite;display:inline-block}
.gc-sit{margin-top:12px;padding:9px 12px;background:#0f1626;border:1px solid #1e2a44;border-radius:10px;font-size:12.5px;color:#b9c4e2}
.gc-sec{margin-top:16px}.gc-sech{font-size:11px;text-transform:uppercase;letter-spacing:.5px;color:var(--mut);font-weight:700;margin-bottom:8px}
.gc-wp{background:var(--bg2);border:1px solid var(--line);border-radius:12px;padding:12px 14px}
.gc-wplabels{display:flex;justify-content:space-between;font-size:12px;margin-bottom:6px}.gc-wpsvg{display:block;height:94px;width:100%}
.gc-subtabs{display:flex;gap:2px;background:var(--bg2);border:1px solid var(--line);border-radius:11px;padding:3px;margin:18px 0 12px}
.gcbtn{flex:1;border:none;background:transparent;color:var(--txt2);font:inherit;font-size:12.5px;font-weight:600;padding:8px;border-radius:8px;cursor:pointer}
.gcbtn.on{background:var(--gold);color:var(--gold-bg)}
.rm-ride{padding:9px 12px;font-size:13px;color:var(--txt);background:rgba(var(--good-rgb),.08);border:1px solid rgba(var(--good-rgb),.25);border-radius:10px;margin-bottom:8px}
.rm-ridebtns{display:flex;gap:8px;margin-bottom:10px}
.rm-rb{flex:1;padding:9px;border:1px solid var(--line);background:var(--surf2);color:var(--txt);border-radius:9px;font:inherit;font-size:12.5px;font-weight:700;cursor:pointer;transition:border-color var(--d2),transform var(--d1) var(--ease-spring)}
.rm-rb:hover{border-color:var(--gold)}.rm-rb:active{transform:scale(.96)}
.rm-list{max-height:46vh;max-height:46dvh;overflow-y:auto;-webkit-overflow-scrolling:touch;border:1px solid var(--line);border-radius:10px}
.rm-row{padding:7px 11px;border-bottom:1px solid var(--line2);font-size:13px;line-height:1.4}
.rm-row:last-child{border-bottom:none}
.rm-row b{font-size:12.5px;color:var(--gold)}
.rm-in{display:flex;gap:6px;margin-top:8px}
.rm-in input{flex:1;background:var(--bg2);border:1px solid var(--line);border-radius:9px;color:var(--txt);padding:10px 12px;font:inherit;font-size:16px;outline:none}
.gc-plays{display:flex;flex-direction:column;max-height:44vh;max-height:44dvh;overflow-y:auto}
.gc-play{display:flex;align-items:baseline;gap:10px;padding:8px 4px;border-bottom:1px solid var(--surf2);font-size:13px}
.gc-scorep{background:rgba(240,198,116,.06)}
.gc-per{flex:none;width:74px;font-size:11.5px;color:var(--mut);font-weight:600}
.gc-ptxt{flex:1;color:#d3d8ee;line-height:1.45}
.gc-pscore{flex:none;font-weight:800;font-variant-numeric:tabular-nums;color:var(--gold)}
.gc-boxteam{margin-bottom:16px}
.gc-boxcat{font-size:11px;color:var(--mut);font-weight:700;margin:8px 0 4px}
.gc-boxwrap{overflow-x:auto}
.gc-box{width:100%;border-collapse:collapse;font-size:12px;font-variant-numeric:tabular-nums}
.gc-box th{color:var(--mut);font-size:11.5px;text-transform:uppercase;text-align:right;padding:5px 7px;border-bottom:1px solid var(--line)}
.gc-box th:first-child{text-align:left}
.gc-box td{padding:5px 7px;text-align:right;border-bottom:1px solid #161a29;white-space:nowrap}
.gc-box td.gc-pl{text-align:left;font-weight:600;color:#e2e6f5}
.parlaylegs{margin-top:7px;display:grid;gap:5px}
.pleglist{margin-top:6px;display:grid;gap:3px}
.pleg{display:flex;align-items:center;gap:8px;font-size:12px;font-weight:500;color:var(--txt2)}
.legchip{font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.4px;padding:2px 7px;border-radius:6px;background:#262a40;color:var(--txt2);white-space:nowrap}
.legchip.lw{background:var(--good-bg);color:var(--good-hi)}.legchip.ll{background:var(--bad-bg);color:var(--bad-hi)}.legchip.lp{background:#2a2740;color:#c7b8f0}.legchip.lpend{background:var(--line);color:var(--blue2)}
@keyframes livepulse{0%,100%{opacity:1}50%{opacity:.55}}
@media (prefers-reduced-motion:reduce){.livechip{animation:none}}
.chip.lbwin.on{background:var(--gold);color:var(--gold-bg);border-color:var(--gold);font-weight:700}
.lbgrid{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.lbhd{font-size:12px;color:var(--mut);text-transform:uppercase;letter-spacing:1px;margin-bottom:6px;font-weight:600}
.lbrow{display:flex;align-items:center;gap:10px;padding:8px 4px;border-bottom:1px solid #1e2236}
.lbrow:last-child{border-bottom:none}
.lbrank{width:22px;text-align:center;font-weight:800;color:var(--gold);font-variant-numeric:tabular-nums}
.lbname{flex:1;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.lbval{font-weight:800;font-variant-numeric:tabular-nums}
.lbn{font-size:11px;color:var(--mut);min-width:52px;text-align:right;font-variant-numeric:tabular-nums}
@media(max-width:640px){.lbgrid{grid-template-columns:1fr}}
.os-sec{font-size:11px;text-transform:uppercase;letter-spacing:1px;color:var(--mut);margin:12px 4px 4px;font-weight:600}
.os-row{padding:9px 11px;border:1px solid var(--line);border-radius:11px;margin:6px 0;background:var(--bg2)}
.os-row.os-pick{border-color:rgba(var(--gold-rgb),.42);background:linear-gradient(90deg,rgba(var(--gold-rgb),.07),var(--bg2))}
.os-mu{font-weight:600;font-size:13px;margin-bottom:7px}
.os-btns{display:flex;flex-wrap:wrap;gap:6px}
.obtn{background:#15203a;border:1px solid var(--line3);color:#cdd6f5;border-radius:8px;padding:5px 10px;font-size:12px;cursor:pointer;font-weight:600;white-space:nowrap;transition:border-color .12s,color .12s}
.obtn:hover{border-color:var(--gold);color:#fff}
.obtn.oseg{background:#191531;border-color:#3a2f5c;color:#c9b8ff}
.obtn.oseg:hover{border-color:#b9a5ff;color:#fff}
.os-seglbl{font-size:11.5px;text-transform:uppercase;letter-spacing:.8px;color:#6f74a0;margin:9px 0 5px;font-weight:600}
.lgrid{display:grid;grid-template-columns:repeat(auto-fit,minmax(320px,1fr));gap:14px;margin-bottom:20px}
.lcard{border:1px solid var(--line);border-radius:16px;padding:16px 18px}
.lcard.lm{background:linear-gradient(165deg,#12182a,#0f1322);border-color:#22314e}
.lcard.lf{background:linear-gradient(165deg,#1a1330,#120f22);border-color:#37275c}
.lhd{font-weight:800;font-size:14px;letter-spacing:.3px;margin-bottom:10px}
.llist{margin:0;padding-left:18px;display:grid;gap:8px;font-size:13px;color:#cdd2ea;line-height:1.5}
.levid{color:var(--mut);font-size:11.5px}
.lcount{color:var(--gold-hi);font-size:11px}
.jentry{border:1px solid var(--line);border-radius:16px;background:linear-gradient(165deg,var(--surf),var(--bg2));padding:18px 20px;margin-bottom:14px}
.jhead{display:flex;align-items:baseline;justify-content:space-between;gap:12px;flex-wrap:wrap;border-bottom:1px solid var(--line);padding-bottom:10px;margin-bottom:12px}
/* Entries are folds now (newest open). The header doubles as the summary, so it must not show a native marker. */
summary.jhead{cursor:pointer;list-style:none}
summary.jhead::-webkit-details-marker{display:none}
details.jentry:not([open]) summary.jhead{border-bottom:0;padding-bottom:0;margin-bottom:0}
details.jentry:not([open]){padding:14px 20px}
summary.jhead:hover .jdate{color:var(--gold)}
.jdate{font-weight:800;font-size:16px;letter-spacing:.3px}
.jmeta{font-size:12.5px;color:var(--mut);font-variant-numeric:tabular-nums}
.jnotes{margin:0;padding-left:18px;display:grid;gap:7px}
.jnotes li{font-size:14px;line-height:1.5;color:#d2d6ea}
.jsub{font-size:11px;text-transform:uppercase;letter-spacing:1px;color:var(--gold-dim);font-weight:600;margin:15px 0 7px}
.jtable{width:100%;border-collapse:collapse;font-size:13px}
.jtable td{padding:5px 8px;border-bottom:1px solid var(--surf2);font-variant-numeric:tabular-nums}
.jchips{display:flex;flex-wrap:wrap;gap:7px}
.jchip{font-size:12px;background:var(--bg2);border:1px solid var(--line);border-radius:8px;padding:5px 10px;color:#c3c8e6}
#track-resolved{background:linear-gradient(180deg,#0f131f,#0d1018)}
#track-resolved .trackrow{opacity:.9}
.bankhero .bk-line{font-size:13px;color:var(--mut)}
.bankhero.life{background:radial-gradient(640px 220px at 6% -34%,rgba(90,160,255,.10),transparent 62%),linear-gradient(160deg,#141b2f,var(--bg))}
.bankhero.sim{background:radial-gradient(640px 220px at 6% -34%,rgba(var(--info-rgb),.12),transparent 62%),linear-gradient(160deg,#0f1c26,#0c1119)}
.bankhero.sim::before{background:linear-gradient(90deg,transparent,rgba(var(--info-rgb),.5),transparent)}
.simtag{font-size:11px;font-weight:800;letter-spacing:.6px;background:#12303f;color:var(--info);border:1px solid rgba(var(--info-rgb),.3);border-radius:6px;padding:3px 8px;vertical-align:middle;margin-left:6px}
.sim-rewards{display:flex;gap:10px;flex-wrap:wrap;margin-top:4px}
.sim-claim{background:var(--good-bg) !important;color:var(--good-hi) !important;border-color:var(--good-bg) !important}
.sim-spin{background:#12303f !important;color:var(--info) !important;border-color:rgba(var(--info-rgb),.3) !important}
/* ---- Store (buy Diamonds + Pro) ---- */
.storebox{position:relative;background:linear-gradient(165deg,var(--surf2),var(--bg2));border:1px solid var(--line);border-radius:20px;padding:22px;width:100%;max-width:460px;max-height:88vh;max-height:88dvh;overflow-y:auto;box-shadow:0 30px 80px rgba(0,0,0,.7)}
.store-h{font-size:20px;font-weight:900;margin-bottom:6px}
.store-sec{font-size:14px;font-weight:800;letter-spacing:.01em}
.store-active{font-size:11.5px;font-weight:900;color:var(--good-bg);background:linear-gradient(135deg,var(--good-hi),var(--good));border-radius:6px;padding:2px 7px;vertical-align:middle}
.store-note{font-size:12px;margin:2px 0 10px;line-height:1.4}
.store-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px}
.store-card{position:relative;text-align:left;background:var(--bg2);border:1px solid var(--line);border-radius:14px;padding:14px;cursor:pointer;transition:border-color .14s,transform .12s;color:inherit}
.store-card:hover{border-color:var(--gold);transform:translateY(-2px)}
.store-card:active{transform:scale(.97)}
.store-card.off{opacity:.5;cursor:default}
.store-dia{font-size:22px;line-height:1}
.store-l{font-size:14px;font-weight:800;margin-top:4px}
.store-price{font-size:16px;font-weight:900;color:var(--gold);margin-top:3px;font-variant-numeric:tabular-nums}
.store-blurb{font-size:11px;color:var(--mut);margin-top:5px;line-height:1.35}
.store-tag{position:absolute;top:-8px;right:8px;font-size:11px;font-weight:900;letter-spacing:.02em;color:var(--bg);background:linear-gradient(135deg,var(--gold-hi),var(--gold-hi));border-radius:7px;padding:2px 7px;box-shadow:0 4px 10px -4px rgba(255,207,77,.7)}
.store-trial{font-size:11.5px;font-weight:900;color:var(--good-bg);background:linear-gradient(135deg,var(--good-hi),var(--good));border-radius:7px;padding:2px 7px;vertical-align:middle}
.store-then{display:block;font-size:11px;font-weight:600;color:var(--mut);margin-top:2px}
.promo-box{margin-top:16px;padding:12px 14px;background:var(--bg2);border:1px solid var(--line);border-radius:14px}
.promo-row{display:flex;gap:8px;margin-top:6px}
.promo-row input{flex:1;background:#0b0d16;border:1px solid var(--line);border-radius:10px;color:var(--txt);padding:10px 12px;font-size:14px;text-transform:uppercase;letter-spacing:.04em}
.promo-btn{border:none;border-radius:10px;background:linear-gradient(135deg,var(--gold-hi),var(--gold-hi));color:var(--bg);font-weight:800;font-size:13px;padding:0 16px;cursor:pointer}
.promo-btn:active{transform:scale(.96)}
.promo-admin{margin-top:10px;border:1px dashed #2a3550;border-radius:12px;padding:2px 12px}
.promo-admin summary{cursor:pointer;font-size:12px;color:var(--mut);padding:8px 0}
.promo-adminform{display:flex;flex-direction:column;gap:8px;padding:0 0 12px}
.promo-adminform input{background:#0b0d16;border:1px solid var(--line);border-radius:9px;color:var(--txt);padding:9px 11px;font-size:13px}
.pc-code{color:var(--gold);cursor:pointer;font-size:15px;letter-spacing:.06em}
.store-soon{background:rgba(var(--gold-rgb),.08);border:1px solid rgba(var(--gold-rgb),.3);border-radius:12px;padding:11px 13px;font-size:12.5px;color:var(--gold);margin-bottom:14px}
.dw-store{width:26px;height:26px;border-radius:50%;border:1px solid rgba(var(--gold-rgb),.4);background:rgba(var(--gold-rgb),.1);color:var(--gold);font-size:17px;font-weight:800;line-height:1;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;flex:none;transition:background .14s,transform .1s}
.dw-store:hover{background:rgba(var(--gold-rgb),.2)}.dw-store:active{transform:scale(.9)}
@media(max-width:420px){.store-grid{grid-template-columns:1fr}}
.btn.sm:disabled{opacity:.5;cursor:default}
.sim-mkt{display:flex;align-items:center;gap:10px;justify-content:space-between;padding:11px 13px;background:var(--surf);border:1px solid var(--line);border-radius:11px;margin-bottom:7px}
.sim-mkt-l{min-width:0;flex:1}.sim-mkt-l b{font-size:13.5px}
.sim-mkt-r{display:flex;align-items:center;gap:10px;flex:none}
.locker{background:var(--surf);border:1px solid var(--line);border-radius:13px;margin-top:10px;overflow:hidden}
.lk-sum{cursor:pointer;list-style:none;padding:13px 15px;font-size:14px;font-weight:700}.lk-sum::-webkit-details-marker{display:none}
#locker-body{padding:0 15px 15px}
.lk-sec{font-size:11px;text-transform:uppercase;letter-spacing:.5px;color:var(--mut);font-weight:700;margin:12px 0 8px}
.av-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(84px,1fr));gap:9px}
.av-cell{background:var(--bg2);border:1.5px solid var(--line);border-radius:12px;padding:7px;text-align:center;cursor:pointer;transition:border-color .12s}
.av-cell img{width:100%;aspect-ratio:1;border-radius:9px;object-fit:cover;display:block}
.av-cell.eq{border-color:var(--ice2,var(--info-hi));box-shadow:0 0 0 2px rgba(var(--info-rgb),.25)}
.av-cell.locked img{filter:grayscale(.6) brightness(.7)}
.av-cell:hover{border-color:var(--line3)}
.av-nm{font-size:11.5px;font-weight:700;margin-top:5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.av-cost{font-size:11.5px;color:var(--gold);font-weight:700;margin-top:1px}
.av-cell.eq .av-cost{color:var(--ice2,var(--info-hi))}
.lk-pub{display:flex;align-items:center;gap:8px;font-size:13px;color:var(--txt2);margin:10px 0;cursor:pointer}
.ach-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(178px,1fr));gap:10px}
.ach-cell{position:relative;display:flex;gap:11px;align-items:flex-start;background:var(--bg2);border:1px solid var(--line);border-left-width:3px;border-radius:12px;padding:11px 12px;text-align:left;opacity:.5;transition:transform .12s}
.ach-cell.got{opacity:1;background:rgba(var(--gold-rgb),.05)}
.ach-cell.got:hover{transform:translateY(-2px)}
.ach-cell.tier-bronze{border-left-color:#c88b52}.ach-cell.tier-silver{border-left-color:#c3cbe0}.ach-cell.tier-gold{border-left-color:var(--gold)}.ach-cell.tier-diamond{border-left-color:var(--info-hi)}
.ach-cell.got.tier-diamond{box-shadow:0 0 14px -4px rgba(143,224,255,.5)}.ach-cell.got.tier-gold{box-shadow:0 0 14px -4px rgba(var(--gold-rgb),.45)}
.ach-e{font-size:26px;line-height:1;flex:none;filter:grayscale(.7)}.ach-cell.got .ach-e{filter:none}
.ach-n{font-size:12.5px;font-weight:800;color:var(--txt);display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.ach-r{font-size:11.5px;font-weight:800;color:var(--info-hi);background:rgba(143,224,255,.12);border-radius:5px;padding:1px 6px}
.ach-cell.got .ach-r{color:var(--info-hi)}
.ach-d{font-size:11px;color:#9096ba;margin-top:3px;line-height:1.4}
.av-cell.sel{border-color:var(--info);box-shadow:0 0 0 2px rgba(var(--info-rgb),.35)}
.av-tierbadge{position:absolute;top:5px;right:5px;font-size:11px;font-weight:800;padding:1px 5px;border-radius:6px;letter-spacing:.3px}
.av-cell{position:relative}
.tb-gold{background:linear-gradient(135deg,var(--gold-hi),#c99a2e);color:var(--gold-bg)}
.tb-diamond{background:linear-gradient(135deg,#d6f6ff,var(--info));color:#023}
.tb-galaxy{background:linear-gradient(135deg,#b47cff,#5b3df0);color:#fff}
.tierpanel{margin-top:12px;background:#0b0e1a;border:1.5px solid var(--line);border-radius:14px;padding:12px}
.tierpanel .tp-h{font-size:12.5px;font-weight:800;margin-bottom:2px}
.tierpanel .tp-sub{font-size:11px;color:var(--mut);margin-bottom:10px}
.tier-row{display:grid;grid-template-columns:repeat(4,1fr);gap:8px}
.tier-c{background:var(--bg2);border:1.5px solid var(--line);border-radius:11px;padding:6px;text-align:center;cursor:pointer;transition:border-color .12s}
.tier-c img{width:100%;aspect-ratio:1;border-radius:8px;object-fit:cover;display:block}
.tier-c.locked{cursor:not-allowed}.tier-c.locked img{filter:grayscale(.85) brightness(.5)}
.tier-c.eq{border-color:var(--info);box-shadow:0 0 0 2px rgba(var(--info-rgb),.3)}
.tier-c:not(.locked):hover{border-color:var(--line3)}
.tier-lbl{font-size:11.5px;font-weight:800;margin-top:5px}
.tier-st{font-size:11px;margin-top:2px;color:var(--mut)}
.tier-c.eq .tier-st{color:var(--info);font-weight:700}
.tp-prog{height:6px;background:var(--surf);border-radius:4px;overflow:hidden;margin:10px 0 2px}
.tp-prog>i{display:block;height:100%;background:linear-gradient(90deg,var(--info),#b47cff)}
/* ---- profile-picture borders (cosmetic frames) ---- */
.avwrap{position:relative;display:inline-block;border-radius:17px;padding:3px;line-height:0;flex:none;--u:1px}
/* Avatar sits ABOVE every border layer, globally. Particle effects orbit BEHIND the face — that only
   works if the image is opaque, hence the background. Previously only 3 borders set this. */
.avwrap>img,.avwrap>.pf-ava{position:relative;z-index:2;display:block;border-radius:13px;object-fit:cover;background:var(--bg)}
.avwrap::before,.avwrap::after{pointer-events:none}
/* Effects extend 15-25px past the frame; %-based offsets can't express that, so everything scales off --u */
.pf-head .avwrap{--u:1.7px}
.avwrap>img,.avwrap>.pf-ava{display:block;border-radius:13px;object-fit:cover}
.bd-cell .avwrap>img{width:100%;height:100%}
.bd-none{padding:0;background:transparent}
.bd-steel{background:linear-gradient(135deg,#4a5170,var(--line),#4a5170);background-size:200% 200%;animation:bdshift 4s linear infinite}
.bd-ember{background:linear-gradient(135deg,var(--gold-hi),#ff8a3d,#e23b2e,#ff8a3d);background-size:220% 220%;box-shadow:0 0 14px rgba(255,90,40,.5);animation:bdshift 2.2s linear infinite,bdpulse 1.3s ease-in-out infinite}
.bd-emerald{background:linear-gradient(135deg,#7bffcf,var(--good),#0f8f5f,var(--good));background-size:220% 220%;box-shadow:0 0 14px rgba(57,230,168,.5);animation:bdshift 2.6s linear infinite}
.bd-neon{background:linear-gradient(135deg,#00e5ff,#ff36f5,#00e5ff);background-size:220% 220%;box-shadow:0 0 14px rgba(0,229,255,.55);animation:bdshift 1.8s linear infinite,bdpulse 1.2s ease-in-out infinite}
.bd-ice{background:linear-gradient(135deg,#eafcff,#d6f6ff,var(--info),#d6f6ff);background-size:220% 220%;box-shadow:0 0 14px rgba(var(--info-rgb),.55);animation:bdshift 2.4s linear infinite,bdpulse 1.6s ease-in-out infinite}
.bd-royal{background:linear-gradient(135deg,#d3b0ff,#b47cff,#6a2ff0,#b47cff);background-size:220% 220%;box-shadow:0 0 14px rgba(140,90,255,.5);animation:bdshift 2.3s linear infinite}
.bd-gold{background:linear-gradient(120deg,var(--gold-hi),var(--gold-hi),#c99a2e,var(--gold-hi));background-size:220% 220%;box-shadow:0 0 16px rgba(255,200,60,.6);animation:bdshift 2s linear infinite,bdpulse 1.5s ease-in-out infinite}
/* ---- new PREMIUM diamond borders (buyable with diamonds) ---- */
.bd-crimson{background:linear-gradient(135deg,var(--bad-hi),#e01e5a,#7a0f2e,#e01e5a);background-size:220% 220%;box-shadow:0 0 16px rgba(224,30,90,.6);animation:bdshift 2.1s linear infinite,bdpulse 1.4s ease-in-out infinite}
.bd-aurora{background:linear-gradient(135deg,#5eead4,var(--info),#b47cff,#5eead4);background-size:230% 230%;box-shadow:0 0 18px rgba(var(--info-rgb),.6);animation:bdshift 2.6s linear infinite}
.bd-solar{background:linear-gradient(135deg,var(--gold-hi),var(--gold-hi),#ff6a2e,var(--gold-hi));background-size:220% 220%;box-shadow:0 0 18px rgba(255,140,40,.65);animation:bdshift 1.9s linear infinite,bdpulse 1.3s ease-in-out infinite}
.bd-onyx{background:linear-gradient(135deg,#5a6285,var(--bg2),#c9a24a,var(--bg2));background-size:230% 230%;box-shadow:0 0 14px rgba(201,162,74,.5);animation:bdshift 3s linear infinite}
.bd-streak{background:linear-gradient(135deg,var(--gold-hi),var(--gold-hi),#ff3b2e,#ff8a3d);background-size:230% 230%;box-shadow:0 0 16px rgba(255,90,40,.6);animation:bdshift 1.4s linear infinite,bdflicker .5s ease-in-out infinite}
.bd-longshot{background:linear-gradient(135deg,#fff6d0,var(--gold-hi),var(--gold),var(--gold-hi));background-size:220% 220%;box-shadow:0 0 18px rgba(var(--gold-rgb),.7);animation:bdshift 2s linear infinite,bdpulse 1.3s ease-in-out infinite}
.bd-whale{background:linear-gradient(135deg,#7bffe0,#5eead4,var(--gold),#5eead4);background-size:220% 220%;box-shadow:0 0 14px rgba(94,234,212,.5);animation:bdshift 2.4s linear infinite}
.bd-champion{background:linear-gradient(120deg,var(--gold-hi),var(--gold-hi),var(--gold2),var(--gold-hi));background-size:230% 230%;box-shadow:0 0 20px rgba(255,200,60,.7);animation:bdshift 1.7s linear infinite,bdpulse 1.2s ease-in-out infinite}
.bd-galaxy{background:linear-gradient(120deg,#d3b0ff,#b47cff,#5b3df0,#00e5ff,#b47cff);background-size:230% 230%;box-shadow:0 0 20px rgba(140,90,255,.65);animation:bdshift 2s linear infinite,bdpulse 1.4s ease-in-out infinite}
@keyframes bdflicker{0%,100%{filter:brightness(1)}45%{filter:brightness(1.5)}70%{filter:brightness(.85)}}
@keyframes bdpulse{0%,100%{box-shadow:0 0 8px rgba(255,90,40,.35)}50%{box-shadow:0 0 18px rgba(255,90,40,.75)}}
@keyframes bdshift{0%{background-position:0 0}100%{background-position:200% 0}}
/* ---- ANIMATED premium frames: real motion. The avatar sits z-index:1 ABOVE the spinning gradient so it never tints. ---- */
.bd-laser,.bd-rave,.bd-diamond{position:relative;overflow:hidden}
.bd-laser>img,.bd-laser>.pf-ava,.bd-rave>img,.bd-rave>.pf-ava,.bd-diamond>img,.bd-diamond>.pf-ava{position:relative;z-index:1}
.bd-laser{background:var(--bg);box-shadow:0 0 18px rgba(255,54,245,.55)}
.bd-laser::before{content:'';position:absolute;inset:-45%;z-index:0;background:conic-gradient(from 0deg,#ff36f5,#00e5ff,#ffe600,var(--good),#ff36f5);animation:bdspin 2.4s linear infinite}
.bd-rave{background:#08060e;box-shadow:0 0 20px rgba(120,90,255,.6);animation:bdravepulse 1.1s ease-in-out infinite}
.bd-rave::before{content:'';position:absolute;inset:-45%;z-index:0;background:conic-gradient(from 90deg,#ff2d95,#7b2ff0,#00e5ff,var(--good),#ffe600,#ff2d95);animation:bdspin 1.3s linear infinite}
.bd-diamond{background:linear-gradient(135deg,#eafcff,#b8e6ff,#fff,#c9b8ff,#eafcff);background-size:220% 220%;box-shadow:0 0 16px rgba(180,220,255,.6);animation:bdshift 3s linear infinite}
.bd-diamond::after{content:'';position:absolute;inset:0;z-index:2;border-radius:inherit;pointer-events:none;background:radial-gradient(circle at 22% 26%,#fff 0 1.5px,transparent 2.4px),radial-gradient(circle at 80% 38%,#fff 0 1.5px,transparent 2.4px),radial-gradient(circle at 60% 82%,#fff 0 1px,transparent 2px),radial-gradient(circle at 35% 65%,#fff 0 1px,transparent 2px);animation:bdtwinkle 1.5s ease-in-out infinite}
@keyframes bdspin{to{transform:rotate(360deg)}}
@keyframes bdtwinkle{0%,100%{opacity:.15}50%{opacity:1}}
@keyframes bdravepulse{0%,100%{box-shadow:0 0 12px rgba(120,90,255,.5)}50%{box-shadow:0 0 26px rgba(255,45,149,.8)}}
@media(prefers-reduced-motion:reduce){.bd-streak,.bd-champion,.bd-galaxy,.bd-laser::before,.bd-rave::before,.bd-rave,.bd-diamond,.bd-diamond::after{animation:none}}
.bd-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(124px,1fr));gap:18px}
/* NEVER put overflow:hidden or contain:paint on a border card — it clips exactly what people paid for */
.bd-cell{text-align:center;cursor:pointer}
.bd-cell .avwrap{width:64px;height:64px}
/* Shop cards are a DIFFERENT class from locker cells and were never given a size, so every frame preview
   rendered at full column width. Constrain them explicitly rather than relying on a rule that doesn't apply. */
.sh-card .avwrap{width:72px;height:72px;margin:0 auto}
.sh-card .avwrap>img{width:100%;height:100%;border-radius:50%}
.sh-avimg{width:72px;height:72px;margin:0 auto}
.sh-avimg>img{width:100%;height:100%;object-fit:cover;border-radius:14px}
.sh-nm{font-size:12px;font-weight:700;margin:7px 0 6px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.sh-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(104px,1fr));gap:10px}
@media(min-width:760px){.sh-grid{grid-template-columns:repeat(auto-fill,minmax(120px,1fr))}}
/* Tabs: one collection on screen at a time instead of a single endless column. */
.shoptabrow{display:flex;gap:6px;margin:12px 0 12px}
.lk-tabs{flex-wrap:wrap}
.lk-bal{font-size:12.5px;font-weight:700;color:var(--mut,var(--mut));padding:9px 11px;background:var(--surf);
  border:1px solid var(--line,var(--surf3));border-radius:10px}
.lk-bal svg{vertical-align:-3px}
.shoptab2{flex:1;background:#111c2b;border:1px solid var(--line,var(--surf3));border-radius:11px;padding:9px 6px;
  font:inherit;font-size:12px;font-weight:800;color:var(--mut,var(--mut));cursor:pointer;transition:border-color .15s,color .15s,background .15s}
.shoptab2:hover{border-color:var(--line3)}
.shoptab2.on{border-color:var(--gold,var(--gold-hi));color:var(--gold,var(--gold-hi));background:#1a2233}
.shoptab2>span{display:block;font-size:11.5px;font-weight:700;opacity:.75;margin-top:2px;font-variant-numeric:tabular-nums}
/* touch target: the old .sh-btn computed to ~30px, below the 44px minimum */
.sh-btn{min-height:38px}
@media(max-width:420px){.sh-grid{grid-template-columns:repeat(auto-fill,minmax(96px,1fr));gap:8px}}
.bd-cell.locked{cursor:default}   /* full brightness: a locked item you can't see isn't aspirational */
.bd-nm{font-size:11px;font-weight:700;margin-top:7px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.bd-st{font-size:11px;font-weight:700;margin-top:1px;color:var(--gold)}
.bd-cell.eq .bd-st{color:var(--info)}.bd-cell.ach .bd-st{color:#b47cff}

/* ============ INVENTORY — the owned-first counterpart to the shop ============
   Shop cards sell (price, rarity chip, buy button). Inventory cards explain: the loudest thing on each
   card after the item itself is WHY you have it. Earned items get their own colour so they read as
   different in kind from bought ones — that distinction is the whole reason the panel exists. */
.inv-wrap{margin:14px 0;border:1px solid var(--line,var(--surf3));border-radius:14px;background:var(--card,#0e1622);overflow:visible}
.inv-sum-h{cursor:pointer;padding:13px 15px;font-weight:800;font-size:13.5px;list-style:none;user-select:none}
.inv-sum-h::-webkit-details-marker{display:none}
.inv-sum-h::before{content:'▸';display:inline-block;margin-right:8px;transition:transform .18s;color:var(--mut,var(--mut))}
.inv-wrap[open] .inv-sum-h::before{transform:rotate(90deg)}
#inv-body{padding:0 15px 16px}
.inv-tabs{display:flex;gap:8px;margin-bottom:12px;flex-wrap:wrap}
.inv-tab{flex:1;min-width:92px;background:#111c2b;border:1px solid var(--line,var(--surf3));border-radius:11px;
  padding:9px 10px;cursor:pointer;text-align:left;color:inherit;font:inherit;transition:border-color .15s,background .15s}
.inv-tab:hover{border-color:var(--line3)}
.inv-tab.on{border-color:var(--gold,var(--gold-hi));background:#1a2233}
.inv-tab .it-n{display:block;font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.5px;color:var(--mut,var(--mut))}
.inv-tab.on .it-n{color:var(--gold,var(--gold-hi))}
.inv-tab .it-c{display:block;font-size:17px;font-weight:800;font-variant-numeric:tabular-nums;margin:1px 0 5px}
.inv-tab .it-c .mut{font-size:12px;font-weight:600}
.inv-tab .it-bar{display:block;height:4px;border-radius:3px;background:#1b2739;overflow:hidden}
.inv-tab .it-bar>i{display:block;height:100%;background:linear-gradient(90deg,var(--gold-hi),var(--gold-hi));border-radius:3px}
.inv-sum{display:flex;gap:14px;flex-wrap:wrap;font-size:12px;color:var(--mut,var(--mut));
  padding:9px 11px;background:var(--surf);border-radius:10px;margin-bottom:11px}
.inv-sum b{color:var(--txt,#e8eef6);font-variant-numeric:tabular-nums}
.inv-sum svg{vertical-align:-2px}
.inv-note{font-size:12px;color:var(--mut,var(--mut));margin:0 0 10px}
.inv-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(146px,1fr));gap:12px}
.inv-card{background:var(--surf);border:1px solid var(--line,var(--surf3));border-radius:12px;padding:12px 11px;
  text-align:center;cursor:pointer;transition:border-color .15s,transform .12s}
.inv-card:hover{border-color:var(--line3);transform:translateY(-1px)}
.inv-card.on{border-color:var(--gold,var(--gold-hi));background:#17202f}
.inv-emo{font-size:30px;line-height:1.1}
.inv-img{width:62px;height:62px;border-radius:12px;object-fit:cover}
.inv-fr{width:62px;height:62px;margin:0 auto}
.inv-fr>img{width:100%;height:100%}
.inv-nm{font-size:12.5px;font-weight:800;margin-top:6px}
.inv-tier{font-size:11px;font-weight:800;letter-spacing:.6px;margin-top:2px;color:var(--mut,var(--mut))}
.inv-tier.t-mythic{color:#ff7ad9}.inv-tier.t-legendary{color:var(--gold-hi)}.inv-tier.t-epic{color:#b47cff}
.inv-tier.t-rare{color:var(--info)}.inv-tier.t-common{color:var(--mut)}
/* provenance — earned reads differently from bought, on purpose */
.inv-why{font-size:11.5px;font-weight:700;margin-top:5px;line-height:1.35}
.inv-why.earned,.inv-why.level{color:var(--good-hi)}
.inv-why.bought{color:var(--gold,var(--gold-hi))}
.inv-why.free{color:var(--mut,var(--mut))}
.inv-why.unmet{color:var(--goldsoft)}
.inv-desc{font-size:11.5px;color:var(--mut,var(--mut));margin-top:5px;line-height:1.4}
.inv-act{font-size:11.5px;font-weight:800;text-transform:uppercase;letter-spacing:.4px;margin-top:8px;color:var(--mut,var(--mut))}
.inv-card.on .inv-act{color:var(--gold,var(--gold-hi))}
@media(max-width:520px){.inv-grid{grid-template-columns:repeat(auto-fill,minmax(124px,1fr));gap:10px}}
@media(prefers-reduced-motion:reduce){.inv-card:hover{transform:none}}

/* ============ SHOP CARDS: rarity + one unambiguous action ============
   Before this, the whole cell had an onclick that was EITHER equip (free) OR buy (real diamonds) depending
   on state — same gesture, same place, wildly different consequence. Now the card is inert and the only
   thing that spends is a real <button>. */
.sh-card{position:relative;background:var(--bg2);border:1.5px solid var(--line);border-radius:14px;
  padding:14px 10px 10px;text-align:center;--tier:var(--mut)}
.sh-card::before{content:'';position:absolute;inset:-1.5px -1.5px auto;height:3px;
  border-radius:14px 14px 0 0;background:var(--tier)}      /* scannable down a column in peripheral vision */
.sh-chip{position:absolute;top:7px;right:7px;font-size:11px;font-weight:800;letter-spacing:.6px;
  padding:2px 6px;border-radius:6px;color:var(--tier);background:rgba(255,255,255,.06);
  border:1px solid var(--tier);opacity:.9}
.r-common{--tier:var(--mut)}
.r-rare{--tier:var(--info)}
.r-epic{--tier:#b47cff}
.r-legendary{--tier:var(--gold);border-color:rgba(var(--gold-rgb),.3)}
.r-mythic{--tier:var(--bad-hi);border-color:rgba(255,90,122,.38);box-shadow:0 0 22px -6px rgba(255,90,122,.5)}
.sh-btn{display:block;width:100%;margin-top:9px;padding:7px 6px;border-radius:9px;font-family:inherit;
  font-size:11.5px;font-weight:800;cursor:pointer;border:1px solid transparent;line-height:1.25;
  transition:filter .12s ease,transform .1s ease}
.sh-btn:hover{filter:brightness(1.1)} .sh-btn:active{transform:translateY(1px)}
.sh-btn:focus-visible{outline:2px solid var(--gold);outline-offset:2px}
.sh-btn.equip{background:var(--gold);color:var(--gold-bg)}                       /* loudest thing on the card */
.sh-btn.on{background:transparent;color:var(--info);border-color:var(--info);cursor:default}
.sh-btn.buy{background:var(--info);color:#06202b}
.sh-btn.short{background:transparent;color:var(--mut);border-color:var(--line)}
.sh-btn.short b{display:block;font-size:11px;font-weight:700;color:var(--gold);margin-top:2px}
.sh-btn.lock{background:transparent;color:#b47cff;border-color:rgba(180,124,255,.45);cursor:default}
.sh-prog{height:3px;background:rgba(255,255,255,.1);border-radius:3px;margin-top:6px;overflow:hidden}
.sh-prog i{display:block;height:100%;background:#b47cff;border-radius:3px}
.sh-grouphd{grid-column:1/-1;font-size:11.5px;font-weight:800;letter-spacing:.14em;text-transform:uppercase;
  color:var(--mut);margin:10px 0 -4px;display:flex;align-items:center;gap:8px}
.sh-grouphd::after{content:'';flex:1;height:1px;background:var(--line)}

/* ============ FLAGSHIP BORDERS ============ */
@keyframes bd-orbit{to{transform:rotate(360deg)}}
@keyframes bd-orbit-r{to{transform:rotate(-360deg)}}

/* --- METEOR BELT: tumbling lit-from-one-side rocks, embers orbiting the other way --- */
/* The rock ring is ONE conic-gradient with irregular hard stops (each rock = lit edge / body / shadow edge)
   masked into a belt. The embers are a single 2px dot carrying 7 box-shadow copies — rotating that one dot
   orbits all seven. Two animated layers total, both transform-only. */
.bd-meteor{background:linear-gradient(160deg,#2a1408,#120a06);
 box-shadow:0 0 calc(24*var(--u)) rgba(255,110,35,.30),inset 0 0 0 calc(1*var(--u)) rgba(255,150,70,.35)}
.bd-meteor::before,.bd-meteor::after{content:'';position:absolute;pointer-events:none}
.bd-meteor::before{inset:calc(-13*var(--u));z-index:0;
 background:conic-gradient(from 0deg,
  transparent 0 6deg,var(--gold-hi) 6deg 8deg,#c2622a 8deg 26deg,#5f2409 26deg 31deg,
  transparent 31deg 44deg,var(--gold-hi) 44deg 46deg,#d1743a 46deg 59deg,#6b2c10 59deg 62deg,
  transparent 62deg 80deg,#ffc98a 80deg 82deg,#b8551f 82deg 104deg,#59230a 104deg 108deg,
  transparent 108deg 122deg,#ffbe7a 122deg 124deg,#e08a44 124deg 137deg,#7a3312 137deg 140deg,
  transparent 140deg 159deg,var(--gold-hi) 159deg 161deg,#c96a2c 161deg 185deg,#5f2409 185deg 190deg,
  transparent 190deg 206deg,#ffc98a 206deg 208deg,#d97c34 208deg 220deg,#6b2c10 220deg 223deg,
  transparent 223deg 241deg,var(--gold-hi) 241deg 243deg,#bb5c22 243deg 267deg,#59230a 267deg 272deg,
  transparent 272deg 290deg,#ffbe7a 290deg 292deg,#e08a44 292deg 303deg,#7a3312 303deg 306deg,
  transparent 306deg 323deg,var(--gold-hi) 323deg 325deg,#c4632a 325deg 346deg,#5f2409 346deg 351deg,
  transparent 351deg 360deg);
 -webkit-mask:radial-gradient(closest-side,transparent 0 63%,#000 70%,#000 84%,transparent 93%);
         mask:radial-gradient(closest-side,transparent 0 63%,#000 70%,#000 84%,transparent 93%);
 animation:bd-orbit 26s linear infinite}
.bd-meteor::after{left:50%;top:50%;width:calc(2*var(--u));height:calc(2*var(--u));margin:calc(-1*var(--u));
 border-radius:50%;background:var(--gold-hi);z-index:1;
 box-shadow:calc(52*var(--u)) calc(-9*var(--u)) 0 calc(-.4*var(--u)) #ffb46a,
  calc(31*var(--u)) calc(40*var(--u)) 0 calc(-.7*var(--u)) #ff8a3d,
  calc(-6*var(--u)) calc(55*var(--u)) 0 calc(-.2*var(--u)) var(--gold-hi),
  calc(-44*var(--u)) calc(33*var(--u)) 0 calc(-.6*var(--u)) #ff8a3d,
  calc(-56*var(--u)) calc(-11*var(--u)) 0 calc(-.3*var(--u)) #ffb46a,
  calc(-28*var(--u)) calc(-47*var(--u)) 0 calc(-.7*var(--u)) #ff7a2e,
  calc(17*var(--u)) calc(-53*var(--u)) 0 calc(-.4*var(--u)) var(--gold-hi);
 filter:drop-shadow(0 0 calc(2.5*var(--u)) rgba(255,120,40,.95));
 animation:bd-orbit-r 17s linear infinite}

/* --- PRISM CUT: an OCTAGON, not a rounded square. Changing the silhouette is the point. --- */
/* Highlights travel the facets WITHOUT the shape spinning: the gradient's start angle is a registered
   custom property, so we animate the light rather than rotate the stone. Glow comes from ::after because
   clip-path would clip a drop-shadow. */
@property --bd-ang{syntax:'<angle>';inherits:false;initial-value:0deg}
.bd-prism{background:transparent;box-shadow:none;padding:calc(3*var(--u))}
.bd-prism::after{content:'';position:absolute;inset:calc(-16*var(--u));z-index:0;pointer-events:none;
 background:radial-gradient(closest-side,rgba(150,205,255,.45),rgba(150,205,255,.12) 55%,transparent 78%)}
.bd-prism::before{content:'';position:absolute;inset:calc(-9*var(--u));z-index:1;pointer-events:none;
 clip-path:polygon(30% 0,70% 0,100% 30%,100% 70%,70% 100%,30% 100%,0 70%,0 30%);
 background:conic-gradient(from var(--bd-ang,0deg),
  #ffffff 0 12deg,#a9cdf0 12deg 26deg,#5f7fae 26deg 38deg,#e8f4ff 38deg 52deg,
  #8fb6e0 52deg 66deg,#d8c8ff 66deg 80deg,#6a86bb 80deg 96deg,#ffffff 96deg 110deg,
  #9fc4ea 110deg 128deg,#5a76a8 128deg 142deg,#eef7ff 142deg 158deg,#b9a8f0 158deg 174deg,
  #7d9dcb 174deg 190deg,#ffffff 190deg 206deg,#8fb6e0 206deg 222deg,#5f7fae 222deg 238deg,
  #e8f4ff 238deg 256deg,#a9cdf0 256deg 272deg,#6a86bb 272deg 290deg,#d8c8ff 290deg 306deg,
  #ffffff 306deg 322deg,#8fb6e0 322deg 340deg,#5a76a8 340deg 360deg);
 animation:bd-facet 9s linear infinite}
@keyframes bd-facet{to{--bd-ang:360deg}}

/* Grid perf + phase-break: only the hovered/equipped card animates, and no two cards ever sync.
   20 cards moving on the same beat is what reads as a slot machine — not the motion itself. */
.bd-grid .avwrap,.bd-grid .avwrap::before,.bd-grid .avwrap::after{animation-play-state:paused}
.bd-grid .sh-card:hover .avwrap,.bd-grid .sh-card:hover .avwrap::before,.bd-grid .sh-card:hover .avwrap::after,
.bd-grid .sh-card:focus-within .avwrap,.bd-grid .sh-card:focus-within .avwrap::before,.bd-grid .sh-card:focus-within .avwrap::after,
.bd-grid .sh-card.eq .avwrap,.bd-grid .sh-card.eq .avwrap::before,.bd-grid .sh-card.eq .avwrap::after{animation-play-state:running}
.sh-card{--i:0}
.sh-card .avwrap::before,.sh-card .avwrap::after{animation-delay:calc(var(--i) * -0.37s)}
@media(prefers-reduced-motion:reduce){
 .bd-meteor::before,.bd-meteor::after,.bd-prism::before{animation:none}
}
/* ---- badges ---- */
.bg-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(80px,1fr));gap:9px}
.bg-cell{background:var(--bg2);border:1.5px solid var(--line);border-radius:11px;padding:10px 6px;text-align:center;cursor:pointer;transition:border-color .12s}
.bg-cell:not(.locked):hover{border-color:var(--line3)}
.bg-cell.pin{border-color:var(--gold);background:rgba(var(--gold-rgb),.08)}
.bg-cell.pin .bd-st{color:var(--gold)}
.bg-cell.ach{border-color:rgba(180,124,255,.35)}.bg-cell.ach .bd-st{color:#b47cff}
.bg-cell.locked{opacity:.5;cursor:not-allowed}
.bg-e{font-size:24px;line-height:1;filter:drop-shadow(0 2px 4px rgba(0,0,0,.4))}
.pf-pins{display:flex;gap:6px;margin-top:7px;flex-wrap:wrap}
.pf-pin{font-size:16px;line-height:1;background:rgba(var(--gold-rgb),.12);border:1px solid rgba(var(--gold-rgb),.3);border-radius:9px;padding:4px 8px}
.wheelbox{background:linear-gradient(168deg,var(--surf),#0c1019);border:1px solid var(--line);border-radius:20px;padding:22px;max-width:620px;width:94vw;text-align:center;box-shadow:0 30px 80px -30px rgba(0,0,0,.95)}
.wheel-title{font-size:16px;font-weight:800;color:var(--ice2,var(--info-hi));margin-bottom:14px}
.wheel-stage{position:relative;width:100%;margin:0 auto}
/* HypeDrop-style horizontal reel */
.reel-window{position:relative;width:100%;height:108px;margin:6px auto 2px;overflow:hidden;border-radius:14px;background:radial-gradient(120% 140% at 50% 0%,#132038,#0a0f1c);border:1px solid var(--line);-webkit-mask-image:linear-gradient(90deg,transparent,#000 15%,#000 85%,transparent);mask-image:linear-gradient(90deg,transparent,#000 15%,#000 85%,transparent)}
.reel-marker{position:absolute;left:50%;top:6px;bottom:6px;width:3px;transform:translateX(-50%);background:linear-gradient(var(--gold-hi),var(--gold));box-shadow:0 0 16px 2px rgba(var(--gold-rgb),.75);z-index:4;border-radius:3px}
.reel-marker::before{content:'';position:absolute;top:-7px;left:50%;transform:translateX(-50%);border-left:7px solid transparent;border-right:7px solid transparent;border-top:9px solid var(--gold)}
.reel-marker::after{content:'';position:absolute;bottom:-7px;left:50%;transform:translateX(-50%);border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:9px solid var(--gold)}
.reel-track{position:absolute;top:0;left:0;height:100%;display:flex;will-change:transform}
.reel-item{flex:0 0 88px;width:88px;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;border-right:1px solid rgba(255,255,255,.06);background:linear-gradient(180deg,rgba(255,255,255,.02),transparent)}
.reel-item .cn-ic,.reel-item .reel-coin{width:32px;height:32px}
.reel-item .reel-gem{font-size:28px;line-height:1}
.reel-item .reel-amt{font-size:15px;font-weight:800;color:#eaf7ff;font-variant-numeric:tabular-nums}
.reel-item.gemi{background:linear-gradient(180deg,rgba(var(--info-rgb),.14),transparent)}.reel-item.gemi .reel-amt{color:var(--info-hi)}
.reel-item.jack{background:linear-gradient(180deg,rgba(var(--gold-rgb),.2),transparent)}.reel-item.jack .reel-amt{color:var(--gold)}
.reel-item.reel-win{animation:reelPulse 1s ease-out}
@keyframes reelPulse{0%{box-shadow:inset 0 0 0 0 rgba(255,233,168,0)}30%{box-shadow:inset 0 0 26px 3px rgba(255,233,168,.6)}100%{box-shadow:inset 0 0 14px 1px rgba(255,233,168,.3)}}
@media(prefers-reduced-motion:reduce){.reel-item.reel-win{animation:none}}
.wheel-stage canvas{width:100%;height:100%;display:block;border-radius:50%;box-shadow:0 0 0 6px #0b0f1c,0 0 0 8px var(--line),0 20px 50px -22px rgba(0,0,0,.9)}
.wheel-ptr{position:absolute;top:-3px;left:50%;transform:translateX(-50%);z-index:3;width:0;height:0;border-left:12px solid transparent;border-right:12px solid transparent;border-top:20px solid var(--gold);filter:drop-shadow(0 3px 4px rgba(0,0,0,.6))}
.wheel-hub{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);z-index:2;width:50px;height:50px;border-radius:50%;background:linear-gradient(150deg,#1c2440,#0c1020);border:2px solid var(--line);display:flex;align-items:center;justify-content:center;font-size:22px}
.wheel-result{min-height:26px;margin:16px 0 12px;font-weight:800;font-size:16px;color:var(--ice2,var(--info-hi))}
.betbox{position:relative;background:linear-gradient(168deg,var(--surf),#0c1019);border:1px solid var(--line);border-radius:20px;padding:22px;max-width:380px;width:92vw;box-shadow:0 30px 80px -30px rgba(0,0,0,.95)}
.bm-side{font-size:18px;font-weight:800;color:#eaf7ff;padding-right:26px;text-wrap:balance}
.bm-matchup{font-size:12.5px;color:var(--mut,var(--mut));margin:5px 0 16px}
.bm-modes{display:flex;gap:8px;margin-bottom:7px}
.bm-modes .segbtn{flex:1;padding:11px 8px;font-size:13.5px;font-weight:700}
.bm-modehint{font-size:11.5px;color:var(--mut,var(--mut));min-height:16px;margin-bottom:13px;line-height:1.35}
.bm-amtlab{display:block;font-size:11.5px;font-weight:800;text-transform:uppercase;letter-spacing:.5px;color:var(--mut,var(--mut));margin-bottom:5px}
.bm-bal{font-size:11.5px;color:var(--gold-hi);margin-top:6px;font-weight:700}
.bm-preview{min-height:20px;font-size:13.5px;margin:13px 0;text-align:center}
.bm-confirm{width:100%;font-size:15px;padding:13px}
.vs-card{border:1px solid var(--line);border-radius:14px;padding:12px 15px;margin:10px 0 4px;background:rgba(20,26,42,.4)}
.vs-row{display:flex;align-items:center;gap:10px;padding:6px 0}
.vs-row+.vs-row{border-top:1px solid rgba(255,255,255,.05)}
.vs-lab{font-weight:700;font-size:13px;color:#eaf7ff}
.vs-row .mut{margin-left:auto;font-size:12px;font-variant-numeric:tabular-nums}
.vs-v{font-weight:800;font-size:15px;font-variant-numeric:tabular-nums;min-width:82px;text-align:right}
.vs-note{font-size:11.5px;line-height:1.4;margin-top:8px}
.parlay-card{border:1px solid var(--line);border-radius:14px;padding:14px 16px;margin:10px 0 4px;background:linear-gradient(168deg,rgba(196,181,253,.06),rgba(20,26,42,.35))}
.review-card{border:1px solid #2a3550;border-radius:14px;padding:15px 17px;margin:12px 0 4px;background:linear-gradient(165deg,rgba(var(--info-rgb),.06),rgba(20,26,42,.4))}
.rv-h{font-weight:800;font-size:14px;margin-bottom:9px;letter-spacing:.2px}
.rv-l{margin:0 0 9px;font-size:13.5px;line-height:1.5;color:var(--txt)}
.rv-foot{font-size:11px;margin-top:2px}
.parlay-card.neg{background:linear-gradient(168deg,rgba(230,120,120,.07),rgba(20,26,42,.35))}
.par-stats{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;margin-top:12px}
.ps-cell{background:linear-gradient(168deg,rgba(196,181,253,.06),rgba(20,26,42,.35));border:1px solid var(--line);border-radius:12px;padding:12px 10px;text-align:center}
.ps-v{font-size:20px;font-weight:800;color:var(--txt);line-height:1;font-variant-numeric:tabular-nums}
.ps-l{font-size:11.5px;color:var(--mut);margin-top:5px;line-height:1.3}
@media(max-width:520px){.par-stats{gap:7px}.ps-v{font-size:17px}}
.psbs{margin-top:10px;border:1px solid var(--line);border-radius:12px;overflow:hidden;background:rgba(20,26,42,.35)}
.psbs>summary{cursor:pointer;list-style:none;padding:10px 14px;font-size:12.5px;font-weight:700;color:#c4b5fd;background:rgba(196,181,253,.06)}
.psbs>summary::-webkit-details-marker{display:none}
.psbs-head,.psbs-row{display:grid;grid-template-columns:1.2fr .6fr .8fr .8fr .9fr;gap:6px;align-items:center;padding:7px 14px;font-size:12px}
.psbs-head{color:var(--mut);font-weight:700;font-size:11.5px;text-transform:uppercase;letter-spacing:.03em;border-bottom:1px solid var(--line)}
.psbs-row{border-top:1px solid rgba(255,255,255,.04);font-variant-numeric:tabular-nums;color:var(--txt2)}
.psbs-name{font-weight:600;color:var(--txt)}
.pc-h{font-size:14px;font-weight:800;color:#eaf7ff;margin-bottom:11px}
.pc-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:8px}
.pc-cell{text-align:center}
.pc-v{font-size:17px;font-weight:800;font-variant-numeric:tabular-nums;color:#eaf7ff}
.pc-l{font-size:11.5px;text-transform:uppercase;letter-spacing:.4px;color:var(--mut,var(--mut));margin-top:2px}
.pc-sub{font-size:11px;margin-top:10px;text-align:center}
@media(max-width:420px){.pc-grid{grid-template-columns:repeat(2,1fr);gap:12px}}
.simbet-cta{background:linear-gradient(168deg,rgba(var(--info-rgb),.06),rgba(20,26,42,.4));border:1px solid rgba(var(--info-rgb),.22);border-radius:16px;padding:16px;margin-top:16px}
.sbc-h{font-size:15px;font-weight:800;color:#eaf7ff;margin-bottom:5px}
.sbc-sub{font-size:12px;color:var(--mut,var(--mut));line-height:1.45;margin-bottom:11px}
.sbc-plus{display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;border-radius:50%;background:var(--gold,var(--gold));color:#1a1300;font-weight:800;font-size:13px;vertical-align:middle}
:root{--ice2:#b8ebff}
.tourbox{background:linear-gradient(168deg,var(--surf),#0c1019);border:1px solid var(--line);border-radius:20px;padding:24px 22px;max-width:400px;width:92vw;box-shadow:0 30px 80px -30px rgba(0,0,0,.95)}
.tourbox{position:relative}
.tour-x{position:absolute;top:10px;right:10px;background:rgba(255,255,255,.06);border:1px solid var(--line);color:#9aa3bd;font-size:11px;font-weight:700;padding:4px 9px;border-radius:8px;cursor:pointer;z-index:2}
.tour-x:hover{color:#fff;border-color:var(--line3)}
.tour-dots{display:flex;gap:7px;justify-content:center;margin-bottom:16px}
.tdot{width:7px;height:7px;border-radius:50%;background:#2a3150}.tdot.on{background:var(--ice2);width:20px;border-radius:4px}
.tour-emoji{font-size:40px;text-align:center;line-height:1;margin-bottom:8px}

/* The tour OFFER. Sits in the flow above the Practice Book rather than over it -- an invitation, not an
   interruption. Deliberately quieter than a modal: if someone ignores it entirely, that is a valid answer. */
.simtourbar{display:flex;align-items:center;justify-content:space-between;gap:14px;flex-wrap:wrap;
 border:1px solid var(--line);border-left:3px solid rgba(var(--gold-rgb),.6);border-radius:12px;
 background:var(--surf);padding:12px 15px;margin:0 0 14px;font-size:13px;line-height:1.55;color:var(--mut)}
.simtourbar b{color:var(--txt)}
.simtourbar .stb-btns{display:flex;gap:8px;flex:none}
.simtourbar .btn{padding:7px 14px;font-size:12.5px}
.tour-h{font-size:20px;font-weight:850;text-align:center;letter-spacing:-.01em;margin-bottom:12px;text-wrap:balance}
.tourbox p{font-size:14.5px;color:var(--txt2);line-height:1.55;margin:0 0 12px}
.tour-pick{background:var(--bg2);border:1px solid rgba(var(--info-rgb),.3);border-radius:12px;padding:12px 14px;margin:12px 0}
.tour-stake{display:flex;align-items:center;gap:10px;margin:14px 0}
.tour-payout{background:var(--bg2);border:1px solid var(--line);border-radius:12px;padding:12px 14px;font-size:13.5px;line-height:1.6;margin-bottom:6px}
.tour-btns{display:flex;flex-direction:column;gap:9px;margin-top:18px}
.tour-btns .btn{width:100%}
.btn.ghost{background:transparent;border-color:var(--line);color:var(--mut)}
.btn.ghost:hover{color:var(--txt);border-color:var(--line3)}
.learn-hero{background:linear-gradient(135deg,rgba(var(--gold-rgb),.1),rgba(245,158,11,.05));border:1px solid rgba(var(--gold-rgb),.3);border-radius:14px;padding:16px 18px;font-size:14px;line-height:1.6;color:#d3d9ec;margin-bottom:18px}
.learn-sec{font-size:12px;text-transform:uppercase;letter-spacing:.6px;color:var(--gold);font-weight:800;margin:20px 0 9px}
.learn-card{background:var(--surf);border:1px solid var(--line);border-radius:12px;margin-bottom:8px;overflow:hidden}
.learn-t{cursor:pointer;list-style:none;padding:14px 16px;font-size:15px;font-weight:700;position:relative}
.learn-t::-webkit-details-marker{display:none}
.learn-t::after{content:'+';position:absolute;right:16px;top:13px;color:var(--mut);font-size:18px;font-weight:400}
.learn-card[open] .learn-t::after{content:'−'}
.learn-b{padding:0 16px 15px;font-size:14px;line-height:1.6;color:var(--txt2)}
.learn-ex{background:var(--bg2);border-radius:9px;padding:9px 12px;margin-top:11px;font-size:13px;color:#aeb6cf}
.gterm{border-bottom:1px dashed rgba(var(--info-rgb),.5);cursor:pointer;white-space:nowrap}
.gq{display:inline-flex;align-items:center;justify-content:center;width:14px;height:14px;border-radius:50%;background:rgba(var(--info-rgb),.16);color:var(--info);font-size:11px;font-weight:800;margin-left:3px;vertical-align:middle;cursor:pointer}
/* TOUCH TOOLTIP. Sits above everything, wraps, and is dismissed by tapping anywhere else. Deliberately
   plain: it is a caveat, not a feature announcement. */
.touchtip{position:fixed;z-index:200;display:none;background:var(--surf,var(--surf));color:var(--txt,#ecedf7);
 border:1px solid var(--line,#272c44);border-radius:11px;padding:10px 12px;font-size:12.5px;line-height:1.5;
 box-shadow:0 18px 44px -18px rgba(0,0,0,.95);pointer-events:auto}
/* Anything whose only content is an explanation gets a visible affordance on touch, so people know to tap it. */
@media(hover:none){
  .gapwarn,.tbadge,.b3chip,.badge.stakeb,.badge.nvb,.badge.unprovenb{position:relative}
  .gapwarn::after,.tbadge::after{content:'';position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);
   width:44px;height:44px}
}
/* CONSENSUS ROWS. A row is now a disclosure, so it needs an affordance and somewhere for the backers to go. */
.ovp-row{position:relative;cursor:pointer;transition:background .14s ease}
.ovp-row:hover{background:rgba(255,255,255,.03)}
.ovp-row.ovp-more{display:none}
.ovp-chev{margin-left:auto;align-self:center;color:var(--mut);font-size:11px;transition:transform .16s ease;padding-left:8px}
.ovp-row.open .ovp-chev{transform:rotate(180deg)}
.ovp-x{flex-basis:100%;margin-top:8px;padding-top:9px;border-top:1px dashed var(--line)}
.ovp-x-k{font-size:11.5px;font-weight:800;letter-spacing:.06em;text-transform:uppercase;color:var(--mut);margin-bottom:6px}
.ovp-bots{display:flex;flex-wrap:wrap;gap:5px}
.ovp-bot{font-size:11px;padding:3px 8px;border-radius:7px;background:rgba(var(--push-rgb),.12);
 color:var(--txt2);border:1px solid rgba(var(--push-rgb),.20)}
.ovp-bot.mut{color:var(--mut);background:transparent}
.ovp-all{display:block;width:100%;margin-top:9px;padding:11px;border-radius:11px;font:inherit;font-size:12.5px;
 font-weight:700;background:transparent;color:var(--gold);border:1px dashed rgba(var(--gold-rgb),.34);cursor:pointer}
.ovp-all:hover{background:rgba(var(--gold-rgb),.07);border-color:rgba(var(--gold-rgb),.55)}
/* A caveat about what we actually measure, visually distinct from the definition it qualifies. */
.learn-note{margin-top:9px;padding:9px 11px;border-radius:9px;font-size:12.5px;line-height:1.55;
 background:rgba(var(--gold-rgb),.07);border:1px solid rgba(var(--gold-rgb),.26);color:#d8dbe8}
.learn-note b{color:var(--gold)}
/* Separates the two ways of splitting the same record so they do not read as one four-item list. */
.eng-hr{height:1px;background:var(--line);margin:11px 0 3px;opacity:.75}
.eng.fol .eng-k{color:var(--gold)}
/* PARLAY SLIP. A docked bar rather than a modal: you build a parlay WHILE scrolling picks, and a modal
   would hide the thing you are choosing from. Sits above the mobile nav and never covers the last card. */
.parbtn{margin-left:5px;min-width:30px;height:30px;border-radius:9px;font:inherit;font-size:11px;font-weight:800;
 letter-spacing:-.5px;cursor:pointer;background:transparent;color:var(--mut);border:1px dashed var(--line);
 line-height:1;padding:0 5px}
.parbtn:hover{color:var(--gold);border-color:rgba(var(--gold-rgb),.5)}
.parbtn.on{background:rgba(var(--gold-rgb),.16);color:var(--gold);border-style:solid;border-color:var(--gold)}
.pslip{position:fixed;left:0;right:0;bottom:0;z-index:120;display:none;
 background:linear-gradient(180deg,rgba(11,14,23,.86),var(--surf,var(--surf)) 22%);
 border-top:1px solid var(--line);box-shadow:0 -18px 44px -22px rgba(0,0,0,.95);
 padding-bottom:env(safe-area-inset-bottom,0)}
.ps-in{max-width:760px;margin:0 auto;padding:12px 14px 14px}
.ps-hd{display:flex;align-items:center;gap:9px;font-size:14px}
.ps-odds{font-variant-numeric:tabular-nums;font-weight:800;color:var(--gold);font-size:16px}
.ps-x{margin-left:auto;background:transparent;border:0;color:var(--mut);font-size:22px;line-height:1;
 cursor:pointer;min-width:44px;min-height:44px}
.ps-x:hover{color:var(--txt)}
.ps-sub{font-size:12.5px;color:var(--mut);margin-top:2px}
.ps-hint{font-size:12.5px;color:var(--mut);margin-top:6px}
.ps-ev{margin-top:8px;padding:8px 10px;border-radius:9px;font-size:12.5px;line-height:1.5;
 background:rgba(var(--push-rgb),.10);border:1px solid var(--line)}
.ps-ev.pos{background:rgba(74,222,128,.10);border-color:rgba(74,222,128,.34)}
.ps-ev.neg{background:rgba(var(--bad-rgb),.10);border-color:rgba(var(--bad-rgb),.34)}
.ps-corr{margin-top:7px;padding:8px 10px;border-radius:9px;font-size:12px;line-height:1.5;
 background:rgba(251,191,36,.09);border:1px solid rgba(251,191,36,.32);color:#e7e2d2}
.ps-note{margin-top:7px;font-size:11.5px;color:var(--mut)}
.ps-legs{margin-top:9px;display:grid;gap:5px;max-height:34vh;overflow-y:auto}
.ps-leg{display:flex;align-items:center;gap:8px;font-size:12.5px;padding:6px 8px;border-radius:8px;
 background:rgba(var(--push-rgb),.07)}
.ps-leg-b{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ps-leg-o{font-variant-numeric:tabular-nums;color:var(--mut)}
.ps-rm{background:transparent;border:0;color:var(--mut);cursor:pointer;font-size:17px;line-height:1;
 min-width:34px;min-height:34px}
.ps-rm:hover{color:var(--bad,var(--bad-hi))}
.ps-go{width:100%;margin-top:10px;min-height:44px}
@media(max-width:640px){
  .ps-in{padding:10px 12px 12px}
  .ps-legs{max-height:26vh}
  /* SIT ABOVE THE BOTTOM NAV, NOT ON IT. .botnav is position:fixed;bottom:0 on phones, and the slip was
     bottom:0 at a higher z-index — so building a parlay covered the navigation. That is backwards for a
     component whose entire purpose is to accumulate picks WHILE you browse between sections. The nav row is
     min-height:62px plus its safe-area padding. */
  .pslip{bottom:calc(62px + max(env(safe-area-inset-bottom),6px));padding-bottom:0;
         border-bottom:1px solid var(--line)}
  /* And give the page a floor so the slip never hides the last card in a list. */
  body.pslip-open .wrap{padding-bottom:46vh}
}
/* BOT HISTORY CALENDAR. The index for a record that used to be a single unbroken scroll. */
.pfcal{margin:10px 0 14px;padding:11px;border:1px solid var(--line);border-radius:12px;background:rgba(var(--push-rgb),.05)}
.pfcal-tabs{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:10px}
.pfcal-tab{font:inherit;font-size:12px;font-weight:700;padding:7px 12px;border-radius:8px;cursor:pointer;
 background:transparent;color:var(--mut);border:1px solid var(--line);min-height:34px}
.pfcal-tab.on{background:rgba(var(--gold-rgb),.14);color:var(--gold);border-color:var(--gold)}
.pfcal-dow{display:grid;grid-template-columns:repeat(7,1fr);gap:4px;margin-bottom:4px}
.pfcal-dow span{text-align:center;font-size:11.5px;font-weight:800;color:var(--mut);letter-spacing:.04em}
.pfcal-cells{display:grid;grid-template-columns:repeat(7,1fr);gap:4px}
.pfcal-c{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:1px;
 min-height:42px;border-radius:8px;font:inherit;border:1px solid transparent;padding:2px;
 font-variant-numeric:tabular-nums;background:transparent;color:var(--mut);cursor:default}
.pfcal-c.pfc-pad{border:0}
.pfcal-c.pfc-off{opacity:.28;font-size:11px}
.pfcal-c[data-pfday]{cursor:pointer}
.pfc-d{font-size:11px;font-weight:700;line-height:1}
.pfc-u{font-size:11px;line-height:1;opacity:.92}
.pfc-w{background:rgba(74,222,128,.16);border-color:rgba(74,222,128,.36);color:var(--good-hi)}
.pfc-l{background:rgba(var(--bad-rgb),.15);border-color:rgba(var(--bad-rgb),.34);color:var(--bad-hi)}
.pfc-0{background:rgba(var(--push-rgb),.14);border-color:var(--line);color:var(--mut)}
.pfcal-c[data-pfday]:hover{outline:1px solid var(--gold);outline-offset:1px}
.pfcal-key{margin-top:9px;display:flex;flex-wrap:wrap;align-items:center;gap:5px;font-size:11.5px;color:var(--mut)}
.pfk{width:11px;height:11px;border-radius:3px;display:inline-block}
.pfk-w{background:rgba(74,222,128,.5)}.pfk-l{background:rgba(var(--bad-rgb),.5)}.pfk-0{background:rgba(var(--push-rgb),.4)}
/* the day you jumped to, briefly, so a smooth-scroll landing is not ambiguous */
.daygrp-hit{outline:2px solid var(--gold);outline-offset:2px;border-radius:9px;transition:outline-color .5s ease}
@media(max-width:420px){ .pfcal-c{min-height:38px} .pfc-u{font-size:11px} }
/* The Overview's lead: the markets that are actually up, on a sample big enough to mean something. */
.rb-strong{margin-top:11px;padding-top:11px;border-top:1px solid var(--line)}
.rb-sk{font-size:11.5px;font-weight:800;letter-spacing:.06em;text-transform:uppercase;color:var(--mut);margin-bottom:9px}
.rb-sk .mut{font-weight:400;letter-spacing:0;text-transform:none;font-size:11px}
.rb-mkts{display:grid;gap:3px}
.rb-mkt{display:flex;align-items:baseline;gap:9px;padding:4px 9px;border-radius:8px;
 background:rgba(74,222,128,.07);border:1px solid rgba(74,222,128,.20)}
.rb-mkt-n{flex:1;min-width:0;font-size:13px;font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rb-mkt-b{font-weight:400;color:var(--mut);font-size:11.5px;margin-left:6px}
.rb-mkt-u{font-variant-numeric:tabular-nums;font-weight:800;font-size:13.5px}
.rb-mkt-m{font-size:11px;color:var(--mut);font-variant-numeric:tabular-nums;min-width:74px;text-align:right}
.rb-lv{margin-top:9px;font-size:12.5px;line-height:1.5;color:var(--txt)}
.rb-full{display:block;margin-top:11px;padding:10px;border-radius:10px;text-align:center;cursor:pointer;
 font-size:12.5px;font-weight:700;color:var(--mut);background:transparent;border:1px dashed var(--line)}
.rb-full:hover{color:var(--gold);border-color:rgba(var(--gold-rgb),.45)}
@media(max-width:520px){ .rb-mkt{flex-wrap:wrap;gap:4px} .rb-mkt-m{text-align:left;min-width:0} }
/* PER-BOT TOP 3. Reads as a shortlist, not another table: three rows, the edge stated, and the two actions. */
.bt3{margin-top:9px;padding-top:9px;border-top:1px dashed var(--line)}
.bt3-h{font-size:11.5px;font-weight:800;letter-spacing:.06em;text-transform:uppercase;color:var(--mut);margin-bottom:6px}
.bt3-h .mut{font-weight:400;letter-spacing:0;text-transform:none;font-size:11.5px;margin-left:5px}
.bt3-row{display:flex;align-items:center;gap:8px;padding:6px 7px;border-radius:8px;margin-bottom:4px;
 background:rgba(var(--push-rgb),.07)}
.bt3-b{flex:1;min-width:0;font-size:12.5px;font-weight:600;line-height:1.3;
 overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.bt3-m{display:block;font-size:11.5px;font-weight:400;color:var(--mut);margin-top:1px}
.bt3-r{text-align:right;white-space:nowrap}
.bt3-u{display:inline-block;font-weight:800;font-size:11px;padding:2px 7px;border-radius:999px;background:rgba(154,163,184,.16);color:var(--txt);margin-right:6px;letter-spacing:.02em;font-variant-numeric:tabular-nums}.bt3-u.hi{background:rgba(16,185,129,.18)}.bt3-u.lo{background:rgba(154,163,184,.10);color:var(--mut)}
.bt3-e{display:block;font-size:12px;font-weight:800;font-variant-numeric:tabular-nums}
.bt3-n{display:block;font-size:11px;color:var(--mut);font-variant-numeric:tabular-nums}
.bt3-nm{font-size:11.5px;color:var(--mut);font-style:italic}
.bt3-tail{min-width:30px;height:30px;border-radius:9px;font:inherit;font-size:15px;font-weight:800;cursor:pointer;
 background:transparent;color:var(--mut);border:1px solid var(--line);line-height:1;padding:0}
.bt3-tail:hover{color:var(--good,var(--good));border-color:rgba(74,222,128,.5)}
.bt3-tail.on{background:rgba(74,222,128,.16);color:var(--good-hi);border-color:rgba(74,222,128,.5)}
.bt3-par{margin-left:3px}
@media(max-width:520px){ .bt3-row{flex-wrap:wrap} .bt3-r{text-align:left} }

/* ============================================================================================================
   DENSITY + CENTRING PASS (2026-08-10)
   Feedback: the boxes and bars overwhelm the content. The cause is nested containers, so this removes chrome
   rather than shrinking type. Tune here; nothing else needs to change.
   ============================================================================================================ */

/* ---- 1. the column. 1080px of left-aligned content on a wide screen reads as sprawl; a tighter measure
        centres the page's weight without changing a single component. ---- */
.wrap{max-width:920px;padding:0 18px 64px}

/* ---- 2. outer containers: less padding, less rounding. A 15-16px radius at this size reads as a toy. ---- */
.card{border-radius:12px;padding:11px 13px}
.panel{border-radius:12px;padding:13px;margin-top:11px}
.zoo-card{border-radius:13px;padding:13px}
.b3card{border-radius:13px;padding:12px 12px 11px;gap:8px}
section{padding-top:14px}

/* ---- 3. section headers: smaller, tighter, and centred — they are the page's rhythm, so centring them is
        what actually makes the layout read as balanced. ---- */
.seghead{font-size:var(--fs-5);margin:18px 0 9px;text-align:center}
.edgehead{text-align:center}
h2{font-size:var(--fs-5);margin:16px 0 7px}

/* ---- 4. hero numbers and KPI blocks centre; this is where centring genuinely helps. ---- */
.realbox{text-align:center}
.rb-lab,.rb-big,.rb-sub,.rb-lv{text-align:center}
.rb-sk{text-align:center}
.edgesum{text-align:center;border-left:0;padding-left:0;margin:2px 0 11px}
.aggline{text-align:center}
/* NOT justify-items on .grid. That was wrong: .grid is a generic auto-fit card grid used in five places,
   and justify-items:center shrinks every card to its content width and centres it in its track, so a row of
   KPI cards stops filling the row and goes ragged. Centre the CONTENT of the cards instead — which is what
   was actually wanted — and leave the cards stretching. */
.pf-stats{justify-items:center}
.grid > .card, .card .k, .card .v{text-align:center}

/* ---- 5. INNER ROWS LOSE THEIR BOX. This is the actual fix. Rows inside an already-bordered container are
        separated by a hairline and space instead of each carrying its own card. ---- */
.rb-mkt,.bt3-row,.ps-leg,.ovp-row{
  background:transparent;border:0;border-bottom:1px solid var(--line);border-radius:0;
  padding:7px 2px;margin-bottom:0}
.rb-mkt:last-child,.bt3-row:last-child,.ps-leg:last-child,.ovp-row:last-child{border-bottom:0}
.rb-mkts,.bt3,.ps-legs{gap:0}
/* The row reset above strips backgrounds at single-class specificity, and .ovp-hot is ALSO a single class
   on the same element — so it lost the highlight that marks 3+ bots agreeing, which is the whole signal that
   list exists to carry. Re-asserted after the reset rather than raising its specificity, so the ordering
   stays readable. */
.ovp-row.ovp-hot{background:linear-gradient(90deg,rgba(var(--gold-rgb),.09),transparent 60%)}
/* keep the winning markets legible as winners without a full green slab behind each one */
.rb-mkt-u{color:var(--good,var(--good))}

/* ---- 6. the market bars section — the single biggest block on the page. ---- */
.bestgrid{grid-template-columns:repeat(auto-fill,minmax(210px,1fr));gap:9px}

/* ---- 7. rows that must stay left-aligned. Centred text in a scannable list costs the reader the left edge
        their eye tracks, and these are exactly the lists people move through fastest. ---- */
.pf-bet,.pf-bet-l,.bt3-b,.rb-mkt-n,.ps-leg-b,.ovp-m,.dayhdr,.pick,.fd-item{text-align:left}

/* ---- 8. mobile: the tighter column would otherwise double up with the existing phone padding. ---- */
@media(max-width:640px){
  .wrap{padding:0 12px 60px}
  .card,.panel,.zoo-card{padding:11px}
  .seghead{font-size:14px;margin:15px 0 8px}
}

/* GAME-FIRST BOARD (2026-08-10). The game is the unit now, so its header has to carry enough to decide
   whether to open it: who is playing, whether it has started, when, and the record so far. */
.gamegrp{border-top:1px solid var(--line)}
.gamegrp:first-of-type{border-top:0}
.gamehdr{display:flex;align-items:center;gap:8px;flex-wrap:wrap;cursor:pointer;list-style:none;
 padding:9px 10px;font-size:13px;min-height:44px}
.gamehdr::-webkit-details-marker{display:none}
.gamehdr:hover{background:rgba(255,255,255,.03)}
.gamegrp>.gamehdr .chev{transition:transform .15s ease;color:var(--mut);font-size:11.5px}
.gamegrp[open]>.gamehdr .chev{transform:rotate(90deg)}
.gname{font-weight:700;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.gwhen{font-size:11px;color:var(--mut);font-variant-numeric:tabular-nums}
.gmeta{font-size:11px;color:var(--mut);font-variant-numeric:tabular-nums;margin-left:auto;white-space:nowrap}
/* STATUS READS AT A GLANCE. A live game and a finished one must not look alike -- that was the whole point
   of the event-status work, and a game-first board makes it the first thing the eye lands on. */
.gst{font-size:11px;font-weight:800;letter-spacing:.06em;padding:2px 6px;border-radius:4px}
.gst-upcoming{background:rgba(var(--push-rgb),.16);color:#aeb6c9}
.gst-live{background:rgba(var(--bad-rgb),.18);color:var(--bad-hi)}
.gst-final{background:rgba(var(--push-rgb),.10);color:var(--mut)}
/* the bet-type groups sit inside a game now, so they indent rather than sitting flush with the league */
.gamegrp .subcat{margin-left:10px}
/* A @media(max-width:520px) block lived here setting .gmeta{width:100%}. It was my first pass at this
   header; the @media(max-width:560px) block further down replaced it and I never deleted this one. Both
   applied under 520px, so the bet count took its own row while the matchup took another — two of the four
   stacked rows that made every collapsed game 106px tall. Superseded CSS does not stop running. */
/* BOARD SEARCH. Sits directly above the games so the control and what it filters are never separated. */
.boardfind{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:0 0 10px}
.bq{flex:1;min-width:180px;background:var(--surf2);border:1px solid var(--line);color:var(--txt);
 border-radius:9px;padding:9px 11px;font:inherit;font-size:13px;min-height:40px}
.bq:focus{outline:none;border-color:var(--gold)}
.bq::-webkit-search-cancel-button{filter:invert(.6)}
.bqn{font-size:11.5px;color:var(--mut);font-variant-numeric:tabular-nums}
@media(max-width:520px){ .bqst{width:100%} .bqst .segbtn{flex:1;text-align:center} }
/* PROPS BY TEAM. A quiet divider, not another card — the props already sit two levels deep inside a game. */
/* BEST 3 IN EVERY MARKET. Additive to the overall card, never summed with it. Denser than a b3card on
   purpose: this is a coverage view you scan, not three hero cards you choose between. */
.b3mkt{margin-top:16px;border:1px solid var(--line);border-radius:12px;padding:12px 12px 6px;
  background:rgba(var(--push-rgb),.04)}
.b3mkt-h{display:flex;flex-wrap:wrap;align-items:baseline;gap:8px;margin-bottom:10px}
.b3mkt-h .k{font-size:12px;font-weight:800;letter-spacing:.05em;text-transform:uppercase;color:var(--txt2)}
.b3mkt-sub{font-size:11px;color:var(--push);line-height:1.45}
.b3mktg{border-top:1px solid var(--line);padding:9px 0 7px}
.b3mktg:first-of-type{border-top:0}
.b3mktg-h{display:flex;flex-wrap:wrap;align-items:baseline;gap:8px;margin-bottom:5px}
.b3mktg-n{font-size:12px;font-weight:800;letter-spacing:.03em;color:#e6e9f2}
.b3mktg-r{font-size:11.5px;font-weight:800;font-variant-numeric:tabular-nums}
.b3mktg-w{margin-left:auto;font-size:11.5px;color:var(--push);font-variant-numeric:tabular-nums}
.b3mktr{display:grid;grid-template-columns:16px 1fr auto auto auto;align-items:center;gap:8px;padding:5px 0;
  border-top:1px dotted rgba(var(--push-rgb),.16)}
.b3mktr:first-of-type{border-top:0}
.b3mktr-i{font-size:11.5px;color:var(--faint);font-variant-numeric:tabular-nums}
.b3mktr-b{font-size:12.5px;color:#dbe0ec;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.b3mktr-o{font-size:11.5px;color:#a9b1c6;font-variant-numeric:tabular-nums;min-width:44px;text-align:right}
/* The start time. Muted and narrow -- it is a disambiguator, not a headline -- but it is the only thing
   separating the two rows of a doubleheader, so it keeps its column even on a phone. */
.b3mktr-w{font-size:11.5px;color:var(--mut);font-variant-numeric:tabular-nums;white-space:nowrap;
  min-width:52px;text-align:right}
.b3mktr-e{font-size:11px;font-weight:700;color:var(--push);font-variant-numeric:tabular-nums;min-width:46px;text-align:right}
.b3mktr-e.pos{color:var(--good)}
@media(max-width:520px){.b3mktr{grid-template-columns:14px 1fr auto auto}.b3mktr-o{display:none}
  .b3mktr-w{min-width:0;font-size:11.5px}}
.propteam{margin-top:6px}
.propteam:first-child{margin-top:0}
/* PLAYER-PROP TEAM FILTER. One lineup on screen at a time (Austin, 2026-08-16). The panes stay .propteam so
   applyFilters() keeps finding them; only the ones without .on are folded away. A pane the filter empties is
   hidden by its own inline display:none, which still wins over this rule -- both behaviours compose. */
.ptsplit{margin-top:6px}
.ptsplit>.propteam:not(.on){display:none}
.ptsplit>.propteam{margin-top:0}
.pttabs{display:flex;gap:6px;margin:0 0 8px;overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none}
.pttabs::-webkit-scrollbar{display:none}
.pttab{flex:1 1 0;min-width:0;min-height:36px;display:flex;align-items:center;justify-content:center;gap:6px;
  padding:7px 10px;border-radius:9px;border:1px solid var(--line);background:rgba(var(--push-rgb),.06);
  color:var(--mut);font:inherit;font-size:11.5px;font-weight:800;letter-spacing:.02em;cursor:pointer;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.pttab:hover{color:var(--txt2)}
.pttab.on{color:var(--gold);border-color:rgba(var(--gold-rgb),.38);background:rgba(var(--gold-rgb),.10)}
.pttab-n{font-size:11.5px;font-weight:700;padding:1px 6px;border-radius:20px;
  background:rgba(var(--push-rgb),.16);color:var(--txt2)}
.pttab.on .pttab-n{background:rgba(var(--gold-rgb),.20);color:var(--gold)}
.ptname{display:flex;align-items:center;gap:7px;font-size:11px;font-weight:800;letter-spacing:.04em;
 text-transform:uppercase;color:var(--mut);padding:5px 2px 5px 8px;border-left:2px solid var(--line);margin-bottom:3px}
.ptn{font-size:11.5px;font-weight:700;background:rgba(var(--push-rgb),.16);color:var(--txt2);
 padding:1px 6px;border-radius:999px;letter-spacing:0}
.ptrec{margin-left:auto;font-weight:400;letter-spacing:0;text-transform:none;font-size:11.5px;
 font-variant-numeric:tabular-nums}
/* GAME ROW, second pass. Brief was "this is what I wanted, it just looks bland" — immediately after
   "everything feels too big". So: more decided, not larger. Every addition here is information density,
   and the row height is unchanged. */
.gamegrp{border-top:1px solid var(--line);border-left:2px solid transparent;transition:border-color .15s ease}
.gamegrp:first-of-type{border-top:0}
/* A status RAIL down the left edge. Colour on an edge is readable in peripheral vision, so you can find the
   live game while scanning rather than reading each pill. */
.gg-upcoming{border-left-color:rgba(var(--push-rgb),.30)}
.gg-live{border-left-color:var(--bad,var(--bad-hi))}
.gg-final{border-left-color:transparent}
.gg-final .gamehdr{opacity:.72}
.gg-final .gamehdr:hover{opacity:1}
.gamegrp[open]{border-left-color:var(--gold)}
.gamehdr{display:flex;align-items:center;gap:9px;flex-wrap:wrap;cursor:pointer;list-style:none;
 padding:8px 10px;font-size:13px;min-height:44px}
.gamehdr::-webkit-details-marker{display:none}
.gamehdr:hover{background:rgba(255,255,255,.035)}
.gamegrp>.gamehdr .chev{transition:transform .15s ease;color:var(--mut);font-size:11.5px;flex:none}
.gamegrp[open]>.gamehdr .chev{transform:rotate(90deg)}
/* AWAY @ HOME. Home is heavier because that is the side the eye anchors on in a matchup. */
.gname{flex:1;min-width:0;display:flex;align-items:baseline;gap:5px;overflow:hidden;white-space:nowrap}
.gt-a{color:var(--txt);overflow:hidden;text-overflow:ellipsis}
.gt-at{color:var(--mut);font-size:11px;flex:none}
.gt-h{font-weight:700;overflow:hidden;text-overflow:ellipsis}
.gwhen{font-size:11px;color:var(--mut);font-variant-numeric:tabular-nums;flex:none}
/* MARKET PREVIEW. The single most useful thing on a collapsed row: it says whether the thing you want is
   in here, so you stop opening games to find out. */
.gchips{display:flex;gap:4px;flex-wrap:wrap;flex:none}
.gc{font-size:11px;font-weight:700;letter-spacing:.02em;padding:2px 5px;border-radius:4px;
 background:rgba(var(--push-rgb),.13);color:#aab3c6;white-space:nowrap}
.gc-prop{background:rgba(var(--gold-rgb),.14);color:var(--gold)}
.gc-more{background:transparent;color:var(--mut)}
.gmeta{font-size:11px;color:var(--mut);font-variant-numeric:tabular-nums;margin-left:auto;white-space:nowrap;flex:none}
/* ---- EVENT DETAIL ------------------------------------------------------------------------------------
   A game header answers "what is in here". The Details button answers "why", which until now was written
   per pick at selection time and then never shown to anyone. Sized generously because it sits inside a
   <summary> that toggles on click -- an undersized target here does not just miss, it opens the accordion. */
.evbtn{flex:none;min-height:28px;padding:4px 9px;border-radius:7px;border:1px solid var(--line);
 background:rgba(255,255,255,.03);color:var(--mut);font-size:11.5px;font-weight:700;letter-spacing:.02em;
 cursor:pointer;white-space:nowrap}
.evbtn:hover{color:var(--txt);border-color:var(--gold);background:rgba(var(--gold-rgb),.08)}
.evsheet{position:fixed;inset:0;z-index:310;background:rgba(4,6,12,.72);backdrop-filter:blur(5px);
 -webkit-backdrop-filter:blur(5px);display:flex;align-items:center;justify-content:center;padding:20px}
.evpanel{width:100%;max-width:640px;max-height:88vh;max-height:88dvh;display:flex;flex-direction:column;
 background:linear-gradient(168deg,var(--surf),var(--bg));border:1px solid var(--line);border-radius:20px;
 box-shadow:0 40px 100px -30px rgba(0,0,0,.95)}
.evhd{display:flex;align-items:flex-start;justify-content:space-between;gap:10px;padding:15px 16px 11px;
 border-bottom:1px solid var(--line)}
.evtitle{font-size:16px;font-weight:800;color:var(--txt);line-height:1.3}
.evsub{font-size:11px;font-weight:400;color:var(--mut);margin-top:3px;font-variant-numeric:tabular-nums}
.evbody{overflow-y:auto;padding:14px 16px 18px;scrollbar-width:thin;-webkit-overflow-scrolling:touch}
.evblk{margin-bottom:16px}
.evblk:last-child{margin-bottom:0}
.evh{font-size:11.5px;font-weight:800;letter-spacing:.09em;text-transform:uppercase;color:var(--gold);
 margin-bottom:7px}
.evna{font-size:11.5px;color:var(--mut);line-height:1.5;font-style:italic}
/* WEATHER: the numbers, then what they mean for a total. A reader should not have to already know that
   dense air suppresses carry -- that is the analysis, and it is the part worth printing. */
.evwx{display:flex;gap:7px;flex-wrap:wrap;margin-bottom:8px}
.evwxi{flex:1 1 auto;min-width:74px;background:rgba(255,255,255,.03);border:1px solid var(--line);
 border-radius:10px;padding:8px 10px}
.evwxl{font-size:11px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--mut)}
.evwxv{font-size:15px;font-weight:800;color:var(--txt);font-variant-numeric:tabular-nums;margin-top:2px}
.evread{font-size:12px;line-height:1.55;color:#c3cad9;margin:4px 0 0;padding-left:12px;
 border-left:2px solid rgba(var(--gold-rgb),.4)}
.evread+.evread{margin-top:6px}
/* PROJECTIONS: a hit rate on record, with the game log right there so the number is checkable. */
.evpr{border:1px solid var(--line);border-radius:11px;padding:9px 11px;margin-bottom:7px;
 background:rgba(255,255,255,.02)}
.evpr-t{display:flex;align-items:center;gap:7px;flex-wrap:wrap}
.evpr-n{font-size:12.5px;font-weight:700;color:var(--txt)}
.evpr-s{font-size:11px;color:var(--mut)}
.evpr-r{margin-left:auto;font-size:12px;font-weight:800;font-variant-numeric:tabular-nums;flex:none}
.evpr-hi{color:var(--good)}.evpr-lo{color:var(--bad-hi)}.evpr-md{color:var(--mut)}
.evlog{display:flex;gap:3px;margin-top:7px;flex-wrap:wrap}
.evg{min-width:22px;text-align:center;font-size:11.5px;font-weight:700;padding:2px 4px;border-radius:4px;
 font-variant-numeric:tabular-nums;background:rgba(var(--push-rgb),.13);color:#aab3c6}
.evg.hit{background:rgba(74,222,128,.16);color:var(--good)}
.evg.miss{background:rgba(var(--bad-rgb),.14);color:var(--bad-hi)}
.evpr-f{font-size:11.5px;color:var(--mut);margin-top:5px}
/* REASONING: the written case per pick. */
.evpick{border-top:1px solid var(--line);padding:9px 0}
.evpick:first-of-type{border-top:none}
.evpick-h{display:flex;align-items:center;gap:7px;flex-wrap:wrap;margin-bottom:4px}
.evpick-s{font-size:12.5px;font-weight:700;color:var(--txt)}
/* LINE VALUE IS SIGNED AND THE BADGE HAS TO SAY SO. This was a flat green fill whatever the number, so a
   NEGATIVE line value wore the same green as a positive edge. Every one of tonight's NFL props rendered
   "-2.3pp" in the colour that means edge, one scroll from a Best 3 card where the identical green reads
   "+2.31pp edge". On a product whose whole claim is an honest record, a number that reads backwards is
   worse than no number. Green means we beat the reference, red means we did not, grey means level. */
.evpick-e{font-size:11.5px;font-weight:800;padding:1px 6px;border-radius:5px;flex:none;
 background:rgba(var(--good-rgb),.15);color:var(--good);font-variant-numeric:tabular-nums}
.evpick-e.neg{background:rgba(var(--bad-rgb),.15);color:var(--bad)}
.evpick-e.flat{background:rgba(var(--push-rgb),.14);color:var(--mut)}
.evpick-r{font-size:11.5px;line-height:1.6;color:#aab3c6}
.evtrk{font-size:11px;font-weight:800;letter-spacing:.05em;padding:1px 5px;border-radius:4px;
 background:rgba(var(--gold-rgb),.16);color:var(--gold);flex:none}
.evmore{width:100%;margin-top:8px;padding:9px;border-radius:9px;border:1px solid var(--line);
 background:rgba(255,255,255,.03);color:var(--mut);font-size:11.5px;font-weight:700;cursor:pointer}
.evmore:hover{color:var(--txt);border-color:var(--gold)}
.evsrc{font-size:11.5px;line-height:1.5;color:var(--mut);border-top:1px solid var(--line);padding-top:10px}
@media(max-width:560px){
 .evsheet{padding:0;align-items:flex-end}
 .evpanel{max-width:none;max-height:93vh;max-height:93dvh;border-radius:20px 20px 0 0}
 .evbtn{min-height:32px;padding:5px 10px}
}
/* A settled game leads with how it went, not how many bets it held. */
.gres{margin-left:auto;font-size:12.5px;font-weight:800;font-variant-numeric:tabular-nums;white-space:nowrap;flex:none}
.gru{font-weight:600;font-size:11px;margin-left:5px;opacity:.85}
.gst{font-size:11px;font-weight:800;letter-spacing:.07em;padding:2px 6px;border-radius:4px;flex:none}
.gst-upcoming{background:rgba(var(--push-rgb),.14);color:#9fa8bd}
.gst-live{background:rgba(var(--bad-rgb),.20);color:var(--bad-hi)}
.gst-final{background:transparent;color:var(--mut);padding-left:0;padding-right:0}
/* LIVE should catch the eye once and then stop. A slow pulse reads as "happening now"; a fast one reads as
   an error state, and prefers-reduced-motion turns it off entirely. */
@keyframes gglive{0%,100%{opacity:1}50%{opacity:.55}}
.gg-live .gst-live{animation:gglive 2.4s ease-in-out infinite}
@media(prefers-reduced-motion:reduce){.gg-live .gst-live{animation:none}}
.gamegrp .subcat{margin-left:10px}
@media(max-width:560px){
  /* DENSITY. Measured: 71.25px per collapsed game = 7 games on a 375x812 screen. Kalshi runs 48-52px and
     shows 11-12. Three things drove ours, and none of them was the type size:
       padding 6+6, a 32px-tall Details button setting row 1's height, and a 6px row gap before the chips.
     Trimmed to 5+5 padding, a 4px gap, and a shorter button (its 44px TOUCH area is an overlay, so the hit
     target does not shrink with it). ~58px, so 9-10 games per screen instead of 7. */
  .gamehdr{padding:5px 8px;gap:5px 6px;min-height:0}
  /* ROW 1: chevron + matchup + status + time + count, all on one line. `flex-basis:100%` used to be on
     .gname to push the chips down, but it also claimed the whole line from the 15px chevron and the bet
     count, giving each of them a row of their own. flex:1 with min-width:0 lets the matchup take the space
     that is left and ellipse, which is what it should have been doing. */
  .gname{flex:1 1 auto;min-width:0;order:1}
  .gst{order:2}
  .gwhen{order:3}
  .gmeta,.gres{order:4;margin-left:auto}
  /* Details rides the right edge of row 1, next to the bet count. Every other child here is explicitly
     ordered, so an unordered element defaults to order:0 and would render BEFORE the matchup — the button
     needs a number for the same reason the rest of them do. Row 1 rather than its own row: an extra line on
     every collapsed game is exactly the height that made these headers feel oversized. */
  .evbtn{order:5}
  /* ROW 2, and only if it needs one: the market chips. */
  .gchips{order:6;flex-basis:100%;margin-top:0}
  /* The chips row was 20.25px of a 71px header. Tighter padding and a hair less leading take it to ~17px
     without shrinking the label text below the readable floor set in the pointer:coarse block. */
  .gamegrp .gc{padding:1px 5px;line-height:1.35}
  /* The Details button set row 1's height at 32px. 26px here; the 44px hit area is an ::after overlay in
     the pointer:coarse block, so the target a thumb sees is unchanged. */
  .evbtn{min-height:26px;padding:3px 9px}
  .gamegrp .subcat{margin-left:6px}
}
/* Flat-payout marker: same shape as the odds chip it replaces, visually quieter because it is a convention
   rather than a price. */
.pf-flat{background:rgba(var(--gold-rgb),.12);color:var(--gold);border-color:rgba(var(--gold-rgb),.28)}
.bt3-flat{color:var(--gold);font-weight:700}
/* BEST-3 CARD, rebuilt around the decision. The rank badge is gone: three picks with identical edge were
   numbered 1/2/3, which implied an ordering the data does not support. */
.b3head{display:flex;align-items:center;gap:7px;flex-wrap:wrap}
/* The edge is why the pick is here, so it sits in the header rather than inside a tooltip. */
.b3edge{font-size:11px;font-weight:800;padding:2px 7px;border-radius:999px;font-variant-numeric:tabular-nums;
 background:rgba(var(--push-rgb),.14);color:var(--mut)}
.b3edge.pos{background:rgba(74,222,128,.15);color:var(--good-hi)}
/* The fixture. Absent from this card until now. */
.b3game{display:flex;align-items:baseline;gap:7px;font-size:11.5px;color:var(--mut);margin-top:-2px;
 overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.b3when{font-variant-numeric:tabular-nums;flex:none;opacity:.85}
/* needs-vs-gets as ONE statement: the comparison is the point, two chips hid it. */
.b3cmp{font-size:11.5px;padding:3px 8px;border-radius:7px;background:rgba(74,222,128,.10);
 border:1px solid rgba(74,222,128,.22);color:#c9d3e2;font-variant-numeric:tabular-nums}
.b3cmp b{color:#eaf0f8}
.b3cmp.under{background:rgba(var(--bad-rgb),.12);border-color:rgba(var(--bad-rgb),.28)}
/* RENAMED FROM .b3rec 2026-08-12. `.b3rec` was ALREADY the Track Record PANEL (see `.b3rec-h` below), so
   this inline win-loss span inherited its padding:13px 15px, background and border -- painting a grey slab
   bursting out of the green comparison chip on every Best-3 card. Same class name, two components, and the
   panel wins because it is declared later. This is the duplicate-definition failure that has bitten this
   file repeatedly; check a name is free before using it. */
.b3wl{opacity:.65;font-size:11.5px}
/* A flat-payout leg has no line to shop, so it says what it is instead of showing a synthetic price. */
.b3flat{color:var(--gold);background:rgba(var(--gold-rgb),.12);border-color:rgba(var(--gold-rgb),.28)}
/* ODDS BUTTONS BREAKING OUT OF THEIR CARD — measured in a real browser, not inferred.
   At 375px the card spans x=11..364 and the MONEY button spans x=281..417: 42px outside the viewport. The
   page is overflow-x:clip, so it cannot even be scrolled to. 96 of 258 rows and 45 of 81 cards overflow at
   320px, and still 91 rows at 430px — so this is not a small-phone edge case. It lands on LIVE games, which
   is the highest-value moment on the product.

   Cause: a flex ITEM defaults to min-width:auto, which is its min-CONTENT width. `.ob-pm` reads
   "LIVE · prediction market" with white-space:nowrap — a 143px floor — so a 55px grid track cannot shrink
   it. The grid TRACK was already correctly declared minmax(0,1fr); the ITEM was never released.
   min-width:0 is the whole fix, and it is required on every ancestor in the chain, not just the leaf. */
.og-c{min-width:0}
.og-c > *{min-width:0}
.obtn{min-width:0}
.glosspop{display:none;position:fixed;z-index:90;max-width:234px;background:#161c2e;border:1px solid #2f3656;border-radius:12px;padding:11px 13px;font-size:13px;font-weight:700;box-shadow:0 16px 44px -16px rgba(0,0,0,.9)}
.gmore{color:var(--info);font-size:12px;font-weight:700;cursor:pointer}
.bankhero.life::before{background:linear-gradient(90deg,transparent,rgba(90,160,255,.5),transparent)}
.segrp.trksub{margin-bottom:14px}
.life-add{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-top:12px}
.btn.sm.lf-dep{background:var(--good-bg);color:var(--good-hi);border-color:var(--good-bg)}
.btn.sm.lf-wd{background:var(--bad-bg);color:var(--bad-hi);border-color:#5a1e2e}
.lf-row{display:flex;align-items:center;gap:10px;padding:9px 12px;border-bottom:1px solid var(--line)}
.lf-row:last-child{border-bottom:0}
.lf-ic{width:22px;height:22px;flex:0 0 22px;border-radius:7px;display:inline-flex;align-items:center;justify-content:center;font-size:11px;font-weight:800}
.lf-ic.d{background:var(--good-bg);color:var(--good-hi)}.lf-ic.w{background:var(--bad-bg);color:var(--bad-hi)}
.lf-main{flex:1;min-width:0}
.lf-amt2{font-weight:800;font-variant-numeric:tabular-nums;white-space:nowrap}
.placebet{background:var(--surf);border:1px solid var(--line3);border-radius:14px;margin:12px 0;overflow:hidden}
.pb-sum{cursor:pointer;list-style:none;padding:13px 16px;font-size:14px}.pb-sum::-webkit-details-marker{display:none}
.pb-form{display:flex;flex-wrap:wrap;gap:8px;padding:0 16px 14px}
.pb-form input{flex:1;min-width:140px;background:var(--bg2);border:1px solid var(--line);border-radius:9px;color:var(--txt);padding:9px 12px;font-size:13px}
.placebet .mut{padding:0 16px 12px}
.pb-legs{padding:0 16px}
.pb-legs-hd{font-size:11px;color:var(--gold);letter-spacing:.5px;text-transform:uppercase;font-weight:700;margin:2px 0 6px}
.pb-leg-row{display:flex;align-items:center;gap:9px;background:var(--bg2);border:1px solid var(--line);border-radius:9px;padding:8px 11px;margin-bottom:6px}
.pb-leg-n{flex:0 0 20px;width:20px;height:20px;border-radius:6px;background:#1b2540;color:#9fb4e6;font-size:11px;font-weight:800;display:inline-flex;align-items:center;justify-content:center}
.pb-leg-b{flex:1;min-width:0;font-size:13px}
.legsel{margin-right:2px}
.tsearch{margin:12px 0}
.tsearch input{width:100%;background:var(--surf);border:1px solid var(--line);border-radius:11px;color:var(--txt);padding:11px 14px;font-size:14px}
#ts-res,#slip-out{margin-top:8px}
/* search inside the + add sheet — the fast path (tap a price, never type odds) */
/* Combined (Tracked + Practice) stats view */
.cmb-hero{background:radial-gradient(120% 140% at 0% 0%,rgba(var(--gold-rgb),.10),transparent 55%),linear-gradient(160deg,var(--surf),var(--bg2));border:1px solid var(--line);border-radius:16px;padding:18px 20px;margin:12px 0}
.cmb-hero-l{font-size:11px;text-transform:uppercase;letter-spacing:.5px;color:var(--mut);font-weight:700}
.cmb-hero-v{font-size:40px;font-weight:900;line-height:1;margin:4px 0 6px;font-variant-numeric:tabular-nums}
.cmb-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.cmb-card{background:var(--surf);border:1px solid var(--line);border-radius:14px;padding:14px 16px}
.cmb-lab{font-size:12.5px;font-weight:700}
.cmb-rec{font-size:22px;font-weight:800;font-variant-numeric:tabular-nums;margin:4px 0}
.cmb-row{display:flex;justify-content:space-between;align-items:baseline;font-weight:700;font-variant-numeric:tabular-nums}
.cmb-wr{color:var(--mut);font-size:12.5px}
@media(max-width:560px){.cmb-grid{grid-template-columns:1fr}}
.as-mode{display:flex;gap:0;margin:2px 0 6px}
.as-mode .segbtn{flex:1;justify-content:center;font-size:12.5px}
.as-modehint{font-size:11px;line-height:1.4;margin:0 2px 10px}
.as-search{margin:2px 0 10px}
.as-search input{width:100%;background:var(--bg2);border:1px solid var(--gold);border-radius:12px;color:var(--txt);padding:13px 15px;font-size:15px;box-shadow:0 0 0 3px rgba(var(--gold-rgb),.08)}
.as-search input::placeholder{color:var(--push)}
#as-res{margin-top:8px;max-height:46vh;max-height:46dvh;overflow-y:auto}
.as-or{display:flex;align-items:center;gap:10px;color:var(--mut);font-size:11px;text-transform:uppercase;letter-spacing:.6px;margin:6px 2px 10px}
.as-or::before,.as-or::after{content:'';flex:1;height:1px;background:var(--line)}
.ts-row{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:9px 12px;background:var(--bg2);border:1px solid #1e2338;border-radius:10px;margin-bottom:6px}
.ts-row .tailbtn{margin-left:0}
.slipbtn{display:flex;align-items:center;justify-content:center;gap:9px;cursor:pointer;background:linear-gradient(135deg,rgba(var(--gold-rgb),.15),rgba(245,158,11,.09));border:1.5px solid rgba(var(--gold-rgb),.45);border-radius:13px;padding:14px 16px;font-size:15px;font-weight:700;color:var(--txt);margin:8px 0}
.slipbtn:hover{border-color:var(--gold)}
.sliploading{display:flex;align-items:center;gap:12px;padding:14px 16px;background:linear-gradient(135deg,rgba(var(--gold-rgb),.1),rgba(245,158,11,.05));border:1px solid rgba(var(--gold-rgb),.35);border-radius:13px;margin:8px 0}
/* LOADER ONLY. Do NOT reuse `spin` as a semantic modifier — it forces 22px + infinite rotation onto whatever
   carries it. The free-spin claim button was `class='claimbub spin'` and got crushed into a spinning 22px
   circle with its label unreadable; `.claimbub.spin` set the gradient but never overrode width/height/animation,
   so the utility leaked straight through. That modifier is now `.cb-spin`. */
.spin{width:22px;height:22px;flex:none;border-radius:50%;border:2.5px solid rgba(var(--gold-rgb),.25);border-top-color:var(--gold);animation:spin .7s linear infinite}
@keyframes spin{to{transform:rotate(360deg)}}
.sliperr{padding:12px 14px;background:rgba(var(--bad-rgb),.1);border:1px solid rgba(var(--bad-rgb),.3);border-radius:12px;color:var(--bad-hi);font-size:13px;margin:8px 0}
/* z-index 400: ABOVE every sheet and overlay on the page (.moresheet 70, .pslip 120, .obetsheet 121,
   #winrx 120, .levelup-overlay 130, .gcoverlay 200, .touchtip 200, .chatoverlay 300, .evsheet 310).
   It was 80, which is under all but one of them -- so every confirmation fired from inside a sheet
   ("Tracked ✓ · 1u", "Position logged", "Invite link copied") painted behind the backdrop and was never
   seen. There are ~130 toast() call sites and the user's response to a silent confirmation is to tap
   again, which is how a "nothing happened" bug becomes a double-action bug. */
.toast{position:fixed;left:50%;bottom:calc(94px + env(safe-area-inset-bottom));transform:translateX(-50%) translateY(16px);z-index:400;background:var(--good-bg);color:var(--good-hi);border:1px solid var(--good-bg);border-radius:12px;padding:11px 18px;font-size:14px;font-weight:700;opacity:0;pointer-events:none;transition:opacity .22s,transform .22s;box-shadow:0 12px 34px -12px rgba(0,0,0,.85);max-width:calc(100vw - 96px);text-align:center}
.toast.show{opacity:1;transform:translateX(-50%) translateY(0)}
/* ONLY THE ACTION BUTTON IS TAPPABLE, NOT THE WHOLE TOAST (2026-08-09).
   .toast.show set pointer-events:auto on the entire banner, which sits at z-index 80 over the z-index 72
   FAB at the same bottom offset -- so on a small screen a visible toast swallowed the tap, right after the
   actions that raise toasts. But toast(msg, actLabel, actFn) only creates a button when an action is
   passed, and most toasts are plain text that never needed to receive input at all. */
.toast.show .toast-act{pointer-events:auto}
.toast-act{margin-left:12px;background:rgba(134,239,172,.16);border:1px solid rgba(134,239,172,.4);color:var(--good-hi);font-weight:800;font-size:13px;border-radius:8px;padding:4px 11px;cursor:pointer;font-family:inherit}
.toast-act:active{transform:scale(.94)}
@media(min-width:769px){.toast{bottom:28px}}
@media(prefers-reduced-motion:reduce){.spin{animation:none}}
.parsedbox{background:var(--surf);border:1px solid var(--line3);border-radius:12px;padding:14px}
.pb-title{font-weight:700;font-size:13px;margin-bottom:8px}
@media(max-width:640px){.play{min-width:100%}.gm{min-width:100%}.nav{width:100%;margin-left:0}.trackrow .side{min-width:100%}}
/* ============ MOBILE APP SHELL (bottom tab bar + More sheet + FAB) ============ */
.botnav{display:none}
.sheetscrim{display:none;position:fixed;inset:0;z-index:69;background:rgba(4,6,12,.55);backdrop-filter:blur(2px)}
.sheetscrim.on{display:block}
/* CLOSED MUST MEAN CLOSED, not merely "moved". This relied ONLY on transform:translateY(110%), so a closed
   sheet was still present, still painted and still clickable -- just parked off-screen. Anything that does
   not honour the transform puts it straight back over the content: a full-page screenshot renderer, a
   reduced-motion or transform-disabled context, or any future rule that resets transform on this element.
   Both #moresheet and #addsheet were sitting on top of the board in the owner's screenshots.
   visibility + pointer-events make it unreachable regardless of transform. The visibility transition is
   delayed by the slide duration on close and zeroed on open, so the animation is unchanged. */
.moresheet{position:fixed;left:0;right:0;bottom:0;z-index:70;background:var(--surf);border-top:1px solid var(--line);
  border-radius:20px 20px 0 0;padding:8px 16px calc(18px + env(safe-area-inset-bottom));max-height:88vh;max-height:88dvh;overflow-y:auto;
  transform:translateY(110%);visibility:hidden;pointer-events:none;
  transition:transform .24s cubic-bezier(.2,.7,.2,1),visibility 0s linear .24s;
  box-shadow:0 -18px 50px -20px rgba(0,0,0,.95)}
@media(min-width:769px){.moresheet{left:auto;right:24px;bottom:24px;width:420px;border-radius:18px;border:1px solid var(--line)}}
.sheet-or{display:flex;align-items:center;gap:10px;color:var(--mut);font-size:11px;text-transform:uppercase;letter-spacing:1px;margin:14px 2px 4px}
.sheet-or::before,.sheet-or::after{content:'';flex:1;height:1px;background:var(--line)}
#addsheet .placebet{margin:6px 0 0;border-color:var(--line)}
.sheet-settings{margin-top:12px;border-top:1px solid var(--line);padding-top:8px}
.sheet-settings summary{cursor:pointer;font-size:13px;font-weight:600;color:var(--mut);padding:6px 2px;list-style:none}
.sheet-settings summary::-webkit-details-marker{display:none}
.setcard{background:var(--surf);border:1px solid var(--line);border-radius:16px;padding:16px 18px;margin-bottom:12px}
.setlab{font-size:14px;font-weight:700;color:var(--txt);margin-bottom:2px}
.setsub{font-size:12px;color:var(--mut);line-height:1.55;margin:2px 0 10px}
.setseg{flex-wrap:wrap;gap:6px}
.setseg .segbtn{padding:8px 14px;font-size:13px}
.setfmt{flex-wrap:wrap;gap:6px}
.pm-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:12px}
.pm-card{background:var(--surf);border:1px solid var(--line);border-radius:14px;padding:14px 15px;display:flex;flex-direction:column;gap:9px}
.pm-chd{display:flex;justify-content:space-between;align-items:center;font-size:11.5px;letter-spacing:.6px;text-transform:uppercase}
.pm-cat{color:var(--gold);font-weight:700}
.pm-vol{color:var(--mut)}
.pm-count{font-size:12px;color:var(--mut);font-weight:600;margin:2px 2px 10px}
.pm-fastchip b{color:var(--bad-hi)}
.pm-fastchip.on{background:rgba(var(--bad-rgb),.18);border-color:rgba(var(--bad-rgb),.5);color:var(--bad-hi)}
.pm-fast{color:var(--bad-hi);font-weight:800;letter-spacing:.4px}
.pm-cardfast{border-color:rgba(var(--bad-rgb),.34);background:linear-gradient(180deg,rgba(var(--bad-rgb),.06),var(--surf))}
.pm-more{display:block;width:100%;margin:14px 0 4px;padding:11px;background:#161a29;border:1px solid var(--line);border-radius:11px;color:var(--blue2);font-weight:700;font-size:13px;cursor:pointer;font-family:inherit}
.pm-more:hover{background:#1c2740;border-color:#3a4a6c}
.pm-q{font-size:13.5px;font-weight:650;line-height:1.35;color:var(--txt)}
.pm-opts{display:flex;flex-direction:column;gap:6px;margin-top:2px}
/* ============ GROUPED EVENT CARDS ============
   Polymarket publishes one market per outcome, so an event arrives pre-shattered into dozens of rows.
   Grouped, an event card has real internal structure: the event is the heading, each market is a labelled
   block beneath it. The divider carries that hierarchy so nested outcome buttons don't read as one flat list. */
.pm-evcard{gap:7px}
.pm-evmeta{font-size:11.5px;font-weight:800;letter-spacing:.5px;text-transform:uppercase;color:var(--mut);margin:-2px 0 3px}
.pm-mkt{border-top:1px solid var(--line);padding-top:8px;margin-top:1px}
.pm-mkt:first-of-type{border-top:0;padding-top:0}
.pm-mq{font-size:11.5px;font-weight:700;line-height:1.35;color:var(--mut);margin-bottom:5px}
.pm-evmore{margin-top:8px;width:100%;background:transparent;border:1px dashed var(--line);color:var(--mut);
  border-radius:9px;padding:7px 10px;font:inherit;font-size:11.5px;font-weight:700;cursor:pointer;
  transition:border-color .15s,color .15s}
.pm-evmore:hover{border-color:var(--gold,var(--gold-hi));color:var(--gold,var(--gold-hi))}
/* An expanded event can get tall — cap it and scroll inside the card so one event can't own the viewport. */
.pm-evcard{max-height:min(70vh,620px);max-height:min(70dvh,620px);overflow-y:auto}
.pm-evcard::-webkit-scrollbar{width:6px}
.pm-evcard::-webkit-scrollbar-thumb{background:var(--line);border-radius:3px}
.pm-opt{display:flex;justify-content:space-between;align-items:center;gap:8px;width:100%;text-align:left;background:var(--surf2);border:1px solid var(--line2);border-radius:9px;padding:7px 11px;color:var(--txt);font:inherit;cursor:pointer;transition:border-color .12s,background .12s,transform .06s}
.pm-opt:hover{border-color:var(--gold);background:var(--surf)}
.pm-opt:active{transform:scale(.98)}
.pm-oname{font-size:12.5px;color:var(--txt)}
.pm-oprice{font-size:13px;font-weight:800;color:var(--good);font-variant-numeric:tabular-nums;margin-left:auto}
.pm-add{display:inline-flex;align-items:center;justify-content:center;width:19px;height:19px;border-radius:50%;background:var(--line);color:var(--mut);font-size:14px;line-height:1;flex:none}
.pm-opt:hover .pm-add{background:var(--gold);color:var(--bg)}
/* ---- MIDAS PREDICTOR ---- */
.pm-rec{background:var(--surf2);border:1px solid var(--line);border-radius:11px;padding:9px 13px;margin-bottom:12px;font-size:12.5px}
/* cross-venue HERO — the headline feature */
.pm-hero{margin-bottom:26px}
.pm-hero-h{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;font-size:15px;margin-bottom:13px}
.pm-hero-h b{color:var(--txt)} .pm-hero-sub{font-size:12px;color:var(--mut);font-weight:400}
.pm-hero-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(248px,1fr));gap:11px}
/* COMPACT cross-venue card: the gap shown directly as two markers on one scale */
.pm-xc{background:linear-gradient(165deg,rgba(127,181,255,.09),var(--surf) 62%);border:1px solid rgba(127,181,255,.32);border-radius:13px;padding:11px 12px 10px;display:flex;flex-direction:column;gap:7px}
.pm-xc-top{display:flex;align-items:center;justify-content:space-between;gap:8px}
.pm-xc-edge{font-size:11px;font-weight:800;padding:2px 8px;border-radius:6px;white-space:nowrap}
.pm-xc-edge.up{background:rgba(var(--good-rgb),.16);color:var(--good)}
.pm-xc-edge.down{background:rgba(127,181,255,.16);color:var(--blue2)}
.pm-xc-edge.flat{background:var(--surf2);color:var(--mut)}
.pm-xc-q{font-size:12.5px;font-weight:700;line-height:1.3;color:var(--txt);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.pm-xc-side{font-size:11px;color:var(--mut);margin-top:-2px} .pm-xc-side b{color:var(--gold)}
.pm-xc-scale{position:relative;height:8px;background:var(--surf2);border-radius:999px;margin:6px 3px 3px}
.pm-xc-gap{position:absolute;top:0;height:100%;background:linear-gradient(90deg,rgba(var(--gold2-rgb),.55),rgba(127,181,255,.55));border-radius:999px}
.pm-xc-mk{position:absolute;top:50%;width:11px;height:11px;border-radius:50%;transform:translate(-50%,-50%);border:2px solid var(--surf);box-shadow:0 1px 3px rgba(0,0,0,.4)}
.pm-xc-mk.mk-book{background:var(--gold2)} .pm-xc-mk.mk-pm{background:var(--blue2)}
.pm-xc-legend{display:flex;justify-content:space-between;font-size:11.5px;font-weight:700;font-variant-numeric:tabular-nums}
.pm-xc-legend .lg-book{color:var(--gold2)} .pm-xc-legend .lg-pm{color:var(--blue2)} .pm-xc-legend .lg-fair{color:var(--mut)}
body.theme-light .pm-xc{background:linear-gradient(165deg,rgba(47,86,168,.07),var(--surf) 62%);border-color:rgba(47,86,168,.26)}
/* Props Edge board */
.pe-bar{display:flex;align-items:center;gap:10px;margin-bottom:14px;flex-wrap:wrap}
.pe-lbl{font-size:12px;color:var(--mut);font-weight:600}
.pe-head{font-size:13.5px;margin-bottom:12px;color:var(--txt)} .pe-head b{color:var(--gold)} .pe-head .mut b{color:var(--txt)}
/* transparent-record strip: the Props Edge bot's live W-L, right on the tool */
.pe-bot{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;background:linear-gradient(165deg,rgba(var(--good-rgb),.09),var(--surf) 62%);border:1px solid rgba(var(--good-rgb),.3);border-radius:14px;padding:12px 15px;margin-bottom:14px;cursor:pointer;transition:border-color .12s}
.pe-bot:hover{border-color:var(--good)}
.pe-bot-l{display:flex;align-items:center;gap:11px;min-width:0}
.pe-bot-e{font-size:26px;line-height:1}
.pe-bot-n{font-size:14px;font-weight:800;color:var(--txt)}
.pe-bot-sub{font-size:11.5px;line-height:1.4;margin-top:1px} .pe-bot-sub b{color:var(--good)}
.pe-bot-r{font-size:13px;font-weight:700;text-align:right;white-space:nowrap;display:flex;align-items:center;gap:12px}
.pe-bot-go{font-size:11.5px;font-weight:800;color:var(--good)}
@media(max-width:520px){.pe-bot-r{width:100%;justify-content:space-between}}
.pe-empty{padding:20px 18px;border:1px dashed var(--line);border-radius:14px;color:var(--mut);font-size:13px;line-height:1.6;background:var(--surf)}
.pe-fresh{font-weight:700}.pe-fresh.ok{color:var(--good)}.pe-fresh.warn{color:var(--goldsoft)}.pe-fresh.stale{color:var(--bad)}
/* SCOPED TO #pe-board (2026-08-09). Pick'em and Props Edge both use a pe-* class namespace, and these
   rules are declared LATER at equal specificity -- so they silently beat Pick'em's versions across the
   whole app. The visible symptom: Pick'em's player grid is minmax(150px) under 560px so it fits two
   cards on a phone, and this minmax(240px) overrode it into one card per row. Props Edge renders
   entirely inside #pe-board (verified), so scoping fixes the collision without renaming either set. */
#pe-board .pe-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:11px}
.pe-card{background:linear-gradient(165deg,rgba(var(--good-rgb),.08),var(--surf) 60%);border:1px solid rgba(var(--good-rgb),.3);border-radius:13px;padding:11px 13px 10px;display:flex;flex-direction:column;gap:6px}
.pe-c-top{display:flex;align-items:center;justify-content:space-between;gap:8px}
.pe-mk{font-size:11.5px;font-weight:800;letter-spacing:.04em;text-transform:uppercase;color:var(--mut)}
.pe-edge{font-size:12px;font-weight:800;color:var(--good);background:rgba(var(--good-rgb),.15);padding:2px 8px;border-radius:6px}
.pe-pick{font-size:14px;line-height:1.3;color:var(--mut)} .pe-pick b{color:var(--txt);font-weight:800}
.pe-c-mid{display:flex;align-items:center;gap:9px;font-size:12px;flex-wrap:wrap}
.pe-fair{color:var(--mut)} .pe-fair b{color:var(--txt);font-size:13.5px}
.pe-ev{font-weight:800} .pe-ev.pos{color:var(--good)} .pe-ev.neg{color:var(--bad)}
.pe-move{font-size:11px;font-weight:800;padding:1px 6px;border-radius:5px;background:var(--surf2)}
.pe-move.up{color:var(--good)} .pe-move.down{color:var(--goldsoft)}
.pe-c-foot{font-size:11.5px;color:var(--mut);opacity:.85}
/* GAME GROUP on the props board. The matchup, league, reference book and start time were repeated inside
   every card; they are game-level facts, so they are stated once here and the cards below carry only the
   player, the line and the edge.
   Named pxg-*, NOT pe-g*: .pe-game/.pe-gmu/.pe-gwhen already belong to the Pick'em game folds, and reusing
   them here would have restyled that board from a later rule. */
.pxg{border:1px solid var(--line);border-radius:var(--r2);background:var(--surf2);padding:11px 12px 12px;margin-bottom:10px}
.pxg-hd{display:flex;flex-wrap:wrap;align-items:baseline;gap:6px 10px;margin-bottom:9px}
.pxg-mu{font-family:var(--font-display);font-size:14px;font-weight:800;color:var(--txt);letter-spacing:-.01em}
.pxg-meta{display:flex;flex-wrap:wrap;align-items:center;gap:8px;font-size:11px;color:var(--mut)}
.pxg-lg{font-weight:800;letter-spacing:.05em;text-transform:uppercase;color:var(--goldsoft)}
.pxg-n{font-variant-numeric:tabular-nums;font-weight:700;color:var(--txt)}
.pxg-bk,.pxg-when{font-variant-numeric:tabular-nums}
.pe-card{cursor:pointer;transition:border-color .12s,transform .08s,box-shadow .12s;position:relative}
.pe-card:active{transform:scale(.99)}
.pe-card .pe-add{margin-top:2px;font-size:11.5px;font-weight:700;color:var(--good);opacity:.72}
.pe-card.sel{border-color:var(--good);box-shadow:0 0 0 1px var(--good) inset,0 10px 26px -20px rgba(var(--good-rgb),.7)}
.pe-card.sel .pe-add{opacity:1}
body.theme-light .pe-card{background:linear-gradient(165deg,rgba(22,163,110,.08),var(--surf) 60%);border-color:rgba(22,163,110,.24)}
/* slip builder tray */
#pe-board .pe-slip{background:var(--surf);border:1px solid var(--line);border-radius:15px;padding:13px 15px;margin-bottom:14px}
.pe-slip-empty{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap;border-style:dashed}
.pe-slip-lead{font-size:12.5px} .pe-slip-lead b{color:var(--txt)}
.pe-slip-h{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:9px;font-size:13.5px}
.pe-slip-h b{color:var(--txt)}
.pe-slip-ctrl{display:flex;gap:7px}
.pe-slip-auto{font-size:11.5px;font-weight:800;color:var(--bg);background:var(--gold);border:none;border-radius:999px;padding:6px 12px;cursor:pointer}
.pe-slip-auto:active{transform:scale(.95)}
.pe-slip-clr{font-size:11.5px;font-weight:700;color:var(--mut);background:var(--surf2);border:1px solid var(--line);border-radius:999px;padding:6px 11px;cursor:pointer}
.pe-slip-share{font-size:11.5px;font-weight:800;color:var(--good);background:rgba(var(--good-rgb),.14);border:1px solid rgba(var(--good-rgb),.4);border-radius:999px;padding:6px 12px;cursor:pointer}
.pe-slip-share:active{transform:scale(.95)}
#pe-board .pe-legs{display:flex;flex-direction:column;gap:4px;margin-bottom:11px}
#pe-board .pe-leg{display:flex;align-items:center;gap:9px;font-size:12.5px;padding:5px 8px;background:var(--surf2);border-radius:8px;cursor:pointer}
.pe-leg-x{color:var(--bad);font-weight:800;font-size:11px;opacity:.65}.pe-leg:hover .pe-leg-x{opacity:1}
.pe-leg-p{flex:1;color:var(--txt);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.pe-leg-f{font-weight:800;color:var(--mut);font-variant-numeric:tabular-nums}
.pe-opts{display:grid;grid-template-columns:1fr 1fr;gap:9px}
.pe-opt{background:var(--surf2);border:1px solid var(--line);border-radius:12px;padding:10px 12px}
.pe-opt.best{border-color:var(--gold);background:linear-gradient(165deg,rgba(var(--gold-rgb),.1),var(--surf2))}
.pe-opt-k{font-size:13px;font-weight:800;color:var(--txt)}
.pe-opt-tag{font-size:11px;font-weight:800;color:var(--bg);background:var(--gold);border-radius:5px;padding:1px 5px;vertical-align:middle}
.pe-opt-m{font-size:11px;color:var(--gold);font-weight:700}
.pe-opt-sub{font-size:11.5px;margin:1px 0 6px}
.pe-opt-row{display:flex;align-items:baseline;justify-content:space-between;gap:8px}
.pe-opt-ev{font-size:15px;font-weight:800} .pe-opt-ev.pos{color:var(--good)} .pe-opt-ev.neg{color:var(--bad)}
.pe-opt-w{font-size:11.5px}
.pe-slip-note{font-size:11.5px;line-height:1.5;margin-top:10px}
@media(max-width:520px){.pe-opts{grid-template-columns:1fr}}
.pm-hero-empty{display:flex;gap:14px;align-items:flex-start;background:linear-gradient(160deg,rgba(127,181,255,.07),var(--surf) 70%);border:1px dashed rgba(127,181,255,.34);border-radius:16px;padding:20px 22px;font-size:13px;color:var(--mut);line-height:1.6}
.pm-hero-empty b{color:var(--txt)} .pm-hero-empty-i{font-size:30px;opacity:.7;line-height:1}
.pm-xhero{background:linear-gradient(165deg,rgba(127,181,255,.11),var(--surf) 66%);border:1px solid rgba(127,181,255,.44);border-radius:16px;padding:16px 18px;display:flex;flex-direction:column;gap:11px;box-shadow:0 10px 30px -22px rgba(127,181,255,.6)}
.pm-xhero-top{display:flex;align-items:center;justify-content:space-between;gap:10px}
.pm-xhero-top-r{display:flex;align-items:center;gap:8px}
.pm-share{font:600 11.5px/1 inherit;color:var(--accent,var(--blue2));background:rgba(127,181,255,.1);border:1px solid rgba(127,181,255,.34);border-radius:999px;padding:5px 10px;cursor:pointer;transition:background .12s,transform .12s;white-space:nowrap}
.pm-share:hover{background:rgba(127,181,255,.2)} .pm-share:active{transform:scale(.94)}
body.theme-light .pm-share{color:#2f56a8;background:rgba(47,86,168,.08);border-color:rgba(47,86,168,.3)}
.pm-xhero-q{font-size:15.5px;font-weight:700;line-height:1.3;text-wrap:balance}
.pm-xhero-side{font-size:12px;color:var(--mut)} .pm-xhero-side b{color:var(--gold)}
.pm-vbars{display:flex;flex-direction:column;gap:10px;margin:3px 0}
.pm-vbar{display:grid;grid-template-columns:104px 1fr 40px;align-items:center;gap:11px;font-size:12px}
.pm-vbar-l{color:var(--mut);white-space:nowrap}
.pm-vbar-track{height:10px;background:var(--surf2);border-radius:999px;overflow:hidden}
.pm-vbar-fill{display:block;height:100%;border-radius:999px}
.pm-vbar-book{background:linear-gradient(90deg,var(--gold2),var(--gold))}
.pm-vbar-pm{background:linear-gradient(90deg,#5b8def,var(--blue2))}
.pm-vbar-n{text-align:right;font-weight:800;font-variant-numeric:tabular-nums;color:var(--txt)}
.pm-xhero-foot{display:flex;align-items:center;justify-content:space-between;gap:10px;padding-top:9px;border-top:1px solid var(--line2)}
.pm-fairtag{font-size:12.5px;color:var(--mut)} .pm-fairtag b{color:var(--blue2);font-size:14.5px}
.pm-edge2{font-size:12px;font-weight:800;padding:2px 10px;border-radius:7px}
.pm-edge2.up{background:rgba(var(--good-rgb),.16);color:var(--good)} .pm-edge2.down{background:rgba(var(--gold-rgb),.15);color:var(--goldsoft)} .pm-edge2.flat{background:var(--surf2);color:var(--mut)}
.pm-reads-h{font-size:13px;font-weight:700;margin:4px 0 12px;color:var(--txt)}
body.theme-light .pm-xhero{background:linear-gradient(165deg,rgba(47,86,168,.08),var(--surf) 66%);border-color:rgba(47,86,168,.32)}
body.theme-light .pm-vbar-book{background:linear-gradient(90deg,#d9880a,#e0a112)} body.theme-light .pm-vbar-pm{background:linear-gradient(90deg,#3a6fd0,#5b8def)}
.pm-preds{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:12px}
.pm-pred{background:var(--surf);border:1px solid var(--line);border-radius:14px;padding:13px 15px;display:flex;flex-direction:column;gap:8px}
.pm-pred-x{border-color:rgba(127,181,255,.42);background:linear-gradient(165deg,rgba(127,181,255,.09),var(--surf) 60%)}
.pm-pred-top{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.pm-pred-q{font-size:13.5px;font-weight:600;line-height:1.35;color:var(--txt)}
.pm-pred-mid{display:flex;align-items:center;justify-content:space-between;gap:10px}
.pm-fav{font-size:13px;color:var(--txt)} .pm-fav b{color:var(--gold)}
.pm-conf{font-size:11px;font-weight:700;padding:2px 8px;border-radius:999px;white-space:nowrap}
.pm-conf-good{background:rgba(var(--good-rgb),.16);color:var(--good-hi)} .pm-conf-mid{background:rgba(var(--gold-rgb),.15);color:var(--gold-hi)} .pm-conf-low{background:rgba(var(--push-rgb),.14);color:var(--mut)}
.pm-sig{font-size:11.5px;font-weight:700;letter-spacing:.2px;padding:2px 8px;border-radius:999px;background:var(--surf2);color:var(--mut);border:1px solid var(--line2)}
.pm-sig-edge{background:rgba(127,181,255,.18);color:#9fc0ff;border-color:rgba(127,181,255,.4)}
.pm-sig-confident{background:rgba(var(--good-rgb),.15);color:var(--good-hi);border-color:rgba(var(--good-rgb),.3)}
.pm-sig-lean,.pm-sig-tossup{background:rgba(var(--gold-rgb),.13);color:var(--gold-hi);border-color:rgba(var(--gold-rgb),.28)}
.pm-mom{font-size:11.5px;font-weight:700;padding:1px 6px;border-radius:6px} .pm-mom.up{color:var(--good-hi)} .pm-mom.down{color:var(--bad)}
.pm-xv{display:flex;flex-wrap:wrap;align-items:center;gap:8px;padding:8px 10px;background:rgba(20,24,40,.5);border:1px solid var(--line2);border-radius:10px;font-size:12px}
.pm-xv-v{color:var(--mut)} .pm-xv-v b{color:var(--txt)}
.pm-xv-fair b{color:#9fc0ff}
.pm-xv-edge{margin-left:auto;font-size:11.5px;font-weight:800;padding:1px 7px;border-radius:6px}
.pm-xv-edge.up{background:rgba(var(--good-rgb),.16);color:var(--good-hi)} .pm-xv-edge.down{background:rgba(var(--bad-rgb),.14);color:var(--bad)}
body.theme-light .pm-pred-x{background:linear-gradient(165deg,rgba(47,86,168,.08),var(--surf) 60%);border-color:rgba(47,86,168,.3)}
body.theme-light .pm-xv{background:rgba(240,242,250,.7)}
.zeus-edge{background:linear-gradient(160deg,rgba(var(--gold-rgb),.08),rgba(20,23,38,.4));border:1px solid rgba(var(--gold-rgb),.28);border-radius:14px;padding:14px 16px;margin-bottom:14px}
.zeus-edge.ze-empty{font-size:12.5px;color:var(--mut);line-height:1.55;background:var(--surf);border-color:var(--line);text-align:center}
.ze-art{margin:2px auto 10px}.ze-art svg{width:120px;height:auto;opacity:.92}
.ze-h{font-size:13.5px;font-weight:750;color:var(--txt);margin-bottom:10px;line-height:1.4}
.ze-row{border-top:1px solid var(--line);padding:9px 0 3px}
.ze-top{display:flex;justify-content:space-between;align-items:center}
.ze-pick{font-size:13.5px;font-weight:700;color:var(--txt)}
.ze-gap{font-size:12px;font-weight:800;padding:2px 8px;border-radius:20px;font-variant-numeric:tabular-nums}
.ze-gap.up{background:rgba(var(--good-rgb),.16);color:var(--good)}
.ze-gap.down{background:rgba(var(--bad-rgb),.16);color:var(--bad)}
.ze-nums{font-size:12px;color:var(--mut);margin-top:2px}
.ze-pm{color:var(--gold);font-weight:600}
.ze-note{font-size:11.5px;color:var(--mut);margin-top:3px;font-style:italic}
.ze-foot{font-size:11.5px;color:var(--mut);line-height:1.5;margin-top:10px;border-top:1px solid var(--line);padding-top:8px}
.trk-empty{text-align:center;padding:22px 20px 28px;display:flex;flex-direction:column;align-items:center;gap:4px}
.trk-empty svg{width:180px;max-width:70%;height:auto;margin-bottom:6px}
.te-h{font-size:19px;font-weight:800;color:var(--txt);letter-spacing:-.2px}
.te-p{font-size:13px;color:var(--mut);line-height:1.55;max-width:340px;margin:2px 0 14px}
.te-cta{background:linear-gradient(120deg,var(--gold),var(--gold2));color:var(--bg);border:none;border-radius:12px;padding:13px 22px;font-size:14.5px;font-weight:800;cursor:pointer;box-shadow:0 10px 30px -12px rgba(255,180,40,.7);transition:transform var(--d1) var(--ease-spring),filter var(--d2)}
.te-cta:hover{filter:brightness(1.05)}.te-cta:active{transform:scale(.96)}
.te-alt{background:none;border:none;color:var(--mut);font-size:12.5px;font-weight:600;cursor:pointer;margin-top:10px;text-decoration:underline;text-underline-offset:3px}
.te-alt:hover{color:var(--txt)}
.morestat{margin-top:6px}
.morestat>summary{cursor:pointer;font-size:12px;color:var(--mut);font-weight:600;padding:7px 2px;list-style:none;text-align:center}
.morestat>summary::-webkit-details-marker{display:none}
.morestat>summary::before{content:'▾ ';color:var(--gold)}
.morestat[open]>summary::before{content:'▴ '}
.morestat>.grid-sub{margin-top:8px}
.su-more{margin-bottom:12px;text-align:left}
.su-more summary{cursor:pointer;font-size:12.5px;color:var(--mut);padding:6px 0;list-style:none;font-weight:600}
.su-more summary::-webkit-details-marker{display:none}
.su-more summary::before{content:'＋ ';color:var(--gold)}
.su-more[open] summary::before{content:'－ '}
.livebubble{position:fixed;left:16px;bottom:calc(20px + env(safe-area-inset-bottom));z-index:70;align-items:center;gap:7px;background:linear-gradient(135deg,#1b2233,#141a28);border:1px solid rgba(var(--gold-rgb),.4);color:var(--gold);border-radius:999px;padding:9px 14px 9px 12px;font-weight:800;font-size:13px;cursor:pointer;box-shadow:0 12px 34px -12px rgba(0,0,0,.85);transition:transform var(--d1) var(--ease-spring)}
.livebubble:active{transform:scale(.94)}
.livebubble .lb-ic{font-size:16px;line-height:1}
.livebubble .lb-btxt{letter-spacing:.3px}
.livebubble .lb-count{background:var(--gold);color:var(--bg);border-radius:999px;min-width:20px;height:20px;display:inline-flex;align-items:center;justify-content:center;font-size:12px;padding:0 5px}
.livebubble.haslive{border-color:rgba(var(--good-rgb),.6)}
.livebubble.haslive .lb-count{background:var(--good)}
.livebubble.haslive{animation:lbpulse 2.2s ease-in-out infinite}
@keyframes lbpulse{0%,100%{box-shadow:0 12px 34px -12px rgba(0,0,0,.85)}50%{box-shadow:0 12px 34px -12px rgba(0,0,0,.85),0 0 0 5px rgba(var(--good-rgb),.14)}}
@media(max-width:768px){.livebubble{bottom:calc(90px + env(safe-area-inset-bottom))}}
.askbubble{left:auto;right:16px;border-color:rgba(var(--info-rgb),.4);color:var(--info-hi)}
/* ---- Persistent "+" FAB (track a bet from anywhere) — the primary floating action; chat sits smaller above it ---- */
.fab{position:fixed;right:18px;bottom:calc(22px + env(safe-area-inset-bottom));z-index:72;width:58px;height:58px;border-radius:50%;border:none;background:linear-gradient(135deg,var(--gold-hi),var(--gold-hi));color:var(--bg);display:flex;align-items:center;justify-content:center;cursor:pointer;box-shadow:0 16px 36px -10px rgba(255,207,77,.55),0 8px 20px -8px rgba(0,0,0,.7);transition:transform .14s var(--ease-spring)}
.fab .fab-plus{font-size:34px;line-height:1;font-weight:300;margin-top:-2px}
.fab:hover{transform:scale(1.06)}.fab:active{transform:scale(.9)}
body.landing .fab{display:none}
.askbubble{bottom:calc(96px + env(safe-area-inset-bottom))}   /* stack ABOVE the + FAB — chat de-emphasized, picks + are the star */
/* mobile: the standalone Add nav tab was removed, so the floating "+" IS the add affordance here too — lift it above
   the bottom nav bar, with Ask MIDAS stacked above it (right side) and the live-bets bubble on the left. */
@media(max-width:768px){.fab{display:flex;right:16px;bottom:calc(94px + env(safe-area-inset-bottom))}.askbubble{bottom:calc(158px + env(safe-area-inset-bottom))}}
/* NOTHING MAY END UNDERNEATH THE FLOATING CONTROLS. The controls themselves were positioned correctly --
   safe-area aware, stacked, clear of the nav -- but the page only reserved 64px at the bottom, so the last
   screen of every tab scrolled under them. On the Today board that put the "+" over the search field and
   the Ask MIDAS pill over "-5.58u (-8.3% ROI)": the comparison figure that carries the entire argument for
   the selection method, hidden behind a chat button.
   Cleared to the top of the highest floating element (ask bubble at 158 + its 44px height) plus a margin,
   so the final line of content always sits above all of it. */
@media(max-width:768px){.wrap{padding-bottom:calc(214px + env(safe-area-inset-bottom))}}
/* center "+" Add tab in the bottom nav — elevated & gold, DraftKings-style primary action */
.botnav .bt[data-g='add']{color:var(--bg)}
.botnav .bt[data-g='add'] svg{width:30px;height:30px;background:linear-gradient(135deg,var(--gold-hi),var(--gold-hi));border-radius:50%;padding:6px;box-sizing:content-box;margin-top:-14px;box-shadow:0 8px 20px -6px rgba(255,207,77,.6);stroke:var(--bg)}
.botnav .bt[data-g='add'] span{color:var(--gold);font-weight:800}
.askbubble.haslive,.askbubble{animation:none}
.askbubble .lb-count{display:none}
.lb-row{display:flex;align-items:center;gap:10px;padding:11px 15px;border-bottom:1px solid var(--line)}
.lb-rmain{flex:1;min-width:0}
.lb-rdesc{font-size:13.5px;font-weight:600;color:var(--txt);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.lb-rmeta{font-size:11.5px;color:var(--mut);margin-top:2px}
.lb-livetag{font-size:11.5px;font-weight:800;color:var(--good);white-space:nowrap}
.lb-pendtag{font-size:11.5px;font-weight:700;color:var(--mut);white-space:nowrap}
#livesheet-body{max-height:60vh;max-height:60dvh;overflow-y:auto;-webkit-overflow-scrolling:touch}
@media(prefers-reduced-motion:reduce){.livebubble.haslive{animation:none}.livebubble:active{transform:none}}
.bt-add{color:var(--gold)}
.bt-add .ti{stroke-width:2.6;background:linear-gradient(120deg,var(--gold),var(--gold2));border-radius:50%;padding:3px;box-sizing:content-box;color:var(--bg);width:17px;height:17px;box-shadow:0 4px 14px -4px rgba(255,180,40,.8)}
.bt-add:active .ti{transform:scale(.9)}
/* ===== WIN RECEIPT overlay ===== */
#winrx{position:fixed;inset:0;z-index:120;display:flex;align-items:center;justify-content:center;padding:20px;background:radial-gradient(900px 500px at 50% 30%,rgba(var(--gold-rgb),.10),transparent 70%),rgba(6,8,15,.90);backdrop-filter:blur(7px);opacity:0;pointer-events:none}
#winrx.on{opacity:1;pointer-events:auto;animation:wrx-flash .5s var(--ease-out)}
@keyframes wrx-flash{0%{background-color:rgba(255,255,255,.42)}22%{background-color:rgba(var(--gold-rgb),.16)}100%{background-color:rgba(6,8,15,.90)}}
.wrx-canvas{position:absolute;inset:0;width:100%;height:100%;pointer-events:none}
.wrx-card{position:relative;background:linear-gradient(160deg,var(--surf2),var(--bg2));border:1px solid var(--line);border-radius:20px;padding:26px 24px 22px;width:100%;max-width:340px;text-align:center;box-shadow:0 24px 70px rgba(0,0,0,.6),0 0 0 1px rgba(var(--gold-rgb),.12) inset;transform:scale(.86) translateY(10px);opacity:0}
#winrx.on .wrx-card{animation:wrx-cardin .5s var(--ease-spring) var(--d1) both}
@keyframes wrx-cardin{to{transform:none;opacity:1}}
.wrx-burst{width:120px;height:120px;margin:2px auto 8px;transform:scale(.2) rotate(-14deg);opacity:0}
#winrx.on .wrx-burst{animation:wrx-burstin .62s var(--ease-spring) var(--d2) both}
@keyframes wrx-burstin{60%{opacity:1}to{transform:none;opacity:1}}
.wrx-burst svg,.wrx-burst img{width:100%;height:100%;display:block;filter:drop-shadow(0 6px 18px rgba(255,180,40,.35))}
.wrx-rays{position:absolute;top:-6px;left:50%;width:220px;height:220px;margin-left:-110px;pointer-events:none;background:conic-gradient(from 0deg,transparent 0 8deg,rgba(var(--gold-rgb),.16) 8deg 16deg,transparent 16deg 30deg);border-radius:50%;opacity:0}
#winrx.on .wrx-rays{animation:wrx-rayin .5s var(--ease-out) var(--d2) forwards,wrx-spin 9s linear infinite}
@keyframes wrx-rayin{to{opacity:1}}
@keyframes wrx-spin{to{transform:rotate(360deg)}}
.wrx-kick{font-size:12px;font-weight:800;letter-spacing:2.5px;text-transform:uppercase;color:var(--good-hi);opacity:0}
#winrx.on .wrx-kick{animation:wrx-fade .4s var(--ease-out) var(--d2) both}
.wrx-profit{font-size:44px;font-weight:900;line-height:1.05;margin:4px 0 2px;color:var(--gold);font-variant-numeric:tabular-nums;text-shadow:0 2px 14px rgba(var(--gold-rgb),.35);opacity:0}
#winrx.on .wrx-profit{animation:wrx-fade .4s var(--ease-out) var(--d3) both}
.wrx-desc{font-size:13.5px;font-weight:650;color:var(--txt);line-height:1.4;opacity:0;overflow:hidden;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}
#winrx.on .wrx-desc{animation:wrx-fade .4s var(--ease-out) var(--d3) both}
.wrx-odds{display:inline-block;margin-top:9px;font-size:11.5px;font-weight:800;color:var(--info);background:rgba(var(--info-rgb),.10);border:1px solid rgba(var(--info-rgb),.30);border-radius:999px;padding:4px 12px;font-variant-numeric:tabular-nums;opacity:0}
#winrx.on .wrx-odds{animation:wrx-fade .4s var(--ease-out) var(--d4) both}
.wrx-share{margin-top:14px;background:linear-gradient(120deg,var(--gold),var(--gold2));color:var(--bg);border:none;border-radius:11px;padding:11px 18px;font-size:13px;font-weight:800;cursor:pointer;box-shadow:0 8px 24px -10px rgba(255,180,40,.8);opacity:0;display:block;width:100%}
#winrx.on .wrx-share{animation:wrx-fade .4s var(--ease-out) calc(var(--d4) + .1s) both}
.wrx-share:active{transform:scale(.97)}
.wrx-tap{margin-top:11px;font-size:11px;font-weight:600;color:var(--mut);opacity:0}
#winrx.on .wrx-tap{animation:wrx-fade .5s var(--ease-out) calc(var(--d4) + .3s) both}
@keyframes wrx-fade{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}
.wrx-brand{margin-top:8px;font-size:11.5px;font-weight:800;letter-spacing:2px;color:#6b7290}
@media(prefers-reduced-motion:reduce){#winrx.on,#winrx.on .wrx-card,#winrx.on .wrx-burst,#winrx.on .wrx-kick,#winrx.on .wrx-profit,#winrx.on .wrx-desc,#winrx.on .wrx-odds,#winrx.on .wrx-share,#winrx.on .wrx-tap{animation:none}#winrx .wrx-card,#winrx .wrx-burst,#winrx .wrx-kick,#winrx .wrx-profit,#winrx .wrx-desc,#winrx .wrx-odds,#winrx .wrx-share,#winrx .wrx-tap{opacity:1;transform:none}.wrx-rays{animation:none;opacity:.5}.wrx-canvas{display:none}}
.pm-end{font-size:11px;color:var(--mut)}
body.theme-light{--bg:#f5f6fb;--surf:#ffffff;--surf2:#eef1f8;--line:#dde1ee;--line2:#e9ecf5;--txt:#131627;--mut:#5b6178;--gold:#b07d10;--gold2:#c98a12;--good:#128a5a;--bad:#d64562}
body.theme-light{background:radial-gradient(1000px 520px at 8% -10%,rgba(255,209,102,.10),transparent 60%),radial-gradient(1100px 640px at 102% -4%,rgba(52,211,153,.08),transparent 55%),var(--bg)}
/* On OPEN the visibility flip must be immediate (delay 0), or the sheet slides in invisibly. */
.moresheet.open{transform:translateY(0);visibility:visible;pointer-events:auto;
  transition:transform .24s cubic-bezier(.2,.7,.2,1),visibility 0s linear 0s}
.sheet-grip{width:38px;height:4px;border-radius:3px;background:var(--line3);margin:6px auto 10px}
.sheet-h{font-size:12px;text-transform:uppercase;letter-spacing:1px;color:var(--mut);font-weight:700;margin:0 2px 10px}
.mgrid{display:grid;grid-template-columns:repeat(3,1fr);gap:10px}
.mi{display:flex;flex-direction:column;align-items:center;gap:7px;padding:14px 6px;background:var(--bg2);border:1px solid var(--line);
  border-radius:14px;min-height:66px;color:var(--txt);font-size:12px;font-weight:600;cursor:pointer;-webkit-tap-highlight-color:transparent}
.mi:active{border-color:var(--gold)}
.mi .ti{width:22px;height:22px;color:var(--gold);opacity:.9}
.addbig{display:flex;align-items:center;gap:14px;width:100%;text-align:left;cursor:pointer;
  background:linear-gradient(135deg,rgba(var(--gold-rgb),.16),rgba(245,158,11,.10));border:1.5px solid rgba(var(--gold-rgb),.5);
  border-radius:16px;padding:16px 16px;color:var(--txt);margin-bottom:10px;-webkit-tap-highlight-color:transparent}
.addbig:active{border-color:var(--gold);background:linear-gradient(135deg,rgba(var(--gold-rgb),.24),rgba(245,158,11,.14))}
.addbig-ic{font-size:30px;line-height:1;flex:none}
.addbig-t{flex:1;font-size:16px;font-weight:800;line-height:1.2}
.addbig-t small{display:block;font-size:12px;font-weight:500;color:var(--mut);margin-top:3px}
.addbig-go{font-size:26px;color:var(--gold);font-weight:400;flex:none}
.addrow{display:grid;grid-template-columns:1fr 1fr;gap:10px}
.addopt{padding:13px 10px;background:var(--bg2);border:1px solid var(--line);border-radius:13px;color:var(--txt);
  font-size:13px;font-weight:600;cursor:pointer;min-height:48px;-webkit-tap-highlight-color:transparent}
.addopt:active{border-color:var(--gold)}
.addfab{display:none;position:fixed;right:22px;bottom:26px;z-index:65;width:58px;height:58px;border-radius:50%;
  align-items:center;justify-content:center;font-size:32px;font-weight:700;color:var(--gold-bg);border:none;cursor:pointer;
  background:linear-gradient(135deg,var(--gold),var(--gold2));box-shadow:0 10px 28px -8px rgba(var(--gold2-rgb),.6)}
@media(max-width:768px){
  .nav{display:none}
  /* ---- PHONE HEADER: DROP WHAT IS DUPLICATED ELSEWHERE ----------------------------------------------
     The mode switch is the same control as Settings > Bet type, and "Shop" was a destination sitting in a
     group of two modes -- it has its own entry on the profile ("Shop & avatar"). The tagline wraps to a
     second line and is decoration once you are inside the app. Each row removed here is a row of content
     gained on every single screen. Desktop keeps all three. */
  .dw-toggle{display:none}
  .brandrow .brand small{display:none}
  .botnav{display:grid;grid-template-columns:repeat(5,1fr);position:fixed;left:0;right:0;bottom:0;z-index:60;
    background:rgba(9,11,19,.93);backdrop-filter:blur(18px) saturate(1.3);border-top:1px solid rgba(var(--gold-rgb),.14);
    padding-bottom:max(env(safe-area-inset-bottom),6px);box-shadow:0 -8px 30px -18px rgba(0,0,0,.95)}
  .bt{position:relative;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:5px;min-height:62px;
    padding:11px 0 9px;border:0;background:none;color:var(--mut);font:600 10.5px/1 inherit;cursor:pointer;-webkit-tap-highlight-color:transparent}
  .bt .ti{width:23px;height:23px;opacity:.72}
  .bt span{letter-spacing:.3px}
  .bt.on{color:var(--gold)} .bt.on .ti{opacity:1}
  .bt.on::before{content:'';position:absolute;top:0;width:28px;height:2.5px;border-radius:0 0 3px 3px;background:var(--gold)}
  .wrap{padding-bottom:calc(92px + env(safe-area-inset-bottom))}
  .bar{padding:10px 14px}
  header{position:sticky;top:0;z-index:40}
  .addfab{right:16px;bottom:calc(86px + env(safe-area-inset-bottom))}   /* clear the bottom bar on mobile */
  /* grids/tables reflow to a single narrow column */
  .zoo-grid,.sc-grid,.lgrid,.layers,.bestgrid{grid-template-columns:1fr}
  .lb-scroll,.tbl-scroll{overflow-x:auto;-webkit-overflow-scrolling:touch}
  /* sticky section sub-headers keep context while scrolling */
  /* The fill and the blur existed to stop content showing through while these were PINNED. Static, they
   are grey blocks between rows. A heading is text. */
.seghead,.trk-lbl,.zoo-cat{position:static;background:none;backdrop-filter:none;-webkit-backdrop-filter:none;padding-top:8px}
  html{scroll-padding-top:calc(var(--hdr-h,56px) + var(--subnav-h,0px) + 8px)}
}
@media(max-width:600px){.pb-form,.life-add,.lb-controls{flex-direction:column;align-items:stretch}
  .pb-form input,.pb-form select,.life-add input,.life-add .tinput{max-width:none!important;width:100%}
  .life-add button{width:100%}
  .lbtable{min-width:0}
  /* many-option segmented controls: scroll inside their pill instead of pushing the page wide */
  .lb-controls .segrp,#rc-mode{display:flex;overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none}
  .lb-controls .segrp::-webkit-scrollbar,#rc-mode::-webkit-scrollbar{display:none}
  .lb-controls .segbtn,#rc-mode .segbtn{flex:1 0 auto;white-space:nowrap}}
@media(max-width:768px){
  input,textarea,select,#q,.tinput,.tsearch input,.pb-form input,.loginbox input,#chat-text{font-size:16px}
  .sc-bet{padding:11px 14px;font-size:12.5px;min-height:44px;display:inline-flex;align-items:center}
  .sc-mkrow{gap:8px;row-gap:8px}
  .chip{min-height:44px;padding:10px 14px;display:inline-flex;align-items:center}
  .segbtn{min-height:44px;display:inline-flex;align-items:center} .mini,.btn.sm{min-height:44px;padding:11px 16px;display:inline-flex;align-items:center}
  .pf-followbtn{min-height:44px;padding:11px 20px} .zoo-follow{min-height:44px}
  .tailbtn{min-width:44px;min-height:44px}
  .rm{display:inline-flex;min-width:44px;min-height:44px;align-items:center;justify-content:center}
  .tab{min-height:44px;display:inline-flex;align-items:center}
  .ochip{min-height:44px;padding:9px 14px;display:inline-flex;align-items:center}
  .pm-opt{min-height:44px;padding:10px 12px}
  .who-lock{min-width:44px;min-height:44px}
  .pm-add{position:relative}.pm-add::after{content:'';position:absolute;inset:-13px}
}
@media(max-width:560px){
  .pm-grid{grid-template-columns:1fr;gap:10px}
  .setseg,.setfmt{flex-wrap:nowrap;overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none}
  .setseg::-webkit-scrollbar,.setfmt::-webkit-scrollbar{display:none}
  .setseg .segbtn,.setfmt .chip{flex:0 0 auto;white-space:nowrap}
}
@media(max-width:430px){
  .grid{grid-template-columns:repeat(2,1fr);gap:8px}
  /* calendar grid: tighter cells so a full month fits without cramping the day numbers */
  .cal-day{height:52px;padding:3px 3px}
  table.cal th{font-size:11px}
  .cal-n{font-size:11px} .cal-wl{font-size:11.5px;margin-top:2px} .cal-u{font-size:11px}
  .calnav button{min-width:44px;min-height:40px}
  .port-big{font-size:40px;letter-spacing:-1px} .port-big .u{font-size:18px}
  .bankhero .bk-big{font-size:34px;letter-spacing:-1px} .port-big,.bankhero .bk-big{font-variant-numeric:tabular-nums}
  /* 13px, not 15px. The <=640px block already sets 14px, so this made section headers LARGER on a
     430px phone than on a 640px one -- the inversion is invisible unless you read the cascade. */
  .card .v{font-size:20px} .seghead{font-size:13px}
  #q,.tinput,.tsearch input,.pb-form input,.loginbox input,#chat-text{font-size:16px}
  .tailbtn{min-width:44px;min-height:44px} .chip{padding:9px 13px;min-height:38px}
  .segbtn{padding:10px 15px;min-height:40px} .mini,.btn.sm{min-height:40px;padding:9px 14px}
  .filters{gap:8px;row-gap:8px}
  button,.chip,.segbtn,.tab,.mini,.btn,.slipbtn{-webkit-tap-highlight-color:rgba(var(--gold-rgb),.12)}
}
/* ============ LANDING PAGE (unauthenticated visitors) ============ */
#landing{display:none;min-height:100vh;min-height:100svh}
/* footer.sitefoot was missing from this list, so the APP's legal footer rendered on the landing page with
   everything above it hidden — which parked a wall of disclaimer text above the logo. The landing page has
   its own .lp-foot carrying the same 21+/1-800-GAMBLER copy at the bottom, where it belongs. */
body.landing>header,body.landing>.wrap,body.landing>nav.botnav,body.landing>#addfab,body.landing>.moresheet,body.landing>.sheetscrim,body.landing>footer.sitefoot{display:none!important}
body.landing #landing{display:block}
.lp{max-width:1180px;margin:0 auto;padding:0 22px}
.lp-hdr{position:sticky;top:0;z-index:30;background:rgba(8,10,18,.82);backdrop-filter:blur(16px) saturate(1.3);-webkit-backdrop-filter:blur(16px) saturate(1.3);border-bottom:1px solid rgba(var(--gold-rgb),.11)}
.lp-bar{max-width:1180px;margin:0 auto;padding:12px 22px;display:flex;align-items:center;gap:12px}
.lp-brand{display:flex;align-items:center;gap:9px;font-weight:800;font-size:19px;letter-spacing:1px}
.lp-bar .sp{flex:1}
.lp-ghost{background:transparent;border:1px solid var(--line);color:var(--txt);border-radius:10px;padding:9px 16px;font-size:13px;font-weight:700;cursor:pointer;min-height:40px}
.lp-ghost:hover{border-color:var(--gold)}
.lp-cta{background:linear-gradient(135deg,var(--gold),var(--gold2));color:var(--gold-bg);border:none;border-radius:10px;padding:9px 18px;font-size:13px;font-weight:800;cursor:pointer;min-height:40px}
.lp-hero{display:grid;grid-template-columns:1.05fr 1fr;gap:40px;align-items:center;padding:60px 0 50px}
.lp-eyebrow{display:inline-flex;align-items:center;gap:8px;font-size:11px;font-weight:700;letter-spacing:1.4px;text-transform:uppercase;color:var(--goldsoft);background:rgba(var(--gold-rgb),.07);border:1px solid rgba(var(--gold-rgb),.22);border-radius:999px;padding:6px 13px;margin-bottom:20px}
.lp-eyebrow .ld{width:7px;height:7px;border-radius:50%;background:var(--good);animation:lppulse 2.2s infinite}
@keyframes lppulse{0%{box-shadow:0 0 0 0 rgba(var(--good-rgb),.5)}70%{box-shadow:0 0 0 7px rgba(var(--good-rgb),0)}100%{box-shadow:0 0 0 0 rgba(var(--good-rgb),0)}}
.lp-h1{font-size:52px;line-height:1.04;font-weight:850;letter-spacing:-1.5px;margin-bottom:18px;text-wrap:balance}
.lp-h1 .g{background:linear-gradient(120deg,var(--gold-hi),var(--gold) 50%,var(--gold2));-webkit-background-clip:text;background-clip:text;color:transparent}
.lp-sub{color:var(--txt2);font-size:16.5px;line-height:1.6;max-width:520px;margin-bottom:26px}
.lp-btns{display:flex;gap:12px;align-items:center;flex-wrap:wrap}
.lp-btns .lp-cta{padding:14px 28px;font-size:15px;border-radius:12px}
.lp-btns .lp-ghost{padding:14px 22px;font-size:14px}
.lp-trust{margin-top:22px;font-size:12.5px;color:var(--mut);display:flex;gap:18px;flex-wrap:wrap}
.lp-trust b{color:#cdd2ec}
.lp-zc{position:relative;overflow:hidden;background:radial-gradient(760px 260px at 6% -34%,rgba(var(--gold-rgb),.11),transparent 62%),linear-gradient(160deg,#171c2f,var(--bg));border:1px solid var(--line);border-radius:22px;padding:20px 20px 8px;box-shadow:0 40px 90px -50px rgba(0,0,0,.95)}
.lp-zc::before{content:'';position:absolute;left:0;right:0;top:0;height:1px;background:linear-gradient(90deg,transparent,rgba(var(--gold-rgb),.5),transparent)}
.lp-zc-top{display:flex;align-items:center;gap:10px;margin-bottom:3px}
.lp-zc-title{font-weight:800;font-size:14px}
.lp-zc-live{margin-left:auto;font-size:11.5px;font-weight:700;letter-spacing:1px;text-transform:uppercase;color:var(--good);display:inline-flex;align-items:center;gap:6px}
.lp-zc-live .d{width:6px;height:6px;border-radius:50%;background:var(--good);animation:lppulse 2s infinite}
.lp-zc-sub{font-size:11px;color:var(--mut);margin-bottom:12px}
.lp-zrow{display:grid;grid-template-columns:22px 1fr auto auto;gap:12px;align-items:center;padding:11px 8px;border-radius:11px;border-bottom:1px solid var(--line2)}
.lp-zrank{font-weight:800;font-size:13px;color:var(--mut);text-align:center}
.lp-zrow.top .lp-zrank{color:var(--gold)}
.lp-zname{font-weight:700;font-size:13.5px}
.lp-zmethod{font-size:11px;color:var(--mut);margin-top:1px}
.lp-zflag{font-size:11.5px;color:#F59E0B;margin-top:2px;line-height:1.3}
.lp-zrec{font-size:12px;color:var(--txt2);font-variant-numeric:tabular-nums;white-space:nowrap}
.lp-zu{font-weight:800;font-size:14px;font-variant-numeric:tabular-nums;white-space:nowrap}
.lp-zu.pos{color:var(--good)}.lp-zu.neg{color:var(--bad)}
.lp-zc-foot{padding:12px 8px 10px;font-size:11.5px;color:var(--mut)}
.lp-zc-foot .g{color:var(--gold);font-weight:700}
.lp-proof{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;padding:6px 0 56px}
.lp-proof .v{font-size:30px;font-weight:850;margin-top:5px;font-variant-numeric:tabular-nums;letter-spacing:-1px}
.lp-proof .v.g{background:linear-gradient(120deg,var(--gold-hi),var(--gold));-webkit-background-clip:text;background-clip:text;color:transparent}
.lp-sec{padding:52px 0;border-top:1px solid var(--line2)}
.lp-eb{font-size:11px;font-weight:700;letter-spacing:1.5px;text-transform:uppercase;color:var(--goldsoft);margin-bottom:12px}
.lp-feat{display:grid;grid-template-columns:1fr 1.1fr;gap:44px;align-items:center}
.lp-feat.rev{grid-template-columns:1.1fr 1fr}
.lp-feat.rev .lp-fc{order:2}
.lp-fc h3{font-size:30px;font-weight:800;letter-spacing:-.6px;margin-bottom:14px;text-wrap:balance}
.lp-fc p{color:var(--txt2);font-size:15px;line-height:1.6;margin-bottom:18px}
.lp-list{list-style:none;display:flex;flex-direction:column;gap:11px;margin-bottom:22px;padding:0}
.lp-list li{display:flex;gap:11px;font-size:14px;color:#cdd2ec}
.lp-list .ic{flex:none;width:22px;height:22px;border-radius:7px;background:rgba(var(--good-rgb),.12);color:var(--good);display:inline-flex;align-items:center;justify-content:center;font-size:12px;font-weight:800;margin-top:1px}
.lp-slip{background:linear-gradient(165deg,var(--surf),var(--surf));border:1px solid var(--line);border-radius:16px;padding:16px;box-shadow:0 30px 70px -46px rgba(0,0,0,.9)}
.lp-brow{display:flex;align-items:center;gap:12px;padding:12px 4px;border-bottom:1px solid var(--line2)}
.lp-brow:last-child{border-bottom:none}
.lp-bside{font-weight:650;font-size:14px;flex:1}
.lp-bod{color:var(--gold);font-weight:700;font-variant-numeric:tabular-nums}
.lp-res{font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.5px;padding:4px 10px;border-radius:8px}
.lp-res.w{background:var(--good-bg);color:var(--good-hi)}.lp-res.l{background:var(--bad-bg);color:var(--bad-hi)}.lp-res.p{background:var(--line);color:var(--blue2)}
.lp-two{display:grid;grid-template-columns:1fr 1fr;gap:20px}
.lp-panel{background:linear-gradient(165deg,var(--surf),var(--surf));border:1px solid var(--line);border-radius:16px;padding:22px}
.lp-panel h4{font-size:19px;font-weight:800;margin-bottom:8px}
.lp-panel p{color:var(--txt2);font-size:14px;line-height:1.55}
.lp-panel .em{font-size:26px;margin-bottom:8px;display:block}
.lp-final{text-align:center;padding:70px 0 40px;border-top:1px solid var(--line2)}
.lp-final h2{font-size:40px;font-weight:850;letter-spacing:-1px;margin-bottom:14px;text-wrap:balance}
.lp-final p{color:var(--txt2);font-size:16px;margin-bottom:26px}
.lp-foot{text-align:center;color:var(--mut);font-size:11.5px;line-height:1.7;padding:26px 0 40px;border-top:1px solid var(--line2)}
.lp-sticky{position:fixed;left:0;right:0;bottom:0;z-index:70;padding:10px 14px calc(10px + env(safe-area-inset-bottom));background:rgba(9,11,19,.93);backdrop-filter:blur(18px) saturate(1.3);-webkit-backdrop-filter:blur(18px) saturate(1.3);border-top:1px solid rgba(var(--gold-rgb),.16);display:none;gap:10px;align-items:center;transform:translateY(130%);transition:transform .3s ease}
.lp-sticky.show{transform:translateY(0)}
/* ---- waitlist / email capture (landing) ---- */
.wl{margin:26px auto 0;max-width:460px;text-align:center}
.wl-lbl{font-size:12.5px;font-weight:700;letter-spacing:.02em;color:#9fb0c8;margin-bottom:9px}
.wl-row{display:flex;gap:8px;align-items:stretch;flex-wrap:wrap;justify-content:center}
.wl-in{flex:1 1 210px;min-width:0;padding:12px 14px;font-size:15px;font-family:inherit;color:#eaf2ff;
  background:rgba(255,255,255,.05);border:1px solid rgba(255,255,255,.16);border-radius:10px;outline:none}
.wl-in::placeholder{color:#71809a}
.wl-in:focus-visible{border-color:var(--gold);box-shadow:0 0 0 3px rgba(var(--gold-rgb),.22)}
.wl-btn{flex:0 0 auto;padding:12px 20px;font-size:14.5px;font-weight:800;font-family:inherit;cursor:pointer;
  color:var(--gold-bg);background:linear-gradient(135deg,var(--gold),var(--gold2));border:none;border-radius:10px;
  transition:transform .12s ease,filter .12s ease}
.wl-btn:hover{filter:brightness(1.06)} .wl-btn:active{transform:translateY(1px)}
.wl-btn:disabled{opacity:.6;cursor:default;transform:none}
.wl-btn:focus-visible{outline:2px solid var(--gold);outline-offset:2px}
/* honeypot: off-screen rather than display:none so bots still fill it, humans never see or tab to it */
.wl-hp{position:absolute;left:-9999px;width:1px;height:1px;opacity:0;pointer-events:none}
.wl-fine{margin-top:9px;font-size:11.5px;line-height:1.5;color:#6f7d93}
.wl-fine.ok{color:var(--good);font-weight:700} .wl-fine.err{color:#ff8b7a;font-weight:700}
@media(prefers-reduced-motion:reduce){.wl-btn{transition:none}}
.lp-sticky .s{flex:1;min-width:0}.lp-sticky .s b{display:block;font-size:13px;font-weight:750}.lp-sticky .s span{font-size:11px;color:var(--mut)}
.lp-sticky .lp-cta{height:48px;padding:0 22px;font-size:15px;border-radius:12px}
@media(max-width:920px){
 .lp-hero{grid-template-columns:1fr;gap:32px;padding:38px 0}
 .lp-h1{font-size:37px} .lp-sub{font-size:15.5px}
 .lp-proof{grid-template-columns:repeat(2,1fr)}
 .lp-feat,.lp-feat.rev{grid-template-columns:1fr;gap:24px}
 .lp-feat.rev .lp-fc{order:0}
 .lp-fc h3{font-size:24px}
 .lp-two{grid-template-columns:1fr}
 .lp-final h2{font-size:29px}
 body.landing .lp{padding-bottom:88px}
 .lp-sticky{display:flex}
}
/* Stake tier. Sharps publish conviction as units (VSIN goes to 2.5u); flat 1u says nothing. */
.b3u{font-weight:800;padding:1px 7px;border-radius:999px;background:rgba(255,255,255,.07);color:var(--txt)}
.b3u.hi{background:rgba(var(--gold-rgb),.16);color:var(--gold)}
.b3u.lo{background:rgba(255,255,255,.05);color:var(--mut)}

/* The EV verdict. A parlay panel that quotes only the price is telling the reader the bet is fine. */
.b3ev{margin:10px 0 4px;padding:10px 12px;border-radius:10px;font-size:12.5px;line-height:1.55;
  background:rgba(255,255,255,.04);border:1px solid var(--line);color:var(--mut)}
.b3ev b{color:var(--txt)}
.b3ev.pos{background:rgba(0,200,5,.09);border-color:rgba(0,200,5,.28)}
.b3ev.pos b{color:var(--good-hi)}
.b3ev.neg{background:rgba(255,80,0,.10);border-color:rgba(255,80,0,.30)}
.b3ev.neg b{color:var(--bad-hi)}
.b3par-note{font-size:11px;color:var(--mut);line-height:1.5;margin:6px 0 10px}
/* the market chip goes red when the price demands more than the market has ever delivered */
.b3cell.under{background:rgba(255,80,0,.10);color:var(--bad-hi);border-color:rgba(255,80,0,.28)}

.tr-scope{font-size:12px;color:var(--mut);line-height:1.55;border-left:3px solid var(--line);
  padding-left:11px;margin:2px 0 16px;max-width:80ch}

/* ---- LEAGUE ORGANISER -------------------------------------------------------------------------------------
   The streaks surface rendered ~40 league cards in glob (alphabetical) order, and 20 of 35 were a full-height
   card wrapping one line of grey text. Now: leagues ordered by how much MIDAS actually bets them, the top few
   expanded, the rest one-line folds, and everything with nothing on a run collapsed into a single summary. */
.lg-sec{margin-bottom:8px}
.lg-body{padding:12px 15px 4px}
.lg-body .trk-grp:last-child{margin-bottom:4px}
.lg-quiet{margin:6px 0 14px}
.lg-quietlist{font-size:11.5px;color:var(--mut);line-height:1.7;padding:8px 2px 0}

/* ---- PER-MARKET RANKED BARS -------------------------------------------------------------------------------
   Replaces the engine-wide equity curve on the Summary. HTML/CSS divs rather than a stretched SVG: chart_svg
   uses preserveAspectRatio='none', which distorts at every viewport width, and a bar list has to stay legible
   on a phone. No external library -- the CSP blocks them anyway. */
.mkchart{background:var(--surf);border:1px solid var(--line);border-radius:16px;padding:16px 18px;margin-bottom:18px}
.mk-head{font-size:13px;color:var(--mut);line-height:1.55;margin-bottom:12px}
.mk-head b{color:var(--txt);font-size:15px}
.mk-lead{display:flex;flex-wrap:wrap;align-items:baseline;gap:8px;font-size:13.5px;padding:11px 14px;
  margin-bottom:14px;border-radius:12px;border:1px solid rgba(var(--gold-rgb),.28);
  background:linear-gradient(160deg,rgba(var(--gold-rgb),.10),transparent 62%)}
.mk-lead .k{font-size:11.5px;font-weight:800;letter-spacing:.09em;text-transform:uppercase;color:var(--goldsoft)}
.mk-lead b{font-size:15.5px;color:var(--txt)}
.mk-rows{display:flex;flex-direction:column;gap:2px}
.mk-rows.early{opacity:.62}
.mk-row{display:grid;grid-template-columns:minmax(120px,1.05fr) minmax(0,2.3fr) minmax(112px,auto);
  align-items:center;gap:12px;padding:8px 10px;border-radius:10px;cursor:pointer;
  border-left:3px solid transparent;transition:background .14s,border-color .14s}
.mk-row:hover{background:rgba(255,255,255,.035)}
.mk-name{font-size:13px;font-weight:650;color:var(--txt);line-height:1.25;overflow:hidden;text-overflow:ellipsis}
.mk-name .lg{display:block;font-size:11.5px;font-weight:600;color:var(--mut);letter-spacing:.04em;text-transform:uppercase}
.mk-track{position:relative;height:16px}
.mk-track::before{content:'';position:absolute;left:50%;top:0;bottom:0;width:1px;background:#2a2f45}
.mk-bar{position:absolute;top:2px;height:12px;border-radius:3px}
.mk-bar.pos{left:50%;background:linear-gradient(90deg,rgba(0,200,5,.55),#00c805)}
.mk-bar.neg{right:50%;background:linear-gradient(270deg,rgba(255,80,0,.55),#ff5000)}
.mk-val{text-align:right;font-variant-numeric:tabular-nums;font-weight:800;font-size:14px;line-height:1.2}
.mk-sub{display:block;font-size:11.5px;font-weight:500;color:var(--mut)}
.mk-row.lead{border-left-color:var(--gold);background:rgba(var(--gold-rgb),.05)}
.mk-row.lead .mk-name{font-size:14.5px}
.mk-axis{display:flex;justify-content:space-between;font-size:11.5px;color:var(--mut);margin-top:10px;padding:0 10px}
.mk-foot{font-size:11px;color:var(--mut);margin-top:8px;line-height:1.5}
.mkfold{margin-top:12px}
/* The engine-wide number does not disappear, it moves here -- same size as .rb-sub, never smaller. */
.aggline{font-size:13px;color:var(--mut);line-height:1.6;margin:14px 0 4px;max-width:74ch}
.aggline b{color:var(--txt)}
.aggline-go{color:var(--gold);font-weight:650;cursor:pointer;white-space:nowrap}
.aggline-go:hover{text-decoration:underline}
@media(max-width:640px){
  .mk-row{grid-template-columns:1fr auto;gap:4px 10px}
  .mk-track{grid-column:1/-1;order:3}
  .mk-val{text-align:right}
}
body.theme-light .mkchart{background:#fff}
body.theme-light .mk-track::before{background:#d6dae8}
body.theme-light .mk-bar.pos{background:linear-gradient(90deg,rgba(15,138,82,.5),#0f8a52)}
body.theme-light .mk-bar.neg{background:linear-gradient(270deg,rgba(209,59,83,.5),#d13b53)}

/* ---- BEST 3: market record + receipts ---------------------------------------------------------------------
   Two things were missing from a feature people are going to PARLAY. First, why this pick is here: it is now
   gated on the (league, bet type) having a >=55% historical win rate and positive units, so that record is
   what earns the slot and it should be on screen. Second, how the feature has actually DONE -- reconstructed
   walk-forward, re-running the selection each day using only prior data. A "best picks" box with no track
   record is exactly the thing this product exists not to be. */
.b3cell{display:inline-flex;align-items:center;gap:5px;font-size:11.5px;font-weight:700;margin-left:8px;
  padding:2px 7px;border-radius:999px;background:rgba(0,200,5,.10);color:var(--good-hi);
  border:1px solid rgba(0,200,5,.24);white-space:nowrap;vertical-align:1px}
.b3cell .n{color:var(--mut);font-weight:600}
.b3rec{margin:14px 0 4px;padding:13px 15px;border-radius:13px;background:var(--surf2);
  border:1px solid var(--line)}
.b3rec-h{display:flex;flex-wrap:wrap;align-items:baseline;gap:9px;font-size:12.5px;color:var(--mut)}
.b3rec-h b{font-size:15px;color:var(--txt)}
.b3rec-h .k{font-size:11.5px;font-weight:800;letter-spacing:.09em;text-transform:uppercase;color:#8a90ad}
/* The interval sits on its own row: .b3rec-h is a wrapping flex row, so without flex-basis:100% this
   trails the ROI inline and reads as more of the same sentence rather than the qualifier on it. */
.b3rec-ci{flex:0 0 100%;margin-top:5px;font-size:11.5px;line-height:1.45;letter-spacing:.01em}
.b3cal{display:flex;flex-wrap:wrap;gap:4px;margin-top:11px}
.b3day{width:26px;height:26px;border-radius:7px;display:flex;align-items:center;justify-content:center;
  font-size:11.5px;font-weight:800;cursor:default;border:1px solid transparent;
  font-variant-numeric:tabular-nums}
.b3day.w{background:rgba(0,200,5,.16);color:var(--good-hi);border-color:rgba(0,200,5,.3)}
.b3day.l{background:rgba(255,80,0,.14);color:var(--bad-hi);border-color:rgba(255,80,0,.28)}
.b3day.e{background:rgba(255,255,255,.05);color:var(--mut)}
.b3day.hit{box-shadow:0 0 0 2px rgba(var(--gold-rgb),.55) inset}
.b3cal-key{font-size:11.5px;color:var(--mut);margin-top:9px;line-height:1.6}
.b3note{font-size:11px;color:var(--mut);margin-top:8px;line-height:1.55}
body.theme-light .b3rec{background:#f0f2f9}
/* ODC-BY 1.0 is a LICENCE CONDITION, not a courtesy: Cricsheet data may be used commercially only WITH
   attribution, and the harvester went live in the extras task today. Small and muted, but present on every
   page that can show a cricket result. */
.foot-attr{margin-top:9px;font-size:11px;color:var(--mut);line-height:1.6}
.foot-attr a{color:var(--mut);text-decoration:underline}
.foot-attr a:hover{color:var(--txt)}

/* ---- TODAY'S BETS DROPDOWN ---------------------------------------------------------------------------------
   A day's slip lives in the header now, beside the player chip. It existed before only as a floating bubble
   pinned bottom-left on phones (.livebubble -> openLiveSheet), which is a different thing in a different place
   and showed a read-only list: you could see an open bet but not stake it, lock it or fix it without navigating
   to the tracker. This panel is the same data with the actions attached, plus the one piece that was invisible
   anywhere: whether a photographed slip is still being read. */
.tdaywrap{position:relative;display:inline-flex}
.tdaybtn{display:inline-flex;align-items:center;gap:6px;background:var(--surf2);border:1px solid var(--line);
  color:var(--txt);border-radius:999px;padding:6px 11px;font:inherit;font-size:12.5px;font-weight:700;
  cursor:pointer;min-height:34px;transition:border-color .12s,background .12s}
.tdaybtn:hover{border-color:var(--gold)}
.tdaybtn .tdn{background:var(--gold);color:var(--bg);border-radius:999px;min-width:18px;height:18px;
  display:inline-flex;align-items:center;justify-content:center;font-size:11px;font-weight:800;padding:0 5px}
.tdaybtn.haslive .tdn{background:var(--bad-hi);color:#fff;animation:tdpulse 1.6s infinite}
.tdaybtn.scanning{border-color:var(--info)}
@keyframes tdpulse{0%,100%{opacity:1}50%{opacity:.45}}
.tdaypop{position:absolute;right:0;top:calc(100% + 8px);width:min(360px,92vw);z-index:95;display:none;
  background:var(--surf);border:1px solid var(--line);border-radius:14px;
  box-shadow:0 22px 48px -16px rgba(0,0,0,.7);overflow:hidden}
.tdaypop.open{display:block}
.tdp-h{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:11px 13px;
  border-bottom:1px solid var(--line);font-size:13px;font-weight:800}
.tdp-h .mut{font-weight:400;font-size:11.5px}
.tdp-body{max-height:min(60dvh,420px);overflow-y:auto;overscroll-behavior:contain}
.tdp-row{display:flex;flex-direction:column;gap:7px;padding:11px 13px;border-bottom:1px solid var(--line2)}
.tdp-row:last-child{border-bottom:none}
.tdp-top{display:flex;align-items:flex-start;gap:9px}
.tdp-desc{flex:1;font-size:12.5px;line-height:1.42;color:var(--txt)}
.tdp-meta{font-size:11.5px;color:var(--mut);margin-top:3px;font-variant-numeric:tabular-nums}
.tdp-pill{flex:none;font-size:11.5px;font-weight:800;padding:3px 8px;border-radius:999px;letter-spacing:.02em;
  text-transform:uppercase;white-space:nowrap}
.tdp-pill.live{background:var(--bad-bg);color:var(--bad-hi)}
.tdp-pill.open{background:var(--surf);color:var(--mut)}
.tdp-pill.w{background:var(--good-bg);color:var(--good-hi)}
.tdp-pill.l{background:var(--bad-bg);color:var(--bad-hi)}
.tdp-pill.p{background:var(--surf2);color:#a5b4fc}
.tdp-act{display:flex;align-items:center;gap:7px;flex-wrap:wrap}
.tdp-stake{width:82px;background:var(--surf2);border:1px solid var(--line);color:var(--txt);border-radius:8px;
  padding:7px 9px;font:inherit;font-size:13px;min-height:36px}
.tdp-b{background:var(--surf2);border:1px solid var(--line);color:var(--txt);border-radius:9px;padding:7px 12px;
  font:inherit;font-size:12px;font-weight:700;cursor:pointer;min-height:36px}
.tdp-b.go{background:linear-gradient(135deg,var(--gold),var(--gold2));border-color:var(--gold);color:var(--bg)}
.tdp-b:hover{border-color:var(--gold)}
.tdp-locked{font-size:11.5px;color:var(--good-hi);font-weight:700}
/* the scan strip: the whole point of the request -- a slip being read is now visible while it happens */
.tdp-scan{display:flex;align-items:center;gap:9px;padding:10px 13px;background:rgba(var(--info-rgb),.08);
  border-bottom:1px solid rgba(var(--info-rgb),.24);font-size:12px;color:#cfe4f5}
.tdp-scan.err{background:rgba(255,93,93,.09);border-bottom-color:rgba(255,93,93,.3);color:var(--bad-hi)}
.tdp-scan.done{background:rgba(var(--good-rgb),.09);border-bottom-color:rgba(var(--good-rgb),.3);color:var(--good-hi)}
.tdp-spin{width:14px;height:14px;border:2px solid rgba(var(--info-rgb),.3);border-top-color:var(--info);
  border-radius:50%;animation:tdspin .8s linear infinite;flex:none}
@keyframes tdspin{to{transform:rotate(360deg)}}
@media(prefers-reduced-motion:reduce){.tdp-spin{animation:none}.tdaybtn.haslive .tdn{animation:none}}
.tdp-empty{padding:22px 14px;text-align:center;color:var(--mut);font-size:12.5px}
.tdp-foot{padding:9px 13px;border-top:1px solid var(--line);display:flex;gap:8px}
@media(max-width:560px){.tdaypop{position:fixed;left:8px;right:8px;top:calc(var(--hdr-h,56px) + 6px);width:auto}}
body.theme-light .tdaypop{box-shadow:0 22px 48px -18px rgba(30,40,80,.3)}
body.theme-light .tdp-pill.open{background:#eef1f8}
/* MIDAS-ALERTS-UI start */
.alwrap{position:relative;display:inline-flex}
.albtn{display:inline-flex;align-items:center;gap:6px;background:var(--surf2);border:1px solid var(--line);
 color:var(--txt);border-radius:999px;padding:6px 11px;font-size:13px;font-weight:700;cursor:pointer;line-height:1}
.albtn:hover{border-color:var(--gold)}
.albtn .aln{background:var(--gold);color:var(--bg);border-radius:999px;min-width:18px;height:18px;
 display:inline-flex;align-items:center;justify-content:center;font-size:11px;font-weight:800;padding:0 5px}
.albtn.has .aln{background:var(--bad-hi);color:#fff}
.alpop{position:absolute;right:0;top:calc(100% + 8px);width:min(380px,92vw);z-index:95;display:none;
 background:var(--surf);border:1px solid var(--line);border-radius:14px;overflow:hidden;
 box-shadow:0 22px 48px -18px rgba(0,0,0,.6)}
.alpop.open{display:block}
.alp-h{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:11px 13px;
 border-bottom:1px solid var(--line);font-size:12.5px;font-weight:800}
.alp-act,.alp-set,.alp-link{color:var(--gold);font-weight:700;font-size:11.5px;cursor:pointer}
.alp-body{max-height:min(60dvh,420px);overflow-y:auto;overscroll-behavior:contain}
.alp-row{display:flex;align-items:flex-start;gap:9px;padding:11px 13px;border-bottom:1px solid var(--line2)}
.alp-row:last-child{border-bottom:none}
.alp-row.unread{background:rgba(var(--gold-rgb),.06)}
.alp-ic{flex:none;font-size:14px;line-height:1.3}
.alp-txt{flex:1;display:flex;flex-direction:column;gap:2px;min-width:0}
.alp-t{font-size:12.5px;font-weight:700;color:var(--txt)}
.alp-b{font-size:11.5px;color:var(--mut);line-height:1.4}
.alp-m{font-size:11px;color:var(--mut);font-variant-numeric:tabular-nums}
.alp-x{flex:none;color:var(--mut);cursor:pointer;font-size:15px;line-height:1;padding:2px 4px}
.alp-x:hover{color:var(--txt)}
.alp-empty{padding:22px 14px;text-align:center;color:var(--mut);font-size:12.5px;line-height:1.6}
.alp-foot{padding:9px 13px;border-top:1px solid var(--line)}
.alset-row{display:flex;align-items:flex-start;gap:10px;padding:9px 0;font-size:13px;cursor:pointer}
.alset-row.dim{opacity:.55}
.alset-row input{margin-top:2px;flex:none}
.alset-row>span{display:flex;flex-direction:column;gap:2px}
.alset-s{font-size:11.5px;color:var(--mut);line-height:1.45;font-weight:400}
@media(max-width:560px){.alpop{position:fixed;left:8px;right:8px;top:calc(var(--hdr-h,56px) + 6px);width:auto}}
body.theme-light .alpop{box-shadow:0 22px 48px -18px rgba(30,40,80,.3)}
body.theme-light .alp-row.unread{background:rgba(255,209,102,.16)}
/* MIDAS-ALERTS-UI end */

/* ================= VERIFIED DESIGN REVIEW FIXES (2026-08-07) ================================================
   Each of these was confirmed against the source before being written; the one finding that did not reproduce
   (a supposed duplicate body.theme-light variable block) was dropped rather than "fixed". */

/* --bg2 WAS NEVER DEFINED. 13 selectors referenced var(--bg2,#12151f) and every one silently took the dark
   literal -- including .b3par, the Today's Best 3 parlay panel. Its children colour from --mut/--txt, so in
   LIGHT theme .b3par-sub b computed #12151f text on a #12151f panel: literally invisible, on the conversion
   surface of the headline feature. Defining the token repairs all 13 at once. */
:root{--bg2:#12151f}
body.theme-light{--bg2:#f0f2f9}

/* COLD-LOAD FLASH. The `landing` class is added by the LAST inline script in an 8.4MB document, and it is the
   only thing that hides the app shell. So a logged-out visitor painted the entire logged-in dashboard, then a
   full-screen login modal over it, and only swapped to the landing page once ~4MB of JS had parsed. This is the
   first impression of every beta signup. The head script below stamps html.pre-landing before any markup is
   parsed, so the correct surface is chosen at parse time instead of after. */
html.pre-landing header,html.pre-landing .wrap,html.pre-landing nav.botnav,html.pre-landing .subnav,
html.pre-landing #addfab,html.pre-landing #fab-add,html.pre-landing .livebubble,html.pre-landing .askbubble,
html.pre-landing footer.sitefoot,html.pre-landing #overlay{display:none!important}
html.pre-landing #landing{display:block!important}

/* iOS ZOOM ON FOCUS. Safari zooms the viewport whenever a focused control computes under 16px. The existing
   guard is a bare `input,textarea,select,...` selector, and media queries add no specificity -- so
   `input:not([type])` (0,1,1) and every `.tinput`/.as-search/.wl-in class rule out-specified it and left real
   fields at 12.5-15px. Enumerating the offenders would miss one; !important is the only single-line fix.
   Keyed on pointer:coarse rather than a width, because a 900px tablet zooms too. */
@media(pointer:coarse){
  input,textarea,select,#q,.tinput,.tsearch input,.pb-form input,.loginbox input,#chat-text,
  .as-search input,.wl-in,.obs-stake,.pe-stakerow input,.promo-row input,.fd-cmt-in input,
  .ref-row .tinput,.fd-comp-on textarea{font-size:16px!important}
  /* The Pick'em slip is fixed at bottom:0 z-index 80; the bottom nav is bottom:0 z-index 60 and ~62px tall.
     Once a leg was picked the slip covered all five nav tabs and they could not be tapped at all. */
  .pe-slip{bottom:calc(62px + max(env(safe-area-inset-bottom),6px))}
}

/* SCROLL CHAINING. No sheet or modal contained its overscroll, so flicking past the end of one scrolled the
   page underneath it. overscroll-behavior appeared exactly 3 times in the whole stylesheet before this. */
.moresheet,#livesheet-body,.gcoverlay,.chatbox,.pe-slip,.storebox,.chatpanel{overscroll-behavior:contain}

/* SCROLL JANK. background-attachment:fixed forces the compositor to repaint the body gradient against a moving
   scroll offset every frame -- the standard first thing to remove when a mobile page misses 60fps. Overridden
   rather than deleted so the light theme (which already resets it via a background shorthand) is untouched.
   The mobile sticky section headers also stack a blur on top of the header, sub-nav and bottom-nav blurs; they
   already carry an opaque rgba(8,10,18,.92) background, so dropping their blur costs nothing visually. */
body{background-attachment:scroll}
@media(max-width:768px){.seghead,.trk-lbl,.zoo-cat{backdrop-filter:none;-webkit-backdrop-filter:none}}

/* will-change:transform was applied to .tailbtn and friends -- 936 elements in the emitted page. MDN is explicit
   that over-applying it costs memory, and each one gets a compositor layer hint it does not need: the rule exists
   only to smooth a :active scale, and a tap-scale transform is already compositor-only. */
.tab,.chip,.segbtn,.bt,.mi,.btn,.pm-opt,.tailbtn,.who-me,.slipbtn,.addbig,.setseg .segbtn{will-change:auto}
.fab,.livebubble{will-change:transform}

/* The landing page rendered 140px narrower than the app it leads into, so the column jumped the moment someone
   signed up. .lp-bar must move with .lp or the sticky header misaligns against the body. */
@media(min-width:1500px){.lp,.lp-bar{max-width:1320px}}

/* The persistent signup bar was display:none at base and only turned on under max-width:920px, so desktop
   visitors scrolled four full sections -- proof, Zoo, tracker, panels -- with no CTA anywhere. The
   transform/.show mechanism already hides it until 300px of scroll, so this needs no new behaviour. */
.lp-sticky{display:flex}

/* ---- DESKTOP TIER -----------------------------------------------------------
   This sheet was written mobile-first and never grew up: 37 max-width queries
   against 4 min-width ones. A 1440-1920px monitor therefore got the exact same
   1080px column a phone gets, and -- because .sitefoot was already 1180px -- the
   footer rendered visibly WIDER than every screen of content above it. These
   tiers widen the content to meet the footer, then a little further on large
   monitors, and dock the floating controls to the content column instead of
   leaving them pinned to a far corner of an empty canvas.

   The FAB is deliberately NOT hidden on desktop. The '+ Add bet' subtab is only
   emitted for the home group, so on Zoo / Social / Tracker the FAB is the only
   way to add a bet; suppressing it above 769px would remove the primary action
   from most of the app. (.addfab is display:none at every width -- dead.) */
@media(min-width:1180px){
  /* Brought down from 1180 (2026-08-10) — the owner's note was that the layout feels oversized, and the
     content column is the largest single contributor. The footer moves with it so the two still line up,
     which was the reason this tier existed. */
  .wrap,.sitefoot{max-width:1040px}
}
@media(min-width:1500px){
  .wrap,.sitefoot{max-width:1120px}
  /* right edge of the floating controls tracks the content column's edge:
     50vw - half the column. max() keeps the mobile offset on narrow screens. */
  /* Half of the column above (1120/2), so these keep tracking its edge. If the column changes and these
     do not, the floating controls drift off the content and sit in empty canvas. */
  .fab,.askbubble{right:max(18px,calc(50vw - 560px))}
  /* :not(.askbubble) -- the Ask bubble carries both classes and pins itself to the
     RIGHT via left:auto. Setting a left here too would stretch it edge to edge. */
  .livebubble:not(.askbubble){left:max(16px,calc(50vw - 560px))}
}

/* ---- SUB-NAV: make the horizontal scroll DISCOVERABLE ------------------------
   .subnav-in has always scrolled (overflow-x:auto) but nothing ever said so: the
   scrollbar is hidden by design, and the 'board' group carries 6 tabs -- 'Odds
   Board', 'Props Edge', 'Live Scores' and the rest run well past the width of a
   phone. The mask fades the strip out across the 14px of padding at each end, so
   a part-scrolled row visibly CONTINUES instead of ending in a hard cut. It costs
   nothing when the row fits: the fade sits exactly on the padding, clear of the
   first and last chip.
   overscroll-behavior-x stops a swipe that runs off the end of the strip from
   being handed to the browser as a back-navigation gesture -- on iOS that quietly
   navigated away from the app mid-scroll. */
.subnav-in{-webkit-mask-image:linear-gradient(90deg,transparent 0,#000 14px,#000 calc(100% - 14px),transparent 100%);mask-image:linear-gradient(90deg,transparent 0,#000 14px,#000 calc(100% - 14px),transparent 100%);overscroll-behavior-x:contain;scroll-behavior:smooth}

/* THE SAME GESTURE BUG, ON EVERY OTHER HORIZONTAL STRIP. The fix above was applied to .subnav-in alone,
   but .subnav-in is not the only row that scrolls sideways: the sticky sport-chip bar sits on Today and on
   History, and the wide tables scroll horizontally on every tab. Each one hands a swipe that runs off its
   end to the page, which on iOS is the back-navigation gesture and on Android is the horizontal rubber
   band. `contain` keeps the overscroll inside the strip that the thumb is actually on. This is a shared
   rule rather than a Today-only one because the strips are shared; the Today-relevant members are .spbar,
   .jumpbar and .tbl-scroll. */
.spbar,.jumpbar,.tbl-scroll,.rc-scroll,.pttabs,.pg-ladrow,#zoo-sportrow{overscroll-behavior-x:contain}

/* ---- TOUCH TAP TARGETS ------------------------------------------------------
   Gated on (pointer:coarse), NOT a width breakpoint, because this is a property of
   the input device rather than the screen: a 1280px touchscreen laptop needs it and
   a 900px window on a desktop does not. Inflating every control at a width
   breakpoint would cost the density this dashboard is built around for no one's
   benefit.
   Controls that SHOULD be bigger get a 44px box, by one of two routes chosen from
   what each rule already does. Ones laid out with flex just take min-height and stay
   centred. Block and inline-block ones take vertical padding instead: forcing
   display:flex on them would collapse a full-width button to its content width, and
   min-height alone would strand the label at the top of a 44px box. */
@media(pointer:coarse){
  .subtab,.navg,.trk-chip,.fchip,.tailbtn,.fd-act,.sharebtn,.obtn,.rc-hit{min-height:44px}
  /* square icon buttons -- width is as much of a miss as height on these */
  .hdr-gear,.setbtn{min-height:44px;min-width:44px}
  /* THIRD WAVE. These were skipped by the two passes above, each for a different reason, and each is
     the ONLY way to do the thing it does:
       .dw-store       26x26 header store button -- its two neighbours (.dw-bal, .dw-swap) were fixed
                       and this one was not, which is the tell that it was an oversight.
       .pfcal-nav btn  26x26 -- .calnav button got 44px, but the profile calendar uses a DIFFERENT
                       class, so month navigation there stayed thumb-hostile.
       checkbox        15x15, and every toggle in Settings is one. */
  .dw-store,.pfcal-nav button{min-height:44px;min-width:44px}
  /* TEXT FLOOR. These carry real information -- the date and start time on every pick card, and the
     label under every headline number -- and were set at 9-10px, which is below comfortable reading on
     a phone. Raised only under coarse pointers so the desktop density is untouched. */
  .pdate,.pstart{font-size:11.5px}
  .card .k{font-size:11px;letter-spacing:.6px}
  .olbl,.ob-best,.sc-mk{font-size:11.5px}
  input[type=checkbox],input[type=radio]{min-width:24px;min-height:24px;accent-color:var(--gold)}
  .chip,.calchip,.dh-chip,.zchip,.pe-chip,.segbtn,.shoptab,.shoptab2,.inv-tab,.m-opt,.vq-opt,.pmtail,.fd-tail,.sh-btn,.zoo-follow,.pf-followbtn,.pf-obtn,.ps-go,.gcbtn,.so-btn,.wl-btn,.obs-cancel,.lp-cta,.lp-ghost,.li-swap,.idea-send,.pe-slip-auto,.pe-slip-clr,.pe-slip-share,.ub-clr,.pm-more,.pm-evmore,.rc-mkt{min-height:44px;padding-top:12px;padding-bottom:12px;align-content:center}

  /* Small BY DESIGN: a 14px '?' popper, a wallet balance chip, a close X. A 44px
     box here would look broken, so the box keeps its pixels and only the TOUCH
     REGION grows, through an invisible overlay centred on the element. Purely
     additive -- nothing moves, nothing reflows.
     Deliberately NOT applied to .zc-tier / .botpx-tag / .pe-opt-tag: those sit
     INSIDE a clickable card or row, and an overlay larger than the badge would
     swallow taps meant for the parent. A hit area that steals the wrong tap is a
     worse bug than one that is too small. */

  /* ---- SECOND WAVE ----------------------------------------------------------
     .ochip / .sc-bet / .who-lock / .who-me already had 44px rules -- but inside
     @media(max-width:768px), a WIDTH breakpoint. A tablet or a touchscreen laptop
     in landscape sits above 768px with a coarse pointer and was getting the 22px
     version. Restated here so the size follows the finger, not the viewport.
     (.who-me was 40px even on mobile -- 4px short of the whole point.)
     Most of these are <button>, which centres its own label, so min-height alone
     is enough and correct. Only the two that are not -- a <span> and a <div> --
     need padding to keep their text off the top edge. */
  .who-me,.sim-diachip,.ostat,.claimbub,.rm-chip,.livebubble,.fd-comp-b,.pf-tail1,
  .fd-comp-go,.pf-fc,.pe-leg,.pe-bot,.fd-comp,.pe-card,.rc-modecard,.mini,.rm-rb,
  .wrx-share{min-height:44px}
  /* mirrors the existing mobile rules exactly, so nothing shifts between the two */
  .ochip{min-height:44px;padding:9px 14px;display:inline-flex;align-items:center}
  .sc-bet{min-height:44px;padding:11px 14px;display:inline-flex;align-items:center}
  /* square-ish: a round log-out button and a vote pill -- width misses as badly as height */
  .who-lock,.idea-vote{min-height:44px;min-width:44px}
  /* not buttons: a <span> tab and a <div> avatar cell, so they take padding */
  .zgbtn,.av-cell{min-height:44px;padding-top:12px;padding-bottom:12px;align-content:center}

  /* Avatars. .avwrap is a decorative ring -- 38 of its 39 uses are not clickable at
     all -- so growing it would inflate every avatar on the site to fix one target.
     The real element is .fd-ava, and its three bare rules cascade down to 34x34
     everywhere while keeping the cursor:pointer from the 36px rule above them: a
     34px target that looks clickable because it is. Matched on the attributes that
     make one tappable (an inline handler, or the data-prof the delegated listener
     reads) so ONLY avatars you can actually open grow, and the decorative ones in
     bot cards and leaderboards keep the density they were designed with. */
  .fd-ava[onclick],.fd-ava[data-prof],.avwrap[onclick]{min-width:44px;min-height:44px}

  /* CLOSERS. A modal X, a chat X and a History day collapse are all small BY DESIGN -- a 44px box would
     look broken -- but they are also the only exit from what they close, and .gcbox/.chatpanel leave
     almost no backdrop to tap instead. So the pixels stay and only the TOUCH REGION grows, the same
     invisible-overlay trick already used for .gq. .lc-gc/.trk-gc/.gc-link are ~14px inline links.
     Purely additive: nothing moves, nothing reflows. */
  .gq,.tour-x,.dw-bal,.gcclose,.hd-close,.cp-x,.lc-gc,.trk-gc,.gc-link{position:relative}
  .gq::after,.tour-x::after,.dw-bal::after,.gcclose::after,.hd-close::after,.cp-x::after,
  .lc-gc::after,.trk-gc::after,.gc-link::after{content:'';position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);width:100%;min-width:44px;height:44px}
}

/* ---- EVENT DETAIL: PICK-FIRST ------------------------------------------------------------------------
   Rewritten 2026-08-14. The panel opened on pitchers -> weather -> 120 player-form chips -> and only then
   the pick you clicked to read about. Now the pick leads and context folds, with each fold's summary
   carrying its own signal so a closed row still answers its own question.

   LAST IN THE SHEET, like the other late additions here: .evblk and .evh already have rules earlier in
   this file, and a rule that loses on source order loses regardless of specificity. */

/* The lead block is the only one with weight. Everything else recedes. */
.evblk.evlead{border:1px solid rgba(var(--gold-rgb),.28);background:linear-gradient(165deg,rgba(var(--gold-rgb),.07),rgba(var(--gold-rgb),.02));
  border-radius:13px;padding:13px 14px;margin-bottom:12px}
/* FLEX, or margin-left:auto on .evsum does nothing and the count welds itself to the heading — shipped
   exactly that way for one build and read "What MIDAS bet17 picks". Caught from a screenshot, not code. */
.evblk.evlead>.evh{color:var(--gold);display:flex;align-items:baseline;gap:9px}

/* ---- CONTEXT CHIPS: conditions first, no clicking required ---- */
.evchips{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:12px}
.evchip{display:inline-flex;align-items:baseline;gap:5px;padding:5px 9px;border-radius:8px;
  border:1px solid var(--line);background:rgba(255,255,255,.025);font-size:11px;color:var(--mut);
  font-weight:600;letter-spacing:.02em}
.evchip b{color:var(--txt);font-weight:800;font-size:12px;font-variant-numeric:tabular-nums}
.evchip-roof{border-color:rgba(var(--gold-rgb),.30);background:rgba(var(--gold-rgb),.07);color:rgba(var(--gold-rgb),.85)}
.evchip-roof b{color:var(--gold)}
/* Rain gets louder as it gets likelier. A washout can void the game, not just move the total. */
.evchip-warn{border-color:rgba(245,158,11,.38);background:rgba(245,158,11,.10);color:var(--gold2)}
.evchip-warn b{color:var(--gold2)}
.evchip-alert{border-color:rgba(239,68,68,.42);background:rgba(239,68,68,.12);color:var(--bad-hi)}
.evchip-alert b{color:var(--bad-hi)}
.evchip-mut{opacity:.62}

/* The honest contrast under the hero: curated Best 3 vs any 3 off the board. Quieter than the headline
   because it is the control, not the claim — but present, because the gap between them IS the claim. */
.ps-contrast{font-size:11.5px;line-height:1.6;color:var(--mut);margin:-4px 0 14px;padding:0 2px}
.ps-contrast b{color:var(--txt);font-weight:700}
/* Provenance sits quieter than the contrast, because it qualifies the claim rather than making it.
   It is present at all because a record that is partly modelled and partly measured must say which. */
.ps-prov{display:inline-block;margin-top:5px;font-size:11.5px;line-height:1.55;color:#6f7590}
.ps-prov b{color:var(--mut);font-weight:700}

/* ---- BOARD AS AN OPERATE SURFACE -----------------------------------------------------------------------
   A tracker is a tool, not a landing page: someone opens it dozens of times a day to find a bet, so
   scanability outranks expression. Two changes follow from that.

   1. The prose moved into .boardhow. It is one row closed instead of two paragraphs holding the fold.
   2. The game row became a GRID. It was flex with .gname{flex:1} and everything after it flex:none, so the
      status, time, chips and bet-count each started wherever that row's team names happened to end. Down a
      list of 15 games nothing lined up vertically, and the eye has to re-find every column on every row.
      Fixed tracks mean status is always in the status place. This is the single biggest scanability win on
      the board and it costs no vertical space. */
.boardhow{margin:0 0 12px;border:1px solid var(--line);border-radius:10px;background:rgba(255,255,255,.015)}
.boardhow>summary{cursor:pointer;list-style:none;padding:9px 12px;font-size:11.5px;font-weight:700;
  color:var(--mut);min-height:38px;display:flex;align-items:center;gap:8px;user-select:none}
.boardhow>summary::-webkit-details-marker{display:none}
.boardhow>summary::after{content:'';margin-left:auto;width:6px;height:6px;border-right:1.5px solid var(--mut);
  border-bottom:1.5px solid var(--mut);transform:rotate(45deg) translate(-2px,-2px);
  transition:transform 180ms cubic-bezier(0.23,1,0.32,1)}
.boardhow[open]>summary::after{transform:rotate(225deg) translate(-2px,-2px)}
.boardhow>summary:hover{color:var(--txt)}
.boardhow p{font-size:12px;line-height:1.6;color:var(--mut);margin:0 12px 10px}
.boardhow p:first-of-type{margin-top:2px}

/* ---- LAYER SCALE ---------------------------------------------------------------------------------------
   There was no scale, just 32 ad-hoc z-index values from 2 to 99999 accreted one bump at a time. That
   produced FIVE ties where two overlays share a number and the winner is decided by DOM order:

       70  .livebubble  .lp-sticky  .moresheet      <- the add-bet sheet
       80  .fd-sheet    .pe-slip
      120  .obetscrim   .pslip      .xp-float       <- a scrim tied with what it must sit behind
      130  .levelup-overlay  .shareopts
      200  .gcoverlay   .touchtip

   "A collision resolved by arrival order is a bug" is already a hard-won rule in this codebase (coin-flip
   default, score-index key, doubleheader scorer, dictionary-order Best 3). This is the same defect in CSS:
   nothing is WRONG until someone reorders markup, and then a sheet silently renders under a bubble.

   The tokens below name the tiers so the next overlay picks a rung instead of inventing a number. The
   fixes are DELIBERATELY SURGICAL -- ties broken inside their existing tier, not a wholesale renumber.
   Renumbering all 32 would risk regressing layouts that cannot be verified without eyes on every surface,
   and this is days from launch. The scale documents the intent; the offsets fix the actual defect.

   Ordering rule, low to high: ambient float < scrim < sheet < popover < modal scrim < modal < toast < fx. */
:root{
  --z-sticky:30;      /* subnav, landing header                */
  --z-float:65;       /* ambient floating affordances          */
  --z-scrim:69;       /* the dimmer behind a bottom sheet      */
  --z-sheet:70;       /* bottom sheets (add, more)             */
  --z-popover:90;     /* anchored popovers, tooltips           */
  --z-modal:310;      /* full modals (event detail, chat)      */
  --z-toast:400;      /* transient confirmation                */
}
/* A SHEET MUST COVER THE BUTTONS THAT OPENED IT. .fab sat at 72 against a sheet at 70, so the floating
   action button drew on top of the open sheet. Ambient furniture now sits below the scrim, where an open
   sheet hides it -- which is what a scrim is for. */
.fab{z-index:68}
.livebubble{z-index:66}
.lp-sticky{z-index:67}
/* Ties broken within tier. Higher = closer to the reader, chosen by what must remain reachable. */
.pe-slip{z-index:81}          /* a slip opened FROM the props sheet sits above it        */
.xp-float{z-index:118}        /* ambient reward animation, never above a live scrim      */
.pslip{z-index:119}           /* ...and the slip sits under its own scrim at 120         */
.levelup-overlay{z-index:132} /* a full-screen celebration outranks a share popover      */
.touchtip{z-index:201}        /* a tooltip is useless if the overlay it explains covers it */
/* The win receipt was tied with .obetscrim at 120 and therefore sat UNDER .obetsheet (121) -- the sheet
   you just confirmed a bet in would cover the receipt telling you it won. A full-screen receipt outranks
   the sheet that produced it. */
#winrx{z-index:122}

/* CARET. Impeccable's craft floor lists the browser surfaces a themed product is expected to own:
   text selection, the caret, scrollbars, focus rings, underline offset. We already theme four of the five.
   The caret was the miss, so every input still blinked in the OS default blue against a gold-on-graphite
   product. One line, and it is the kind of detail that reads as care without ever being noticed. */
input,textarea,[contenteditable]{caret-color:var(--gold)}

/* Meta atoms, replacing the middots. Same information, one less thing competing for attention. */
.gm-n{font-weight:800;color:var(--txt);font-variant-numeric:tabular-nums}
.gm-k{margin-left:4px;margin-right:9px;color:var(--mut)}
.gm-lg{margin-right:9px;color:var(--mut)}
/* The day-count readout only appears once a filter actually narrows something, so an unfiltered
   History is not carrying a line that always says the same thing. */
.hist-n{font-size:11.5px;color:var(--mut);font-variant-numeric:tabular-nums;min-height:16px;margin:0 2px 8px}
/* Says what the number is NOT, right where it is read. Quieter than the label, louder than a tooltip. */
.rb-nb{font-size:11.5px;font-weight:800;letter-spacing:.03em;padding:1px 6px;border-radius:20px;
  background:rgba(var(--push-rgb),.16);color:#9fa8bd;vertical-align:middle;margin-left:2px}

/* ================= MOTION SYSTEM =========================================================================
   The site did not read as generated because it lacked motion. It read that way because it had 107
   transitions written one at a time: 15 distinct durations from 100ms to 800ms, 9 `transition: all`,
   8 different :active scales, and 185 hover rules with only 4 gated for touch. Each was locally sensible.
   Together they had no rhythm, which is exactly what accreted assistance produces.
   One token set, named for the job each curve does. Frequency decides duration, not element size. */
:root{
  --ease-out:    cubic-bezier(0.23, 1, 0.32, 1);    /* enters, exits, press release. the default */
  --ease-sheet:  cubic-bezier(0.32, 0.72, 0, 1);    /* bottom sheets only. settles like a panel */
  --ease-move:   cubic-bezier(0.77, 0, 0.175, 1);   /* something on screen moving to a new place */
  --ease-tint:   cubic-bezier(0.4, 0, 0.6, 1);      /* colour only. symmetric, since colour has no position */
  --ease-decay:  cubic-bezier(0.16, 1, 0.3, 1);     /* settle flash. peak early, long fade */
  --dur-press:   60ms;    /* press down: must land in the same perceptual moment as the touch */
  --dur-1:      120ms;    /* release, tint, focus */
  --dur-2:      160ms;    /* small movement */
  --dur-3:      220ms;    /* exits. always faster than enters */
  --dur-4:      280ms;    /* sheet entry. the longest travel in the app */
  --dur-settle: 900ms;    /* money changed. this one earns its length */
}

/* ONE PRESS SCALE. There were eight (.9 .94 .95 .955 .96 .97 .98 .99), so no two controls answered a
   finger the same way. Asymmetric on purpose: down fast because the system is reacting, up slower
   because it is relaxing. Bounce is deliberately absent, a button released from a spring curve grows
   past its resting size, which on a dense row list reads as wobble. */
.btn,.chip,.segbtn,.mi,.slipbtn,.tab,.evtab,.sbtn,.ps-go,.evbtn,.evmore,.mkttl{
  transition:transform var(--dur-1) var(--ease-out),
             background var(--dur-1) var(--ease-tint),
             border-color var(--dur-1) var(--ease-tint),
             color var(--dur-1) var(--ease-tint)}
.btn:active,.chip:active,.segbtn:active,.mi:active,.slipbtn:active,.tab:active,
.evtab:active,.sbtn:active,.ps-go:active,.evbtn:active,.evmore:active{
  transform:scale(0.97);transition-duration:var(--dur-press)}

/* TOUCH: a phone has no hover, but :hover still fires on tap and then STICKS until you tap elsewhere.
   181 of 185 hover rules were ungated, so tapping a row left it lit. Killing the lift and the shadow is
   enough: those are the artefacts you can see stuck. Colour changes are harmless and stay. */
@media (hover: none), (pointer: coarse){
  .card:hover,.layer:hover,.bcard:hover,.pm-card:hover,.zt-card:hover,.setcard:hover,
  .btn:hover,.slipbtn:hover,.sbtn:hover,.tailbtn:hover,.evbtn:hover,.ps-go:hover,
  .gamehdr:hover,.sporthdr:hover,.grphdr:hover,.subhdr:hover,.hd-row:hover,.evfold:hover{
    transform:none;box-shadow:none;filter:none}
}

/* REDUCED MOTION means fewer and gentler, not none. Colour and opacity carry meaning and stay; movement
   goes. A blanket `animation:none !important` would also kill the loading skeletons, which are the one
   place motion is load-bearing information. */
@media (prefers-reduced-motion: reduce){
  *,*::before,*::after{
    transition-duration:var(--dur-1) !important;
    animation-duration:var(--dur-1) !important;
    animation-iteration-count:1 !important}
  .btn:active,.chip:active,.segbtn:active,.mi:active,.slipbtn:active,.tab:active,.evtab:active{
    transform:none !important}
  .mz-skel,.skel{animation:none !important}
}

/* ---- SHEETS: ONE MOTION, AND A SCRIM THAT ACTUALLY FADES ------------------------------------------------
   The single grossest detail in the product. Four hand-rolled bottom sheets, three different curves
   (.2,.7,.2,1 / .22,1,.36,1 / none) across .2s, .24s and .28s. Worse, `.sheetscrim` was
   `display:none` toggled to `display:block`, and DISPLAY CANNOT TRANSITION, so on every open the backdrop
   appeared in a single frame while the panel glided for 240ms behind it. You feel that mismatch without
   being able to name it, and it fires on the most common interaction in the app.

   Now: one curve, one enter duration, one exit duration, and the scrim fades on the same frame as the
   panel it belongs to. pointer-events carries the "is it there" job that display used to do, so a closed
   scrim still cannot intercept a tap. */
.sheetscrim{display:block;opacity:0;pointer-events:none;
  transition:opacity var(--dur-3) var(--ease-tint)}
.sheetscrim.on{opacity:1;pointer-events:auto;transition-duration:var(--dur-4)}
.obetscrim{transition:opacity var(--dur-3) var(--ease-tint)}
.obetscrim.on{transition-duration:var(--dur-4)}

/* Exits are faster than enters, always. The panel is leaving because you asked it to, so waiting on it is
   pure tax; arriving is the only half that has anything to communicate. */
.moresheet,.obetsheet,.pe-slip{transition:transform var(--dur-3) var(--ease-sheet)}
.moresheet.open,.obetsheet.open,.pe-slip.open{transition-duration:var(--dur-4)}
.fd-sheet{transition:opacity var(--dur-3) var(--ease-tint)}

/* ---- NO `transition: all` ---------------------------------------------------------------------------
   Nine controls used it. `all` animates every property that changes, including ones that trigger layout,
   so a width or padding change that was never meant to be animated gets a 200ms tween and a reflow per
   frame. It also silently picks up any property added later. These are all button-shaped controls, so
   they want exactly what every other control here gets: transform, plus colour. */
.zgbtn,.dh-chip,.ochip,.obtn,.pe-ob,.pe-ub,.m-opt,.obs-chips button,button.ocell.otail,.pf-obtn{
  transition:transform var(--dur-1) var(--ease-out),
             background var(--dur-1) var(--ease-tint),
             border-color var(--dur-1) var(--ease-tint),
             color var(--dur-1) var(--ease-tint) !important}
.zgbtn:active,.dh-chip:active,.ochip:active,.obtn:active,.pe-ob:active,.pe-ub:active,
.m-opt:active,.obs-chips button:active,button.ocell.otail:active,.pf-obtn:active{
  transform:scale(0.97);transition-duration:var(--dur-press)}

/* ---- will-change IS NOT A STYLESHEET PROPERTY -------------------------------------------------------
   Seven selectors declared it permanently. `will-change` tells the browser to promote an element to its
   own compositor layer AND KEEP IT THERE, so a rule in a stylesheet holds that memory for the life of the
   page whether the element ever animates or not. On a board of hundreds of rows that is the single
   biggest scroll-performance cost in the product. Released here; the browser promotes on demand, which is
   what it is good at. */
.card,.layer,.bcard,.pm-card,.setcard,.pick,.gamegrp{will-change:auto}

/* ---- ONE PRESS SCALE, FOR REAL --------------------------------------------------------------------
   The earlier pass in this block set 0.97 on the main controls but left thirty-odd other selectors on
   their own values (.9 .94 .95 .955 .96 .98 .99), so it ADDED a ninth scale rather than replacing eight.
   Overridden by name here. The spread was not a style choice, it is what happens when each control is
   authored on the day it is needed: a .9 press on the FAB next to a .99 press on a card reads as two
   different products. One value, one duration, everywhere a finger lands. */
.sharebtn:active,.who-lock:active,.dw-swap:active,.claimbub:active,.idea-send:active,
.idea-vote:active,.pe-qs button:active,.pe-go:not(:disabled):active,.compete-card:active,
.m-lock:not(:disabled):active,.obs-lock:active,.pf-followbtn:active,.sc-bet:active,
.rm-rb:active,.promo-btn:active,.dw-store:active,.toast-act:active,.pm-opt:active,
.pe-card:active,.pe-slip-auto:active,.pe-slip-share:active,.pm-share:active,.te-cta:active,
.livebubble:active,.fab:active,.bt-add:active,.addbig:active,.bt:active{
  transform:scale(0.97) !important;
  transition-duration:var(--dur-press) !important}

/* The remaining permanent will-change declarations. Same reasoning as above: a compositor layer held for
   the life of the page whether or not the element ever moves. .fly-coin and .mz-fly are genuinely
   transient (they exist only while flying) so they keep theirs. */
.slipbtn,.addbig,.setseg .segbtn,.reel-track,.fab,.livebubble{will-change:auto}

/* ==========================================================================================================
   VISUAL SYSTEM  ::  "INSTRUMENT"
   ==========================================================================================================
   The product looked generic because its surfaces were generic: three flat greys, a border on everything,
   and one light source implied by nothing. Colour alone does not fix that. What reads as expensive in a
   dark interface is LIGHT BEHAVIOUR, so this layer changes four things and only four:

     1. One light source. A single cool key light from top centre, so the page has a top and a bottom
        instead of being a flat field. Everything else derives from it.
     2. Elevation replaces outlines. A raised surface is lighter, carries a 1px top rim where the light
        catches it, and drops a soft shadow. Borders drop to hairlines because they no longer do the work
        of separating things.
     3. Real black is refused. #05070C, not #000. A true black kills every shadow you draw on it, which is
        precisely how a dark UI ends up looking flat.
     4. Numbers get their own treatment. This is a product about figures, so every figure is tabular and
        slightly tighter than the prose around it. Nothing else in the app signals "instrument" harder.

   Gold stays. It is the brand and it is now RATIONED: signal only, never decoration. */
:root{
  /* Cool near black, hue held at 250 so the whole ramp is one family */
  --bg:      #05070c;
  --bg-2:    #070a11;
  --surf:    #0d1119;   /* z1: cards, rows */
  --surf2:   #131826;   /* z2: raised panels, sheets */
  --surf3:   #1a2032;   /* z3: popovers */
  --line:    #1c2233;   /* hairline. deliberately low contrast */
  --line2:   #141926;
  --txt:     #f4f6fb;
  --mut:     #79819b;
  --gold:    #ffd166;
  --gold2:   #f0b544;
  --good:    #3ddc97;
  --bad:     #ff6b81;
  /* Elevation: offset AND blur, never a zero offset halo */
  --e1: 0 1px 2px rgba(0,0,0,.40);
  --e2: 0 4px 16px -6px rgba(0,0,0,.70);
  --e3: 0 18px 48px -18px rgba(0,0,0,.86);
  --rim: inset 0 1px 0 rgba(255,255,255,.045);   /* where the key light catches an edge */
  --r1: 8px; --r2: 12px; --r3: 16px;
}

/* THE LIGHT SOURCE. One cool key from top centre plus a faint gold bloom low down, so the page reads as a
   lit space rather than a flat colour. Fixed attachment so it does not slide under scrolling content. */
body{
  background:
    radial-gradient(1200px 620px at 50% -8%,  rgba(120,150,255,.055), transparent 62%),
    radial-gradient(900px 520px at 88% 108%,  rgba(var(--gold-rgb),.030), transparent 60%),
    var(--bg) !important;
  background-attachment:fixed;
}

/* SURFACES: lighter as they rise, rim where the light lands, shadow underneath. The border is a hairline
   now because elevation is doing the separating. */
.card,.layer,.bcard,.pm-card,.setcard,.panel,.zt-card,.zoo-card,.gamegrp,.sport,.trackrow,.pe-slip{
  /* AURORA, SITE-WIDE — and the cheap half of it on purpose. The look is the translucent sheet letting the
     wash through; the expensive part is backdrop-filter, and with several hundred cards on a full board it
     stays off. Translucency alone costs nothing and is what makes every tab read as one product.
     Was an opaque gradient, which is why the wash behind it was invisible everywhere except Practice. */
  background:rgba(255,255,255,.055);
  border:1px solid rgba(255,255,255,.12);
  /* 14px, matching Aurora's sheet. Was 16 (--r3); the two-pixel disagreement between a Practice sheet and
     a Record card is exactly the kind of thing that reads as "different app" without being nameable. */
  border-radius:14px;
  box-shadow:var(--e2),var(--rim)}
.gamehdr,.sporthdr,.grphdr,.subhdr{
  background:linear-gradient(180deg,rgba(255,255,255,.022),rgba(255,255,255,0))}
.gamegrp,.sport,.sportgrp{border-color:var(--line) !important}

/* Sheets and modals sit highest, so they get the deepest shadow and the clearest rim. */
.moresheet,.obetsheet,.evpanel,.gcbox,.pe-slip{
  background:linear-gradient(180deg,var(--surf3),var(--surf2)) !important;
  box-shadow:var(--e3),var(--rim) !important;
  border-color:var(--line) !important}

/* NUMBERS ARE THE PRODUCT. Tabular everywhere, so columns line up and a digit never shifts as it updates. */
.gm-n,.hd-u,.hd-rec,.hd-n,.ps-v,.evpick-p,.evpick-e,.sc-rec,.sc-u,.gres,.gru,.gwhen,.gmeta,
.bk-big,.b3wl,.evtab-n,.evsum,.cnt,.n{font-variant-numeric:tabular-nums;font-feature-settings:'tnum' 1}

/* Headings get tighter tracking than body. Confidence reads as compression. */
.seghead,.sportname,.grpname,.gname,.evtitle,.bk-big,.ps-v{letter-spacing:-.015em}
.bk-big,.ps-v{letter-spacing:-.03em}

/* Gold is a SIGNAL, not a texture: current selection, our pick, money in our favour. Nothing else. */
.navg.on{background:rgba(var(--gold-rgb),.09);box-shadow:inset 0 -2px 0 var(--gold)}
.subtab.on{box-shadow:var(--e1)}
.pick.tracked{border-left-color:var(--gold);box-shadow:inset 1px 0 0 rgba(var(--gold-rgb),.25)}

/* Themed browser surfaces, per the craft floor: selection, scrollbar, focus ring. */
::selection{background:rgba(var(--gold-rgb),.26);color:var(--txt)}
*{scrollbar-width:thin;scrollbar-color:var(--line) transparent}
*::-webkit-scrollbar{width:10px;height:10px}
*::-webkit-scrollbar-thumb{background:var(--line);border-radius:99px;border:3px solid transparent;background-clip:content-box}
*::-webkit-scrollbar-thumb:hover{background:var(--surf3);background-clip:content-box}
:focus-visible{outline:2px solid rgba(var(--gold-rgb),.55);outline-offset:2px;border-radius:4px}

/* ==========================================================================================================
   TYPE SYSTEM
   ==========================================================================================================
   The stack was `-apple-system, BlinkMacSystemFont, Segoe UI, Roboto, sans-serif`, which is the default
   every AI-assisted site ships and reads as exactly that. No webfont is loaded here on purpose: this page
   is already ~10MB and a render-blocking third-party request would undo the caching work. Character comes
   from faces ALREADY on the device instead.

   Two families, each with one job.

   DISPLAY, for headings, figures and anything that has to look measured:
     Bahnschrift is Microsoft's DIN 1451 interpretation, ships with Windows 10+, and is a variable font with
     a real width axis. DIN is the lettering standard for German road signs and engineering drawings, which
     is precisely the register this product wants. On Apple it falls to SF Pro Display, which is the closest
     equivalent in tone.

   NUMERALS, which in a product about numbers is not a detail:
     A monospace stack so every figure occupies identical width. A price ticking from -110 to -115 must not
     reflow the row it sits in, and a column of units has to align on the decimal without being told to.

   Body text stays on the refined system face: it is the most-read text in the app and legibility outranks
   personality there. Display carries the identity; body carries the reading. */
:root{
  --font-ui: 'Segoe UI Variable Text','SF Pro Text',-apple-system,BlinkMacSystemFont,'Segoe UI',system-ui,sans-serif;
  --font-display: 'Bahnschrift','DIN Next','SF Pro Display','Segoe UI Variable Display',var(--font-ui);
  --font-num: 'Cascadia Mono','SF Mono','JetBrains Mono',ui-monospace,Menlo,Consolas,monospace;
}
body{font-family:var(--font-ui) !important}

/* DISPLAY: the surfaces that should feel engineered rather than typed. */
.seghead,.sportname,.grpname,.gname,.evtitle,.ps-k,.evh,.navg,.subtab,.evtab,
.hd-date,.bk-lab,.sc-rec,.gst{
  font-family:var(--font-display);
  font-stretch:92%;            /* Bahnschrift's width axis. A touch condensed reads as instrument, not
                                  as cramped, and gracefully ignored by faces without the axis. */
  letter-spacing:.005em}

/* FIGURES: monospace, tabular, slightly tighter than the prose beside them. */
.gm-n,.hd-u,.hd-rec,.hd-n,.ps-v,.evpick-p,.evpick-e,.gres,.gru,.gwhen,.bk-big,
.b3wl,.evtab-n,.cnt,.sc-u,.evsum{
  font-family:var(--font-num);
  font-variant-numeric:tabular-nums;
  letter-spacing:-.01em}

/* The hero figures earn a size and a weight nothing else gets. One moment of scale per screen. */
.bk-big,.ps-v{font-family:var(--font-num);font-weight:700;letter-spacing:-.035em}

/* Prose keeps a readable measure. Data and tables are exempt: density is the point there. */
.boardhow p,.evpick-r,.evread,.ps-contrast,.tr-scope{max-width:68ch}

/* ---- IN PLAY: a game, then your positions in it ------------------------------------------------------ */
.ip-game{border:1px solid var(--line);border-radius:var(--r2);background:linear-gradient(180deg,var(--surf2),var(--surf));
  box-shadow:var(--e1),var(--rim);margin-bottom:8px;overflow:hidden}
.ip-ghead{display:flex;align-items:center;gap:9px;padding:11px 13px;min-height:46px;flex-wrap:wrap}
.ip-mu{font-family:var(--font-display);font-stretch:92%;font-weight:700;font-size:13.5px;color:var(--txt);
  flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ip-score{font-family:var(--font-num);font-weight:800;font-size:14px;color:var(--txt);font-variant-numeric:tabular-nums}
.ip-clock{font-size:11.5px;color:var(--mut);margin-left:5px}
/* Stated once per game, in the header, at the weight of a caveat rather than a headline. */
.ip-noodds{font-size:11.5px;color:var(--mut);font-style:italic}
.ip-n{font-family:var(--font-num);font-size:11px;font-weight:800;color:var(--txt);
  background:rgba(255,255,255,.07);padding:1px 7px;border-radius:99px}
.ip-legs{border-top:1px solid var(--line2)}
.ip-leg{display:flex;align-items:center;gap:10px;padding:8px 13px;font-size:12.5px;
  border-top:1px solid rgba(255,255,255,.035)}
.ip-leg:first-child{border-top:0}
.ip-leg-s{flex:1;min-width:0;color:var(--txt);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ip-leg .ip-price{font-family:var(--font-num);font-weight:700;color:var(--txt);font-variant-numeric:tabular-nums}

/* ==========================================================================================================
   CHROME  ::  the frame you see on every screen
   ==========================================================================================================
   Three changes, each replacing a pattern that is generic rather than wrong.

   1. THE WORDMARK WAS GRADIENT TEXT. The craft floor bans it outright and it is one of the loudest
      generated-design tells there is. A wordmark should be a shape, not a fill effect. It is now set in
      the display face at heavy weight with wide tracking, in flat gold, with a drawn mark beside it.

   2. NAVIGATION WAS FIVE FLOATING PILLS. Separate rounded pills on a dark field is the default every dark
      UI arrives at, and it reads as five unrelated buttons rather than one control with five positions.
      It is now ONE segmented instrument switch: a single recessed housing, hairline dividers, and the
      active position lit from within. You are moving a selector, not pressing unrelated buttons.

   3. THE HEADER FLOATED IN THE MIDDLE OF THE PAGE. Full bleed now, with a hairline rule and the content
      still held to the reading column. An instrument's chrome meets the edges of its case. */

/* Full bleed header, hairline rule, no gold tint on the border. */
header{
  background:linear-gradient(180deg,rgba(7,10,17,.92),rgba(5,7,12,.86)) !important;
  border-bottom:1px solid var(--line) !important;
  box-shadow:0 1px 0 rgba(255,255,255,.03), 0 18px 40px -30px rgba(0,0,0,.9) !important}

/* WORDMARK: a shape, not a fill. Flat gold, display face, wide tracking, with a hairline keyline mark. */
.brand{
  background:none !important; -webkit-background-clip:initial !important; background-clip:initial !important;
  color:var(--gold) !important; -webkit-text-fill-color:var(--gold) !important;
  font-family:var(--font-display); font-weight:700; font-size:19px; letter-spacing:.20em;
  text-transform:uppercase; display:inline-flex; align-items:center; gap:9px}
.brand::before{
  content:''; width:16px; height:16px; flex:none; border-radius:3px;
  border:1.5px solid var(--gold); box-shadow:inset 0 0 0 2.5px var(--bg), 0 0 0 1px rgba(var(--gold-rgb),.18)}
.brand small{
  -webkit-text-fill-color:var(--mut) !important; color:var(--mut) !important;
  font-family:var(--font-ui); letter-spacing:.04em; font-size:11px; text-transform:none}

/* NAV: one housing, five positions. Recessed, hairline-divided, the live one lit from inside. */
.navwrap,.navrow,.bar>.navs{display:inline-flex}
.navg{
  border-radius:0 !important;
  padding:8px 15px !important;
  border-left:1px solid var(--line);
  background:transparent !important;
  box-shadow:none !important;
  font-family:var(--font-display); font-stretch:92%; font-weight:600; letter-spacing:.02em}
.navg:first-child{border-left:0}
.navg.on{
  color:var(--gold) !important;
  background:linear-gradient(180deg,rgba(var(--gold-rgb),.14),rgba(var(--gold-rgb),.05)) !important;
  box-shadow:inset 0 1px 0 rgba(var(--gold-rgb),.22), inset 0 -2px 0 var(--gold) !important}
/* The housing itself. Applied to whatever element wraps the group, matched loosely so markup can vary. */
.bar>div:has(> .navg){
  display:inline-flex; border:1px solid var(--line); border-radius:var(--r2);
  background:rgba(0,0,0,.28); box-shadow:inset 0 1px 2px rgba(0,0,0,.5); overflow:hidden}

/* SUB NAV: reads as a filter rail under the switch, not a second row of buttons competing with it. */
.subnav{background:rgba(5,7,12,.90) !important;border-bottom:1px solid var(--line) !important}
.subtab{
  border-radius:var(--r1) !important;
  background:transparent !important;
  border:1px solid transparent !important;
  font-family:var(--font-display); font-stretch:94%; letter-spacing:.015em}
.subtab:hover{background:rgba(255,255,255,.035) !important;border-color:var(--line) !important}
.subtab.on{
  color:var(--gold) !important; background:rgba(var(--gold-rgb),.10) !important;
  border-color:rgba(var(--gold-rgb),.30) !important; box-shadow:none !important}

/* LIGHT THEME. Killing the gradient globally is right (a wordmark is a shape, not a fill), but #ffd166 on
   a near-white page fails contrast badly. Light mode gets a deepened gold that still reads as the same
   brand colour and clears 4.5:1 against the paper. */
body.theme-light .brand{color:#8a5a00 !important;-webkit-text-fill-color:#8a5a00 !important}
body.theme-light .brand::before{border-color:#8a5a00;box-shadow:inset 0 0 0 2.5px #fff,0 0 0 1px rgba(138,90,0,.18)}
body.theme-light .navg.on{
  color:#8a5a00 !important;
  background:linear-gradient(180deg,rgba(138,90,0,.10),rgba(138,90,0,.04)) !important;
  box-shadow:inset 0 -2px 0 #8a5a00 !important}
body.theme-light .subtab.on{color:#8a5a00 !important;background:rgba(138,90,0,.09) !important;
  border-color:rgba(138,90,0,.28) !important}
body.theme-light .bar>div:has(> .navg){background:rgba(0,0,0,.04);box-shadow:inset 0 1px 2px rgba(0,0,0,.06)}

/* ==========================================================================================================
   THE BOARD  ::  rebuilt to the instrument language
   ==========================================================================================================
   The board carried FOUR nesting levels to reach 31 picks: sport group, league, game, market, pick. Every
   level was a <details> with the same visual weight, so the eye could not tell a sport from a market and
   the whole thing read as one indented list with five headers of chrome per bet.

   The rebuild does not remove levels, it RANKS them. Depth now maps to ELEVATION AND WEIGHT rather than to
   indentation, so you can see which level you are looking at without reading it:

     sport group   a quiet rail. A label, not a container. No box, no fill.
     league        a hairline header with a rule under it.
     GAME          the unit. A raised card with rim light and its own shadow. It is what a person actually
                   thinks in, so it is the only level that gets a surface.
     market        a divider inside the card, not another box.
     pick          a row on that surface, on the fixed columns.

   The gold left edge is reserved for OUR tracked picks and appears nowhere else, so the thing you came for
   is findable by colour before you read a word. */

/* Level 1: the sport group stops being a box. */
.sportgrp{border:0 !important;background:none !important;box-shadow:none !important;
  border-radius:0 !important;margin:0 0 6px !important;padding:0 !important}
.grphdr{
  background:none !important;border:0 !important;padding:14px 2px 6px !important;
  font-family:var(--font-display);font-stretch:92%;font-weight:700;font-size:12px;
  letter-spacing:.14em;text-transform:uppercase;color:var(--mut) !important;
  min-height:0 !important;box-shadow:none !important}

/* Level 2: the league is a hairline header, not a panel. */
.sport{border:0 !important;background:none !important;box-shadow:none !important;
  border-radius:0 !important;margin:0 0 4px !important}
.sporthdr{
  background:none !important;border:0 !important;border-bottom:1px solid var(--line) !important;
  padding:9px 2px !important;border-radius:0 !important;box-shadow:none !important}
.sportname{font-family:var(--font-display);font-stretch:92%;font-weight:700;font-size:13.5px;
  letter-spacing:.01em;color:var(--txt)}

/* Level 3: THE GAME. The only level that becomes a surface. */
.gamegrp{
  background:linear-gradient(180deg,var(--surf2),var(--surf)) !important;
  border:1px solid var(--line) !important;
  border-radius:var(--r2) !important;
  box-shadow:var(--e1),var(--rim) !important;
  margin:6px 0 !important;overflow:hidden}
.gamegrp[open]{box-shadow:var(--e2),var(--rim) !important;border-color:#252c40 !important}
.gamehdr{
  background:linear-gradient(180deg,rgba(255,255,255,.028),rgba(255,255,255,0)) !important;
  border:0 !important;padding:12px 14px !important;min-height:52px}
.gamegrp[open] .gamehdr{border-bottom:1px solid var(--line) !important}
.gt-a,.gt-h{font-family:var(--font-display);font-stretch:94%;font-weight:700;letter-spacing:.005em}
.gt-at{color:var(--mut);margin:0 6px;font-weight:400}

/* Level 4: the market is a divider, not another container. */
.subcat{border:0 !important;background:none !important;border-radius:0 !important;box-shadow:none !important}
.subhdr{
  background:none !important;border:0 !important;border-top:1px solid var(--line2) !important;
  padding:8px 14px !important;border-radius:0 !important;min-height:40px}
.subcat:first-of-type>.subhdr{border-top:0 !important}

/* Level 5: the pick. Flat row on the card, gold edge only when it is ours. */
.pick{
  background:none !important;border-top:1px solid rgba(255,255,255,.035) !important;
  border-left:2px solid transparent !important;padding:9px 14px !important}
.pick.tracked{border-left-color:var(--gold) !important;
  background:linear-gradient(90deg,rgba(var(--gold-rgb),.055),transparent 42%) !important}
.pick.unproven{background:none !important;opacity:.62}
.pick.unproven:hover{opacity:1}

/* Status and market chips in the display face so the game row reads as instrumentation. */
.gst{font-family:var(--font-display);font-stretch:90%;font-weight:700;letter-spacing:.06em}
.gc{font-family:var(--font-display);font-stretch:90%;letter-spacing:.03em}

/* ==========================================================================================================
   SHARED COMPONENTS  ::  the layer every tab inherits
   ==========================================================================================================
   Applied globally rather than per tab, so a surface nobody has touched still arrives in the new language.
   These are the pieces that appear on every screen: tables, panels, inputs, buttons, badges. */

/* TABLES. This product is mostly tables pretending to be lists, so they get instrument treatment: figures
   monospaced and right aligned so decimals stack, headers quiet and lettered, rules hairline. A ruled box
   around every cell is a spreadsheet; a rule under every row is a ledger. */
table{font-variant-numeric:tabular-nums}
th{
  font-family:var(--font-display);font-stretch:92%;font-weight:700 !important;
  font-size:11.5px !important;letter-spacing:.10em !important;color:var(--mut) !important;
  border-bottom:1px solid var(--line) !important;padding:9px 10px !important;
  position:sticky;top:0;background:var(--surf);z-index:1}
td{border-bottom:1px solid var(--line2) !important;padding:9px 10px !important}
tr:last-child td{border-bottom:0 !important}
/* Numeric columns: monospace, right aligned, so a column of units reads as a column. */
td:not(:first-child),th:not(:first-child){text-align:right}
td:not(:first-child){font-family:var(--font-num);font-variant-numeric:tabular-nums}
@media(hover:hover){tbody tr:hover td{background:rgba(255,255,255,.022)}}

/* PANELS. Same elevation grammar as the game card, so a table and a board row feel like one product. */
.panel{
  background:linear-gradient(180deg,var(--surf2),var(--surf)) !important;
  border:1px solid var(--line) !important;border-radius:var(--r3) !important;
  box-shadow:var(--e1),var(--rim) !important;overflow:hidden}

/* INPUTS. Recessed rather than raised: a field is a hole you put something into, and that reads as depth
   inward. Focus lights the edge instead of drawing a second box around it. */
.tinput,.bq,input:not([type]),input[type=text],input[type=search],input[type=number],input[type=password],input[type=email],input[type=date],textarea,select{
  background:rgba(0,0,0,.30) !important;
  border:1px solid var(--line) !important;
  border-radius:var(--r1) !important;
  color:var(--txt) !important;
  box-shadow:inset 0 1px 2px rgba(0,0,0,.45) !important;
  font-family:var(--font-ui)}
.tinput:focus,.bq:focus,input:focus,textarea:focus,select:focus{
  outline:none !important;border-color:rgba(var(--gold-rgb),.42) !important;
  box-shadow:inset 0 1px 2px rgba(0,0,0,.45),0 0 0 3px rgba(var(--gold-rgb),.10) !important}
::placeholder{color:#5f6780;opacity:1}

/* BUTTONS. One primary treatment, gold, used for the single most likely action on a screen and nothing
   else. Everything else is a quiet outline, because a screen where six things shout has no primary. */
.btn{
  background:linear-gradient(180deg,rgba(255,255,255,.045),rgba(255,255,255,.012)) !important;
  border:1px solid var(--line) !important;border-radius:var(--r1) !important;
  color:var(--txt) !important;box-shadow:var(--e1),var(--rim) !important;
  font-family:var(--font-display);font-stretch:94%;font-weight:600;letter-spacing:.015em}
.btn.primary,.btn.gold,.ps-go,.addbig{
  background:linear-gradient(180deg,var(--gold),var(--gold2)) !important;
  border-color:rgba(var(--gold-rgb),.55) !important;color:#120d02 !important;font-weight:700 !important;
  box-shadow:0 1px 0 rgba(255,255,255,.25) inset,0 6px 18px -8px rgba(var(--gold-rgb),.45) !important}

/* BADGES. Lettered and quiet. A badge labels something, it does not compete with it. */
.badge{
  font-family:var(--font-display);font-stretch:90%;font-weight:700;letter-spacing:.06em;
  border-radius:5px;padding:2px 7px}

/* SEGMENTED CONTROLS everywhere inherit the nav's housing idea, so one interaction pattern reads the same
   in every context instead of four dialects of the same control. */
.segrp{display:inline-flex;border:1px solid var(--line);border-radius:var(--r2);
  background:rgba(0,0,0,.28);box-shadow:inset 0 1px 2px rgba(0,0,0,.45);overflow:hidden}
.segrp .segbtn{border-radius:0 !important;border:0 !important;border-left:1px solid var(--line) !important;
  background:transparent !important;box-shadow:none !important}
.segrp .segbtn:first-child{border-left:0 !important}
.segrp .segbtn.on{color:var(--gold) !important;
  background:linear-gradient(180deg,rgba(var(--gold-rgb),.13),rgba(var(--gold-rgb),.04)) !important;
  box-shadow:inset 0 -2px 0 var(--gold) !important}

/* TOASTS pick up the sheet elevation so transient surfaces match permanent ones. */
.toast{border-radius:var(--r2) !important;box-shadow:var(--e3),var(--rim) !important}








/* ---- INFINITE ANIMATIONS: PAUSED WHEN NOBODY IS LOOKING ---------------------------------------------
   There are 43 of them. Deleting them wholesale would be wrong, because they are not one thing:
     live indicators (.mz-live-dot, .livechip, .olive, .gc-livedot, .sc-live) carry STATE, a game is on;
     skeletons (.mz-skel, .wal-load) carry "loading", which is information;
     the .bd-* border effects are cosmetics users BOUGHT, so their whole value is that they move.
   What they share is that every one keeps a compositor layer busy forever, including in a background tab
   where nobody can see them. A tracker sits open in a tab all day, so this is the battery cost of the
   product. Pausing on hidden costs nothing visually and stops the work when it cannot be perceived. */
body.midas-idle *,body.midas-idle *::before,body.midas-idle *::after{
  animation-play-state:paused !important}






/* ---- EVENT PANEL: PANES, MOBILE FIRST ------------------------------------------------------------------
   Written unprefixed so it applies on PHONES, which is where this panel is actually read. The previous
   pass put its only layout work behind @media(min-width:760px) and shipped mobile unchanged, which is why
   "nothing changed" was a fair description of it. */
.evtabs{display:flex;gap:6px;position:static;padding:2px 0 10px;background:none}
.evtab{flex:1;min-height:40px;padding:9px 10px;border-radius:10px;border:1px solid var(--line);
  background:rgba(255,255,255,.02);color:var(--mut);font-size:12px;font-weight:700;cursor:pointer;
  display:inline-flex;align-items:center;justify-content:center;gap:6px;white-space:nowrap}
.evtab.on{color:var(--gold);border-color:rgba(var(--gold-rgb),.38);background:rgba(var(--gold-rgb),.10)}
.evtab-n{font-size:11.5px;font-weight:800;padding:1px 6px;border-radius:20px;
  background:rgba(255,255,255,.09);color:var(--txt);font-variant-numeric:tabular-nums}
.evtab.on .evtab-n{background:rgba(var(--gold-rgb),.20);color:var(--gold)}
.evpane[hidden]{display:none}

/* A pick is ONE LINE until you ask for more. This is what stops a 17-prop game being a wall of prose. */
.evpick-x>summary{list-style:none;cursor:pointer;min-height:44px;display:flex;align-items:center}
.evpick-x>summary::-webkit-details-marker{display:none}
.evpick-x>summary::after{content:'';flex:none;margin-left:8px;width:6px;height:6px;
  border-right:1.5px solid var(--mut);border-bottom:1.5px solid var(--mut);
  transform:rotate(45deg) translate(-2px,-2px);transition:transform 160ms cubic-bezier(0.23,1,0.32,1)}
.evpick-x[open]>summary::after{transform:rotate(225deg) translate(-2px,-2px)}
.evpick-h{display:flex;align-items:center;gap:8px;flex-wrap:wrap;min-width:0;flex:1}
.evpick-s{flex:1;min-width:0;font-size:13px;font-weight:700;color:var(--txt);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.evpick-r{font-size:12px;line-height:1.6;color:var(--mut);padding:2px 0 10px}
.evpick+.evpick,.evpick-x+.evpick-x,.evpick+.evpick-x,.evpick-x+.evpick{border-top:1px solid rgba(255,255,255,.05)}
@media(prefers-reduced-motion:reduce){.evpick-x>summary::after{transition:none}}

/* ---- MOTION BY FREQUENCY (Emil Kowalski's rule) ---------------------------------------------------------
   Animate by how often a thing is SEEN, not by how nice it looks once. Opening a game row is list
   navigation: it happens tens of times in a session, and at that frequency an animated disclosure stops
   reading as polish and starts reading as lag. Modals and sheets, seen occasionally, keep their motion.
   So the chevrons go instant here while .evfold (opened rarely) keeps its 180ms curve.

   What replaces it is FEEDBACK, which is a valid purpose: the row acknowledges the press immediately. A
   background flash rather than a scale, because scaling a full-width row looks like the layout broke. */
.grphdr::before,.sporthdr .chev,.gamehdr .chev,.subhdr .chev{transition:none}
@media(hover:hover) and (pointer:fine){
  .gamehdr:hover,.sporthdr:hover,.grphdr:hover{background:#1b2036}
}
.gamehdr:active,.sporthdr:active,.grphdr:active,.subhdr:active{background:#20263f}
/* Reduced motion means fewer/gentler, not zero: opacity and colour stay, movement goes. */
@media(prefers-reduced-motion:reduce){
  .evfold>summary::after,.evgrp>summary::after,.boardhow>summary::after{transition:none!important}
}

@media(min-width:760px){
  /* chev | matchup | status | time | markets | count/result | Details */
  /* THE COUNT TRACK HAS TO FIT THE COUNT. It was a flat 92px while .gmeta is white-space:nowrap, and a
     fully ungraded game reads "32 bets · 32 no result" -- about 130px at 11px tabular. The text
     overflowed its track, and because it is justify-self:end the overflow spills LEFT, straight across the
     markets track: "F1 Total" landed on top of "7 bets · 7 no result" and rendered as "F17otals -7 no
     result". max-content sizes the track to the longest count and the 1fr matchup track gives up the room. */
  .gamehdr{display:grid;
    grid-template-columns:14px minmax(0,1fr) 78px 68px minmax(0,164px) minmax(92px,max-content) 74px;
    align-items:center;gap:10px}
  .gamehdr>.gname{min-width:0}
  .gamehdr>.gst{justify-self:start}
  .gamehdr>.gwhen{justify-self:end}
  /* min-width:0 IS THE WHOLE FIX AND overflow:hidden ALONE NEVER WAS. A grid item's automatic minimum size
     is its CONTENT size, so .gchips refused to shrink below the width of five chips and overflowed its
     164px track no matter what overflow said -- the chips drew straight across the count beside them and
     produced "F5 ML" struck through "18 bets". Widening the count track (done earlier) moved the collision
     without removing it, because the overflow was coming from this side. */
  /* justify-self:start WAS THE ACTUAL BUG, and neither overflow:hidden nor min-width:0 could beat it.
     A grid item defaults to justify-self:stretch, which sizes it to the TRACK. justify-self:start opts out
     of that and sizes it to its CONTENT -- so with five market chips the box rendered 243px wide inside a
     164px track and overflowed by 79px, straight across the count beside it. overflow:hidden clipped
     nothing because the box itself was 243px; min-width:0 permitted a shrink that nothing was asking for.
     Measured on the live page before the fix: track 164px, element width 243px, scrollWidth 245px,
     17px of overlap into .gmeta. Stretching it to the track is what makes overflow:hidden mean something. */
  .gamehdr>.gchips{overflow:hidden;flex-wrap:nowrap;justify-self:stretch;min-width:0;max-width:100%}
  /* margin-left:auto was doing the right-alignment under flex and fights the grid track. */
  .gamehdr>.gmeta,.gamehdr>.gres{margin-left:0;justify-self:end;text-align:right;min-width:0}
  .gamehdr>.evbtn{justify-self:end}
}
.evroofnote{font-size:11px;line-height:1.5;color:var(--mut);margin:-6px 0 12px;font-style:italic}

/* ---- PICK GROUPS: 17 props become "Player props 17", opened when you want them ---- */
.evgrp{border-top:1px solid rgba(255,255,255,.06);margin-top:8px}
.evgrp:first-of-type{border-top:0;margin-top:2px}
.evgrp>summary{cursor:pointer;list-style:none;display:flex;align-items:center;gap:8px;padding:8px 0;
  font-size:11px;font-weight:800;letter-spacing:.06em;text-transform:uppercase;color:var(--mut);
  min-height:38px;user-select:none}
.evgrp>summary::-webkit-details-marker{display:none}
.evgrp>summary::after{content:'';margin-left:auto;width:6px;height:6px;border-right:1.5px solid var(--mut);
  border-bottom:1.5px solid var(--mut);transform:rotate(45deg) translate(-2px,-2px);
  transition:transform 180ms cubic-bezier(0.23,1,0.32,1)}
.evgrp[open]>summary::after{transform:rotate(225deg) translate(-2px,-2px)}
.evgrp>summary:hover{color:var(--txt)}
.evgrpn{font-size:11px;font-weight:800;color:var(--txt);background:rgba(255,255,255,.07);
  padding:1px 7px;border-radius:20px;letter-spacing:0}

/* Folded context. summary::-webkit-details-marker is killed so the row reads as a line of type, not a widget. */
.evfold{border:1px solid var(--line);border-radius:11px;margin-bottom:8px;background:rgba(255,255,255,.015);
  overflow:hidden;transition:border-color .16s ease}
.evfold:hover{border-color:var(--line3)}
.evfold>summary{cursor:pointer;list-style:none;padding:11px 13px;display:flex;align-items:center;gap:9px;
  user-select:none;min-height:44px;box-sizing:border-box}
.evfold>summary::-webkit-details-marker{display:none}
.evfold>summary::after{content:'';margin-left:auto;flex:none;width:7px;height:7px;border-right:1.5px solid var(--mut);
  border-bottom:1.5px solid var(--mut);transform:rotate(45deg) translate(-2px,-2px);transition:transform .18s ease}
.evfold[open]>summary::after{transform:rotate(225deg) translate(-2px,-2px)}
.evfold[open]>summary{border-bottom:1px solid var(--line)}
.evfold>*:not(summary){padding:0 13px 12px}
.evfold>.evwx{padding-top:11px}

/* The summary line does the work of the closed panel: it must carry real information, not a count of rows. */
.evsum{margin-left:auto;font-size:11.5px;font-weight:600;color:var(--mut);white-space:nowrap;overflow:hidden;
  text-overflow:ellipsis;max-width:56%;font-variant-numeric:tabular-nums}
.evfold>summary>.evsum{margin-right:2px}
.evblk.evlead .evsum{color:rgba(var(--gold-rgb),.72)}

/* A pick reads as a unit: side and price on one line, the written case under it. */
.evpick-trk{border-left:2px solid var(--gold);padding-left:10px}
.evpick-p{font-size:13px;font-weight:800;color:var(--txt);font-variant-numeric:tabular-nums;white-space:nowrap}
.evpick-b{font-size:11.5px;font-weight:600;color:var(--mut);margin-left:5px;text-transform:uppercase;letter-spacing:.03em}
.evpick-nb{font-size:11px;font-weight:800;letter-spacing:.05em;text-transform:uppercase;padding:2px 6px;border-radius:4px;
  background:rgba(var(--push-rgb),.16);color:#9fa8bd;white-space:nowrap}
@media(max-width:560px){
  .evsum{max-width:44%}
  .evfold>summary{padding:12px 12px}
}

body.theme-light{
  --bg:#f5f6fb;--surf:#ffffff;--surf2:#f0f2f9;--line:#e2e6f0;--line2:#eceff7;
  --txt:#12151f;--mut:#5a6078;--gold:#b8860b;--gold2:#a9760a;
  --good:#0f8a52;--bad:#d13b53;--gold-dim:#8a6a12;--ice2:#0f6f9e}
body.theme-light{background:
  radial-gradient(1000px 520px at 8% -10%,rgba(255,193,7,.10),transparent 60%),
  radial-gradient(1100px 640px at 102% -4%,rgba(16,150,90,.07),transparent 55%),var(--bg);
  color:var(--txt)}
body.theme-light ::selection{background:rgba(184,134,11,.24);color:#12151f}
body.theme-light ::-webkit-scrollbar-thumb{background:#c9cfe0;border:2px solid var(--bg)}
body.theme-light header{background:rgba(255,255,255,.82);border-bottom:1px solid rgba(184,134,11,.20);box-shadow:0 10px 30px -24px rgba(30,40,80,.5)}
body.theme-light .brand{background:linear-gradient(120deg,#a9760a,#c9920f 45%,#e0a112);-webkit-background-clip:text;background-clip:text;color:transparent}
body.theme-light .navg.on{background:rgba(184,134,11,.12)}
body.theme-light h2{color:#3a4a6a}
body.theme-light .subnav{background:rgba(245,246,251,.92);border-bottom:1px solid var(--line)}
body.theme-light .subtab{background:var(--surf2);border-color:var(--line2);color:var(--mut)}
body.theme-light .subtab:hover{color:var(--txt);border-color:var(--line)}
body.theme-light .subtab.on{background:var(--gold);border-color:var(--gold);color:#fff}
body.theme-light .subadd{color:#fff;background:linear-gradient(120deg,var(--gold),var(--gold2));border-color:var(--gold)}
body.theme-light .botnav{background:rgba(255,255,255,.94);border-top:1px solid rgba(184,134,11,.18);box-shadow:0 -8px 26px -18px rgba(30,40,80,.4)}
body.theme-light .seghead,body.theme-light .trk-lbl,body.theme-light .zoo-cat{background:rgba(245,246,251,.94)}
body.theme-light .card{background:linear-gradient(165deg,#ffffff,#f4f6fc);border-color:var(--line);box-shadow:inset 0 1px 0 rgba(255,255,255,.7),0 1px 2px rgba(30,40,80,.04)}
body.theme-light .card:hover{border-color:#cfd6ea;box-shadow:0 16px 34px -26px rgba(30,40,80,.35)}
body.theme-light .grid-primary .card{border-color:#d5dbec;background:linear-gradient(165deg,#ffffff,#eef1fa)}
body.theme-light .card.hero{background:linear-gradient(135deg,#f2f5ff,#e8ecfa);border-color:rgba(15,138,82,.35)}
body.theme-light .panel{background:var(--surf);border-color:var(--line)}
body.theme-light th,body.theme-light td{border-bottom:1px solid var(--line2)}
body.theme-light tr:hover td{background:#f2f4fb}
body.theme-light .chip{background:var(--surf);border-color:var(--line);color:#3a4a6a}
body.theme-light .chip.on{background:var(--gold);color:#fff;border-color:var(--gold)}
body.theme-light .segrp{background:#eef1f8;border-color:var(--line)}
body.theme-light .segbtn{color:#5a6078}
body.theme-light .segbtn:hover{color:#12151f}
body.theme-light .segbtn.on{background:var(--gold);color:#fff}
body.theme-light input[type=text],body.theme-light input[type=number],body.theme-light input[type=password],body.theme-light input[type=search],body.theme-light input:not([type]),body.theme-light textarea,body.theme-light #q,body.theme-light .tinput,body.theme-light .tsel,body.theme-light .loginbox input,body.theme-light #chat-text,body.theme-light .tsearch input,body.theme-light .pb-form input,body.theme-light .pe-stakerow input,body.theme-light .rm-in input,body.theme-light .oddssearch,body.theme-light select{background:#ffffff;border-color:var(--line);color:var(--txt)}
body.theme-light input::placeholder,body.theme-light textarea::placeholder{color:#9aa1b8}
body.theme-light input:focus,body.theme-light textarea:focus,body.theme-light select:focus,body.theme-light .tinput:focus,body.theme-light .tsel:focus{border-color:var(--gold);box-shadow:0 0 0 3px rgba(184,134,11,.15)}
body.theme-light .btn,body.theme-light .loginbox button,body.theme-light .pe-go,body.theme-light .lp-cta,body.theme-light .addfab{background:linear-gradient(135deg,#e0a112,#c9920f);color:#fff}
body.theme-light .btn.ghost,body.theme-light .lp-ghost{background:transparent;border-color:var(--line);color:var(--txt)}
body.theme-light .so-btn,body.theme-light .rm-rb{background:var(--surf2);border-color:var(--line);color:var(--txt)}
body.theme-light .mini{background:#eef2fb;border-color:#d3ddf2;color:#33518c}
body.theme-light .calnav button{background:var(--surf);border-color:var(--line);color:var(--txt)}
body.theme-light .sportgrp,body.theme-light .osportgrp{background:#f7f9fe;border-color:#dde3f1}
body.theme-light .grphdr,body.theme-light .osgrp-hdr{background:linear-gradient(90deg,#eef2fb,#f6f8fe)}
body.theme-light .grpname,body.theme-light .osgrp-name{color:#1c2a44}
body.theme-light .sport,body.theme-light .game{background:#ffffff;border-color:var(--line)}
body.theme-light .sporthdr{background:linear-gradient(90deg,#f0f3fb,#f7f9fe)}
body.theme-light .subhdr,body.theme-light .gamehdr{background:#f2f4fb}
body.theme-light .pick{border-top:1px solid var(--line2);border-left:3px solid #b7c0dc;background:#fbfcfe}
body.theme-light .pick.win{border-left-color:#0f8a52;background:#eef8f2}
body.theme-light .pick.loss{border-left-color:#d13b53;background:#fdf0f2}
body.theme-light .reason{border-top:1px dashed var(--line);color:#3d4560}
body.theme-light .ctxline,body.theme-light .setl,body.theme-light .gc-sit{background:#eef4fc;border-color:#d6e2f2;color:#3d4d70}
body.theme-light .cal-day{border-color:#dde3f1}
body.theme-light .cal-green{background:#e5f5ec}
body.theme-light .cal-red{background:#fbeaed}
body.theme-light .cal-flat{background:#eef1f8}
body.theme-light .cal-g1{background:#e3f6ea}body.theme-light .cal-g2{background:#c3ecd2}body.theme-light .cal-g3{background:#96deb1}
body.theme-light .cal-r1{background:#fce8ec}body.theme-light .cal-r2{background:#f7ccd4}body.theme-light .cal-r3{background:#efa8b5}
body.theme-light .port,body.theme-light .bankhero{background:radial-gradient(700px 240px at 6% -34%,rgba(184,134,11,.10),transparent 62%),linear-gradient(160deg,#ffffff,#eef1fa);border-color:#d9dfef;box-shadow:0 26px 60px -44px rgba(30,40,80,.4)}
body.theme-light .bankhero.sim{background:radial-gradient(700px 240px at 6% -34%,rgba(20,140,190,.12),transparent 62%),linear-gradient(160deg,#ffffff,#e9f4fb)}
body.theme-light .port-label,body.theme-light .bankhero .bk-lab{color:#9a7d2f}
body.theme-light .port-big.pos,body.theme-light .bankhero .bk-big.pos{background:linear-gradient(120deg,#12a866,#0c7a49);-webkit-background-clip:text;background-clip:text;color:transparent}
body.theme-light .port-big.neg,body.theme-light .bankhero .bk-big.neg{background:linear-gradient(120deg,#e0596e,#c22f47);-webkit-background-clip:text;background-clip:text;color:transparent}
body.theme-light .trackrow{border-top:1px solid var(--line2)}
body.theme-light .trackrow.locked{background:#f4f6fc;border-color:#dde3f1}
body.theme-light .daygrp{background:var(--surf);border-color:var(--line)}
body.theme-light .dayhdr,body.theme-light .bd-hdr{background:#eef2fb}
body.theme-light .badge{background:#e7eaf4;color:#3d4560}
body.theme-light .badge.shop{background:#e0f3e7;color:#0f7a48}
body.theme-light .badge.res-w,body.theme-light .legchip.lw,body.theme-light .lp-res.w{background:#dff2e7;color:#0d7a47}
body.theme-light .badge.res-l,body.theme-light .legchip.ll,body.theme-light .lp-res.l{background:#fbe3e7;color:#c22f47}
body.theme-light .livechip,body.theme-light .tmg-live,body.theme-light .vbadge.vlive,body.theme-light .sc-live{background:#fbe3e7;color:#c22f47;border-color:#f0bcc5}
body.theme-light .dw-dia,body.theme-light .dw-bal{background:#e0f2fb;color:#0d6a9a;border-color:#a9d8ef}
body.theme-light .dw-coin{background:rgba(184,134,11,.12);color:#9a7d2f;border-color:rgba(184,134,11,.3)}
body.theme-light .rc-card,body.theme-light .rc-kpi,body.theme-light .rc-mkt,body.theme-light .zoo-st,body.theme-light .pf-st,body.theme-light .sim-mkt,body.theme-light .sc-card,body.theme-light .locker,body.theme-light .learn-card,body.theme-light .pg-ladder{background:var(--surf);border-color:var(--line)}
body.theme-light .zoo-card{background:linear-gradient(165deg,#ffffff,#f4f6fc);border-color:var(--line)}
body.theme-light .zoo-ava{background:#eef2fb;border-color:#d6def0}
body.theme-light .zoo-nm{color:#1c2a44}
body.theme-light .zoo-follow.on{background:var(--gold);color:#fff}
body.theme-light .orow,body.theme-light .ogame,body.theme-light .pe-prop{background:linear-gradient(165deg,#ffffff,#f4f6fc);border-color:#dde3f1}
body.theme-light .oaway,body.theme-light .ohome,body.theme-light .og-tm,body.theme-light .pe-gmu,body.theme-light .pe-pname,body.theme-light .sc-nm{color:#1c2a44}
body.theme-light .obtn,body.theme-light .pe-ob,body.theme-light .pe-ub,body.theme-light .m-opt{background:#eef2fb;border-color:#cfd9ef;color:#25467e}
body.theme-light .obtn:hover{background:#dde8fb;border-color:#7fa4de}
body.theme-light .pe-ob.on,body.theme-light .m-opt.on{background:#dff2e7;border-color:#35a06a;color:#0d7a47}
body.theme-light .pe-ub.on{background:#fdf1dc;border-color:#d99a1e;color:#8a6a12}
body.theme-light .pe-game,body.theme-light .pe-entry,body.theme-light .m-card,body.theme-light .compete-card{background:linear-gradient(180deg,#ffffff,#f5f7fd);border-color:#dde3f1}
body.theme-light .pe-slip-in,body.theme-light .obetsheet,body.theme-light .moresheet{background:linear-gradient(180deg,#ffffff,#f4f6fc);border-color:#d9dfef}
body.theme-light .sheet-grip{background:#c3cadd}
body.theme-light .pe-topbar .pe-freepill{background:#e0f2fb;border-color:#a9d8ef;color:#0d6a9a}
body.theme-light .layer{background:linear-gradient(165deg,#ffffff,#f4f6fc);border-color:var(--line)}
body.theme-light .bcard{background:linear-gradient(165deg,#eefaf5,#f4fbf8);border-color:#bfe6d5}
body.theme-light .pg-hero{background:linear-gradient(150deg,#f2effc,#eef1fb);border-color:#d9d3ef}
body.theme-light .pg-lvl{color:#1c2a44}
body.theme-light .pg-xpbar,body.theme-light .pg-st,body.theme-light .pg-ach{background:#f0f2f9;border-color:var(--line)}
body.theme-light .pg-tier{background:var(--surf2);border-color:var(--line2)}
body.theme-light .pg-tier.got{border-color:rgba(184,134,11,.45);background:rgba(184,134,11,.08)}
body.theme-light .gcbox{background:linear-gradient(180deg,#ffffff,#f4f6fc);border-color:var(--line);box-shadow:0 30px 70px -30px rgba(30,40,80,.4)}
body.theme-light .gc-wp,body.theme-light .gc-subtabs{background:#f4f6fc;border-color:var(--line)}
body.theme-light .gcbtn{color:#5a6078}
body.theme-light .gcbtn.on{background:var(--gold);color:#fff}
body.theme-light .gc-play,body.theme-light .gc-box td{border-bottom:1px solid var(--line2)}
body.theme-light .rm-list,body.theme-light .rm-row{border-color:var(--line);border-bottom-color:var(--line2)}
body.theme-light .rm-ride{background:#eef8f2;border-color:#a9dcc2}
body.theme-light #overlay,body.theme-light .shareopts{background:rgba(240,242,250,.86)}
body.theme-light .loginbox,body.theme-light .so-card,body.theme-light .wheelbox,body.theme-light .betbox,body.theme-light .tourbox{background:linear-gradient(160deg,#ffffff,#f2f4fc);border-color:var(--line);box-shadow:0 24px 64px -30px rgba(30,40,80,.4)}
body.theme-light .so-x{background:#1a1a1a;border-color:#1a1a1a;color:#fff}
body.theme-light .glosspop{background:#ffffff;border-color:#d9dfef;color:#1c2a44;box-shadow:0 16px 40px -18px rgba(30,40,80,.4)}
body.theme-light .gq{color:#0d6a9a;background:rgba(20,140,190,.14)}
body.theme-light #winrx{background:radial-gradient(900px 500px at 50% 30%,rgba(184,134,11,.10),transparent 70%),rgba(240,242,250,.92)}
body.theme-light .wrx-card{background:linear-gradient(160deg,#ffffff,#f2f4fc);border-color:var(--line);box-shadow:0 24px 64px -30px rgba(30,40,80,.4),0 0 0 1px rgba(184,134,11,.14) inset}
body.theme-light .wrx-profit{color:#c9920f;text-shadow:none}
body.theme-light .wrx-kick{color:#0d7a47}
body.theme-light .toast{background:#dff2e7;color:#0d7a47;border-color:#a9dcc2}
body.theme-light .sliperr{background:#fbe3e7;border-color:#f0bcc5;color:#c22f47}
body.theme-light .slipbtn{background:linear-gradient(135deg,rgba(184,134,11,.14),rgba(184,134,11,.07));border-color:rgba(184,134,11,.4);color:#12151f}
body.theme-light .msg.me{background:#dce6fb;color:#1c2a44}
body.theme-light .msg.bot{background:#f0f2f9;border-color:var(--line)}
body.theme-light .who-me{background:rgba(18,21,31,.04);border-color:var(--line)}
body.theme-light .who a,body.theme-light .who-lock{color:#2f56a8}
body.theme-light .who-ava{background:#c3cee6;color:#1c2a44}
body.theme-light .mz-skel{background:rgba(18,21,31,.06)}
body.theme-light .mz-skel::after{background:linear-gradient(90deg,transparent,rgba(255,255,255,.7),transparent)}
body.theme-light .livebubble{background:linear-gradient(135deg,#ffffff,#f2f4fc);border-color:rgba(184,134,11,.45);color:#a9760a;box-shadow:0 12px 30px -12px rgba(30,40,80,.35)}
body.theme-light .livebubble .lb-count{background:var(--gold);color:#fff}
body.theme-light .askbubble{color:#0d6a9a;border-color:rgba(20,140,190,.4)}
body.theme-light .lb-row{border-bottom:1px solid var(--line2)}
body.theme-light .pm-card,body.theme-light .setcard{background:var(--surf);border-color:var(--line)}
body.theme-light .pm-opt{background:var(--surf2);border-color:var(--line2);color:var(--txt)}
body.theme-light .pm-opt:hover{border-color:var(--gold);background:#ffffff}
body.theme-light .pm-add{background:#e2e6f0;color:var(--mut)}
body.theme-light .zeus-edge{background:linear-gradient(160deg,rgba(184,134,11,.08),rgba(240,242,250,.6));border-color:rgba(184,134,11,.28)}
body.theme-light .zeus-edge.ze-empty{background:var(--surf);border-color:var(--line)}
body.theme-light .ze-gap.up{background:#dff2e7;color:#0d7a47}
body.theme-light .ze-gap.down{background:#fbe3e7;color:#c22f47}
body.theme-light .morestat>summary{color:var(--mut)}
body.theme-light .unproven{background:#e7eaf4;color:#5a6078;border-color:#d3d8e8}
body.theme-light .trk-empty .te-cta{background:linear-gradient(120deg,#e0a112,#c9920f);color:#fff}
body.theme-light .te-alt{color:var(--mut)}
body.theme-light .pos,body.theme-light .lk-win b,body.theme-light .shadowline .pos{color:#0f8a52}
body.theme-light .neg,body.theme-light .rm,body.theme-light .shadowline .neg{color:#d13b53}
body.theme-light .lp-hdr{background:rgba(255,255,255,.85);border-bottom:1px solid rgba(184,134,11,.18)}
body.theme-light .lp-sub,body.theme-light .lp-fc p,body.theme-light .lp-panel p{color:#4a5170}
body.theme-light .lp-zc,body.theme-light .lp-slip,body.theme-light .lp-panel{background:linear-gradient(165deg,#ffffff,#f4f6fc);border-color:#d9dfef;box-shadow:0 40px 80px -50px rgba(30,40,80,.4)}
body.theme-light .lp-zrow,body.theme-light .lp-brow{border-bottom:1px solid var(--line2)}
body.theme-light .lp-res.p{background:#e3ebfb;color:#2f56a8}
body.theme-light .lp-list .ic{background:rgba(15,138,82,.14);color:#0d7a47}
body.theme-light .lp-sticky{background:rgba(255,255,255,.94);border-top:1px solid rgba(184,134,11,.2)}
body.theme-light .lp-cta{background:linear-gradient(135deg,#e0a112,#c9920f);color:#fff}
body.theme-light .lp-ghost{border-color:var(--line);color:var(--txt)}
/* ==========================================================================================
   MIDAS DENSITY PASS v2 — APPEND LAST, AFTER LIGHT_CSS.
   Everything is driven by the tokens in :root. To make the whole app looser or tighter,
   change --fs-3 and --s-3; nothing else needs to move.
   ========================================================================================== */

/* BATCHES 1-2 of the density pass: type scale, spacing/radius snap, de-nesting.
   Group order is the AUTHOR'S, not append order. 8 and 9 share 50 selectors and 9 must win on all
   of them (`.ob-best{padding:0}` beats `.ob-best{padding:2px 6px}`), so 8 is inserted ahead of 9
   rather than appended after it. Group 11 restates the 44px touch targets and the text floor and
   MUST stay last -- this whole block sits after them in source order and would otherwise undo them.
   Still held back: the column width, settled separately at 1040/1120 with the floating-control
   offsets recomputed to match. */

/* --- 1. TOKENS ---------------------------------------------------------------------------
   Eight type steps replacing 39 ad-hoc sizes; six spacing steps replacing 60+ padding pairs;
   four radii replacing 19. The point is not that 13px is better than 14px — it is that one
   scale makes the hierarchy legible, which is what "overwhelming" actually means. */
:root{
  --fs-0:10px; --fs-1:11px; --fs-2:12px; --fs-3:13px;
  --fs-4:14px; --fs-5:16px; --fs-6:18px; --fs-7:28px; --fs-page:20px;
  --lh-1:1.2;  --lh-2:1.35; --lh-3:1.5;
  --s-1:4px; --s-2:6px; --s-3:8px; --s-4:12px; --s-5:16px; --s-6:24px;
  --r-1:4px; --r-2:8px; --r-3:12px;
  --measure:1040px;   /* the ONE column width. See group 2. */
}

/* --- 3. BASE TYPE -------------------------------------------------------------------------
   14/1.55 gives a 21.7px line box on every row in the app. 13/1.4 gives 18.2px — a ~19%
   height cut across every list, table and card body, from one declaration.
   tabular-nums moves to the body because the two hand-maintained lists (L287, L617) already
   miss .b3d-u, .pf-bet-u, .decknet, .lbval, .bcnet, .lnet, .ob-o and .dh-big. */
body{
  font-size:var(--fs-3); line-height:1.4;
  font-variant-numeric:tabular-nums; font-feature-settings:"tnum" 1;
}
/* prose keeps generous leading — this is the only place 1.5 is right */
.reason,.rb-note,.foot-disc,.setsub,.zoo-method,.zoo-intro,.rep-body,.ub-note,
.unv-note,.pe-empty,.rc-hero-s,.hero p,.cc-d,.ppl-bio,.pf-bio,.fd-text,.msg{
  line-height:var(--lh-3);
}
/* six line-heights collapse to one for chrome */
.pe-leg,.m-leg,.pml-steps,.pl-mstep,.gc-ptxt,.rm-row,.mq-text,.ip-mu,.fd-bet,
.pmk-q,.pmt-q,.pm-q,.pm-mq,.b3bet,.pe-pick{ line-height:var(--lh-2) }

/* --- 4. ONE HERO NUMBER --------------------------------------------------------------------
   Seven hero sizes (56/46/46/42/40/40/34) meant every tab opened with a different-sized
   headline. One size, one weight, one tracking. 28px still reads as the biggest thing on the
   page when everything around it is 13px — that is the whole trick. */
.port-big,.bankhero .bk-big,.dh-big,.cmb-hero-v,.rb-big{
  font-size:var(--fs-7); line-height:var(--lh-1); letter-spacing:-.02em; font-weight:800;
}
.port-big .u,.rb-big .u{ font-size:var(--fs-4); margin-left:2px }
.gc-sc{ font-size:22px; line-height:var(--lh-1); letter-spacing:-.01em }
.lu-lvl{ font-size:32px }   /* level-up modal is a moment, not a dashboard figure */
@media(max-width:430px){
  .port-big,.bankhero .bk-big,.dh-big,.cmb-hero-v,.rb-big{font-size:24px;letter-spacing:-.015em}
}

/* --- 5. ONE KPI SIZE -----------------------------------------------------------------------
   Eleven sizes (27/26/26/24/22/22/21/18/18/17) for "a number in a stat tile". */
.card .v,.grid-primary .v,.grid-sub .v,.pms .v,.pmk-c .v,.pf-sv,.zoo-st div:last-child,
.rc-kpi>div:last-child,.pl-hs .v,.zt-u,.cmb-rec,.pg-lvl,.ps-v,.b3odds,.b3par-odds,
.obs-odds,.spv b,.pmv-r,.ip-score,.sc-sco,.pg-stn,.bcnet,.lnet,.pe-opt-ev{
  font-size:var(--fs-6); line-height:var(--lh-1); font-weight:800; letter-spacing:-.01em;
}
.rb-mkt-u,.pf-bet-u,.decknet,.lbval,.hd-u,.b3d-u,.cald-btu,.cplay-u,.vs-v,.pmk-pnl{
  font-size:var(--fs-3); font-weight:800;
}

/* --- 6. HEADERS AND TITLES -----------------------------------------------------------------
   Ten sizes in the 15-26px band. Two survive: --fs-5 for section/group headers, --fs-page for
   the two real page titles. --s-6 is the only gap between sections, replacing 18/20/22/24/26. */
.seghead{ font-size:var(--fs-5); line-height:var(--lh-2); font-weight:700; margin:var(--s-6) 0 var(--s-3) }
h2,.grpname,.sportname,.osgrp-name,.zoo-cat-h,.pg-hd,.m-hd,.cc-t,.fabname,.cp-title,
.so-h,.gc-nm,.ck-hd,.loginbox h2,.rc-h,.pf-name,.pe-bot-n,.b3bet,.obs-pick{
  font-size:var(--fs-5); line-height:var(--lh-2); font-weight:700; margin-top:0;
}
h2{ margin:var(--s-6) 0 var(--s-3) }
.hero h1,.rc-hero-t{ font-size:var(--fs-page); line-height:var(--lh-1); letter-spacing:-.01em }
/* card / list-item leads */
.bcsport,.bcbt,.pe-gmu,.zoo-nm,.ppl-nm,.lname,.b3d-bet,.pmr-q,.tr-side,.pl-play,
.gmu,.play,.daydate,.bd-sp,.hd-date,.ovp-bet,.fd-att-b,.setlab,.mailfrom,.rep-who{
  font-size:var(--fs-4); line-height:var(--lh-2); font-weight:600;
}
/* the one section rhythm */
.zoo-cat,.setgrp,.ideabox,.pm-hero,.sc-league,.zoo-idlewrap,.ogrp,.ovp,.b3,.pf-full,
.gc-sec,.softfold,.breakfold,.port-chart,.trk-lbl{
  margin-top:var(--s-6); margin-bottom:var(--s-4);
}
section{ padding-top:var(--s-5) }

/* --- 7. LABELS AND MICRO TYPE --------------------------------------------------------------
   Small uppercase labels are what makes a financial UI readable: they are structure, not
   content, so they sit below the body size and above the noise floor. One size (11), one
   tracking (.06em). The 59 declarations below 10px all come up to 10. */
.card .k,.rb-lab,.ps-k,.pl-hs .k,.pms .k,.pmk-c .k,.pf-sk,.trk-lbl,.hb-title,.port-label,
.bankhero .bk-lab,.cmb-hero-l,.rb-sk,.bt3-h,.ovp-x-k,.pf-sech,.gc-sech,.lbhd,.setgrp,
.pmk-sec,.pml-poshd,.ref-hd,.setprev-h,.pe-mk,.b3lg,.b3par-l,.ub-lab,.panel h3,.tlab,
.spk,.zsl,.pg-cat,.m-cw,.oghdr,.claim-or,.ck-or,.as-or,.sheet-or,.pmcal-dayhd,.fd-pick-h,
.rep-hd,.pm-evmeta,.pm-chd,.og-hdr .og-c,.olbl,.sc-mk,.bd-lgcap,.pmo-h,.lc-h,.pe-boardhd,
th,.lbtable th,.rc-stat th,.gc-box th{
  font-size:var(--fs-1); line-height:var(--lh-1); letter-spacing:.06em; font-weight:700;
}
/* micro: badges, tags, res chips — a single floor at 10px */
.badge,.otag,.fd-badge,.fd-lvl,.fd-sp,.fd-ai,.fd-pend,.pf-lvl,.pf-bot,.crtag,.zc-live,
.zc-today,.zc-gsc,.zc-streak,.midaspx,.botpx-tag,.botpx-n,.pmr-v,.pmv-tag,.tmg,.srcb,
.livechip,.parlaytag,.beta-tag,.tbadge,.gapwarn,.xtag,.constag,.autog,.pmt-cons,.pmt-bt,
.pmk-tr,.mq-kind,.mq-v,.evp,.trk-score,.gm-score,.og-score,.ob-best,.ob-pm,.b3chip,.b3bots,
.hd-pend,.setauto,.pml-soon,.pml-ok,.unproven,.picksflag,.cc-soon,.cc-livetag,.ovp-midas,
.ovp-bot,.legchip,.sc-badge,.lb-livenow,.ip-src,.bctag,.zt-badge,.mst,.mtag,.pe-opt-tag,
.b3d-res,.pf-clvm,.oopen,.bt3-n,.pfc-u,.sh-desc,.bg-desc,.msg .nm{
  font-size:var(--fs-0); line-height:var(--lh-1);
}
/* meta / secondary — 11.5/12/12.5 all become 12 */
.gm,.book,.gmeta,.bcsub,.lsub,.fd-when,.hd-n,.hd-rec,.submeta,.sportmeta,.grpmeta,
.daymeta,.zoo-cat-sub,.rc-mc-d,.pe-gwhen,.ovp-sub,.b3par-sub,.rb-sub,.ps-s,.pf-when,
.fl-bio,.fl-rec,.ip-bet,.ip-gd,.pmk-meta,.pe-bot-sub,.pe-c-foot,.mq-reason,.rep-meta,
.pf-bt,.zt-sub,.cald-sm,.bd-lg-m,.bd-meta,.cal-n,.eng-n,.eng-note,.rb-mkt-b,.bt3-m,
.pmt-more,.pm-xc-side,.pm-hero-sub,.zoo-form,.pf-form,.pg-prog,.pg-axp,.sc-pend{
  font-size:var(--fs-2); line-height:var(--lh-2);
}
/* The league sub-line in the by-sport tree carries the record for a whole league and was nowrap, so on a
   phone it ran off the row. It has to be overridden HERE, after both its base rule and the line-height set
   directly above -- an earlier attempt sat 700 lines too high and lost to both. */
@media(max-width:560px){ .bd-lg-m{white-space:normal;line-height:1.35} }
/* CJK: uppercase tracking inserts visible gaps between ideographs */
:lang(zh) .card .k,:lang(zh) .rb-lab,:lang(zh) .b3lg,:lang(zh) .ub-lab,:lang(zh) .setgrp,
:lang(zh) .port-label,:lang(zh) .brand,:lang(zh) th,:lang(zh) .trk-lbl{ letter-spacing:0 }

/* --- 8. SPACING + RADIUS SNAP ---------------------------------------------------------------
   Nothing here changes a layout; it removes the 60+ near-identical padding pairs and the 19
   radii that make the page read as hand-assembled. 12px is the largest radius on any card:
   above that a box starts to look like a widget rather than a surface. */
.card,.panel,.zoo-card,.b3card,.bcard,.layer,.pm-card,.setcard,.rc-card,.pe-game,.ogame,
.daygrp,.sport,.sportgrp,.osportgrp,.game,.fabsec,.pg-hero,.pg-ladder,.m-card,.mailcol,
.rep-wrap,.pml-card,.histbars,.pfcal,.unitbox,.ideabox,.pmo-chart,.sc-card,.cmb-card,
.pm-pred,.pe-card,.pm-xc,.compete-card,.zt-card,.ppl-card,.dash-hero{
  border-radius:var(--r-3);
}
.hero,.port,.bankhero,.pl-hero,.realbox,.cmb-hero,.rc-hero,.pm-xhero,.gcbox,.loginbox,
.so-card,.chatpanel,.pe-slip-in,.obetsheet,.moresheet,.fd-pick-in{ border-radius:var(--r-3) }
.card,.zoo-card,.bcard,.layer,.pm-card,.rc-card,.b3card,.sc-card,.cmb-card,.pm-pred,
.pe-card,.pm-xc,.compete-card,.zt-card,.ppl-card,.pg-ach,.m-card{ padding:var(--s-3) var(--s-4) }
.panel,.setcard,.hero,.port,.bankhero,.pl-hero,.realbox,.cmb-hero,.rc-hero,.dash-hero,
.pm-xhero,.gcbox,.loginbox,.so-card,.pg-hero,.parsedbox{ padding:var(--s-4) var(--s-5) }
.port{ padding-bottom:var(--s-3) }
/* inner blocks and buttons */
.obtn,.pe-ob,.pe-ub,.m-opt,.pm-opt,.btn,.mini,.setbtn,.rc-mkt,.zgbtn,.so-btn,.pe-opt,
.rm-rb,.ps-go,.pf-obtn,.idea-send,.pm-more,.pm-evmore,.ub-clr,.b3tail,.gcbtn,.segbtn,
.pfcal-tab{ border-radius:var(--r-2) }
/* pills stay pills, badges get the smallest radius */
.badge,.otag,.fd-badge,.fd-lvl,.fd-sp,.zc-live,.zc-today,.zc-gsc,.midaspx,.botpx-tag,
.pmr-v,.pmv-tag,.tmg,.srcb,.livechip,.parlaytag,.beta-tag,.tbadge,.xtag,.b3chip,.b3bots,
.legchip,.sc-badge,.mst,.mtag,.trk-score,.gm-score,.og-score,.ob-best,.ob-pm,.pf-odds,
.pf-stk,.pf-gd,.pf-livesc,.fd-livesc,.zt-badge{ border-radius:var(--r-1); padding:2px var(--s-2) }
/* gaps: 1,2,3,5,7,9,10,11,14 all snap */
.grid,.bestgrid,.layers,.zoo-grid,.pm-grid,.pe-grid,.b3grid,.pl-method,.rc-modes,.rc-kpis,
.pf-stats,.zoo-stats,.pmstats,.pmsplit,.pmk-grid,.pg-grid,.pg-streaks,.compete-grid,
.ppl-grid,.sc-grid,.lbgrid,.cmb-grid,.pm-hero-grid,.pm-preds{ gap:var(--s-4) }
.filters,.trk-chips,.zoo-chiprow,.oddschips,.calfilter,.pe-topbar,.fd-acts,.tr-badges,
.pf-meta,.b3ev,.ovp-bots,.bcothers,.idlewrap,.pfcal-tabs,.setseg,.setfmt,.shoptabs,
.oddsstatus,.pmr-act,.zc-livescores,.oplays{ gap:var(--s-2) }
.sharerow,.pm-opts,.rb-mkts,.pf-types,.pmk-list,.pmt-list,.ip-list,.idea-list,.pe-legs,
.parlaylegs,.pleglist,.og-grid,.sc-lines{ gap:var(--s-1) }

/* --- 9. DE-NESTING. THE ACTUAL FIX. --------------------------------------------------------
   A bordered box inside a bordered box reads as two objects; three levels reads as noise. The
   sheet has three-level nests on its two densest screens and a five-level nest in the by-sport
   tree. Every rule below is duplicated for body.theme-light because the light theme re-declares
   these at 0,2,0 and would otherwise put the boxes straight back. */

/* 9a. Badges lose their outline, keep their tint. ~40 selectors, 2px of border around 9px of
   text each. Single highest-leverage rule in this file.
   Deliberately EXCLUDES .evp*, .vbadge, .pmk-tr and .mq-v — on those the border colour IS the
   status signal (live / upcoming / final / blocked), so removing it removes information. */
.badge,body.theme-light .badge,
.fd-lvl,.fd-sp,.fd-ai,.pf-lvl,.pf-odds,.pf-stk,.pf-gd,.pf-livesc,.fd-livesc,.zc-live,
.zc-today,.zc-gsc,.zc-streak,.midaspx,.botpx-tag,.pmr-v,.pmv-tag,.tmg,.srcb,.livechip,
.parlaytag,.beta-tag,.tbadge,.gapwarn,.xtag,.constag,.autog,.b3chip,.b3bots,.ob-best,
.ob-pm,.trk-score,.gm-score,.og-score,.hd-pend,.setauto,.pml-soon,.unproven,.picksflag,
.ovp-midas,.ovp-bot,.sc-badge,.lb-livenow,.zt-badge,.pf-sport,.pl-sport,.pe-edge,.pe-move,
body.theme-light .fd-lvl,body.theme-light .fd-sp,body.theme-light .pf-odds,
body.theme-light .pf-stk,body.theme-light .zc-live,body.theme-light .zc-today,
body.theme-light .b3chip,body.theme-light .b3bots,body.theme-light .ob-best{
  border-width:0;
}

/* 9b. Stat tiles inside cards. A Zoo card was carrying up to seven separately boxed children.
   The tiles become columns separated by a hairline instead of seven little cards. */
.zoo-st,body.theme-light .zoo-st,
.pf-st,body.theme-light .pf-st,
.rc-kpi,body.theme-light .rc-kpi,
.pms,.pmk-c,.pmv-card,.pg-st,.pg-tier{
  background:none; border-width:0 0 0 1px; border-radius:0;
  padding:var(--s-2) var(--s-3);
}
.zoo-stats>:first-child,.pf-stats>:first-child,.rc-kpis>:first-child,
.pmstats>:first-child,.pmk-grid>:first-child,.pg-streaks>:first-child{ border-left-width:0 }
.zoo-stats,.pf-stats,.rc-kpis,.pmstats,.pmk-grid,.pg-streaks{ gap:0 }

/* 9c. List rows stop being cards. Eight components independently re-implemented
   "border + radius:11-12px on a row inside a gap-ed column list". */
.ip-row,.pmk-row,.mq-row,.fl-row,.pmt-row,.pmrow,.pf-type,.pg-ach,.pe-entry,.m-match,
.ts-row,.pb-leg-row,.fd-attach,.fd-comp-att,.rc-hit,.ref-item,.mailrow,.rep-row,.lf-row,
body.theme-light .ip-row,body.theme-light .pmk-row,body.theme-light .fl-row,
body.theme-light .pf-type,body.theme-light .pg-ach{
  background:none; border-width:0 0 1px 0; border-radius:0;
  padding:var(--s-3) 0; margin-bottom:0;
}
.ip-row:last-child,.pmk-row:last-child,.mq-row:last-child,.fl-row:last-child,
.pmt-row:last-child,.pmrow:last-child,.pf-type:last-child,.pg-ach:last-child,
.pe-entry:last-child,.m-match:last-child,.rc-hit:last-child,.ref-item:last-child,
.rep-row:last-child,.lf-row:last-child{ border-bottom-width:0 }
.ip-list,.pmk-list,.pmt-list,.pmlist,.pf-types,.idea-list{ gap:0 }
.pmt-row{ padding-right:44px }   /* keeps clearance for the absolutely-positioned .tailbtn */

/* 9d. Frames around already-ruled content. A bordered wrapper around a table whose cells
   already carry border-bottom is a second box drawn over the first. */
.lbwrap,body.theme-light .lbwrap,
.ovp-list,.rc-hits,.ref-list,.rep-wrap,.mailcol,.rm-list,.b3d-rows{
  border-width:0; border-radius:0;
}
.b3d-h{ border-width:0 0 1px 0; border-radius:0; padding:var(--s-2) 0 }

/* 9e. Sixteen callout treatments become one: a left rule, no box. border-width (not border)
   so each keeps its own colour and the semantic tint survives; only the frame goes.
   The three genuinely-urgent ones keep their background. */
.ctxline,.altline,.settline,.setl,.learn-note,.ps-ev,.pml-note,.pml-safe,.ip-note,
.pmk-note,.rc-howto,.unv-note,.pmnote,.zoo-clvbar,.pf-clv,.pmt-sum,.fd-note,.rb-full,
body.theme-light .ctxline,body.theme-light .settline,body.theme-light .learn-note,
body.theme-light .pf-clv,body.theme-light .fd-note{
  background:none; border-width:0 0 0 2px; border-radius:0;
  padding:var(--s-2) 0 var(--s-2) var(--s-4); margin-bottom:var(--s-3);
}
.slipwarn,.mq-warn,.ps-corr,.fd-comp-err.bad{
  border-width:0 0 0 2px; border-radius:0; padding:var(--s-2) var(--s-4);
}

/* 9f. THE ODDS BOARD — the three-level nest. The .obtn border stays (it is a tap target and
   needs an affordance) but its radius drops and the best-price pill inside it becomes text.
   Same shape for Pick'em. */
.ogame,body.theme-light .ogame{ padding:var(--s-3) var(--s-4); border-radius:var(--r-3) }
.obtn,body.theme-light .obtn{ border-radius:var(--r-2); padding:var(--s-1) var(--s-1) }
.ob-best,.ob-pm{ background:none; border-width:0; padding:0; margin-top:1px }
.pe-game{ border-radius:var(--r-3) }
.pe-prop,body.theme-light .pe-prop{
  background:none; border-width:0 0 1px 0; border-radius:0; padding:var(--s-2) 0;
}
.pe-ob,.pe-ub{ border-radius:var(--r-1) }
.pe-game .pe-grid{ padding:0 var(--s-4) var(--s-3) }

/* 9g. Settings: setcard > setprev > spv, plus a bordered icon square and a bordered pill. */
.setprev,body.theme-light .setprev{ border-width:1px 0 0 0; border-radius:0; margin-top:var(--s-4) }
.seticon{ border-width:0; width:28px; height:28px; border-radius:var(--r-2) }
.setauto{ border-width:0 }

/* 9h. The Best-3 card — the conversion surface, and it had five boxed children. */
.b3n{ border-width:0 }
.b3u{ border-width:0; padding:2px var(--s-3) }
.b3card{ gap:var(--s-2); padding:var(--s-3) var(--s-4) }

/* 9i. The by-sport tree: five levels of box. .pick already sits inside .subcat inside .sport
   inside .sportgrp, so it does not also need a background and two borders of its own. */
.sportgrp,.osportgrp{ border-radius:var(--r-3) }
.sport{ border-radius:0; border-left-width:0; border-right-width:0 }
.pick{ background:none; border-top-width:1px; padding:var(--s-2) var(--s-4) }
.pick.win,.pick.loss,.pick.unproven{ background:none }
.altsum,body.theme-light .altsum{ background:none; border-width:0 0 0 2px; border-radius:0; margin:0 var(--s-4) }

/* 9j. Tracker: bordered box inside a bordered box under a bordered hero. */
.unitbox,body.theme-light .unitbox{
  background:none; border-width:1px 0 0 0; border-radius:0; padding:var(--s-4) 0 0;
}

/* 9k. StatCluster pills: hard heights become min-heights so the smaller type does not float. */
.sc-rec,.sc-u,.sc-roi{ height:auto; min-height:19px }
.sc{ gap:var(--s-2) }

/* --- 11. TOUCH GUARDS — MUST STAY LAST -------------------------------------------------------
   This block is appended after everything, which means the rules above would otherwise beat the
   coarse-pointer sizing at L3609-3677 and the text floor at L3621-3626. Restated verbatim so a
   density pass never silently shrinks a tap target or drops a label below the reading floor.
   Non-negotiable: 44px minimum on coarse pointers. */
@media(pointer:coarse){
  .subtab,.navg,.trk-chip,.fchip,.tailbtn,.fd-act,.sharebtn,.obtn,.rc-hit,
  .who-me,.sim-diachip,.ostat,.claimbub,.rm-chip,.livebubble,.fd-comp-b,.pf-tail1,
  .fd-comp-go,.pf-fc,.pe-leg,.pe-bot,.fd-comp,.pe-card,.rc-modecard,.mini,.rm-rb,
  .wrx-share,.pm-evmore,.b3tail,.ps-go{ min-height:44px }
  .hdr-gear,.setbtn,.dw-store,.pfcal-nav button,.who-lock,.idea-vote{ min-height:44px; min-width:44px }
  .chip,.calchip,.dh-chip,.zchip,.pe-chip,.segbtn,.shoptab,.shoptab2,.inv-tab,.m-opt,.vq-opt,
  .pmtail,.fd-tail,.sh-btn,.zoo-follow,.pf-followbtn,.pf-obtn,.ps-go,.gcbtn,.so-btn,.wl-btn,
  .obs-cancel,.lp-cta,.lp-ghost,.li-swap,.idea-send,.pe-slip-auto,.pe-slip-clr,.pe-slip-share,
  .ub-clr,.pm-more,.pm-evmore,.rc-mkt,.zgbtn,.av-cell,.pe-ob,.pe-ub{
    min-height:44px; padding-top:12px; padding-bottom:12px; align-content:center;
  }
  .ochip{ min-height:44px; padding:9px 14px; display:inline-flex; align-items:center }
  .sc-bet{ min-height:44px; padding:11px 14px; display:inline-flex; align-items:center }
  .fd-ava[onclick],.fd-ava[data-prof],.avwrap[onclick]{ min-width:44px; min-height:44px }
  /* TEXT FLOOR — these carry the date, the start time and every KPI label. Never below this. */
  .pdate,.pstart{ font-size:11.5px }
  .card .k{ font-size:11px; letter-spacing:.06em }
  .olbl,.ob-best,.sc-mk,.b3lg,.pe-mk{ font-size:11.5px }
  input[type=checkbox],input[type=radio]{ min-width:24px; min-height:24px }
  /* iOS zoom-on-focus guard already carries !important at L3526 — do not lower it here. */
}

/* ==============================================================================================
   DENSITY PASS — BATCH 3: mobile layout + per-language rules.
   Sits AFTER group 11 on purpose. Group 11 says "must stay last"; group 7 below overrides its chip
   sizing at <=640px and coarse pointer, replacing a 44px painted BOX with a 34px box plus a 44px
   invisible hit overlay. The touch guarantee is kept, the chrome is not. Do not "restore" group 11
   over this without also removing the ::after overlays, or the hit areas go with it.
   ============================================================================================== */

/* ══════════════════════════════════════════════════════════════════════════════════════════════════════
   MOBILE DENSITY + I18N HARDENING                                                    (appended last)
   Two problems, one block. (1) On a phone the chrome outweighs the data: a 296px-wide column carries a
   card border, a row border, a row background and a radius at three nesting levels. Kalshi's phone list
   is a hairline between rows and nothing else, and that is what "the boxes and bars are overtaking
   everything" is describing. (2) Every constrained row in this sheet is sized to an ENGLISH string, and
   the measured growth on the SHORT strings that live in those rows is +64% to +167%, not +25%.
   Tap targets stay >=44px throughout; where a row must LOOK 34px the hit area is restored with the
   invisible-overlay ::after already used for .gq / .lc-gc in the pointer:coarse block above.
   ══════════════════════════════════════════════════════════════════════════════════════════════════════ */


/* ── 1. THE HEADER WALLET ROW OVERFLOWS AT 320px TODAY, IN ENGLISH ────────────────────────────────────
   .dwallet is display:flex with no wrap; .segrp is inline-flex with no overflow; and .segrp>.segbtn is
   flex:0 0 auto + nowrap, so the children refuse to shrink inside the max-width:100% that header .dwallet
   .dw-toggle already sets. Two balance pills plus "Sportsbook | Prediction market | Shop" measure ~425px.
   The page is overflow-x:clip, so the Shop button is not merely off-screen -- it cannot be scrolled to.
   Spanish ("Mercado de predicción") and French ("Marché de prédiction") add ~25px on top.
   Fix = the pattern .subnav-in already uses: let the pill scroll inside itself. */
@media(max-width:768px){
  .dwallet{flex-wrap:wrap;max-width:100%}
  .segrp.dw-toggle{max-width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;
    scrollbar-width:none;overscroll-behavior-x:contain}
  .segrp.dw-toggle::-webkit-scrollbar{display:none}
  .segrp.dw-toggle>.segbtn{flex:0 0 auto}
}
@media(max-width:400px){
  .dw-toggle .segbtn{padding-left:10px;padding-right:10px;font-size:11.5px}
  .dw-bal{padding:5px 8px;font-size:12.5px}
}


/* ── 2. GRID TRACKS THAT SAY 1fr BUT MEAN minmax(auto,1fr) ────────────────────────────────────────────
   `1fr` resolves to minmax(auto,1fr), and `auto` = min-content. When the child of that track is
   white-space:nowrap + text-overflow:ellipsis, its min-content IS the full untruncated string -- so the
   ellipsis never engages and the ROW grows instead. .zsp-row is the worst case: 66+52+74+62 fixed +4
   gaps +28 padding = 314px of hard minimum against a 296px content box at 320px, before the name column
   asks for anything. This is a live English overflow, and DE table headers make it worse.
   minmax(0,1fr) is the correct spelling everywhere a track holds a truncating child. */
.zsp-head,.zsp-row{grid-template-columns:minmax(0,1fr) 66px 52px 74px 62px}
.og-row{grid-template-columns:minmax(90px,1.4fr) minmax(0,1fr) minmax(0,1fr) minmax(0,1fr)}
.lp-zrow{grid-template-columns:22px minmax(0,1fr) auto auto}
@media(max-width:430px){
  .zsp-head,.zsp-row{grid-template-columns:minmax(0,1fr) 52px 42px 56px 46px;gap:6px;padding-left:10px;padding-right:10px}
  .zsp-head{font-size:11.5px;letter-spacing:0}
  .lp-zrec{white-space:normal;line-height:1.3;text-align:right}
}


/* ── 3. HARD PIXEL WIDTHS ON TRANSLATED LABELS ────────────────────────────────────────────────────────
   Each of these reserves an English-sized box for a label: .m-lbl and .gc-per are `width:74px` with
   flex-shrink:0, which is ~10 Latin characters at 12px -- so a French or German label overflows into the
   control beside it with no ellipsis and no wrap. The same boxes are the reason Chinese looks sparse:
   a 2-glyph label sits in 74px with 50px of dead air after it. .hd-date (line 402) already solves this
   correctly with min-width:0;flex:1 at <=560; these are the ones that were missed. */
@media(max-width:768px){
  .m-lbl{width:auto;min-width:0;flex:0 0 auto}
  .gc-per{width:auto;min-width:52px}
  .eng-k{min-width:0}
  .cal-title{min-width:0;flex:1}
  .play,.trackrow .side{min-width:0}
  .pg-tier{min-width:0}
  .idea-ta{min-width:0}
  /* a 104px label track with a nowrap child is a guaranteed clip in any locale but English */
  .pm-vbar{grid-template-columns:minmax(0,max-content) minmax(0,1fr) auto}
  .pm-vbar-l{white-space:normal;line-height:1.25}
}
@media(max-width:430px){
  .rb-mkt-m,.vs-v,.cald-btu,.cplay-u,.lbn{min-width:0}
}


/* ── 4. STATUS PILLS: LET THE WORD WRAP RATHER THAN CLIP ──────────────────────────────────────────────
   These carry the words that grow MOST. "WON"->"GEWONNEN" is +167%; "CLOSING"->"BIENTÔT CLOS" is +71%.
   They are all white-space:nowrap and several are flex:none, so they cannot shrink and cannot wrap --
   the only remaining outcome is overflow. Allowing a break at the space costs one line of height in DE/FR
   and nothing at all in EN or ZH. Deliberately NOT overflow-wrap:anywhere: breaking GESCHLOSSEN mid-word
   is worse than a two-line pill. */
@media(max-width:768px){
  .badge,.tdp-pill,.pl-badge,.pm-conf,.pm-xc-edge,.lb-livetag,.lb-pendtag,
  .pmt-cons,.gapwarn,.tbadge,.legchip,.mst,.otag,.pmv-tag,.pmr-v,.srcb,.tmg{
    white-space:normal;line-height:1.25;max-width:100%;text-align:center;
    -webkit-hyphens:auto;hyphens:auto}
}
/* Fixed-square result chips. They hold one glyph today ("W"/"L"/"·", dashboard.py:6710/7730/7953) so
   nothing is broken -- but the day any of them is wired to t('bet.won') a 26px box has to hold GEWONNEN.
   min-width instead of width costs zero pixels now and makes that impossible later. */
.ip-res{width:auto;min-width:26px;padding:0 4px}
.cbadge,.fchip{width:auto;min-width:22px;padding:0 4px}


/* ── 5. KALSHI DENSITY, PART 1: THE CONTAINER AND THE HEADLINE NUMBERS ────────────────────────────────
   Base is 14px/1.55 with .wrap padding 18px (12px under 640). The complaint is not the type size, it is
   the ratio of chrome to content: a 24px KPI number in a 15px-radius card with 14/16px padding inside an
   11px gap grid inside 12px page padding leaves ~112px of actual content width at 320px. Kalshi's phone
   dashboard runs ~13px base, ~20px hero numbers and 10-11px padding. Nothing here goes below 11px on a
   label, and no interactive element is touched. */
@media(max-width:640px){
  body{font-size:13.5px;line-height:1.5}
  .card{padding:10px 11px;border-radius:12px}
  .card .v{font-size:20px}
  .grid-primary .v{font-size:22px}
  .grid-sub .card{padding:9px 10px}
  .grid-sub .v{font-size:16px}
  .card .sub{font-size:11.5px}
  .grid{gap:8px}
  .panel{padding:12px;border-radius:12px;margin-top:10px}
  .panel h3{font-size:12px;letter-spacing:.4px;margin-bottom:6px}
  section{padding-top:10px}
  h2{font-size:13.5px;margin:14px 0 6px}
  .hero{padding:14px;border-radius:13px;margin-bottom:10px}
  .hero h1{font-size:20px;letter-spacing:.4px}
  .port{padding:16px 15px 10px;border-radius:16px;margin-bottom:14px}
  .port-big{font-size:40px;letter-spacing:-1.4px;margin:4px 0 5px}
  .port-big .u{font-size:18px}
  .mkchart,.rc-card,.pg-ladder,.ideabox{padding:12px 13px;border-radius:12px}
  th,td{padding:7px 8px}
}
@media(max-width:430px){
  .wrap{padding-left:10px;padding-right:10px}
  .card .v{font-size:19px}
  .port-big{font-size:36px}
}


/* ── 6. KALSHI DENSITY, PART 2: LIST ROWS COLLAPSE TO HAIRLINES ───────────────────────────────────────
   This is the actual "boxes and bars are overtaking everything". Every one of these lists renders as a
   column of independently bordered, rounded, background-filled cards separated by a gap -- so a 10-row
   list draws 10 borders, 10 radii, 10 fills and 9 gaps. A phone list wants ONE hairline between rows and
   the container border doing the framing. This reclaims ~22px of horizontal room and roughly 90px of
   vertical scroll per 10 rows, changes no type size and touches no control.
   Result colour cues are preserved: .pl-r keeps its 3px left border, which is the whole point of the row. */
@media(max-width:640px){
  .pmlist,.ip-list,.pmt-list,.pm-preds{gap:0}
  .pmlist>.pmrow,
  .ip-list>.ip-row,
  .pmt-list>.pmt-row,
  .hd-row,
  .os-row,
  .m-match,
  .pg-ach{
    border:0;border-bottom:1px solid var(--line2);border-radius:0;background:transparent;
    box-shadow:none;margin:0;padding-left:2px;padding-right:2px}
  .pmlist>.pmrow:last-child,.ip-list>.ip-row:last-child,.pmt-list>.pmt-row:last-child{border-bottom:0}
  /* .pl-r and .trackrow.locked carry a LEFT border that encodes win/loss -- keep it, drop the rest. */
  .pl-r{border-top:0;border-right:0;border-bottom:1px solid var(--line2);border-radius:0;
    background:transparent;margin-bottom:0;padding:10px 2px 10px 10px}
  .trackrow.locked{border:0;border-bottom:1px solid var(--line2);border-radius:0;background:transparent;
    margin:0;padding:11px 2px}
  /* nested rounded borders: a .sportgrp inside a .panel inside .wrap draws three radii on a 296px column.
     .sportgrp>.sport is already flattened (line 2830-ish); .game and .subcat were not. */
  .game{border-left:0;border-right:0;border-radius:0;margin:0}
  .sport{border-left:0;border-right:0;border-radius:0}
  .lcard,.pe-card{border-radius:11px;padding:11px 12px}
}


/* ── 7. 34px ROWS AND CHIPS THAT STILL HAVE A 44px HIT AREA ────────────────────────────────────────────
   The pointer:coarse block above inflates every chip to a 44px BOX (min-height:44 + 12px vertical padding),
   which is right for accessibility and is the single biggest reason the UI reads as oversized: a filter row
   of eight 44px pills is 100px of chrome before any data. The fix is the pattern this sheet already uses
   for .gq / .tour-x / .lc-gc -- keep the pixels, grow only the TOUCH REGION via a centred invisible overlay.
   Verified collision-free: none of these classes defines ::after anywhere in the sheet.
   row-gap is raised to 12px so two stacked 44px overlays cannot overlap on a wrapped chip row (34px visual
   + 5px overhang each side needs >=10px of row gap; 12 gives margin). */
@media(pointer:coarse) and (max-width:640px){
  /* .parbtn, .evbtn and .subhdr joined this group on 2026-08-12. All three sit INSIDE a <summary>, which
     is the case where an undersized target is worse than a plain miss: the tap does not do nothing, it
     toggles the accordion instead. .parbtn is the sharpest -- a hard height:30px sitting 5px from the 44px
     .tailbtn, so a left-miss on "add to parlay" hits "add to your tracker" and logs a real bet. 168 of them
     ship. .evbtn is the Details button added earlier today at 32px, under a comment that explicitly said it
     must not be undersized for this exact reason; the comment was right and the value was not. */
  .chip,.calchip,.zchip,.subtab,.segbtn,.trk-chip,.mini,.btn.sm,.ochip,.rc-mkt,.shoptab,
  .parbtn,.evbtn{
    min-height:34px;padding-top:7px;padding-bottom:7px;position:relative}
  .parbtn{height:auto}   /* it sets a hard height:30px, which min-height alone cannot lift */
  .chip::after,.calchip::after,.zchip::after,.subtab::after,.segbtn::after,.trk-chip::after,
  .mini::after,.btn.sm::after,.ochip::after,.rc-mkt::after,.shoptab::after,
  .parbtn::after,.evbtn::after{
    content:'';position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);
    width:100%;min-width:44px;height:44px}
  /* .subhdr is a full-width row, so it needs real height rather than an overlay -- 39px measured, and it
     is the bet-type accordion, 166 instances. */
  .subhdr{min-height:44px}
  .filters,.trk-chips,.zoo-chiprow,.calfilter,.rc-mkts,.spbar,.sharerow,.tr-badges{row-gap:12px}
  /* the sub-nav strip is a single non-wrapping scroller, so it can go flat without any overlap risk */
  .subtab{min-height:34px}
}


/* ── 8. BOTTOM NAV: SURVIVE THE LONGEST LABEL WITHOUT SHIFTING THE ICONS ───────────────────────────────
   .bt is a centred flex column with min-height:62px and a 10.5px label. It ships English literals today
   (_GROUPS, dashboard.py:13134) but is the first thing that will be wired to t('nav.*'), and German turns
   "Board" into "Übersicht" (+80%) -- ~56px of text in a 64px cell at 320px. If ONE label wraps to two
   lines, that cell's icon moves up relative to its four neighbours, because each grid cell centres its own
   content. A fixed-height label box makes wrapping impossible, so the icon row can never break alignment.
   The cell is still 56x64 -- comfortably over 44px in both axes. */
@media(max-width:768px){
  .bt{min-height:56px;padding:9px 2px 8px;gap:4px}
  .bt .ti{width:21px;height:21px}
  .bt span{display:block;width:100%;height:12px;line-height:12px;font-size:11.5px;letter-spacing:.1px;
    text-align:center;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
}
@media(max-width:360px){ .bt span{font-size:11px;letter-spacing:0} }


/* ── 9. HEADER BRAND ROW AT 320px ──────────────────────────────────────────────────────────────────────
   .brand is 20px with 3px of letter-spacing (~70px for MIDAS alone), and in prediction-market mode
   .mkt-flag adds an uppercase pill that reads "Prediction market" in English and "Mercado de predicción"
   (21 chars) in Spanish, inside a .brandrow that is display:flex with no wrap. .bar does wrap, so this
   pushes the header taller rather than clipping -- and --hdr-h is recomputed by a ResizeObserver
   (dashboard.py:12362), so the sticky offsets follow correctly. It is a density cost, not a break. */
@media(max-width:430px){
  .brand{font-size:17px;letter-spacing:2px}
  .brandrow{flex-wrap:wrap}
  /* white-space:normal here is what wrapped the pill into a square on a phone. It stays on one line and
     hides below 400px instead, where the header has no room for it at all. */
  .mkt-flag{font-size:11px;letter-spacing:.3px;white-space:nowrap;padding:2px 7px;margin-left:6px}
  .bar{padding:9px 12px;gap:7px}
}

/* ══════════════════════════════════════════════════════════════════════════════════════════════════════
   PER-LANGUAGE RULES                                                     REQUIRES <html lang> — see above
   ══════════════════════════════════════════════════════════════════════════════════════════════════════ */

/* ── ZH-1. LETTER-SPACING IS A BUG IN HAN, NOT A STYLE ────────────────────────────────────────────────
   106 selectors set letter-spacing between .03em and 1.5px alongside text-transform:uppercase. On Latin
   that is an eyebrow. On Han, uppercase is a no-op and the tracking inserts a gap between EVERY GLYPH:
   已 结 算 instead of 已结算. At the 9-10px these labels use, it reads as a rendering fault.
   Every one of the 106 sets the property directly on the element, so inheritance cannot fix it -- a
   universal reset is the only single-line route, exactly as the pointer:coarse font-size:16px!important
   fix above reasoned. The MIDAS wordmark is Latin and is re-asserted straight after. */
:lang(zh) *{letter-spacing:normal!important}
:lang(zh) .brand{letter-spacing:2px!important}
:lang(zh) .lu-ttl{letter-spacing:.12em!important}

/* ── ZH-2. TYPE SIZE AND LEADING ──────────────────────────────────────────────────────────────────────
   Han needs more optical size than Latin at the same perceived weight -- a 10px Latin label is small,
   a 10px Han label is unreadable, because the strokes do not resolve. 12px is the practical floor on a
   2x phone screen. Leading goes from 1.55 to 1.75: Han glyphs are full-height boxes with no x-height
   relief, so Latin leading reads as cramped. The font stack is explicit because the current one
   (-apple-system, Segoe UI, Roboto) has no CJK coverage on Android or Windows, so Han falls through to
   whatever the system substitutes -- usually a different weight and metric than the numerals beside it. */
:lang(zh) body,:lang(zh){
  font-family:"PingFang SC","Hiragino Sans GB","Microsoft YaHei","Noto Sans CJK SC","Source Han Sans SC",
    -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;
  line-height:1.75}
:lang(zh) .card .k,:lang(zh) .pms .k,:lang(zh) .pl-hs .k,:lang(zh) .pmk-c .k,:lang(zh) .mk-lead .k,
:lang(zh) .b3rec-h .k,:lang(zh) th,:lang(zh) .lbtable th,:lang(zh) .gc-box th,:lang(zh) .rc-kpi .mut,
:lang(zh) .badge,:lang(zh) .tdp-pill,:lang(zh) .legchip,:lang(zh) .pl-badge,:lang(zh) .srcb,:lang(zh) .tmg,
:lang(zh) .olbl,:lang(zh) .otag,:lang(zh) .mst,:lang(zh) .pmt-bt,:lang(zh) .ip-src,:lang(zh) .zt-badge,
:lang(zh) .bctag,:lang(zh) .pmr-v,:lang(zh) .pmv-tag,:lang(zh) .fd-ai,:lang(zh) .fd-pend,:lang(zh) .unproven,
:lang(zh) .xtag,:lang(zh) .pg-tl,:lang(zh) .m-cw,:lang(zh) .cbt-n,:lang(zh) .spk,:lang(zh) .ub-lab,
:lang(zh) .rb-lab,:lang(zh) .ps-k,:lang(zh) .b3lg,:lang(zh) .b3par-l,:lang(zh) .settline .sl-k,
:lang(zh) .eng-k,:lang(zh) .ref-hd,:lang(zh) .pmo-h,:lang(zh) .pmk-sec,:lang(zh) .pf-sk,:lang(zh) .pf-sech,
:lang(zh) .os-sec,:lang(zh) .os-seglbl,:lang(zh) .lbhd,:lang(zh) .hb-title,:lang(zh) .claim-or,
:lang(zh) .fd-pick-h,:lang(zh) .pml-ok,:lang(zh) .pml-soon,:lang(zh) .mq-kind,:lang(zh) .mq-v,
:lang(zh) .cc-soon,:lang(zh) .cc-livetag,:lang(zh) .bg-desc,:lang(zh) .av-nm,:lang(zh) .zoo-st .mut{
  font-size:12px}
:lang(zh) .bt span{font-size:11px;height:14px;line-height:14px}
:lang(zh) .subtab,:lang(zh) .chip,:lang(zh) .calchip,:lang(zh) .zchip{font-size:13px}

/* ── ZH-3. THE SPARSE-LAYOUT PROBLEM ──────────────────────────────────────────────────────────────────
   Chinese strings measure ~40% of English. Every label box sized to an English string therefore holds a
   2-4 glyph word with 50-80px of dead air after it -- .eng-k is a 118px box holding ~40px of text. Block 1
   above already frees these below 768px; this repeats the release at ALL widths for zh, because the gap is
   a function of the STRING, not the viewport, and looks just as wrong on a tablet. */
:lang(zh) .eng-k{min-width:0}
:lang(zh) .m-lbl,:lang(zh) .gc-per{width:auto;min-width:0}
:lang(zh) .cal-title{min-width:0}
:lang(zh) .pg-tier{min-width:48px}
:lang(zh) .vs-v,:lang(zh) .rb-mkt-m{min-width:0}
:lang(zh) .zsp-head,:lang(zh) .zsp-row{grid-template-columns:minmax(0,1fr) 58px 46px 64px 54px}
:lang(zh) .pm-vbar{grid-template-columns:minmax(0,max-content) minmax(0,1fr) auto}

/* ── ZH-4. ORPHANED GLYPHS AND UNBREAKABLE RUNS ───────────────────────────────────────────────────────
   Two opposite failures. (a) A wrapped heading that leaves a SINGLE Han character alone on the last line
   reads as a typo rather than as a line break -- text-wrap:balance on short headings and :pretty on body
   copy both prevent it. (b) Han has no spaces, so a long unbroken run has no break opportunity at all and
   will push its row wide unless told it may break anywhere; line-break:strict then stops it breaking
   before punctuation that may not start a line. */
:lang(zh) h2,:lang(zh) .seghead,:lang(zh) .card .k,:lang(zh) .zt-name,:lang(zh) .rc-mc-n,
:lang(zh) .hero h1,:lang(zh) .te-h,:lang(zh) .pg-hd,:lang(zh) .m-hd{text-wrap:balance}
:lang(zh) p,:lang(zh) .port-sub,:lang(zh) .te-p,:lang(zh) .lp-sub,:lang(zh) .aggline,
:lang(zh) .rc-hero-s,:lang(zh) .reason,:lang(zh) .foot-disc,:lang(zh) .mk-head{text-wrap:pretty}
:lang(zh) .pmr-q,:lang(zh) .pm-q,:lang(zh) .pmt-q,:lang(zh) .tdp-desc,:lang(zh) .b3d-bet,
:lang(zh) .lb-rdesc,:lang(zh) .pl-play,:lang(zh) .tr-side{word-break:break-word;line-break:strict}

/* ── LATIN-LONG (fr/es/pt/de). +23% to +32% average, and +64% to +167% on the SHORT labels that sit in
   constrained rows. Two levers that do not touch the design:
   (1) hyphenation, which German compounds genuinely need and which is inert without a lang attribute --
       this is the concrete payoff of the applyLang()-on-boot fix;
   (2) the uppercase tracking, which multiplies against character COUNT: 1px of letter-spacing on a
       12-character German label is 12 free pixels of overflow. Dropping it to .3px on the micro-labels
       buys back most of the German growth at no legibility cost, because these are 800-weight already. */
:lang(de),:lang(fr),:lang(es),:lang(pt){-webkit-hyphens:auto;hyphens:auto}
@media(max-width:768px){
  :lang(de) .card .k,:lang(fr) .card .k,:lang(es) .card .k,:lang(pt) .card .k,
  :lang(de) th,:lang(fr) th,:lang(es) th,:lang(pt) th,
  :lang(de) .lbtable th,:lang(fr) .lbtable th,:lang(es) .lbtable th,:lang(pt) .lbtable th,
  :lang(de) .pl-hs .k,:lang(fr) .pl-hs .k,:lang(es) .pl-hs .k,:lang(pt) .pl-hs .k,
  :lang(de) .rc-kpi .mut,:lang(fr) .rc-kpi .mut,:lang(es) .rc-kpi .mut,:lang(pt) .rc-kpi .mut,
  :lang(de) .port-label,:lang(fr) .port-label,:lang(es) .port-label,:lang(pt) .port-label,
  :lang(de) .bankhero .bk-lab,:lang(fr) .bankhero .bk-lab,:lang(es) .bankhero .bk-lab,:lang(pt) .bankhero .bk-lab,
  :lang(de) .trk-lbl,:lang(fr) .trk-lbl,:lang(es) .trk-lbl,:lang(pt) .trk-lbl{letter-spacing:.3px}
  /* German compounds are the only strings long enough to need a mid-word break in a badge */
  :lang(de) .badge,:lang(de) .tdp-pill,:lang(de) .pl-badge{overflow-wrap:break-word}
}
/* German is the longest word-for-word: give the nav label one more pixel of room before it ellipses */
@media(max-width:400px){
  :lang(de) .bt span,:lang(fr) .bt span,:lang(es) .bt span,:lang(pt) .bt span{font-size:11px;letter-spacing:0}
}

/* ---- Track Record: day header > game group > pick row ---- */
.pl-dayh{display:flex;align-items:baseline;gap:10px;margin:20px 0 9px;padding-bottom:6px;
  border-bottom:1px solid var(--line)}
#pl-feed>.pl-dayh:first-child{margin-top:2px}
.pl-dd{font-family:var(--font-display);font-size:12.5px;font-weight:800;letter-spacing:.06em;
  text-transform:uppercase;color:var(--txt)}
.pl-dn{font-size:11.5px;color:var(--mut);font-variant-numeric:tabular-nums}
.pl-g{background:var(--surf);border:1px solid var(--line);border-radius:var(--r2);
  box-shadow:var(--e1),var(--rim);margin-bottom:9px;overflow:hidden}
.pl-gh{display:flex;align-items:center;flex-wrap:wrap;gap:8px;padding:9px 13px;
  background:var(--surf2);border-bottom:1px solid var(--line)}
.pl-gm{font-weight:700;font-size:13.5px;color:var(--txt)}
.pl-gsc{font-family:var(--font-num);font-size:11.5px;color:var(--gold);
  background:rgba(var(--gold-rgb),.09);border:1px solid rgba(var(--gold-rgb),.22);
  border-radius:var(--r1);padding:1px 7px}
.pl-gn{font-size:11.5px;color:var(--mut);font-variant-numeric:tabular-nums}
.pl-grec{font-family:var(--font-num);font-size:12px;color:var(--mut)}
.pl-grec b{font-weight:800}
.pl-grec .pos{color:var(--good)}
.pl-grec .neg{color:var(--bad)}
.pl-gpre{margin-left:auto;display:inline-flex;align-items:center;gap:4px;font-size:11px;color:var(--mut)}
.pl-gpre svg{width:12px;height:12px}
.pl-g .pl-r{background:transparent;border:0;border-left:3px solid transparent;
  border-top:1px solid var(--line2);border-radius:0;margin:0;padding:9px 13px;gap:4px}
.pl-g .pl-gh+.pl-r{border-top:0}
.pl-g .pl-r.w{border-left-color:var(--good)}
.pl-g .pl-r.l{border-left-color:var(--bad)}
.pl-g .pl-r.push{border-left-color:var(--mut)}
.pl-g .pl-r-bot{margin-top:2px}
@media(max-width:560px){
  .pl-gh{padding:8px 11px;gap:6px}
  .pl-gm{font-size:12.5px}
  .pl-gpre{margin-left:0}
  .pl-g .pl-r{padding:8px 11px}
}

/* ---- Performance: one table per sport, leagues as spanning rows ---- */
/* .bd-sport .lbtable th:first-child sets 40% + nowrap + ellipsis for the Bet-type column. A league row is
   also a th:first-child, so it has to opt back out of all three or the league name gets clipped. */
.bd-sport .lbtable tr.bd-lgrow>th{width:auto;white-space:normal;overflow:visible;text-overflow:clip;
  text-align:left;padding:11px 12px 5px;background:transparent;border-top:1px solid var(--line);
  font-weight:400;letter-spacing:0;text-transform:none}
.bd-sport .lbtable tr.bd-lgrow:first-of-type>th{border-top:0}
.bd-lgrow .bd-lg-n{font-family:var(--font-display);font-size:12px;font-weight:800;letter-spacing:.05em;
  text-transform:uppercase;color:var(--txt);margin-right:9px}
.bd-lgrow .bd-lg-m{font-family:var(--font-num);font-size:11px;color:var(--mut)}
.bdfold{margin:2px 12px 12px}
.bdfold>summary{font-size:11.5px}
.bdfold .lbwrap{margin-top:8px}

/* ---- Overview: the "last 7d" caption belongs to the whole list, not to every row ---- */
.layers-cap{display:flex;align-items:baseline;justify-content:space-between;gap:10px;flex-wrap:wrap;
  font-size:11.5px;color:var(--mut);margin:0 0 8px}

/* ---- Best 3: the strip of facts every leg shares ---- */
.b3shared{display:flex;align-items:center;flex-wrap:wrap;gap:0 8px;margin:0 0 10px;padding:8px 12px;
  background:var(--surf2);border:1px solid var(--line);border-radius:var(--r2);box-shadow:var(--rim);
  font-size:11.5px;color:var(--mut)}
.b3s-k{font-family:var(--font-display);font-size:11.5px;font-weight:800;letter-spacing:.09em;
  text-transform:uppercase;color:var(--gold);margin-right:2px}
.b3s-v{display:inline-flex;align-items:center;gap:4px}
.b3s-v+.b3s-v::before{content:'';display:inline-block;width:3px;height:3px;border-radius:50%;
  background:currentColor;opacity:.45;margin-right:6px}
.b3s-v b{color:var(--txt);font-weight:750;font-variant-numeric:tabular-nums}
.b3s-v .b3wl{font-family:var(--font-num);opacity:.8}

/* ---- Best 3: the sections the headline card no longer carries (b3alt-*, NOT b3sec-* --
   .b3sec was already taken at the per-market track-record headers, and being defined LATER
   in this stylesheet it wins: these row lists would have inherited display:flex and
   collapsed onto one line. The CSS guard balances braces; it does not catch a name clash. -------------------------------------------
   Foreign baseball and the non-major markets are published here rather than on the Best 3. Deliberately a
   ROW list and not the b3card grid: these are secondary by design, and giving them the flagship treatment
   would undo the separation by making them read as three more headline picks. Same grid-column trick the
   Zoo rows use, so the prices line up down the page and the eye can run the column. */
.b3alt{margin:16px 0 0}
.b3alt-h{display:flex;align-items:baseline;justify-content:space-between;gap:10px;flex-wrap:wrap;
  margin:0 0 8px;padding:0 2px}
.b3alt-t{font-family:var(--font-display);font-size:11px;font-weight:800;letter-spacing:.09em;
  text-transform:uppercase;color:var(--gold)}
.b3alt-s{font-size:11.5px;color:var(--mut);flex:1 1 240px;min-width:0}
.b3alt-rows{display:flex;flex-direction:column;gap:5px}
.b3alt-row{display:grid;grid-template-columns:58px minmax(0,1fr) auto auto;align-items:center;gap:10px;
  padding:8px 11px;border:1px solid var(--line);border-radius:11px;background:rgba(255,255,255,.022)}
.b3alt-row.done{opacity:.72}
.b3alt-row.won{border-color:rgba(var(--good-rgb),.30)}
.b3alt-row.lost{border-color:rgba(var(--bad-rgb),.26)}
.b3alt-lg{font-family:var(--font-display);font-size:11.5px;font-weight:800;letter-spacing:.06em;
  text-transform:uppercase;color:var(--mut);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.b3alt-bet{min-width:0;display:flex;flex-direction:column;gap:1px}
.b3alt-bet b{font-size:13px;font-weight:700;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.b3alt-bet small{font-size:11.5px;color:var(--mut);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.b3alt-od{font-family:var(--font-num);font-size:13px;font-weight:700;font-variant-numeric:tabular-nums;
  white-space:nowrap}
.b3alt-r{font-family:var(--font-display);font-size:11.5px;font-weight:800;letter-spacing:.06em;
  text-transform:uppercase;white-space:nowrap}
.b3alt-r.won{color:var(--good)}
.b3alt-r.lost{color:var(--bad)}
.b3alt-r.void{color:var(--mut)}
.b3alt-r.live{color:var(--gold)}
.b3alt-e{font-family:var(--font-num);font-size:11.5px;color:var(--mut);font-variant-numeric:tabular-nums}
.b3alt-e.pos{color:var(--good)}
/* Tomorrow's overnight card. Tinted and ruled so it cannot be mistaken for today's sections -- these games
   have not been played and are not in today's numbers, and that has to read at a glance. */
.b3early{border:1px solid rgba(var(--gold-rgb),.30);border-radius:12px;padding:13px 14px;
  background:rgba(var(--gold-rgb),.045)}
.b3early .b3alt-t{color:var(--gold)}
.b3early .b3alt-row{background:rgba(255,255,255,.03)}
@media(max-width:640px){
  .b3alt-row{grid-template-columns:minmax(0,1fr) auto auto;row-gap:2px}
  .b3alt-lg{grid-column:1/-1}
}

/* ---- Zoo: paging control under the grid ---- */
/* ---- ZOO ROWS: the long tail, scannable -----------------------------------------------------------------
   Everything below the shortlist. Grid rather than flex so the numbers column starts at the same x on every
   row and the eye can run straight down it -- with flex each row sizes to its own content and the figures
   jitter left and right, which is most of why a long list feels unreadable. */
.zoo-rows{display:flex;flex-direction:column;gap:5px;margin-top:10px}
.zrow{display:grid;grid-template-columns:26px 30px minmax(0,1fr) auto auto;align-items:center;gap:10px;
  padding:8px 11px;border:1px solid var(--line);border-radius:11px;background:rgba(255,255,255,.022);
  cursor:pointer;transition:border-color .12s,background .12s}
.zrow:hover{border-color:rgba(var(--gold-rgb),.4);background:rgba(255,255,255,.05)}
.zr-rk{font-size:11px;color:var(--mut);font-variant-numeric:tabular-nums;text-align:right}
.zr-av{width:30px;height:30px;border-radius:50%;display:flex;align-items:center;justify-content:center;
  background:rgba(255,255,255,.06);font-size:15px;overflow:hidden}
.zr-av img{width:100%;height:100%;object-fit:cover;border-radius:50%}
.zr-id{min-width:0;display:flex;flex-direction:column;gap:1px}
.zr-id b{font-size:13px;font-weight:700;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.zr-id small{font-size:11.5px;color:var(--mut);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.zr-nums{display:flex;flex-direction:column;align-items:flex-end;gap:1px;font-variant-numeric:tabular-nums}
.zr-nums b{font-size:13.5px;font-weight:750}
.zr-nums small{font-size:11.5px;color:var(--mut);white-space:nowrap}
.zr-act{display:flex;align-items:center;gap:7px}
.zr-live{font-size:11.5px;font-weight:700;color:var(--bad);background:rgba(var(--bad-rgb),.14);
  border-radius:20px;padding:2px 7px;white-space:nowrap}
.zr-today{font-size:11.5px;font-weight:700;color:var(--gold);background:rgba(var(--gold-rgb),.12);
  border-radius:20px;padding:2px 7px;white-space:nowrap}
.zr-up{box-shadow:inset 2px 0 0 rgba(var(--good-rgb),.5)}
.zr-dn{box-shadow:inset 2px 0 0 rgba(var(--bad-rgb),.34)}
.zr-new{box-shadow:inset 2px 0 0 rgba(255,255,255,.14)}
/* The shortlist band is the only one that gets cards, so it carries the emphasis the old winners band had. */
.zb-pick{border-color:rgba(var(--gold-rgb),.34);background:rgba(var(--gold-rgb),.045)}
@media(max-width:560px){
  /* What it bets is the first thing to go on a phone: the name and the numbers are what a tail decision
     needs, and three ellipsised market names in a 90px slot help nobody. */
  .zrow{grid-template-columns:20px 26px minmax(0,1fr) auto;gap:8px;padding:7px 9px}
  .zr-id small{display:none}
  .zr-av{width:26px;height:26px;font-size:13px}
  .zr-act .zoo-follow{display:none}
}
.zoo-more{display:flex;align-items:center;justify-content:center;gap:10px;flex-wrap:wrap;
  margin:12px 0 4px;font-size:11.5px}
.zoo-more .mut{font-variant-numeric:tabular-nums}

/* ---- Odds: per-toggle counts, so each option states its own size ---- */
.segn{font-family:var(--font-num);font-size:11.5px;font-weight:800;opacity:.72;margin-left:4px;
  font-variant-numeric:tabular-nums}
.segn:empty{display:none}
/* ==========================================================================================
   RECOVERY BLOCK — restored 2026-08-17 after midas_dashboard.py was truncated to 0 bytes by a
   write that encoded AFTER opening the file (see _recover/safewrite.py). Every rule below was
   recovered VERBATIM from the last good build's stylesheet, so this is the same CSS that was
   already live and verified, not a retype from memory.
   It sits at the end because that is where it can only WIN the cascade — several of these were
   deliberate overrides of earlier rules and must not be re-overridden by them.
   ========================================================================================== */

/* overscroll-behavior has to be on the ROOT element. Unlike `overflow`, it does NOT propagate from
   body to the viewport, so declaring it only on body -- as this did -- left the document scroller
   with the default `auto` and the whole page kept its elastic overscroll. That is the rubber-banding:
   the page drags past its own end and springs back, which on a tab whose height is still resolving
   reads as the content bouncing. Kept on body too; harmless, and correct if the scroller ever moves. */
html{overflow-x:clip;touch-action:manipulation;overscroll-behavior-y:none}

/* ---- ZEUS: THE TEST, RUN IN PUBLIC ------------------------------------------------------------------
   The page's own copy promised "if the Locks beat the Fades, Zeus is adding real value" and then never
   showed the Fades. This strip is that comparison, and it is the first thing on the tab because it is the
   only question a reader actually has. Three columns because a two-way readout would hide the awkward
   detail that Leans currently outperform Locks -- which is exactly the kind of thing this product exists
   to print rather than tidy away. */
.zx-what{font-size:12.5px;line-height:1.6;color:var(--mut);max-width:76ch;margin:0 0 12px}

.zx-what b{color:var(--txt)}

.zx-k{padding:1px 6px;border-radius:6px;font-size:11.5px}

.zx-k.lock{background:rgba(var(--gold-rgb),.14);color:var(--gold)}

.zx-k.lean{background:rgba(var(--push-rgb),.14);color:#c3cad8}

.zx-k.fade{background:rgba(var(--bad-rgb),.12);color:var(--bad-hi)}

.zx-test{border:1px solid var(--line);border-radius:14px;background:var(--surf);overflow:hidden;margin:0 0 14px}

.zx-cols{display:grid;grid-template-columns:repeat(3,1fr);gap:1px;background:var(--line)}

.zx-col{background:var(--bg2,var(--bg2));padding:11px 13px;min-width:0;display:flex;flex-direction:column;gap:2px}

.zx-lbl{font-size:11px;font-weight:800;letter-spacing:.09em;text-transform:uppercase;color:var(--mut);
 white-space:nowrap;overflow:hidden;text-overflow:ellipsis}

.zx-lbl em{font-style:normal;font-weight:600;letter-spacing:.03em;text-transform:none;opacity:.75}

.zx-wr{font-size:22px;font-weight:850;font-variant-numeric:tabular-nums;line-height:1.1}

.zx-col.lock .zx-wr{color:var(--gold)}

.zx-col.lean .zx-wr{color:var(--txt)}

.zx-col.fade .zx-wr{color:var(--bad-hi)}

.zx-sub{font-size:11.5px;color:var(--mut);font-variant-numeric:tabular-nums;white-space:nowrap;
 overflow:hidden;text-overflow:ellipsis}

.zx-verdict{padding:10px 13px;font-size:12.5px;line-height:1.55;border-top:1px solid var(--line);
 background:var(--surf)}

.zx-verdict.pos{color:var(--good-hi);background:linear-gradient(180deg,rgba(var(--good-rgb),.09),transparent 80%),var(--surf)}

.zx-verdict.neg{color:var(--bad-hi);background:linear-gradient(180deg,rgba(var(--bad-rgb),.08),transparent 80%),var(--surf)}

.zx-verdict.mut{color:var(--mut)}

body.theme-light .zx-col{background:var(--bg2,#fff)}

/* ---- THE LEAGUE PANEL --------------------------------------------------------------------------------
   The rule this whole component exists to obey: a filter must never grow the page. The panel is absolutely
   positioned under the rail, its list is height-capped, and the list scrolls inside itself. Open it on the
   smallest phone and nothing below moves. */
/* REGRESSION, FOUND 2026-08-16 ON MOBILE. This wrapper was `position:relative` so the panel could be
   absolutely positioned against it -- and that silently broke the sticky sport bar inside it. A sticky
   element only sticks while its CONTAINING BLOCK is on screen, and this wrapper's height is exactly the
   bar's height (the panel is out of flow and adds none), so the bar unstuck the instant it moved. On a
   phone, where that bar is the main way to change sport, it read as the filter scrolling away and content
   sitting at the wrong offset.
   The panel is `position:fixed` now and placed by JS, so it needs no positioning context at all and cannot
   interfere with the bar's stickiness again. */
.sp-wrap{position:static}

.sp-more{flex:none;cursor:pointer;font-family:inherit}

.sp-more .cnt{opacity:.7}

.spp{position:fixed;z-index:60;
 border:1px solid var(--line);border-radius:14px;background:var(--bg2,var(--bg2));
 box-shadow:0 26px 60px -26px rgba(0,0,0,.95),0 2px 0 rgba(255,255,255,.03) inset;overflow:hidden}

/* Desktop: a dropdown under the trigger, placed by spPanel(). */
@media(min-width:641px){.spp{width:min(420px,calc(100vw - 24px))}}

/* Mobile: a bottom sheet. It is the native pattern, it is thumb-reachable, and it removes every question
   about where a dropdown fits on a short screen. */
@media(max-width:640px){
  .spp{left:0;right:0;bottom:0;top:auto;width:auto;border-radius:16px 16px 0 0;border-bottom:0;
    padding-bottom:env(safe-area-inset-bottom,0px)}
  .spp-list{max-height:min(58vh,420px)}
}

.spp-top{display:flex;align-items:center;gap:8px;padding:9px 10px;border-bottom:1px solid var(--line)}

.spp-q{flex:1;min-width:0;height:36px;padding:0 11px;border-radius:9px;border:1px solid var(--line);
 background:var(--surf);color:var(--txt);font:inherit;font-size:13.5px}

.spp-q:focus{outline:none;border-color:rgba(var(--gold-rgb),.45)}

.spp-x{flex:none;width:36px;height:36px;border-radius:9px;border:1px solid var(--line);
 background:transparent;color:var(--mut);font-size:19px;line-height:1;cursor:pointer}

.spp-x:hover{color:var(--txt);background:rgba(255,255,255,.05)}

/* THE CAP. min() so it is a share of the viewport on a phone and a fixed sane height on a desktop. */
.spp-list{max-height:min(46vh,340px);overflow-y:auto;overscroll-behavior:contain;
 scrollbar-width:thin;scrollbar-color:rgba(var(--push-rgb),.35) transparent}

.spp-list::-webkit-scrollbar{width:10px}

.spp-list::-webkit-scrollbar-track{background:transparent}

.spp-list::-webkit-scrollbar-thumb{background:rgba(var(--push-rgb),.3);border-radius:99px;
 border:3px solid var(--bg2,var(--bg2))}

.spp-list::-webkit-scrollbar-thumb:hover{background:rgba(var(--push-rgb),.5)}

/* Family headings stay put while their leagues scroll under them, so you never lose which sport you are in. */
.spp-fam{position:static;display:flex;justify-content:space-between;align-items:baseline;
 gap:10px;padding:7px 12px 5px;background:none;
 font-size:11px;font-weight:800;letter-spacing:.1em;text-transform:uppercase;color:var(--gold)}

.spp-fn{font-size:11px;font-weight:700;letter-spacing:.04em;color:var(--mut);text-transform:none}

.spp-r{display:flex;width:100%;align-items:center;justify-content:space-between;gap:12px;
 padding:9px 12px;min-height:40px;border:0;border-top:1px solid rgba(var(--push-rgb),.07);
 background:transparent;color:var(--txt);font:inherit;font-size:13.5px;text-align:left;cursor:pointer}

.spp-r:first-child{border-top:0}

.spp-r:hover{background:rgba(255,255,255,.045)}

.spp-r.on{background:rgba(var(--gold-rgb),.10);color:var(--gold)}

.spp-n{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

.spp-c{flex:none;font-size:11px;font-weight:700;color:var(--mut);font-variant-numeric:tabular-nums}

.spp-all{border-top:0;border-bottom:1px solid var(--line);font-weight:700}

.spp-none{padding:14px 12px;font-size:12.5px;color:var(--mut)}

body.theme-light .spp{background:var(--bg2,#fff)}

body.theme-light .spp-fam{background:var(--bg2,#fff)}

body.theme-light .spp-list::-webkit-scrollbar-thumb{border-color:var(--bg2,#fff)}

/* ---- A SETTLED CARD MUST NOT LOOK LIKE A LIVE ONE ----------------------------------------------------
   The day-lock keeps picks on the card through settlement, so a graded pick and a live one sat in the same
   box with the same gold price, the same stake pill and the same green tail button. The only honest fix is
   to make the two states visibly different at a glance, before anything is read.
   Settled cards recede: the border takes the result colour, the surface flattens, and the price -- which is
   the number we recorded this morning and no book will still honour -- drops to muted weight. It is kept
   rather than deleted because it is what the pick was graded at. */
.b3card.done{background:var(--surf);border-color:rgba(var(--push-rgb),.22)}

.b3card.done:hover{transform:none;box-shadow:none;border-color:rgba(var(--push-rgb),.3)}

.b3card.done.won{border-color:rgba(var(--good-rgb),.30)}

.b3card.done.lost{border-color:rgba(var(--bad-rgb),.26)}

.b3card.done .b3odds{color:var(--mut);font-weight:700;font-size:16px}

.b3card.done .b3u{background:rgba(var(--push-rgb),.08);color:var(--mut);border-color:rgba(var(--push-rgb),.18)}

.b3card.done .b3edge{opacity:.6}

/* The verdict, in the slot the checkbox used to hold. */
.b3done{margin-left:auto;flex:none;font-size:11px;font-weight:800;letter-spacing:.09em;
 padding:2px 7px;border-radius:6px;border:1px solid transparent}

.b3done.won{background:rgba(var(--good-rgb),.14);color:var(--good-hi);border-color:rgba(var(--good-rgb),.3)}

.b3done.lost{background:rgba(var(--bad-rgb),.12);color:var(--bad-hi);border-color:rgba(var(--bad-rgb),.28)}

.b3done.void{background:rgba(var(--push-rgb),.10);color:var(--mut);border-color:rgba(var(--push-rgb),.22)}

/* Where the tail button was. Same footprint so the grid does not reflow between states, but flat, quiet and
   not a button -- there is nothing left to press. */
.b3settled{margin-top:6px;min-height:44px;display:flex;align-items:center;gap:9px;flex-wrap:wrap;
 padding:9px 12px;border-radius:12px;border:1px solid var(--line);background:rgba(var(--push-rgb),.05)}

.b3settled.won{border-color:rgba(var(--good-rgb),.26);background:rgba(var(--good-rgb),.06)}

.b3settled.lost{border-color:rgba(var(--bad-rgb),.22);background:rgba(var(--bad-rgb),.05)}

.b3s-r{font-size:12px;font-weight:850;letter-spacing:.08em}

.b3settled.won .b3s-r{color:var(--good-hi)}

.b3settled.lost .b3s-r{color:var(--bad-hi)}

.b3settled.void .b3s-r{color:var(--mut)}

.b3s-u{font-size:14px;font-weight:850;font-variant-numeric:tabular-nums}

.b3s-n{flex:1 1 100%;font-size:11.5px;line-height:1.4;color:var(--mut)}

/* ---- THE DAY'S STATE, SAID ONCE ---------------------------------------------------------------------
   Above the grid, because whether the card is live or graded changes what every box under it means. */
.b3state{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:0 0 12px;padding:10px 13px;
 border-radius:12px;border:1px solid var(--line);background:var(--surf)}

.b3state.won{border-color:rgba(var(--good-rgb),.3);background:linear-gradient(180deg,rgba(var(--good-rgb),.08),transparent 70%),var(--surf)}

.b3state.lost{border-color:rgba(var(--bad-rgb),.26);background:linear-gradient(180deg,rgba(var(--bad-rgb),.07),transparent 70%),var(--surf)}

.b3st-k{font-size:11px;font-weight:800;letter-spacing:.07em;text-transform:uppercase;color:var(--txt)}

.b3st-r{font-size:13px;font-weight:800;font-variant-numeric:tabular-nums;color:var(--mut)}

.b3st-u{font-size:17px;font-weight:850;font-variant-numeric:tabular-nums}

.b3st-n{flex:1 1 100%;font-size:11px;line-height:1.45;color:var(--mut)}

/* Ladder rows settle too. A small tag, not a restyle -- the row is a list item, not a card. */
.b3mktr.done{opacity:.72}

.b3mktr-r{flex:none;font-size:11px;font-weight:800;letter-spacing:.08em;padding:1px 6px;border-radius:5px}

.b3mktr-r.won{background:rgba(var(--good-rgb),.14);color:var(--good-hi)}

.b3mktr-r.lost{background:rgba(var(--bad-rgb),.12);color:var(--bad-hi)}

.b3mktr-r.void{background:rgba(var(--push-rgb),.10);color:var(--mut)}

/* ---- EVIDENCE, NOT JUST PERFORMANCE -----------------------------------------------------------------
   Deliberately NOT styled like a trophy. The common case is "too early to tell" and it has to sit calmly
   on a card that is up 40 units without either shouting or hiding. Only a bot that survives the fleet-wide
   correction gets the gold treatment, and right now that is nobody. */
.zc-ev{display:flex;align-items:baseline;gap:8px;margin-top:8px;padding:6px 9px;border-radius:9px;
 border:1px solid var(--line);background:rgba(var(--push-rgb),.05);min-width:0}

.zc-ev-n{flex:none;font-size:13px;font-weight:850;font-variant-numeric:tabular-nums}

.zc-ev-t{font-size:11.5px;line-height:1.35;color:var(--mut);min-width:0}

.zc-ev.ev-strong{border-color:rgba(var(--gold-rgb),.45);background:rgba(var(--gold-rgb),.09)}

.zc-ev.ev-strong .zc-ev-n{color:var(--gold)}
 .zc-ev.ev-strong .zc-ev-t{color:#e8d9a8}

.zc-ev.ev-some{border-color:rgba(var(--good-rgb),.24);background:rgba(var(--good-rgb),.05)}

.zc-ev.ev-some .zc-ev-n{color:var(--good-hi)}

.zc-ev.ev-none .zc-ev-n{color:var(--mut)}

.zc-ev.ev-behind{border-color:rgba(var(--bad-rgb),.20);background:rgba(var(--bad-rgb),.04)}

.zc-ev.ev-behind .zc-ev-n{color:var(--bad-hi)}

/* The fleet-level correction, above the leaderboard it corrects. */
.zoo-eviband{border:1px solid var(--line);border-radius:14px;background:var(--surf);padding:13px 15px;
 margin:0 0 14px}

.ze-b{font-size:12px;line-height:1.6;color:var(--mut);max-width:78ch}

.ze-b b{color:var(--txt)}

.ze-r{font-size:13px;line-height:1.5;color:var(--txt);margin:8px 0;padding:7px 11px;border-radius:9px;
 background:rgba(var(--gold-rgb),.07);border:1px solid rgba(var(--gold-rgb),.22)}

.ze-r b{color:var(--gold);font-weight:850}

.ze-why{margin-top:6px}

body.theme-light .zc-ev{background:rgba(15,23,42,.03)}

/* The fade line. Blue rather than green on purpose: it is a real result but it is an ESTIMATE, and it must
   not wear the same colour as a measured profit anywhere else on the site. */
/* Three windows, one row. Tabular figures so the columns line up down a grid of cards, which is the whole
   point — you are comparing bots, not reading one. */
.zc-win{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:6px;padding:5px 8px;
 border-radius:8px;background:rgba(var(--push-rgb),.05);border:1px solid rgba(var(--push-rgb),.14)}

.zc-win-k{flex:none;font-size:11px;font-weight:800;letter-spacing:.09em;text-transform:uppercase;color:var(--mut)}

.zc-w{display:inline-flex;align-items:baseline;gap:4px;min-width:0}

.zc-w em{font-style:normal;font-size:11px;font-weight:700;letter-spacing:.04em;color:var(--mut);opacity:.8}

.zc-w b{font-size:11.5px;font-weight:800;font-variant-numeric:tabular-nums}

.zc-fade .zc-win{flex:1 1 100%;margin-top:4px;background:rgba(125,176,255,.06);border-color:rgba(125,176,255,.18)}

.zc-fade .zc-win-k{color:var(--blue2)}

.zc-fade{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap;margin-top:6px;padding:6px 9px;
 border-radius:9px;border:1px solid rgba(125,176,255,.28);background:rgba(125,176,255,.07)}

.zc-fade-k{flex:none;font-size:11px;font-weight:800;letter-spacing:.09em;text-transform:uppercase;color:var(--blue2)}

.zc-fade-n{flex:none;font-size:13px;font-weight:850;font-variant-numeric:tabular-nums;color:var(--blue2)}

.zc-fade-t{flex:1 1 100%;font-size:11.5px;line-height:1.35;color:var(--mut)}

.zc-fade-t b{color:#a9ccff}

.zc-fade-e{font-size:11px;font-weight:700;letter-spacing:.05em;text-transform:uppercase;opacity:.7}

.zm{display:inline-flex;align-items:baseline;gap:5px;padding:2px 7px;border-radius:7px;
 background:rgba(var(--push-rgb),.09);border:1px solid rgba(var(--push-rgb),.18);
 font-size:11.5px;color:var(--mut);white-space:nowrap;max-width:100%;overflow:hidden;text-overflow:ellipsis}

.zm b{color:var(--txt);font-weight:700}

.zm-n{font-size:11px;opacity:.65;font-variant-numeric:tabular-nums}

.zm-more{background:transparent;border-style:dashed}

.zm-none{font-size:11.5px;color:var(--mut)}

.mk-end{display:flex;align-items:center;justify-content:flex-end;gap:8px;min-width:0}

/* ---- YOUR MARKETS ------------------------------------------------------------------------------------
   Deliberately reuses .mk-row wholesale rather than inventing a second row component. The engine's market
   chart and the user's market chart are the same object about two different ledgers, and they should be
   impossible to tell apart except by their heading. */
.ym-scope{font-size:12.5px;color:var(--mut);line-height:1.55;margin:0 0 10px;max-width:74ch}

.ym-tabs{display:flex;gap:6px;margin:0 0 8px}

.ym-tab{flex:none;padding:6px 12px;border-radius:999px;border:1px solid var(--line);background:transparent;
 color:var(--mut);font:inherit;font-size:12px;font-weight:700;cursor:pointer;min-height:34px}

.ym-tab:hover{color:var(--txt);background:rgba(255,255,255,.04)}

.ym-tab.on{color:var(--gold);border-color:rgba(var(--gold-rgb),.45);background:rgba(var(--gold-rgb),.09)}

/* A thin sample is shown, not hidden -- but it is visibly quieter than a market with a real record behind it. */
.ym-thin{opacity:.66}

#your-markets{margin-top:18px}

/* Under ~380px the word "cal" is not worth the 34px it costs. The button stays -- same tap target, same
   action -- as a calendar glyph. */
@media(max-width:380px){
  .mk-cal{font-size:0;padding:6px 7px}
  .mk-cal::before{content:'\1F5D3';font-size:12px;line-height:1}
}

/* The summary is now the whole card when closed, so it needs to behave like one. */
.ip-game>summary{list-style:none;cursor:pointer}

.ip-game>summary::-webkit-details-marker{display:none}

.ip-game>summary::after{content:'';flex:none;width:7px;height:7px;margin-left:2px;
  border-right:1.5px solid var(--mut);border-bottom:1.5px solid var(--mut);
  transform:rotate(45deg) translate(-2px,-2px)}

.ip-game[open]>summary::after{transform:rotate(225deg) translate(-2px,-2px)}

.ip-game[open]{box-shadow:var(--e2),var(--rim)}

.ip-game[open]>summary{border-bottom:1px solid var(--line)}


/* ==========================================================================================================
   MOBILE SCROLL COST
   ==========================================================================================================
   Three elements are on screen at ALL TIMES and all three carried a backdrop-filter: the header
   blur(16px) saturate(1.3), the sub nav blur(10px), and the bottom nav blur(18px) saturate(1.3). A
   backdrop-filter on a sticky element makes the browser re-blur everything behind it on every scroll
   frame, and on a phone GPU that is the difference between a scroll that tracks your thumb and one that
   stutters. Three of them stacked is three full-width blurs per frame.

   Desktop keeps them: it has the headroom and the effect is part of the chrome. On touch devices they
   become near-solid instead. Modals and sheets keep their blur everywhere, because the page behind a modal
   is not scrolling, so it is blurred once and never again.

   Also dropped on mobile: the fixed scrim under the header. position:fixed plus a gradient is another
   per-frame repaint, and it buys the least of anything here. */
@media (hover: none), (pointer: coarse){
  header{backdrop-filter:none !important;-webkit-backdrop-filter:none !important;
    background:linear-gradient(180deg,rgba(6,9,15,.985),rgba(5,7,12,.97)) !important}
  .subnav{backdrop-filter:none !important;-webkit-backdrop-filter:none !important;
    background:rgba(5,7,12,.985) !important}
  .botnav{backdrop-filter:none !important;-webkit-backdrop-filter:none !important;
    background:rgba(6,9,15,.985) !important}
  .wrap::before{display:none}
  body.theme-light header{background:linear-gradient(180deg,rgba(248,249,253,.985),rgba(245,246,251,.97)) !important}
  body.theme-light .subnav,body.theme-light .botnav{background:rgba(248,249,253,.985) !important}
}


/* ---- OFFSCREEN GAME CARDS ARE NOT RENDERED -----------------------------------------------------------
   The board is the largest section in the product by a wide margin: one tab holding every league, every
   game and every market for the day. Even collapsed, the browser was laying out and painting all of it on
   every scroll frame, which is why Today stayed glitchy on a phone while lighter tabs went smooth.

   content-visibility:auto tells the browser to skip layout and paint entirely for a card that is off
   screen, and to do the work only as it approaches. contain-intrinsic-size supplies a placeholder height
   so the scrollbar does not jump around as cards are skipped and realised. The measurements are the real
   collapsed heights: a closed game row is about 52px plus margin, a closed In Play card about 46px.

   This is the single biggest rendering win available on this page and it costs nothing visually. */
.gamegrp{content-visibility:auto;contain-intrinsic-size:auto 58px}

.ip-game{content-visibility:auto;contain-intrinsic-size:auto 52px}

.pxg-game,.pl-g{content-visibility:auto;contain-intrinsic-size:auto 120px}

/* An OPEN card must never be skipped: it is tall, it is being read, and a wrong intrinsic size on an
   expanded card is exactly how a page jumps under a thumb. */
/* .sportgrp[open] is exempt at EVERY width, not just on phones, for the same reason only more so: its real
   height is the sum of all its games, so it is the single worst-estimated box on the page. */
.gamegrp[open],.ip-game[open],.sportgrp[open]{content-visibility:visible;contain-intrinsic-size:none}

/* ---- WHY THIS IS TURNED OFF ON PHONES -----------------------------------------------------------------
   contain-intrinsic-size is a PROMISE about how tall an unrendered element will be, and the browser lays
   the page out as if the promise were true. 58px was measured against the DESKTOP header, which is a
   single grid row. On mobile .gamehdr is `flex-wrap:wrap` and routinely takes two lines, so the real
   collapsed height is closer to 90-100px and every off-screen group was under-promised by ~40%.
   The consequence is exactly what Austin described: the page believes it is much shorter than it is, then
   corrects group by group as you scroll into them. The scroll position drifts under the finger, the
   scrollbar jumps, and the tab "doesn't fit" until it has been scrolled through once.
   Today is worst because it holds the most groups, and it is the tab the app opens on -- so it is the one
   surface that pays this on a cold load every time.
   The trade is small: this saves off-screen layout on a few dozen collapsed rows, which is worth having on
   a 400-row list and is not worth a single frame of scroll drift on a phone. The big lists (.fabsec at 415
   children) keep theirs. */
/* .sportgrp IS THE ONE THAT ACTUALLY MATTERED, AND IT WAS MISSED. The opt-out above was written against
   the selectors declared in THIS block, but the same 140px promise is also made to .sportgrp about 4,800
   lines up, in the PERF rule that covers .fabsec and the Zoo cards -- so it was never part of the same
   edit and it survived the fix. A .sportgrp is a whole league's <details> wrapper holding every game for
   that league; open, it is routinely 600-1500px tall, and it was promising 140px. That is an order of
   magnitude worse than the 58px-vs-90px error described above, and it fails in exactly the same way: the
   document reports a height it does not have, then grows under the thumb one league at a time as each
   group is scrolled into. Today carries the most league groups and is the tab the app opens on, so Today
   pays it hardest and pays it on every cold load -- which is the "not fluid at all" report. */
@media(max-width:640px){
  .gamegrp,.ip-game,.pxg-game,.pl-g,.sportgrp{content-visibility:visible;contain-intrinsic-size:none}
}

/* The way into the per-market calendar. Deliberately quiet: the row's own job is the number, and this is
   the second thing you might want from it, not the first. */
.mk-cal{flex:none;margin-left:8px;padding:3px 8px;border-radius:var(--r1);border:1px solid var(--line);
  background:rgba(255,255,255,.03);color:var(--mut);font-family:var(--font-display);font-stretch:92%;
  font-size:11.5px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;cursor:pointer}

.mk-cal:hover{color:var(--gold);border-color:rgba(var(--gold-rgb),.35);background:rgba(var(--gold-rgb),.08)}


/* ==========================================================================================================
   SIGNATURE MOTION  ::  the part that should feel like a product rather than a page
   ==========================================================================================================
   Everything above this deliberately took motion AWAY, because a board row opened forty times a day must
   not animate. That is correct and it is also not the whole job: a product with no signature moments feels
   competent and forgettable. So motion comes back here, in the three places it costs nothing and reads as
   craft. All of it is scroll-driven or edge-based, none of it sits between you and an action, and every
   line is transform/opacity or a mask, so it composites on the GPU and never triggers layout.

   1. DISSOLVE EDGES. Scrollable rails fade their content out at the boundary instead of guillotining it.
      A hard cut says "the box ended". A dissolve says "there is more that way", which is the actual truth
      and needs no scrollbar to say it.
   2. SCROLL-LINKED REVEAL. Cards resolve as they enter the viewport, driven by CSS scroll timelines, so
      there is no JS, no observer and no main-thread work. Degrades to fully visible where unsupported,
      which is the correct failure: the content was never hidden, it was only late.
   3. THE PAGE DISSOLVES UNDER THE HEADER. Content fades as it passes beneath the blurred bar rather than
      sliding under an opaque edge. This is the single detail that most reads as "app" rather than "page". */

/* ---- 1. Dissolve edges on horizontal rails ---- */
.subnav-in,.filters,.jumpbar,.spbar,.shoptabrow,.oddsbar{
  -webkit-mask-image:linear-gradient(90deg,transparent 0,#000 18px,#000 calc(100% - 22px),transparent 100%);
          mask-image:linear-gradient(90deg,transparent 0,#000 18px,#000 calc(100% - 22px),transparent 100%)}


/* Vertical dissolve is limited to the SHORT panel that actually scrolls inside itself. It was also on
   .pl-feed, .zoo-grid and .ip-list, which hold hundreds of children: a mask forces the whole subtree into
   one composited layer, and on a list that long that is paid on every frame. Horizontal rails keep theirs
   because they are a handful of chips. */
.evbody{
  -webkit-mask-image:linear-gradient(180deg,transparent 0,#000 14px,#000 calc(100% - 18px),transparent 100%);
          mask-image:linear-gradient(180deg,transparent 0,#000 14px,#000 calc(100% - 18px),transparent 100%)}


/* ---- 2. Scroll-linked reveal: REMOVED ----
   This was a second `animation-timeline: view()` rule setting transform and opacity on the SAME cards the
   focus observer now drives, with `both` fill, so the two would have fought for the same two properties on
   the same elements. It was also unsupported in Safari and on iOS, meaning it did nothing on a phone while
   still costing a conflict everywhere else. One mechanism owns card transform and opacity now, and it is
   the observer, because that one actually runs on every browser. */

/* ---- 3. The page dissolves under the header ---- */
/* A soft scrim below the sticky bar so rows fade out as they pass beneath it rather than being clipped.
   pointer-events:none so it never eats a tap on the row underneath it. */
/* REMOVED. This scrim faded rows out as they passed under the header, which was right while the header
   was permanently on screen. The header auto-hides now, and --hdr-h does not follow it down, so after any
   scroll this band is a fixed dark smear floating over the middle of the page with nothing above it. A
   blurred layer that holds still while the content moves under it reads as a rendering fault, and that is
   how it was reported. The problem it solved went away with the sticky header. */
.wrap::before{display:none}

body.theme-light .wrap::before{display:none}


/* ---- Live state should breathe, everything else should not ---- */
/* One ambient pulse in the whole product, on the thing that is genuinely changing while you look at it.
   Opacity only, and it is already paused when the tab is hidden by the idle rule above. */
@media (prefers-reduced-motion: no-preference){
  @keyframes midas-live{0%,100%{opacity:1}50%{opacity:.45}}
  .mz-live-dot,.gc-livedot,.olive,.gst-live::before{animation:midas-live 2.4s var(--ease-tint) infinite}
}


/* ==========================================================================================================
   FOCUS SCROLL  ::  the list as a stack of bubbles rather than a wall of rows
   ==========================================================================================================
   The card nearest the middle of the viewport is fully present. Cards above and below sit slightly back:
   a little smaller, a little dimmer, a hairline quieter. Scrolling therefore moves ATTENTION rather than
   just moving pixels, and a long list reads as a sequence of things you are looking at one at a time.

   Entirely scroll-driven CSS. No JS, no IntersectionObserver, no scroll listener, and it composites on the
   GPU because it only touches transform and opacity. Where scroll timelines are unsupported nothing
   happens at all and the list is simply a normal list, which is the correct degradation.

   The numbers are deliberately small. At .972 and .62 you feel the focus without the page appearing to
   breathe, and text never dims far enough to become unreadable while you are scrolling past it. */
/* IMPLEMENTED WITH IntersectionObserver, NOT scroll timelines. The first version used
   `animation-timeline: view()`, which is genuinely elegant and genuinely unsupported in Safari and on iOS,
   so on a phone it did exactly nothing while I reported it as shipped. IntersectionObserver is universally
   supported, is NOT a scroll listener (the callback is async and fires only on threshold crossings), and
   the actual animation stays pure CSS transition on transform and opacity.
   The class is applied by midasFocus() below. */
@media (prefers-reduced-motion: no-preference){
  /* CONTINUOUS, NOT BINARY. The first version toggled a class when a card crossed a band, which grows a
     card as it arrives and then never shrinks it, because a card taller than the band never fully leaves
     the band. Focus is a gradient, not a state: --f is written per element by the loop below, 1 at the
     centre of the screen falling to 0 at the edges, and the card reads it directly.
     No transition on transform: the value is already updated every frame while scrolling, and a transition
     on top of a per-frame value is what makes motion feel laggy rather than attached to the finger. */
  /* ROWS get the curve that was tuned on rows: opacity 23, scale 18, blur 2. */
  /* SOFTENED 2026-08-17. At 2px of blur and a .77 floor this was not receding, it was deleting: on Practice,
     which is built from a few TALL rows, two of the three rows on screen sit deep in the tail and were
     unreadable. Depth should cost legibility nothing. Four numbers, all here, easy to push back up. */
  .zt-card,.zoo-card,.trackrow,.pick,.au-row,.au-sheet.au-hero{
    --f:1;
    opacity:calc(.84 + .16 * var(--f));
    filter:blur(calc((1 - var(--f)) * 0.9px));
    transform:scale(calc(.89 + .11 * var(--f))) translateY(calc((1 - var(--f)) * 9px));
    transform-origin:center}
  /* CONTAINERS TAKE THE SAME CURVE AS ROWS. They used to get opacity only, on the reasoning that a
     several-hundred-pixel container scaling by .82 reads as a bug rather than as depth.
     That is true of an OPEN container and false of a closed one. Closed, a .gamegrp is a ~60px row — after
     the density pass, among the shortest rows in the product — and the Today board is forty of them. So
     the tab that opens first was built almost entirely from the one class excluded from scale and blur,
     and all it did was ripple between .72 and 1 opacity. That is why the effect read as absent on the
     board while being clearly visible on Practice.
     The tall case is already covered by the [open] rule directly below, which forces transform:none,
     opacity:1 and filter:none the moment a card is opened to be read. With that guard in place the
     exclusion here was protecting against a state that cannot occur. */
  .ip-game,.gamegrp,.pxg-game{
    --f:1;
    opacity:calc(.84 + .16 * var(--f));
    filter:blur(calc((1 - var(--f)) * 0.9px));
    transform:scale(calc(.89 + .11 * var(--f))) translateY(calc((1 - var(--f)) * 9px));
    transform-origin:center}
  /* THE SAME CURVE IS NOT THE SAME EFFECT ON A PHONE. The falloff is proportional to viewport height, so
     the ratio of dimmed to bright is constant -- but the CARD COUNT is not. On a desktop window eight
     cards are visible and the two at the edges recede, which reads as depth. On a phone three are visible
     and two of them are at 50-67% opacity, so most of the screen looks broken rather than focused, and
     Austin reported it as "sizing is wrong and things are cut off".
     Same effect, much gentler: barely any scale change and a high opacity floor. */
  /* THE CSS HAS TO OPT OUT WHEREVER THE JS DOES, AND IT DID NOT. midasFocus() below returns early on
     `(max-width:640px),(pointer:coarse)`, so on a phone --f is never written and holds its 1 default --
     which meant the softened curve above resolved to scale(1) and opacity(1) on every card, forever. It
     had no visible effect at all, and still gave every card on the biggest board in the product a computed
     transform that is not `none`. That makes each one a stacking context and a containing block and keeps
     it in the compositor's candidate set for the whole scroll, on the tab with the most cards.
     Matching the JS guard exactly removes that for a guaranteed zero visual delta: these declarations were
     already evaluating to the identity transform and full opacity on every device that takes this branch. */
    /* NO MOBILE OPT-OUT ANY MORE. The old curve was disabled on phones because it dimmed to 50% and three
     visible cards meant most of the screen looked broken. The tuned curve has a .77 opacity floor and the
     containers no longer scale at all, which was the actual complaint. The effect is the point of the
     design, and a phone is where it will mostly be seen. */
  /* An OPEN card is being read, so it is never scaled or dimmed no matter where it sits. */
  .ip-game[open],.gamegrp[open]{--f:1 !important;transform:none !important;opacity:1 !important;filter:none !important}
}


/* SCROLL SNAP REMOVED. It was declared on `#bets .sport`, which is not a scroll container at all, so the
   snap points were being resolved against the document scroller and fought every deliberate flick. Snap
   only ever belongs on the element that actually scrolls, and here that is the page itself, where a detent
   on a variable-height list is more annoying than useful. scroll-margin is kept: it is free, and it stops
   an expanded card landing underneath the sticky header. */
.ip-game,.gamegrp{scroll-margin-top:calc(var(--hdr-h,56px) + 34px)}


/* ---- Zoo: result bands. The winners band is open and carries the rank badges; the rest are one click
   away with their counts stated on the closed row, so nothing is hidden by folding it. ---- */
.zoo-band{margin:16px 0 0}

.zoo-band>summary{list-style:none;cursor:pointer}

.zoo-band>summary::-webkit-details-marker{display:none}

.zb-h{display:flex;align-items:center;flex-wrap:wrap;gap:8px;padding:9px 13px;
  background:var(--surf2);border:1px solid var(--line);border-radius:var(--r2);box-shadow:var(--rim)}

.zoo-band[open]>.zb-h{border-bottom-left-radius:0;border-bottom-right-radius:0}

.zoo-band>summary.zb-h:hover{border-color:var(--gold);color:var(--txt)}

.zb-h svg{width:15px;height:15px;color:var(--gold);flex:none}

.zb-t{font-family:var(--font-display);font-size:12.5px;font-weight:800;letter-spacing:.06em;
  text-transform:uppercase;color:var(--txt)}

.zb-n{font-family:var(--font-num);font-size:11.5px;font-weight:800;color:var(--gold);
  background:rgba(var(--gold-rgb),.10);border:1px solid rgba(var(--gold-rgb),.22);border-radius:var(--r1);
  padding:1px 7px;font-variant-numeric:tabular-nums}

.zb-say{flex:1 1 100%;font-size:11.5px;color:var(--mut);line-height:1.5}

.zb-down .zb-n,.zb-thin .zb-n,.zoo-idlewrap .zb-n{color:var(--mut);background:transparent;
  border-color:var(--line)}

.zoo-band .zoo-grid{margin-top:10px}

.zb-up{border-left:2px solid var(--gold);padding-left:10px;margin-left:-12px}

body{overflow-x:clip;max-width:100%;overscroll-behavior-y:none}

@media(max-width:560px){
  .zx-cols{grid-template-columns:1fr}
  .zx-col{flex-direction:row;align-items:baseline;justify-content:space-between;gap:10px}
  .zx-wr{font-size:18px}
}

.ze-h{font-size:13.5px;font-weight:800;letter-spacing:-.01em;color:var(--txt);margin-bottom:6px}

.zoo-method{display:flex;flex-wrap:wrap;gap:5px;margin-top:6px}


.zoo-stats{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin-bottom:12px;font-variant-numeric:tabular-nums}

.mk-val{text-align:right;font-variant-numeric:tabular-nums;font-weight:800;font-size:14px;line-height:1.2;min-width:0}


.mkfold{margin-top:12px}

@media(max-width:640px){
  .mk-row{grid-template-columns:minmax(0,1fr) auto;gap:4px 10px;padding:8px 8px}
  .mk-track{grid-column:1/-1;order:3}
  .mk-val{text-align:right}
  /* The label is the thing that must not push the row wide. minmax(0,1fr) above lets it shrink; this
     lets it ellipsis rather than force a horizontal scrollbar on the whole page. */
  .mk-name{min-width:0}
  .mk-sub{white-space:nowrap}
}


/* THE LIGHT SOURCE. One cool key from top centre plus a faint gold bloom low down, so the page reads as a
   lit space rather than a flat colour. Fixed attachment so it does not slide under scrolling content. */
body{
  background:
    radial-gradient(1200px 620px at 50% -8%,  rgba(120,150,255,.055), transparent 62%),
    radial-gradient(900px 520px at 88% 108%,  rgba(var(--gold-rgb),.030), transparent 60%),
    var(--bg) !important;
  /* NOT background-attachment:fixed. This file already had `scroll` set further down, which was somebody
     fixing exactly this before me, and my first pass overrode it back to fixed with !important. A fixed
     attachment cannot be composited: the browser repaints the whole background every scroll frame, which
     is the single most reliable way to make a long page feel glitchy on a phone. The gradients scroll with
     the page now. The lit-space effect survives because the light is at the TOP of the document, which is
     where it reads anyway. */
  background-attachment:scroll !important;
}





/* ==========================================================================================================
   CHROME  ::  the frame you see on every screen
   ==========================================================================================================
   Three changes, each replacing a pattern that is generic rather than wrong.

   1. THE WORDMARK WAS GRADIENT TEXT. The craft floor bans it outright and it is one of the loudest
      generated-design tells there is. A wordmark should be a shape, not a fill effect. It is now set in
      the display face at heavy weight with wide tracking, in flat gold, with a drawn mark beside it.

   2. NAVIGATION WAS FIVE FLOATING PILLS. Separate rounded pills on a dark field is the default every dark
      UI arrives at, and it reads as five unrelated buttons rather than one control with five positions.
      It is now ONE segmented instrument switch: a single recessed housing, hairline dividers, and the
      active position lit from within. You are moving a selector, not pressing unrelated buttons.

   3. THE HEADER FLOATED IN THE MIDDLE OF THE PAGE. Full bleed now, with a hairline rule and the content
      still held to the reading column. An instrument's chrome meets the edges of its case. */

/* Full bleed header, hairline rule, no gold tint on the border. */
header{
  background:linear-gradient(180deg,rgba(7,10,17,.92),rgba(5,7,12,.86)) !important;
  border-bottom:1px solid var(--line) !important;
  box-shadow:0 1px 0 rgba(255,255,255,.03), 0 18px 40px -30px rgba(0,0,0,.9) !important}



/* ==========================================================================================================
   SHARED COMPONENTS  ::  the layer every tab inherits
   ==========================================================================================================
   Applied globally rather than per tab, so a surface nobody has touched still arrives in the new language.
   These are the pieces that appear on every screen: tables, panels, inputs, buttons, badges. */

/* TABLES. This product is mostly tables pretending to be lists, so they get instrument treatment: figures
   monospaced and right aligned so decimals stack, headers quiet and lettered, rules hairline. A ruled box
   around every cell is a spreadsheet; a rule under every row is a ledger. */
table{font-variant-numeric:tabular-nums}











/* ---- INFINITE ANIMATIONS: PAUSED WHEN NOBODY IS LOOKING ---------------------------------------------
   There are 43 of them. Deleting them wholesale would be wrong, because they are not one thing:
     live indicators (.mz-live-dot, .livechip, .olive, .gc-livedot, .sc-live) carry STATE, a game is on;
     skeletons (.mz-skel, .wal-load) carry "loading", which is information;
     the .bd-* border effects are cosmetics users BOUGHT, so their whole value is that they move.
   What they share is that every one keeps a compositor layer busy forever, including in a background tab
   where nobody can see them. A tracker sits open in a tab all day, so this is the battery cost of the
   product. Pausing on hidden costs nothing visually and stops the work when it cannot be perceived. */
body.midas-idle *,body.midas-idle *::before,body.midas-idle *::after{
  animation-play-state:paused !important}

@media(max-width:560px){
  .zb-up{margin-left:0;padding-left:8px}
  .zb-h{padding:8px 11px}
}


/* ---- CHIPS WRAP. NOTHING IS EVER CUT OFF. ----------------------------------------------------------------
   I added an edge-fade mask an hour ago so a horizontally-scrolling chip row would look scrollable. It made
   things worse: Austin read the fade as a shadow chopping the tabs, twice, and he is right that it looks
   like damage rather than an affordance. The underlying problem was never the affordance - it was that
   chips were hidden at all.
   So they wrap. Every chip is visible, nothing scrolls sideways, nothing needs a hint, and no fade can be
   mistaken for a shadow. A second row of chips costs 34px; a filter you cannot see costs you the filter.
   This overrides the earlier nowrap and mask rules on purpose and is placed after them. */
/* `.subnav` REMOVED FROM THIS LIST 2026-08-19. Wrapping is right for filter CHIPS -- a chip you cannot
   see costs you the filter -- and wrong for a fixed five-item nav strip, which needs >=433px intrinsic
   against a 430px phone and therefore wrapped on every handset, costing 40px of the vertical space this
   header is supposed to be giving back. It also silently disabled navPaint()'s scrollIntoView. It scrolls
   again below; no fade returns with it. */
.spbar,.zoo-chiprow,.oddschips,.bqst,
.zoo-sortrow,.zoo-sportrow,.zoo-catrow{
  -webkit-mask-image:none !important;
          mask-image:none !important;
  flex-wrap:wrap !important;
  overflow-x:visible !important;
  padding-right:0 !important;
  row-gap:6px}
/* The sub-nav is a short list and centring it keeps it looking deliberate when it wraps. */
.subnav{justify-content:center}
/* The float column no longer needs clearance from a scrolling row, but the LAST row of chips still must not
   sit under Ask MIDAS, so the container keeps a little room instead of the row keeping it. */
@media(max-width:768px){
  .spbar,.zoo-chiprow,.oddschips,.bqst{padding-right:0 !important}
}

/* ---- SCROLLABLE CHIP ROWS LOOK SCROLLABLE ---------------------------------------------------------------
   The league chips already scroll horizontally; nothing said so, so a fourth chip cut off at the right edge
   read as broken layout rather than as more content. A mask fades the last 28px, which is the cheapest
   honest signal available - it costs no element and cannot be mistaken for a border.
   The right padding is clearance for the float column: Ask MIDAS and the FAB sit over that corner, and a
   chip you can scroll to but not tap is not reachable. */
.spbar,.zoo-chiprow,.oddschips,.bqst{
  -webkit-mask-image:linear-gradient(to right,#000 0,#000 calc(100% - 28px),transparent 100%);
          mask-image:linear-gradient(to right,#000 0,#000 calc(100% - 28px),transparent 100%)}
.spbar{padding-right:72px;scroll-snap-type:x proximity}
.spbar>*{scroll-snap-align:start}
@media(min-width:769px){
  /* No floating column on desktop and the row usually fits, so neither the mask nor the padding earns its
     keep there. */
  .spbar{padding-right:0}
  .spbar,.zoo-chiprow,.oddschips,.bqst{-webkit-mask-image:none;mask-image:none}
}
/* The sub-nav had the same hard cut ("Odds Bo..."). Same treatment, no padding — nothing floats over it. */
.subnav{-webkit-mask-image:linear-gradient(to right,#000 0,#000 calc(100% - 24px),transparent 100%);
                mask-image:linear-gradient(to right,#000 0,#000 calc(100% - 24px),transparent 100%)}
@media(min-width:769px){.subnav{-webkit-mask-image:none;mask-image:none}}

/* ---- THE FEED STARTED 100px DOWN THE PAGE --------------------------------------------------------------- */
#feed .seghead{margin-top:4px}
#feed{padding-top:0}
.fd-note{margin:8px 0}
/* Two stacked left-bordered callouts consumed ~180px above the first post. They say related things, so they
   read as one block with a rule between rather than as two competing announcements. */
.fd-note + .fd-note{margin-top:0;border-top:1px solid var(--line);border-top-left-radius:0;
  border-top-right-radius:0}
.fd-note:has(+ .fd-note){margin-bottom:0;border-bottom-left-radius:0;border-bottom-right-radius:0}

/* ---- FEED AVATARS CANNOT COLLAPSE THE CARD -------------------------------------------------------------
   The box is reserved at 40px whatever happens: flex:0 0 40px so it never shrinks, a monogram always
   present underneath, and the image absolutely positioned on top. A src that 404s removes itself and the
   monogram is simply revealed - no broken glyph, no reflow, no text shifting out of line with the cards
   above and below it. Replies get the same treatment at 24px. */
.fd-ava{position:relative;flex:0 0 40px;width:40px;height:40px;border-radius:50%;overflow:hidden;
  background:var(--surf2,#1b1f30);display:flex;align-items:center;justify-content:center}
.fd-ava img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;border-radius:50%}
.fd-ini{font-size:14px;font-weight:800;color:var(--mut);line-height:1;user-select:none}
.fd-cmt .fd-ava{flex:0 0 24px;width:24px;height:24px}
.fd-cmt .fd-ini{font-size:11.5px}

/* ---- A SHEET YOU CAN ALWAYS LEAVE ------------------------------------------------------------------------
   The Cancel button always existed; it was not reachable. The sheet padded for the safe-area inset but
   nothing lifted it clear of the FIXED bottom tab bar, so its last row sat under 56px of chrome, and the
   FAB kept drawing on top of the Delete row.
   The floats are HIDDEN while a sheet is open rather than re-layered: a z-index argument is what produced
   this, and adding another number to it would only move the argument. */
body.sheet-open .fab,
body.sheet-open .askbubble,
body.sheet-open .addfab{display:none !important}
body.sheet-open{overflow:hidden}
.fd-picksheet,.moresheet,.obetsheet{z-index:900 !important}
/* A SHEET AND ITS BACKDROP MUST STAY ADJACENT IN THE STACK.
   The sheets above were raised to 900, and their scrims were left where they were -- .obetscrim at 120,
   which is BELOW .gcoverlay (200), .chatoverlay (300), .evsheet (310) and .toast (400). So the add-to-
   tracker sheet floated above everything while its own dimming sat under four other layers, which is the
   "modal does not sit cleanly above the boards with adequate backdrop dimming" fault. Pinning the scrims one
   level under their sheet closes the gap so nothing can render between a sheet and the backdrop that is
   supposed to be masking the page for it. */
.obetscrim,.sheetscrim{z-index:899 !important}
.fd-pick-in{
  position:relative;z-index:901;
  /* clear of the tab bar AND the home indicator, not one or the other */
  padding-bottom:calc(18px + 56px + env(safe-area-inset-bottom)) !important;
  max-height:82vh;overflow-y:auto}
@media(min-width:769px){
  /* no bottom tab bar on desktop, so do not reserve room for one */
  .fd-pick-in{padding-bottom:calc(18px + env(safe-area-inset-bottom)) !important}
}
/* Reads as draggable because it now is. */
.sheet-grip{display:block;width:36px;height:4px;border-radius:99px;background:rgba(255,255,255,.22);
  margin:0 auto 12px}
/* Destructive, and not one tap away from Report by accident. */
.fd-pick-row.fd-danger{color:var(--bad);border-color:rgba(var(--bad-rgb),.35);background:rgba(var(--bad-rgb),.06)}
.fd-pick-row.fd-danger:hover{background:rgba(var(--bad-rgb),.12)}
.fd-pick-row{min-height:48px}

/* ========== TWO PHONE BUGS FROM AUSTIN'S SCREENSHOTS, 2026-08-18 ==========================================

   1. THE HEADER IS SEE-THROUGH ON iOS. There IS a correct rule — inside @media (hover:none),(pointer:coarse)
      the header drops backdrop-filter and takes a .985 background — and roughly 21 KB further down the
      sheet another `header{...}` re-applies rgba(...,.92)/(...,.86) with !important, outside any media
      query. Later plus !important wins, so the phone got the translucent one and the sport chips and
      "High consensus" showed straight through the bar. Third time today the bug has been "the rule exists
      and a later one beats it", so this block is appended LAST on purpose.
      backdrop-filter is killed too: on iOS it is what turns a nearly-opaque bar into a window.

   2. THE WHOLE BOARD IS BLURRED UNTIL YOU OPEN A CARD. .gamegrp carries the focus curve including blur,
      with no coarse-pointer opt-out. A phone shows two or three TALL game cards, so almost every one of
      them sits in the tail of the falloff at once — which is not depth, it is a board you cannot read.
      Blur is the part that costs legibility, so on touch it goes entirely and the effect keeps opacity and
      a little scale. Desktop is unchanged: many short rows, only the far ones soften.
*/
@media (hover:none),(pointer:coarse){
  header{
    background:linear-gradient(180deg,#070a11,#05070c) !important;
    backdrop-filter:none !important;-webkit-backdrop-filter:none !important}
  body.theme-light header{
    background:linear-gradient(180deg,#f8f9fd,#f5f6fb) !important}
  .subnav{
    background:#05070c !important;
    backdrop-filter:none !important;-webkit-backdrop-filter:none !important}
  body.theme-light .subnav{background:#f5f6fb !important}

  /* NO BLUR ON TOUCH. Keep the fade and a hint of scale — the effect survives, the text stays readable. */
  .ip-game,.gamegrp,.pxg-game,
  .zt-card,.zoo-card,.trackrow,.pick,.au-row,.au-sheet.au-hero{
    filter:none !important;
    opacity:calc(.90 + .10 * var(--f,1)) !important;
    transform:scale(calc(.96 + .04 * var(--f,1))) !important}
  /* An OPEN card is being read: no treatment at all. */
  .gamegrp[open],.ip-game[open]{opacity:1 !important;transform:none !important}
}

/* ---- A RETIRED SURFACE THAT EXPLAINS ITSELF --------------------------------------------------------------
   Not an error state and not an empty state: a decision, stated. Styled calm rather than red, because
   nothing is broken and a red box invites someone to "fix" it by turning the feature back on. */
.pm-off{max-width:60ch;margin:18px auto;padding:20px 22px;border:1px solid var(--line);border-radius:14px;
  background:rgba(255,255,255,.025);text-align:left}
.pm-off-h{font-size:14px;font-weight:800;margin-bottom:9px;color:var(--txt)}
.pm-off-b{font-size:12.5px;line-height:1.65;color:var(--mut);margin-bottom:14px}
.pm-off-b b{color:var(--txt)}
body.theme-light .pm-off{background:rgba(20,30,70,.025)}

/* ---- ODDS CELLS: TARGET THE CLASS THAT ACTUALLY RENDERS --------------------------------------------------
   An earlier pass hardened `.ocell`, which is produced only by _oddsCell() -- a function with zero call
   sites. The real cell is .og-c wrapping an .obtn, so that fix was inert. Both halves, on the right class:
   the TRACK already uses minmax(0,1fr); the ITEM needs min-width:0 or it refuses to shrink below its own
   content and pushes the money column off the right edge. */
.og-c,.og-row>*{min-width:0}
.obtn{min-width:0;max-width:100%}
.obtn .ob-o{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ob-best,.ob-side{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* "not applicable", not "missing" — a dash the same weight as the muted labels around it. */
.og-na{display:flex;align-items:center;justify-content:center;color:var(--mut);opacity:.55;font-size:13px}

/* ---- EXPLAINERS ARE ONE TAP AWAY, NOT IN THE WAY ---------------------------------------------------------
   Austin: not in your face, small, near the bottom. Applies to EXPLANATIONS only -- 21+, the helpline, the
   not-betting-advice line and the Polymarket attribution all stay exactly where they are, because a
   disclosure you have to open is fine for an explanation and not fine for a disclaimer. */
.boardhow{border:1px solid var(--line);border-radius:11px;background:rgba(255,255,255,.02);margin:8px 0}
.boardhow>summary{cursor:pointer;list-style:none;padding:9px 12px;font-size:11.5px;font-weight:700;
  color:var(--mut);display:flex;align-items:center;gap:8px;min-height:38px}
.boardhow>summary::-webkit-details-marker{display:none}
.boardhow>summary::after{content:'';margin-left:auto;width:7px;height:7px;flex:none;
  border-right:1.6px solid var(--mut);border-bottom:1.6px solid var(--mut);
  transform:rotate(45deg) translateY(-2px);transition:transform .15s ease}
.boardhow[open]>summary::after{transform:rotate(-135deg) translateY(-2px)}
.boardhow>summary:hover{color:var(--txt)}
.boardhow .bh-b,.boardhow .ps-prov{display:block;padding:0 12px 11px;font-size:11.5px;line-height:1.6;
  color:var(--mut);max-width:68ch}

/* ---- THE FILTER CHIP, RESOLVED ---------------------------------------------------------------------------
   Three rules were fighting over this one element: `padding:5px 12px`, then `padding:10px 14px` with
   min-height:44px, then `padding:9px 13px` with min-height:38px, then padding-top/bottom:12px from the
   touch-target sweep. The winner was a chip with 13px sides, 12px top and bottom AND a 44px minimum height
   -- so the box was taller than its own content and the count badge sat hard against the right border with
   the label crowded left. That is the "cut off and looks wrong".
   One declaration now owns the box: symmetric padding, the 44px tap target expressed as min-height with
   the content vertically centred rather than padded to size, and a little extra room on the right whenever
   a count is present so the badge is never flush against the border. */
.chip{
  padding:0 12px !important;
  min-height:36px !important;
  display:inline-flex;align-items:center;
  white-space:nowrap;overflow:visible;
  line-height:1}
.spbar>.chip{min-height:34px !important}
.chip:has(.cnt){padding-right:9px !important}
/* The badge is a label, not a button: small, quiet, and sized by its own digits so a 4-figure count on
   History does not inflate every chip on the board. */
.cnt,.zct{
  min-width:0;height:17px;padding:0 6px;margin-left:6px;
  font-size:11.5px;line-height:17px;border-radius:5px}
/* The 44px target the review asks for is kept where it matters -- a chip you tap on a phone -- without
   inflating the same component on a desktop toolbar. */
@media(hover:none),(pointer:coarse){
  .chip{min-height:44px !important}
  .spbar>.chip{min-height:40px !important}
}

/* ======= EXTERNAL MOBILE REVIEW: remaining items ========================================================== */

/* #4  A JUMPED-TO HEADING MUST CLEAR THE PINNED STRIP.
   There was no scroll-margin anywhere in the sheet, so every in-page jump put the heading underneath the
   sticky sub-nav. One property on the scroll targets covers every tab. */
section,[id^="t-"],[id^="sec-"],.seghead{
  scroll-margin-top:calc(var(--hdr-h,56px) + var(--subnav-h,46px) + 12px)}

/* #6  THE ACTIVE-TAB INDICATOR BELONGS INSIDE THE TAB BAR.
   It was drawing outside the bar's box, which is the short amber line floating above the left edge. */
.botnav{overflow:hidden}

/* #7  THE FAB WAS PAINTING ON THE ROW ABOVE IT.
   0 16px 36px -10px rgba(255,207,77,.55) is a 36px amber glow with nothing clipping it — that is the
   "random shadow near the MLB chip". A raised button needs elevation, not a light source. */
.fab{box-shadow:0 6px 16px -4px rgba(0,0,0,.55),0 0 0 1px rgba(255,255,255,.07) !important}

/* #14 ONE ACCENT COLOUR. This blue appeared nowhere else except the footer's legal links. */
.obk-change{color:var(--gold)}

/* #16 MATCHUPS GET TWO LINES instead of clipping at 60% width with empty space to the right. */
.gname,.gt-a,.gt-h{overflow:hidden;text-overflow:ellipsis}
.gt-a,.gt-h{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;white-space:normal;
  word-break:break-word}

/* #18 THE ATTRIBUTION IS A LICENCE CONDITION, so it stays. What was wrong is that it sat at full strength
   above muted italic copy, inverting the hierarchy. Caption weight, still legible, still present. */
.pmr-attrib{font-size:11.5px;line-height:1.5;color:var(--mut);opacity:.9;margin-top:8px}

/* #19 CONTRAST. --mut was #79819b, which measures under 4.5:1 on the darkest surface in the app.
   Lifted to a value that clears AA for normal text; see the computation in the edit script. */
:root{--mut:#9aa1b8}

/* #23 ONE ACCORDION MARKER. The game and sub-category rows used a literal triangle character, which
   renders differently on every platform and rotates badly. The glyph is left in the markup (104 sites, not
   worth a migration) and simply not painted; the same drawn chevron the rest of the product uses replaces
   it, and it rotates on open. */
.chev{font-size:0 !important;width:8px;height:8px;position:relative;flex:none;
  transition:transform .15s ease}
.chev::after{content:'';position:absolute;left:0;top:1px;width:6px;height:6px;
  border-right:1.6px solid var(--mut);border-bottom:1.6px solid var(--mut);
  transform:rotate(-45deg)}
details[open]>summary>.chev{transform:rotate(90deg)}

/* #23b THE WHOLE HEADER ROW IS THE TAP TARGET, at the 44px the review asks for. */
.gamehdr,.subhdr{min-height:44px}

/* #26 THREE BALANCE PILLS, ONE SHAPE. The coin pill had a border and a glow, the gem pill did not, and the
   ticket pill was a different height again — all three sitting next to each other in the header. */
.dw-bal,.tdaybtn{
  display:inline-flex;align-items:center;gap:6px;
  height:30px;padding:0 11px;border-radius:999px;
  font-size:12.5px;font-weight:700;font-variant-numeric:tabular-nums;
  border:1px solid rgba(255,255,255,.14);background:rgba(255,255,255,.05);
  box-shadow:none}
.dw-coin{color:var(--gold-hi);border-color:rgba(255,207,106,.34);background:rgba(255,207,106,.10)}
.dw-dia{color:var(--info);border-color:rgba(var(--info-rgb),.32);background:rgba(var(--info-rgb),.10)}
.tdaybtn{color:var(--txt)}
.dw-bal .cn-ic,.dw-bal .dw-ico,.tdaybtn img{width:15px;height:15px;flex:none}

/* ---- ODDS BOARD CELLS CAN SHRINK ------------------------------------------------------------------------
   .og-row already declares minmax(0,1fr) on the three price columns, which is the half of this that stops
   the TRACK from refusing to shrink. The other half was never done: a grid ITEM also defaults to
   min-width:auto, so each cell still refused to go below its own content width and pushed the money column
   past the right edge on a narrow screen. Both halves are needed -- fixing the track alone is why this
   looked fixed and was not.
   The book tag ellipsises rather than truncating mid-glyph, so "FanDuel" degrades legibly. */
.ocell,.og-row>*{min-width:0}
.ocell{overflow:hidden;text-overflow:ellipsis}
.ocell .bk,.ocell .booktag,.ocell small{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
@media(max-width:420px){
  /* At this width three price columns and a matchup do not coexist; the matchup gives up its minimum
     first because it is the one that can wrap onto a second line without losing meaning. */
  .og-row{grid-template-columns:minmax(64px,1.2fr) minmax(0,1fr) minmax(0,1fr) minmax(0,1fr);gap:4px}
  .ocell{font-size:12px}
}

/* ---- CHIP COUNTS ARE A BADGE, NOT A NUMBER GLUED TO A WORD ----------------------------------------------
   `.cnt` had NO rule anywhere in the sheet, so "MLB 7" and "Spain Segunda Division 1" rendered the count at
   the same size and colour as the label with a single literal space holding them apart -- at 12px on a
   phone that reads as "MLB7". The Zoo already solved this with .zct; the two are unified here so a count
   looks the same everywhere it appears, which is what the review asked for.
   font-variant-numeric:tabular so a chip does not change width when its count ticks 9 -> 10. */
.cnt,.zct{
  display:inline-flex;align-items:center;justify-content:center;
  margin-left:7px;padding:1px 6px;min-width:18px;
  font-size:11.5px;font-weight:800;line-height:1.5;
  font-variant-numeric:tabular-nums;
  color:var(--mut);background:rgba(255,255,255,.08);
  border-radius:6px;opacity:.9}
.chip.on .cnt,.zchip.on .zct{background:rgba(0,0,0,.22);color:inherit;opacity:.85}
body.theme-light .cnt,body.theme-light .zct{background:rgba(20,30,70,.09)}

/* ---- THE FILTER ROW STOPS RUNNING OFF THE SCREEN --------------------------------------------------------
   The bot filter carries an inline style='width:210px', which beats any stylesheet rule that is not
   !important. 210px + gap + the "High consensus" chip does not fit beside itself on a 390pt phone, so the
   chip was pushed to the edge and clipped mid-word. On a phone the select takes its own full-width line,
   which is what a 210px control wants to be at that width anyway.
   min-width:0 on the children because a flex item defaults to min-width:auto and refuses to shrink below
   its content -- the single most common cause of a row overflowing rather than wrapping. */
.bets-ctrl{width:100%}
.bets-ctrl>*{min-width:0;max-width:100%}
.bets-cons{white-space:nowrap}
@media(max-width:560px){
  #bets-bot{width:100% !important;flex:1 1 100%}
}
/* A SELECT SHOULD LOOK LIKE A SELECT. It was rendering as a plain text field, so nothing said it could be
   opened. Chevron is an inline data URI -- no extra request, and the CSP blocks external ones anyway. */
select.tinput{
  appearance:none;-webkit-appearance:none;
  padding-right:30px;cursor:pointer;
  background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%238aa2b8' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");
  background-repeat:no-repeat;background-position:right 9px center;background-size:14px}
select.tinput:hover{border-color:rgba(var(--gold-rgb),.45)}

/* ---- THE PHONE NAV WAS HIDDEN AND THEN SILENTLY PUT BACK ------------------------------------------------
   @media(max-width:768px){.nav{display:none}} exists and is correct. Further down the sheet sits
   `.bar>div:has(> .navg){display:inline-flex; border:...}` — which is THE SAME ELEMENT reached by a more
   specific selector, declared later, outside any media query. So it won on every phone and the duplicate
   nav came back, wearing a border: five destinations in the header and the identical five in the bottom
   tab bar, ~700px apart on the same screen. When it wrapped, the container's border drew around the empty
   grid track too, which is the "broken 4+1 grid" in the review.
   The bottom tab bar IS the phone navigation. Both selectors are hidden together here, after the rule that
   was overriding them, so a future reader cannot fix one and miss the other.
   On desktop it stays a single row that scrolls rather than wrapping — a bordered container must never be
   allowed to wrap, because the border then outlines space with nothing in it. */
@media(max-width:768px){
  .nav,.bar>div:has(> .navg){display:none !important}
}
.nav,.bar>div:has(> .navg){flex-wrap:nowrap;max-width:100%;overflow-x:auto;scrollbar-width:none}
.nav::-webkit-scrollbar,.bar>div:has(> .navg)::-webkit-scrollbar{display:none}

/* ---- THE PRACTICE SCOREBOARD ------------------------------------------------------------------------------
   A board, not a card: darker than the page rather than lighter, a gold rim, and a faint scanline so it
   reads as a lit panel. Digits are tabular and monospaced so a number changing does not reflow the cell it
   sits in -- the single most important property of a scoreboard is that it holds still. */
.sb{position:relative;overflow:hidden;border-radius:18px;padding:14px 14px 12px;margin:0 0 10px;
  background:linear-gradient(180deg,#0a0d18,#0d1120);
  border:1px solid rgba(var(--gold-rgb),.30);
  box-shadow:inset 0 1px 0 rgba(var(--gold-rgb),.10), 0 18px 40px -30px rgba(0,0,0,.9)}
.sb::after{content:'';position:absolute;inset:0;pointer-events:none;border-radius:18px;
  background:repeating-linear-gradient(0deg,rgba(255,255,255,.028) 0 1px,transparent 1px 3px)}
.sb-top{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:11px}
.sb-name{font-size:11.5px;font-weight:800;letter-spacing:.18em;text-transform:uppercase;color:var(--gold)}
.sb-open{display:inline-flex;align-items:center;gap:6px;font-size:11.5px;font-weight:700;color:var(--mut)}
.sb-dot{width:6px;height:6px;border-radius:50%;background:var(--bad);display:inline-block}
.sb-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:1px;background:rgba(255,255,255,.07);
  border-radius:12px;overflow:hidden}
.sb-cell{background:#0b0f1c;padding:10px 11px;display:flex;flex-direction:column;gap:3px;min-width:0}
.sb-cell i{font-style:normal;font-size:11px;font-weight:800;letter-spacing:.13em;text-transform:uppercase;
  color:var(--mut);display:flex;align-items:center;gap:5px;white-space:nowrap;overflow:hidden}
.sb-cell i svg{width:11px;height:11px;flex:none}
.sb-cell b{font:800 22px/1.05 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
  font-variant-numeric:tabular-nums;letter-spacing:-.01em;
  text-shadow:0 0 14px rgba(var(--gold-rgb),.22);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.sb-cell b.pos{color:var(--good);text-shadow:0 0 14px rgba(var(--good-rgb),.30)}
.sb-cell b.neg{color:var(--bad);text-shadow:0 0 14px rgba(var(--bad-rgb),.30)}
.sb-cell s{text-decoration:none;font-size:11.5px;color:var(--mut);white-space:nowrap;overflow:hidden;
  text-overflow:ellipsis;display:flex;gap:3px;align-items:center}
.sb-p{font-style:normal;font-weight:800;font-size:11px;width:13px;height:13px;border-radius:3px;
  display:inline-flex;align-items:center;justify-content:center;background:rgba(255,255,255,.06)}
.sb-p.pos{color:var(--good)}.sb-p.neg{color:var(--bad)}
@media(max-width:640px){
  /* Two by two rather than four across: four cells on a 375px screen gives each one 84px, and a six-figure
     bankroll does not fit in 84px without ellipsising the number that matters most. */
  .sb-grid{grid-template-columns:1fr 1fr}
  .sb-cell b{font-size:19px}
}
/* ---- GAME TILES ------------------------------------------------------------------------------------------- */
.sb-games{display:grid;grid-template-columns:repeat(auto-fit,minmax(178px,1fr));gap:9px;margin-bottom:10px}
.sbg{display:flex;flex-direction:column;align-items:flex-start;gap:5px;text-align:left;cursor:pointer;
  padding:13px 13px 12px;border-radius:15px;color:var(--txt);
  background:linear-gradient(180deg,rgba(255,255,255,.055),rgba(255,255,255,.022));
  border:1px solid rgba(255,255,255,.11);transition:border-color .13s,transform .1s,background .13s}
.sbg:hover{border-color:rgba(var(--gold-rgb),.5);background:linear-gradient(180deg,rgba(var(--gold-rgb),.10),rgba(255,255,255,.03))}
.sbg:active{transform:scale(.985)}
.sbg-ic{font-size:22px;line-height:1}
.sbg b{font-size:14px;font-weight:800}
.sbg small{font-size:11px;line-height:1.4;color:var(--mut)}
.sbg-go{margin-top:6px;font-size:11.5px;font-weight:800;letter-spacing:.04em;padding:5px 13px;border-radius:999px;
  background:var(--gold);color:var(--gold-bg)}
.sbg-soon{opacity:.72}
.sbg-soon .sbg-go{background:rgba(255,255,255,.09);color:var(--mut)}
.sbg-soon:hover{border-color:rgba(255,255,255,.16);background:linear-gradient(180deg,rgba(255,255,255,.055),rgba(255,255,255,.022))}
body.theme-light .sb{background:linear-gradient(180deg,#12172a,#171d33)}
body.theme-light .sb-cell{background:#131829}
body.theme-light .sb-cell b{color:#f3f6ff}
body.theme-light .sb-name{color:#ffd166}
body.theme-light .sbg{background:linear-gradient(180deg,rgba(20,30,70,.05),rgba(20,30,70,.02));
  border-color:rgba(20,30,70,.12)}
@media(prefers-reduced-motion:reduce){.sbg:active{transform:none}}

/* ---- STICKERS + FADE ------------------------------------------------------------------------------------- */
.fd-st{width:30px;height:30px;vertical-align:-8px;margin:0 3px}
.st-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(78px,1fr));gap:8px;max-height:46vh;overflow-y:auto}
.st-cell{display:flex;flex-direction:column;align-items:center;gap:5px;padding:9px 5px;cursor:pointer;
  background:rgba(255,255,255,.03);border:1px solid rgba(255,255,255,.08);border-radius:12px;
  color:var(--mut);font:600 10px/1.2 inherit;transition:border-color .12s,background .12s}
.st-cell:hover{border-color:rgba(var(--gold-rgb),.45);background:rgba(255,255,255,.06);color:var(--txt)}
.st-cell img{width:40px;height:40px}
.st-cell span{text-align:center}
/* A fade is a position, so it gets its own colour rather than the danger red a dislike would take. */
.fd-fade.on{color:var(--info)}
.fd-fade.on .ti{stroke:var(--info)}
.fd-like.on{color:var(--bad)}
body.theme-light .st-cell{background:rgba(20,30,70,.03);border-color:rgba(20,30,70,.09)}

/* ---- A DAY'S BETS, GROUPED BY LEAGUE --------------------------------------------------------------------- */
.pf-lgrp{margin:8px 0 0;border:1px solid rgba(255,255,255,.06);border-radius:11px;overflow:hidden;
  background:rgba(255,255,255,.018)}
.pf-lgrph{display:flex;align-items:baseline;gap:9px;padding:7px 11px;
  border-bottom:1px solid rgba(255,255,255,.055);font-variant-numeric:tabular-nums}
.pf-lgn{flex:1;min-width:0;font-size:11.5px;font-weight:800;letter-spacing:.08em;text-transform:uppercase;
  color:var(--gold);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.pf-lgm{font-size:11px;color:var(--mut);font-weight:700}
.pf-lgu{font-size:12px;font-weight:800}
body.theme-light .pf-lgrp{background:rgba(20,30,70,.02);border-color:rgba(20,30,70,.08)}
body.theme-light .pf-lgrph{border-bottom-color:rgba(20,30,70,.07)}
/* ---- THE COMPOSER AS AN INVITATION ----------------------------------------------------------------------- */
.fd-comp-invite{align-items:flex-start}
.fd-comp-mid{flex:1;min-width:0;display:flex;flex-direction:column;gap:5px}
.fd-comp-hints{display:flex;flex-wrap:wrap;gap:6px;align-items:center}
.fd-comp-hints span{display:inline-flex;align-items:center;gap:5px;font-size:11.5px;font-weight:700;
  color:var(--mut);background:rgba(255,255,255,.045);border:1px solid rgba(255,255,255,.08);
  border-radius:999px;padding:3px 9px}
.fd-comp-hints .ti{width:13px;height:13px}
.fd-comp-priv{background:none !important;border-color:transparent !important;font-weight:600 !important;
  opacity:.75}
body.theme-light .fd-comp-hints span{background:rgba(20,30,70,.035);border-color:rgba(20,30,70,.09)}

/* ---- FLOATS NEVER SIT ON CONTENT, AND NEVER ON THE HELPLINE ---------------------------------------------
   External review found the FAB covering the 1-800-GAMBLER line. That is a compliance problem rather than a
   polish one: the responsible-gambling line has to be readable on every screen it appears on.
   The two floats stack vertically instead of sitting side by side, and the footer reserves enough room
   underneath that neither can ever land on it. */
.askbubble{bottom:calc(96px + env(safe-area-inset-bottom)) !important;right:18px !important}
footer.sitefoot{padding-bottom:calc(104px + env(safe-area-inset-bottom))}
@media(max-width:768px){
  /* The bottom tab bar is also in play on a phone, so the stack starts above it. */
  .fab{bottom:calc(86px + env(safe-area-inset-bottom)) !important}
  .askbubble{bottom:calc(152px + env(safe-area-inset-bottom)) !important}
  footer.sitefoot{padding-bottom:calc(168px + env(safe-area-inset-bottom))}
}
/* ---- FEED: people, then bots ---------------------------------------------------------------------------- */
.fd-who{display:flex;flex-wrap:wrap;gap:6px;margin:10px 0 4px}
.fd-band{margin:16px 0 8px;font-size:11.5px;font-weight:800;letter-spacing:.09em;text-transform:uppercase;
  color:var(--mut);display:flex;align-items:baseline;gap:7px}
.fd-band .mut{font-size:11.5px;letter-spacing:.02em;text-transform:none;font-weight:600}
.fd-empty{padding:22px 16px;text-align:center;font-size:12.5px;color:var(--mut);
  border:1px dashed var(--line);border-radius:12px;margin:8px 0}

/* ---- THE ZOO AS A SHOWCASE -------------------------------------------------------------------------------
   The avatar is the point of a zoo, so it leads at 56px instead of 30. Under it the lifetime curve, then the
   three windows, then the numbers. Everything here was already in the /zoo payload and simply was not drawn. */
.zoo-card.zshow{display:flex;flex-direction:column;gap:9px}
.zshow .zoo-top{display:flex;align-items:center;gap:11px}
.zshow .zav{flex:none;width:56px;height:56px;border-radius:16px;overflow:hidden;
  background:rgba(255,255,255,.05);border:1px solid rgba(255,255,255,.10);
  display:flex;align-items:center;justify-content:center}
.zshow .zav .zoo-ava{width:100%;height:100%;object-fit:cover;border-radius:0;margin:0;
  display:flex;align-items:center;justify-content:center;font-size:26px;background:none}
.zshow .zoo-nm{font-size:14.5px;font-weight:800;display:flex;align-items:center;gap:7px;flex-wrap:wrap}
.zshow .zoo-method{margin-top:2px}
/* THE CURVE. preserveAspectRatio:none stretches the path to the card width, which is why every stroke below
   carries vector-effect:non-scaling-stroke -- without it the line thins horizontally and thickens
   vertically as the card resizes, and a 300-card grid shows every width at once. */
.zsp-wrap{position:relative;background:rgba(255,255,255,.028);border:1px solid rgba(255,255,255,.06);
  border-radius:10px;padding:7px 9px 5px}
.zsp{display:block;width:100%;height:34px}
.zsp-cap{display:block;margin-top:3px;font-size:11px;letter-spacing:.06em;text-transform:uppercase;
  color:var(--mut);opacity:.8}
/* 7d / 30d / LIFE. Equal columns so the eye compares straight across three cards, not three layouts. */
.zwins{display:grid;grid-template-columns:repeat(3,1fr);gap:6px}
.zwc{display:flex;flex-direction:column;gap:1px;padding:6px 8px;border-radius:9px;
  background:rgba(255,255,255,.025);border:1px solid rgba(255,255,255,.055);
  font-variant-numeric:tabular-nums}
.zwc i{font-style:normal;font-size:11px;letter-spacing:.07em;text-transform:uppercase;color:var(--mut)}
.zwc b{font-size:13.5px;font-weight:800}
.zwc s{text-decoration:none;font-size:11.5px;color:var(--mut)}
body.theme-light .zsp-wrap,body.theme-light .zwc{background:rgba(20,30,70,.028);border-color:rgba(20,30,70,.08)}
body.theme-light .zshow .zav{background:rgba(20,30,70,.04);border-color:rgba(20,30,70,.10)}
@media(max-width:560px){
  .zshow .zav{width:46px;height:46px;border-radius:13px}
  .zshow .zav .zoo-ava{font-size:21px}
  .zwc b{font-size:12.5px}
  .zsp{height:30px}
}

/* ---- THE BOARD AS NESTED BUBBLES ------------------------------------------------------------------------
   .sport had been flattened to nothing (border:0, background:none, border-radius:0, all !important) while
   .gamegrp inside it carried a full surface -- so the child read as more of a container than its parent,
   and the board became one undifferentiated column with no sense of which league you were looking at.
   The sport is the sheet and the market is the tile inside it, same idiom as .au-sheet: translucent white,
   hairline, generous radius; the market smaller and fainter so the nesting reads without a label.
   !important throughout because the rules being overridden use it. */
.sport{
  background:rgba(255,255,255,.045) !important;
  border:1px solid rgba(255,255,255,.10) !important;
  border-radius:16px !important;
  padding:5px !important;
  margin:0 0 10px !important;
  overflow:hidden !important}
.gamegrp{
  background:rgba(255,255,255,.028) !important;
  border:1px solid rgba(255,255,255,.07) !important;
  border-radius:11px !important;
  margin:4px !important}
/* An open market BRIGHTENS rather than changing shape or size, so opening one does not reflow the group
   around it and lose your place. */
.gamegrp[open]{
  background:rgba(255,255,255,.055) !important;
  border-color:rgba(255,255,255,.13) !important}
.gamegrp>.gamehdr{border-radius:10px !important}
/* The sub-category strip is a divider inside a tile, not another box. */
.subcat{border:0 !important;background:none !important;border-radius:0 !important}
body.theme-light .sport{
  background:rgba(20,30,70,.030) !important;border-color:rgba(20,30,70,.10) !important}
body.theme-light .gamegrp{
  background:rgba(20,30,70,.022) !important;border-color:rgba(20,30,70,.08) !important}
body.theme-light .gamegrp[open]{
  background:rgba(20,30,70,.045) !important;border-color:rgba(20,30,70,.13) !important}

/* ==========================================================================================================
   EVERY EDGE FADE, GONE. APPENDED LAST ON PURPOSE.
   ==========================================================================================================
   Two findings, and the second explains why the first kept coming back.

   1. The both-sides fade Austin has reported three times is NOT the mask I added this morning. It is
      `.subnav-in, .filters, .jumpbar, .spbar, .shopbar { mask-image: linear-gradient(90deg, transparent 0,
      #000 14px, #000 calc(100% - 14px), transparent) }` -- an older rule that fades BOTH ends of the row.
      That is why removing my right-edge mask only half-fixed it: I was removing the wrong one.

   2. Every CSS block appended today was inserted immediately after `CSS += GROUPED_CSS`, which means each
      new block landed BEFORE the previously appended ones. Newer rules have been losing to older ones all
      day, silently. That is how my own mask survived my own removal of it, twenty minutes ago.
      This block is appended after the LAST existing block instead, so it genuinely wins.

   A fade at the edge of a control row reads as damage, not as an affordance. The rows wrap now, so there is
   nothing off-screen for an affordance to point at. */
.subnav-in,.filters,.jumpbar,.spbar,.shopbar,.chiprow,
.zoo-chiprow,.zoo-catrow,.zoo-sportrow,.zoo-sortrow,
.oddschips,.bqst,.subnav,.evtabs,.spp-fam,.setseg,.setfmt{
  -webkit-mask-image:none !important;
          mask-image:none !important;
  flex-wrap:wrap !important;
  overflow-x:visible !important;
  row-gap:6px}
.subnav,.subnav-in{justify-content:center}

/* ==========================================================================================================
   THE TOP OF THE PAGE, COMPACTED. Appended last so it actually applies.
   ==========================================================================================================
   Measured before touching anything: .bar carried 9px of padding top and bottom around a 34px logo, .navg
   another 8px above and below its label, and the sub-nav its own padding on top of that. Three stacked
   bands each paying for their own breathing room, so ~130px of chrome sat above the first line of content
   on desktop and the phone lost a third of a small screen before anything useful appeared.

   Austin's word for it is negative space and that is exactly right: none of that height carries
   information. The logo does not need 9px of air when it is already 34px tall, and a nav label does not
   need 16px of vertical padding to be tappable when the row itself is 40px.

   The 44px touch target is NOT sacrificed - it is expressed as min-height on the row rather than as padding
   around the text, which is the same finger target in less space. That distinction is the whole trick here.

   Desktop and phone both, because Austin reported the dead space on both. */
.bar{padding:5px 14px !important;gap:8px;min-height:46px}
header{border-bottom:1px solid var(--line)}

/* The nav row: label padding down, row height held. */
.nav{margin-top:0 !important}
.navg{padding:6px 14px !important;min-height:34px;display:inline-flex;align-items:center}
.bar>div:has(> .navg){margin-top:2px}

/* The sub-nav was paying for a third band of padding under the first two. */
.subnav{padding:5px 0 !important;min-height:38px}
.subtab,.subnav a,.subnav span{padding-top:5px !important;padding-bottom:5px !important}

/* Section headings then added their own gap immediately below all of that. */
.seghead{padding-top:4px !important;margin-bottom:8px}

@media(max-width:768px){
  /* No nav row on a phone (the bottom bar is the navigation), so the header is a single band and can be
     tighter still. The 44px target lives on the controls inside it, not on the bar. */
  .bar{padding:4px 10px !important;min-height:44px}
  .subnav{padding:4px 0 !important;min-height:36px}
  .seghead{padding-top:2px !important;margin-bottom:6px}
  .logo{margin-right:6px}
}

/* ---- THE FILTER ROW IS A FILTER, NOT A WALL -------------------------------------------------------------
   60+ leagues wrapped to twelve rows of chips above the content. Ten are shown, ordered with the leagues
   people actually filter to first; the rest are behind one tap that says how many there are. */
.filters.sp-collapsed .sp-x{display:none}
.sp-toggle{cursor:pointer;font-family:inherit;color:var(--gold);
  border-color:rgba(var(--gold-rgb),.45);background:rgba(var(--gold-rgb),.07)}
.sp-toggle:hover{background:rgba(var(--gold-rgb),.14)}
/* THE ACTIVE CHIP IS SOLID. `.chip .cnt{opacity:.6}` outranks the plain `.cnt` rule on specificity, so the
   count sat at 60% inside a filled gold chip and read as washed out - which is what "the yellow tab looks
   faded" was. Nothing translucent survives on the selected state. */
.chip.on{background:var(--gold) !important;color:var(--gold-bg) !important;border-color:var(--gold) !important;
  font-weight:800}
.chip.on .cnt{background:rgba(0,0,0,.24) !important;color:var(--gold-bg) !important;opacity:1 !important}
.chip .cnt{opacity:1}
body.theme-light .chip.on{color:#1a1200 !important}

/* Small, always visible, never behind a disclosure - it is a legal notice, not an explanation. */
.foot-juris{max-width:74ch;margin:8px auto 0;font-size:11.5px;line-height:1.55;color:var(--mut);
  text-align:center}
.foot-juris b{color:var(--txt);font-weight:700}

/* The second filter row folds the same way as the league row: search and the four statuses stay, the
   eleven narrower chips are one tap away. ~75 buttons above the first bet was the actual complaint. */
.filters.flt-collapsed .flt-x{display:none}
.flt-toggle{cursor:pointer;font-family:inherit;color:var(--gold);
  border-color:rgba(var(--gold-rgb),.45);background:rgba(var(--gold-rgb),.07)}
.flt-toggle:hover{background:rgba(var(--gold-rgb),.14)}

/* ==========================================================================================================
   THE HEADER, MADE ONE THING. Appended last.
   ==========================================================================================================
   Three times now the note has been that the top feels thrown together, and three times I trimmed padding,
   which was answering the wrong question. The problem is not height, it is that the row is five unrelated
   objects: a 34px logo, a bordered-and-tinted coin pill, an untinted gem pill, a ticket button of a third
   height, a round avatar with a badge, and a bare gear icon. Six shapes, six sizes, no shared rule --
   which is exactly what "thrown together" describes, and no amount of tightening fixes it.

   So every control in the bar is now ONE shape: 30px tall, same radius, same border weight, same gap. The
   only thing allowed to differ is colour, because colour is carrying meaning (gold = coins, cyan = gems).

   ON A PHONE the row also gets shorter by removing what is duplicated elsewhere rather than by shrinking
   what stays: diamonds are a cosmetic currency that lives on Practice and the Shop, and nobody acts on the
   number mid-session. Coins stay because a practice balance is the one figure people glance at. */
header .bar{display:flex;align-items:center;gap:8px}

/* ONE SHAPE FOR EVERYTHING IN THE BAR. */
.bar .dw-bal,
.bar .tdaybtn,
.bar .hdr-gear,
.bar .who .who-me{
  height:30px;min-height:30px;
  border-radius:999px;
  display:inline-flex;align-items:center;justify-content:center;
  padding:0 10px;
  font-size:12.5px;font-weight:700;line-height:1;
  border:1px solid rgba(255,255,255,.13);
  background:rgba(255,255,255,.05);
  box-shadow:none}
.bar .hdr-gear{width:30px;padding:0}
.bar .dw-coin{color:var(--gold-hi);border-color:rgba(255,207,106,.34);background:rgba(255,207,106,.10)}
.bar .dw-dia{color:var(--info);border-color:rgba(var(--info-rgb),.32);background:rgba(var(--info-rgb),.10)}
.bar .dw-bal svg,.bar .dw-bal .dw-ico{width:14px;height:14px;flex:none}
.bar .who .who-avwrap,.bar .who img{width:22px;height:22px;border-radius:50%}

@media(max-width:768px){
  /* Fewer objects, not smaller ones. */
  .bar .dw-dia{display:none !important}
  .bar{min-height:48px;padding:5px 10px !important;gap:7px}
  .logo{margin-right:4px}
  /* The notification badge sits ON the avatar rather than between two controls. */
  .who .who-me{position:relative}
}

/* ==========================================================================================================
   EVERY EDGE FADE, ENUMERATED AND KILLED. Appended last.
   ==========================================================================================================
   I removed these three times by naming selectors from memory and missed some every time, which is why the
   fade kept reappearing on "a few tabs". This list came from parsing the built stylesheet for every
   mask-image rule instead of guessing:

       .subnav-in                                     both-sided 90deg fade
       .subnav-in,.filters,.jumpbar,.spbar,.shoptabrow,.oddsbar   both-sided 90deg fade
       .evbody                                        VERTICAL 180deg fade, top and bottom
       .spbar,.zoo-chiprow,.oddschips,.bqst           my right-edge fade
       .subnav                                        my right-edge fade

   My previous kill-list said `.shopbar`; the real class is `.shoptabrow`. It never covered `.oddsbar` or
   `.evbody` at all. That is the Shop, the Odds Board and the event panels - exactly the tabs still showing
   it.

   .reel-window KEEPS its mask deliberately: that is the spin wheel, where the fade is the effect rather
   than an accident.

   Rows wrap now, so nothing is off-screen for a fade to hint at. */
.subnav-in,.subnav,.filters,.jumpbar,.spbar,.shoptabrow,.shopbar,.oddsbar,.evbody,
.chiprow,.zoo-chiprow,.zoo-catrow,.zoo-sportrow,.zoo-sortrow,
.oddschips,.bqst,.evtabs,.spp-fam,.setseg,.setfmt,.calfilter{
  -webkit-mask-image:none !important;
          mask-image:none !important}
/* The horizontal ones also wrap, so nothing is hidden rather than merely un-hinted. */
.subnav-in,.subnav,.filters,.jumpbar,.spbar,.shoptabrow,.shopbar,.oddsbar,
.chiprow,.zoo-chiprow,.zoo-catrow,.zoo-sportrow,.zoo-sortrow,
.oddschips,.bqst,.evtabs,.calfilter{
  flex-wrap:wrap !important;overflow-x:visible !important;row-gap:6px}

/* The bet-type group became a <details>, so it needs the same summary treatment as every other group:
   no default marker, a chevron that turns, whole header as the tap target. */
.cbt-grp>summary{cursor:pointer;list-style:none;display:flex;align-items:center;gap:8px;min-height:40px}
.cbt-grp>summary::-webkit-details-marker{display:none}
.cbt-grp>summary::after{content:'';margin-left:auto;width:7px;height:7px;flex:none;
  border-right:1.6px solid var(--mut);border-bottom:1.6px solid var(--mut);
  transform:rotate(45deg) translateY(-2px);transition:transform .15s ease}
.cbt-grp[open]>summary::after{transform:rotate(-135deg) translateY(-2px)}
.cald-sport>summary{min-height:44px}

/* ==========================================================================================================
   THE DISSOLVE, FINISHED
   ----------------------------------------------------------------------------------------------------------
   The scroll-focus curve writes --f per element: 1 at the centre of the screen, 0 at the edges. One of the
   two rule sets that carries it already had its blur killed. This one did not, and `.gamegrp` is a game
   group on Today's board -- which is why picks rendered blurred there and nowhere else. Four rounds of edge
   masks could never have fixed it, because it was never an edge mask.

   Blur is gone rather than reduced. It has been raised three times, and 0.9px of blur on a page whose
   content is prices and records costs legibility to buy atmosphere.

   The floor moves .84 -> .94 and the scale .89 -> .985 for a different reason: the observer measures
   against the viewport, so anything inside a display:none section measures as off-screen and gets written
   f=0. At .84 and .89 such an element looks broken. At .94 and .985 nobody can tell. midasRefocus() fixes
   the cause; these numbers make the failure invisible on the occasions it still happens.
   ========================================================================================================== */
.zt-card,.zoo-card,.trackrow,.pick,.au-row,.au-sheet.au-hero,
.ip-game,.gamegrp,.pxg-game{
  filter:none !important;
  opacity:calc(.94 + .06 * var(--f,1)) !important;
  transform:scale(calc(.985 + .015 * var(--f,1))) translateY(calc((1 - var(--f,1)) * 3px)) !important;
}
/* An open card is being read, not scrolled past. */
.gamegrp[open],.ip-game[open]{opacity:1 !important;transform:none !important}
@media (prefers-reduced-motion: reduce){
  .zt-card,.zoo-card,.trackrow,.pick,.au-row,.au-sheet.au-hero,
  .ip-game,.gamegrp,.pxg-game{opacity:1 !important;transform:none !important}
}

/* ==========================================================================================================
   THE COLLAPSE CONTROL
   Same shape everywhere it appears, because it is the same control everywhere it appears. Sized to the chip
   rows it sits in so it reads as one of them rather than a button bolted on the end.
   ========================================================================================================== */
.cx-h{display:none !important}
.cx-btn{
  flex:0 0 auto;cursor:pointer;font:inherit;font-size:12px;font-weight:700;
  padding:6px 12px;border-radius:999px;
  border:1px dashed var(--line);
  background:transparent;color:var(--mut);
  letter-spacing:.01em;white-space:nowrap;
  min-height:32px;
}
.cx-btn:hover{color:var(--txt);border-color:rgba(var(--gold-rgb),.42);border-style:solid}
.cx-btn:focus-visible{outline:2px solid rgba(var(--gold-rgb),.55);outline-offset:2px}
/* In a stacked list the control is a full-width row, not a chip floating off the end of the last card. */
.ip-list>.cx-btn{display:block;width:100%;margin-top:8px;text-align:center}
@media(max-width:640px){.cx-btn{font-size:11.5px;padding:6px 10px}}

/* ---- SIGN-IN THAT IS OFF, RATHER THAN ABSENT ---------------------------------------------------------------
   Muted, not red. The visitor can still sign in with a username; only one OPTION is missing, and a red box
   would report a broken site to somebody whose next action works fine. */
.ck-off{font-size:12px;line-height:1.6;color:var(--mut);background:rgba(255,255,255,.025);
  border:1px solid var(--line);border-radius:10px;padding:10px 12px;margin:0 0 12px;text-align:left}

/* ---- FOLLOW @TrackMidas ------------------------------------------------------------------------------------
   Footer: one line, same weight as the links beside it. It is an invitation, not an announcement. */
.foot-social{font-size:var(--fs-1);color:var(--mut);line-height:1.7;margin:0 0 6px}
.foot-social a{color:var(--gold,var(--gold));text-decoration:none;font-weight:700}
.foot-social a:hover{text-decoration:underline}

/* Feed card: sits with the other feed notes, and can be dismissed for good. A promo you cannot turn off is an
   advertisement inside a product somebody is paying for. */
.fd-xcard{display:flex;align-items:center;gap:10px}
.fd-xi{flex:0 0 auto;font-size:15px;font-weight:800;line-height:1;color:var(--txt);
  width:26px;height:26px;display:grid;place-items:center;border:1px solid var(--line);border-radius:8px;
  background:rgba(255,255,255,.03)}
.fd-xt{flex:1;min-width:0}
.fd-xcard a{color:var(--gold,var(--gold));font-weight:700;text-decoration:none;white-space:nowrap}
.fd-xcard a:hover{text-decoration:underline}
.fd-xx{flex:0 0 auto;cursor:pointer;background:transparent;border:0;color:var(--mut);
  font-size:17px;line-height:1;padding:4px 6px;border-radius:6px;font-family:inherit}
.fd-xx:hover{color:var(--txt);background:rgba(255,255,255,.06)}

/* ---- FREE-TIER PREVIEW BANNER ------------------------------------------------------------------------------
   Bottom, not top: the header is already the most contested 100px on the page, and this is a mode indicator
   rather than an alert. Above the tab bar so it never covers navigation. */
#freebar{position:fixed;left:0;right:0;bottom:0;z-index:880;
  display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;
  padding:11px 16px calc(11px + env(safe-area-inset-bottom));
  background:rgba(var(--gold-rgb),.10);border-top:1px solid rgba(var(--gold-rgb),.35);
  backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);
  font-size:12px;line-height:1.55;color:var(--txt)}
#freebar b{color:var(--gold,var(--gold));font-weight:800;white-space:nowrap}
#freebar .fb-s{flex:1;min-width:200px;color:var(--mut)}
#freebar .fb-x{flex:0 0 auto;color:var(--txt);font-weight:700;text-decoration:none;
  border:1px solid var(--line);border-radius:999px;padding:5px 12px;background:rgba(0,0,0,.25)}
#freebar .fb-x:hover{border-color:rgba(var(--gold-rgb),.5)}
/* Clear the banner AND the tab bar, so the last row of content is never trapped underneath both. */
body.has-freebar{padding-bottom:96px}
@media(max-width:640px){
  #freebar{bottom:calc(56px + env(safe-area-inset-bottom));padding-bottom:11px}
  body.has-freebar{padding-bottom:150px}
}

/* ---- A GATED FEATURE, STATED PLAINLY ----------------------------------------------------------------------
   Not a blur, not a teaser with the numbers half-visible behind a gradient. Those are the pattern people have
   learned to resent, and on a product whose whole claim is honesty, obscuring real numbers to sell access to
   them is the wrong instinct twice over. Say what it is, say what is still free, offer the upgrade once. */
.prolock{border:1px solid var(--line);border-radius:14px;padding:18px 20px;margin:10px 0 16px;
  background:rgba(255,255,255,.022);max-width:62ch}
.pl-h{font-size:14px;font-weight:800;color:var(--txt);margin-bottom:7px}
.pl-b{font-size:12.5px;line-height:1.65;color:var(--mut);margin-bottom:10px}
.pl-free{font-size:11.5px;line-height:1.6;color:var(--mut);margin-bottom:13px;
  padding-left:10px;border-left:2px solid rgba(var(--gold-rgb),.35)}
.pl-free b{color:var(--txt)}
body.theme-light .prolock{background:rgba(20,30,70,.025)}

/* The research cap note sits with the results it describes, not in a toast that disappears. */
.rc-cap{font-size:12px;line-height:1.6;color:var(--mut);margin:8px 0 2px;
  padding:8px 11px;border:1px dashed var(--line);border-radius:9px}
.rc-cap a{color:var(--gold,var(--gold));font-weight:700;text-decoration:none}
.rc-cap a:hover{text-decoration:underline}

/* ---- THE FOUNDER OFFER -------------------------------------------------------------------------------------
   The layout Austin specified and the one the law wants are the same layout: the price is the biggest thing,
   the full terms sit immediately under it in smaller type behind an asterisk, and they are ALWAYS on screen.
   What gets companies fined is not small text -- it is text you cannot read, or that only appears after you
   have paid. So .fo-terms is smaller and quieter than the price and no smaller than 11.5px, with a real
   contrast ratio against the panel. Do not shrink it further to win space. */
.foffer{border:1px solid rgba(var(--gold-rgb),.38);border-radius:16px;padding:20px 22px;margin:4px 0 16px;
  background:radial-gradient(120% 140% at 0% 0%,rgba(var(--gold-rgb),.13),transparent 58%),rgba(255,255,255,.02);
  max-width:60ch}
.fo-tag{font-family:var(--font-display);font-size:11.5px;font-weight:800;letter-spacing:.12em;
  text-transform:uppercase;color:var(--gold,var(--gold));margin-bottom:10px}
.fo-price{font-family:var(--font-num,inherit);font-size:44px;line-height:1;font-weight:800;
  letter-spacing:-.035em;color:var(--txt);font-variant-numeric:tabular-nums}
.fo-star{font-size:.5em;vertical-align:super;color:var(--gold,var(--gold));font-weight:700;margin-left:2px}
.fo-sub{font-size:14px;font-weight:600;color:var(--txt);margin-top:6px}
.fo-save{font-size:12.5px;color:var(--good,var(--good));font-weight:700;margin-top:4px}
.foffer .btn{margin-top:14px}
.fo-soon{font-size:11.5px;color:var(--mut);margin-top:7px;text-align:center}
.fo-terms{font-size:11.5px;line-height:1.65;color:var(--mut);margin-top:13px;
  padding-top:11px;border-top:1px solid var(--line)}
.fo-terms .fo-star{font-size:1em;vertical-align:baseline;margin:0 2px 0 0}
.foffer.fo-c{padding:15px 16px}
.foffer.fo-c .fo-price{font-size:34px}
@media(max-width:640px){.fo-price{font-size:38px}.foffer{padding:17px 18px}}
body.theme-light .foffer{background:radial-gradient(120% 140% at 0% 0%,rgba(255,183,3,.16),transparent 58%),rgba(20,30,70,.02)}

/* ---- THE SIGN-IN SCREEN ------------------------------------------------------------------------------------
   Every field had its placeholder doing the job of a label, so the label vanished the moment anyone typed.
   Real labels, always visible. The left-aligned field block inside a centred panel is deliberate: headings and
   reassurance read better centred, but a form you are filling in reads better aligned to where your eye
   returns after each field. */
.lb-field{text-align:left;margin-bottom:13px}
.lb-field label{display:block;font-size:11.5px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;
  color:var(--mut);margin:0 0 5px 2px}
.loginbox .lb-field input{margin-bottom:0}
.lb-hint{font-size:11.5px;line-height:1.5;color:var(--mut);margin:5px 0 0 2px;opacity:.9}
.lb-sub{color:var(--mut);font-size:13px;line-height:1.55;margin-bottom:16px}

/* A failure should read as a hand on the shoulder, not a stack trace. Only takes up space when there is
   something to say. */
.lb-err{color:var(--bad);font-size:12.5px;line-height:1.5;text-align:left;margin:2px 0 10px}
.lb-err:empty{display:none}

.lb-swap{margin-top:12px;font-size:13px;color:var(--mut)}
.lb-swap .li-swap{color:var(--gold,var(--gold));font-weight:700;cursor:pointer}
.lb-swap .li-swap:hover{text-decoration:underline}

/* The focus ring was the browser default on a dark panel, which is nearly invisible. */
.loginbox input:focus{outline:none;border-color:rgba(var(--gold-rgb),.55);
  box-shadow:0 0 0 3px rgba(var(--gold-rgb),.13)}
.loginbox button:focus-visible{outline:2px solid rgba(var(--gold-rgb),.75);outline-offset:2px}

/* A leg still in progress is a THIRD state, not a quiet loss. It reads muted so a day in flight cannot be
   mistaken for a day that finished flat. */
.b3d-row.p .b3d-res{color:var(--mut)}
.b3d-u.mut{color:var(--mut)}
.b3d-pend{color:var(--gold,var(--gold));font-weight:700}

/* The fixture on a market row: present but subordinate — you are scanning bets, and the game is the answer to
   "which one is this" rather than something you read first. Own line so a long matchup cannot shove the price
   off the end of the row. */
.bt3-g{display:block;font-size:11.5px;color:var(--mut);margin-top:2px;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}

/* ---- BEST 3: PERIODS + SUB-MARKETS -------------------------------------------------------------------------
   The four periods sit side by side rather than behind a switcher, because the comparison IS the information:
   a good week against a flat month says something neither number says alone. The tabs then re-filter only the
   market table underneath. */
.b3depth{margin:12px 0 14px}
.b3p-tabs{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:10px}
.b3p-tab{cursor:pointer;font:inherit;font-size:11.5px;font-weight:700;padding:5px 11px;border-radius:999px;
  border:1px solid var(--line);background:transparent;color:var(--mut)}
.b3p-tab.on{color:var(--txt);border-color:rgba(var(--gold-rgb),.45);background:rgba(var(--gold-rgb),.09)}
.b3p-tab:hover{color:var(--txt)}

/* auto-fit, not repeat(4): the period list gained "This season" and a hard-coded column count wraps the
   fifth card onto its own full-width row. This tracks however many periods _B3PERS carries. */
.b3p-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(128px,1fr));gap:8px;margin-bottom:14px}
.b3p-card{border:1px solid var(--line);border-radius:12px;padding:11px 12px;background:rgba(255,255,255,.018)}
.b3p-card.on{border-color:rgba(var(--gold-rgb),.42);background:rgba(var(--gold-rgb),.05)}
.b3p-k{font-size:11.5px;font-weight:800;letter-spacing:.08em;text-transform:uppercase;color:var(--mut)}
.b3p-u{font-family:var(--font-num,inherit);font-size:19px;font-weight:800;letter-spacing:-.02em;margin-top:4px;
  font-variant-numeric:tabular-nums}
.b3p-n{font-size:11.5px;color:var(--txt);margin-top:2px;font-variant-numeric:tabular-nums}
.b3p-n2{font-size:11.5px;color:var(--mut);margin-top:3px;line-height:1.4}

.b3p-mh{font-size:12px;font-weight:700;color:var(--txt);margin:0 0 7px}
.b3p-tbl{display:flex;flex-direction:column;gap:5px}
.b3p-row{display:grid;grid-template-columns:minmax(96px,1.4fr) minmax(46px,1fr) auto auto;
  gap:9px;align-items:center;font-size:12px}
.b3p-mk{font-weight:700;color:var(--txt);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* The bar is win RATE, not units — units already have a column, and a bar is the faster read for "how often". */
.b3p-bar{height:5px;border-radius:99px;background:rgba(255,255,255,.07);overflow:hidden}
.b3p-bar i{display:block;height:100%;background:linear-gradient(90deg,rgba(var(--gold-rgb),.75),rgba(var(--gold-rgb),.4))}
.b3p-rec{font-size:11px;color:var(--mut);white-space:nowrap;font-variant-numeric:tabular-nums}
.b3p-mu{font-weight:800;white-space:nowrap;font-variant-numeric:tabular-nums;text-align:right;min-width:58px}
.b3p-empty,.b3p-note{font-size:11.5px;color:var(--mut);line-height:1.55;margin-top:9px}
.b3p-note{padding-top:8px;border-top:1px solid var(--line)}

@media(max-width:640px){
  .b3p-grid{grid-template-columns:repeat(2,1fr)}
  .b3p-u{font-size:17px}
  .b3p-row{grid-template-columns:minmax(80px,1.3fr) auto auto;gap:7px}
  .b3p-bar{display:none}          /* the rate is already printed beside it; the bar is the first thing to go */
}

/* ==========================================================================================================
   HEADER: ONE ROW, ONE SCALE
   ----------------------------------------------------------------------------------------------------------
   Measured before this block: header 89px desktop / 48px mobile, and 160px total above the first heading on
   desktop, 124-218px on a phone. On a 667px handset the fixed chrome was 28-42% of the screen.

   The cause was never padding -- three separate passes trimmed padding and it kept "looking bad" -- it was
   that `.bar{flex-wrap:wrap}` plus `.nav{flex-basis:100%;order:5}` put the five nav groups on their own
   line. Neither was overridden anywhere in 7,600 lines. The groups need ~442px of a ~1052px row; they fit.
   ========================================================================================================== */
header .bar{flex-wrap:nowrap}
header .nav,
header .bar>div:has(> .navg){flex-basis:auto;order:0;margin-left:10px;min-width:0}
/* Width pressure resolves into the username's existing ellipsis instead of into a second row. */
header .who{min-width:0}

/* THE HEADER COLUMN NOW MATCHES THE CONTENT COLUMN.
   The bar was capped at a fixed 1080px while .wrap moves 920 -> 1040 -> 1120, so the logo sat 44px left of
   the first heading at 1000px and 16px RIGHT of it at 1600px. The offset changed sign, which is why the top
   never looked settled at any width. */
header .bar{max-width:920px;padding-left:18px;padding-right:18px}
@media(min-width:1180px){header .bar{max-width:1040px}}
@media(min-width:1500px){header .bar{max-width:1120px}}

/* THE BRAND, SIZED IN CSS FOR THE FIRST TIME.
   The mark was 25x34 from HTML attributes alone -- not one width/height rule for .logo existed in 581KB of
   stylesheet -- which made it NARROWER THAN THE 30x30 GEAR beside it. Its aspect is 0.737, so height alone
   cannot widen a narrow shield; the wordmark is what makes it read as a brand rather than a fifth chip.
   This is the lockup the landing page (.lp-brand) has always used. */
.logo{height:32px;width:auto;display:block}
.hdr-word{font-family:var(--font-display,inherit);font-size:17px;font-weight:800;letter-spacing:.18em;
  color:var(--gold,var(--gold));line-height:1;margin-left:9px;white-space:nowrap}
.homelink{display:inline-flex;align-items:center;text-decoration:none;flex:none}
@media(max-width:768px){
  .logo{height:28px}
  .hdr-word{font-size:15px;letter-spacing:.15em;margin-left:7px}
  /* 28px mark + 10px padding = 38. 44 is honest; the old 48 carried 4px of pure air. */
  header .bar{min-height:44px}
}
@media(max-width:380px){ .hdr-word{display:none} }   /* at that width the row is the constraint, not the brand */

/* THE SUB-NAV SCROLLS RATHER THAN WRAPPING.
   It needs >=433px intrinsic against a 430px phone, so forcing it to wrap cost 40px on every handset and
   made navPaint()'s scrollIntoView a no-op. No mask comes back with it: the fade read as a shadow cutting
   the tabs, twice, and that reading was correct. */
.subnav-in{flex-wrap:nowrap;overflow-x:auto;scrollbar-width:none;-webkit-overflow-scrolling:touch;
  scroll-snap-type:x proximity;overscroll-behavior-x:contain}
.subnav-in::-webkit-scrollbar{display:none}
.subnav-in>*{scroll-snap-align:center}

/* .seghead's mobile ramp was written twice (14px at 640, 13px at 430) and lost both times to a later
   unconditional rule, so every heading rendered 16px with a 24px top margin down to 320px. Restated last. */
@media(max-width:768px){.seghead{font-size:14px;margin:14px 0 8px}}
@media(max-width:430px){.seghead{font-size:13px;margin:12px 0 7px}}

/* Bottom padding reserved 92px for 63px of bottom bar, and counted the safe-area inset twice. */
@media(max-width:768px){.wrap{padding-bottom:calc(70px + env(safe-area-inset-bottom))}}

/* ==========================================================================================================
   PASS 2 — the things the audits found that are one rule each
   ========================================================================================================== */

/* --goldsoft IS USED SIX TIMES AND DEFINED NOWHERE.
   An undefined var() with no fallback is invalid-at-computed-value-time, so `color` fell back to inherit and
   three Props Edge signals silently lost their meaning: the MIDDLE data-freshness state (45-180 min old) drew
   identical to normal text on a board whose own copy says "the edge decays fast -- race them", the "sharp
   line moved DOWN" arrow was uncoloured while "up" was green, and the league tag was indistinguishable from
   the book and time beside it. */
:root{--goldsoft:#e0b658}
body.theme-light{--goldsoft:#a9760d}

/* TAP TARGETS. Each of these is a real control that ended up under 44px because a later, more specific rule
   beat the coarse-pointer floor. The project's own fix for this is an invisible ::after, which keeps the
   visual size while restoring the real hit area -- these were simply missed. */
@media (pointer: coarse){
  .cx-btn,.b3p-tab,.hdr-gear,.who .who-me,.tdaybtn,.calnav button,.pf-followbtn.sm{position:relative}
  .cx-btn::after,.b3p-tab::after,.hdr-gear::after,.who .who-me::after,.tdaybtn::after,
  .calnav button::after,.pf-followbtn.sm::after{
    content:'';position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);
    width:max(100%,44px);height:max(100%,44px)}
  .calnav button{min-width:44px}
}

/* THE COLLAPSE CONTROL SHOULD LOOK LIKE THE CHIPS IT SITS AMONG.
   It was the only dashed, transparent, 999px control in rows of solid filled chips -- which reads as a
   different kind of thing rather than as one more item in the row. */
.cx-btn{border-style:solid;background:rgba(255,255,255,.05);border-radius:16px}
.cx-btn:hover{background:rgba(var(--gold-rgb),.09)}

/* .obtn IS DEFINED TWICE BY TWO UNRELATED COMPONENTS — the odds-grid price button and the parlay builder's
   pill. Equal specificity, so the parlay skin was winning on the board it was never written for, and hover
   was a hybrid of both. The board's own grid is scoped here so it cannot lose again. */
.og-row .obtn{background:var(--surf2);border:1px solid var(--line);border-radius:10px;padding:5px 4px}
.og-row .obtn:hover{background:#22305a;border-color:#4a7bd0}

/* LIGHT THEME: EVERY INPUT IN THE APP WAS UNREADABLE.
   The dark rule carries !important on background/border/colour, so the light-theme counterpart -- which has
   higher specificity but no !important -- never applied. In light mode every text/search/number/password/
   email input and every select rendered as a translucent-black box with an inset dark shadow. Matching
   !important is the minimal correct fix; the alternative is unpicking !important from a rule 3,000 lines up.
   input[type=date] is added because it was never in the original list and drew a different control beside
   its own neighbours in the same form row. */
body.theme-light .tinput,body.theme-light .bq,
body.theme-light input[type=text],body.theme-light input[type=search],
body.theme-light input[type=number],body.theme-light input[type=password],
body.theme-light input[type=email],body.theme-light input[type=date],
body.theme-light textarea,body.theme-light select{
  background:#ffffff !important;border:1px solid var(--line) !important;color:var(--txt) !important;
  box-shadow:inset 0 1px 2px rgba(20,30,70,.06) !important}
input[type=date]{border-radius:var(--r1);background:rgba(0,0,0,.30);border:1px solid var(--line);color:var(--txt)}

/* NUMBERS IN A TABLE SHOULD LINE UP. .lbtable already sets tabular-nums and then left-aligns every cell, so
   the tabular figures bought nothing anywhere except the two tables that right-align by hand. */
.lbtable td:not(:first-child),.lbtable th:not(:first-child),
.jtable td:not(:first-child),.jtable th:not(:first-child){text-align:right}

/* .jtable is the only table in the app with no scroll wrapper, inside .panel{overflow:hidden} — so anything
   that did exceed the width was clipped and unreachable rather than scrollable. */
.jtable{display:block;overflow-x:auto;white-space:nowrap}

/* THE FOOTER LINKS ARE THE REGULATORY ONES and were ~20px targets in an app that enforces 44px everywhere
   else. The convention already exists two lines away (.li-swap got min-height:40px); the footer was missed. */
.sitefoot .foot-rg a,.sitefoot .foot-attr a,.sitefoot .foot-social a{
  display:inline-block;padding:9px 4px;line-height:24px}
@media (pointer: coarse){ .sitefoot .foot-rg a,.sitefoot .foot-attr a,.sitefoot .foot-social a{min-height:44px} }

/* .spvs is a 4-column grid wearing dividers written for a 2x2 one: cell 2 lost its right border and cells
   1-2 carried a bottom border under a single row. */
.spvs .spv:nth-child(2){border-right:1px solid var(--line)}
.spvs .spv:nth-child(1),.spvs .spv:nth-child(2){border-bottom:0}

/* .rc-tbl has no CSS at all — the one table in the app rendering at browser defaults. */
.rc-tbl{width:100%;border-collapse:collapse;font-size:12.5px;font-variant-numeric:tabular-nums}
.rc-tbl th,.rc-tbl td{padding:6px 8px;border-bottom:1px solid var(--line);text-align:right}
.rc-tbl th:first-child,.rc-tbl td:first-child{text-align:left}
.rc-stat th{background:var(--surf)}
body.theme-light .rc-stat th{background:#eef1fa;color:var(--txt)}

/* ==========================================================================================================
   PASS 3 — the consistency findings, highest-impact first
   ========================================================================================================== */

/* --ink IS USED FOUR TIMES AND DEFINED NOWHERE — twice inside the sign-in overlay (.loginbox .ghost, .ck-hd).
   An undefined var() with no fallback falls back to `inherit`, which currently lands near --txt BY ACCIDENT,
   so it looks right until any ancestor colour changes. Defining it as the alias it was always meant to be. */
:root{--ink:var(--txt)}

/* .card AND .panel ARE THE TWO GENERIC CONTAINERS AND AGREE ON NOTHING — different background, border,
   radius, shadow and padding, because an !important block landed on .panel 467 lines before the rule that
   was supposed to own both. The stylesheet's own comment says "12px is the largest radius on any card";
   .panel was rendering 16px. Same surface now. */
.panel{border-radius:var(--r-3) !important;padding:var(--s-4) var(--s-5) !important}

/* THE SIGN-IN CARD IS THE ONLY FULL-WIDTH SURFACE IN THE PRODUCT WITH A FLAT BACKGROUND AND NO ELEVATION.
   Every tab behind it uses the translucent sheet + shadow, which is exactly why the overlay reads as
   belonging to a different app. */
.loginbox,.so-card{
  background:linear-gradient(180deg,var(--surf2),var(--surf));
  border:1px solid var(--line);
  border-radius:var(--r-3);
  box-shadow:0 24px 60px -28px rgba(0,0,0,.85),var(--rim)}

/* The sign-in submit had no class, so it kept an older gold recipe: 135deg to #f59e0b, no border, 10px, no
   shadow — while the app's primary CTA is 180deg to --gold2 with a gold rim and a glow. Two gold buttons,
   and the one a new user meets first was the odd one. */
.loginbox button:not(.ghost){
  background:linear-gradient(180deg,var(--gold),var(--gold2));
  border:1px solid rgba(var(--gold-rgb),.55);
  border-radius:var(--r-2);
  color:#120d02;
  box-shadow:0 1px 0 rgba(255,255,255,.25) inset,0 6px 18px -8px rgba(var(--gold-rgb),.45)}

/* The login labels missed the app's canonical micro-label treatment by 0.5px and 0.02em, because they were
   appended after the block that normalises every other label in the product. */
.lb-field label{font-size:var(--fs-1);letter-spacing:.06em}
/* --bad moved from #fb7185 to #ff6b81 when the palette was reset; rules that hardcoded the old value are
   permanently a different red. The login error was one of them, and it stayed pink on white in light mode. */
.lb-err{color:var(--bad)}

/* The primary nav signals "selected" with a gold underline; the sub-nav directly beneath it was explicitly
   given box-shadow:none !important and an outline instead. Two languages, one inch apart. */
.subtab.on{box-shadow:inset 0 -2px 0 var(--gold) !important}

/* LIGHT THEME HAS NO ELEVATION TOKENS AT ALL — only --e1 is ever defined, so every card carrying --e2 or
   --e3 painted a 70%-black drop shadow onto a white page. And .zt-card / .pe-slip have no light background
   override, so they kept a translucent-white sheet on white: invisible. */
body.theme-light{
  --e1:0 1px 2px rgba(30,40,80,.06);
  --e2:0 4px 16px -6px rgba(30,40,80,.14);
  --e3:0 18px 44px -20px rgba(30,40,80,.22);
  --rim:0 0 0 1px rgba(20,30,70,.05) inset}
body.theme-light .zt-card,body.theme-light .pe-slip,body.theme-light .loginbox,body.theme-light .so-card{
  background:linear-gradient(180deg,#ffffff,#f5f7fd);border-color:var(--line)}

/* ==========================================================================================================
   THE ZOO, AS A GALLERY
   ----------------------------------------------------------------------------------------------------------
   .zoo-cat / .zoo-cat-h / .zoo-cat-sub have been in this stylesheet the whole time with ZERO uses in the
   HTML — the grouped view existed once, and the one-line description of each division is still sitting in
   ZCATS. Restated here so the division heading reads as a heading rather than as another chip.
   ========================================================================================================== */
.zoo-cat{margin:18px 0 11px}
.zoo-cat-h{font-size:15px;font-weight:800;letter-spacing:-.01em;color:var(--txt)}
.zoo-cat-sub{font-size:12px;color:var(--mut);margin-top:3px;line-height:1.5;max-width:64ch}

/* .zoo-id is the flex sibling of a 56px avatar inside every card and had NO rule anywhere in the file, so a
   long bot name had nothing to shrink against and pushed the card's own layout wide. */
.zoo-id{flex:1;min-width:0}
.zoo-nm{overflow-wrap:anywhere}

/* The narrow override dropped .zrow to four columns while _zRow still emits five children, so the activity
   pill wrapped onto a second grid row into a 20px cell — and body{overflow-x:clip} cut it silently. */
@media(max-width:560px){
  .zrow{grid-template-columns:20px 26px minmax(0,1fr) auto auto}
  .zr-act:empty{display:none}
}

/* The card grid: wide enough that a card reads as a card, and never a single stretched column. */
.zoo-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:11px}
@media(max-width:640px){.zoo-grid{grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:9px}}

/* ---- THE WORDMARK MUST NOT CROWD THE WALLET (regression, same day it was added) ---------------------------
   Adding "MIDAS" beside the mark was right on desktop and wrong on a phone: the bar is flex-wrap:nowrap now,
   so an unshrinkable 15px word with .18em tracking simply pushed into the coin and gem chips instead of
   wrapping. It was hidden only below 380px, and the phones that matter are 390-430px.
   Below 900px the mark carries the brand on its own -- which is what shipped for months without complaint --
   and the wallet keeps the room it needs. The brand block also stops shrinking, and the wallet is allowed
   to, so any remaining pressure lands on the username ellipsis rather than on the logo. */
.brandrow{flex:none;flex-wrap:nowrap;min-width:0;align-items:center}
header .dwallet{flex-wrap:nowrap;min-width:0;flex-shrink:1}
header .dwallet .dw-bal{flex-shrink:0}
@media(max-width:900px){ .hdr-word{display:none} }

/* A filter that cannot match anything should look inert rather than blanking the board when tapped. */
.segbtn.seg-off{opacity:.4;pointer-events:none}

/* ---- PER-MARKET BEST-3 HISTORY -----------------------------------------------------------------------------
   Three windows side by side, because the comparison is the information: a market can be up over 30 days and
   flat this week, and neither number says that alone. */
.b3mh{margin:8px 0 4px}
.b3mh-row{display:grid;grid-template-columns:repeat(3,1fr);gap:7px;margin-bottom:8px}
.b3mh-c{border:1px solid var(--line);border-radius:10px;padding:8px 10px;background:rgba(255,255,255,.02)}
.b3mh-k{font-size:11px;font-weight:800;letter-spacing:.08em;text-transform:uppercase;color:var(--mut)}
.b3mh-u{font-family:var(--font-num,inherit);font-size:15px;font-weight:800;letter-spacing:-.02em;margin-top:3px;
  font-variant-numeric:tabular-nums}
.b3mh-n{font-size:11.5px;color:var(--mut);margin-top:1px;font-variant-numeric:tabular-nums}
/* The denominator line: smaller and dimmer than the record it qualifies, because it is a caveat rather
   than a competing headline -- but present on every window, including the winning ones. */
.b3mh-x{font-size:11px;color:var(--mut);opacity:.8;margin-top:2px;font-variant-numeric:tabular-nums}

/* STALENESS BANNER. Fixed to the bottom so it cannot be scrolled past -- the 'Generated' stamp it
   replaces sits at the foot of a 10 MB page and was effectively invisible. Loud enough to be seen,
   dismissible only by acting on it, and never covering the nav. */
.stalebar{position:fixed;left:50%;transform:translateX(-50%);bottom:16px;z-index:9000;max-width:min(92vw,640px);
 background:var(--surf);border:1px solid rgba(var(--gold-rgb),.55);border-radius:12px;padding:11px 15px;
 font-size:13px;line-height:1.5;color:var(--txt);box-shadow:0 8px 28px rgba(0,0,0,.45)}
.stalebar b{color:var(--gold)}
.stalebar button{margin-left:10px;background:var(--gold);color:#111;border:0;border-radius:8px;
 padding:6px 13px;font-weight:800;font-size:12.5px;cursor:pointer}

/* THE DIVIDE. Picks are the content; the record is the research behind it. A labelled rule rather than a
   gap, because the two halves make different claims and a reader should not have to infer which is which
   from the dates on the rows. */
.b3sec{display:flex;align-items:baseline;gap:9px;flex-wrap:wrap;margin:14px 0 7px;padding-top:11px;
 border-top:1px solid var(--line)}
.b3sec:first-of-type{margin-top:6px;padding-top:0;border-top:0}
.b3sec-k{font-size:11px;font-weight:800;letter-spacing:.09em;text-transform:uppercase;color:var(--txt)}
.b3sec-m{font-size:11px;color:var(--mut)}
.b3sec-hist .b3sec-k{color:var(--mut)}
/* THE LIVE BLOCK. Today's picks are the only thing on a market card a reader can still act on, so they get
   edges and everything else does not. Gold here is a BRAND frame on a container, never applied to a number
   -- the colour-blind rule is about data encoding, and this encodes nothing. */
.b3live{border:1px solid rgba(255,209,102,.28);border-left:3px solid var(--gold);border-radius:10px;
 padding:9px 11px 7px;margin:8px 0 2px;background:linear-gradient(180deg,rgba(255,209,102,.05),transparent 72%)}
.b3live-off{border-color:var(--line);border-left-color:var(--mut);background:none}
.b3live-h{display:flex;align-items:baseline;gap:9px;flex-wrap:wrap;margin-bottom:6px}
.b3live-k{font-size:11.5px;font-weight:800;letter-spacing:.09em;text-transform:uppercase;color:var(--gold)}
.b3live-off .b3live-k{color:var(--mut)}
.b3live-m{font-size:11px;color:var(--mut)}
.b3live-none{font-size:12px;color:var(--mut);line-height:1.5;padding:2px 0 4px}
/* ALSO QUALIFIED. Subordinate, not hidden: the eye should land on the three that are the claim, but a
   published pick never leaves the card. A rule and a step down in weight, no colour change -- these rows
   still carry results, and a result must read the same wherever it sits. */
.b3hm-h{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap;margin:9px 0 3px;padding-top:7px;
 border-top:1px dashed var(--line)}
.b3hm-k{font-size:11.5px;font-weight:800;letter-spacing:.09em;text-transform:uppercase;color:var(--mut)}
.b3hm-m{font-size:11.5px;color:var(--mut);opacity:.85}
.b3mktr.hm{opacity:.72}
.b3mktr.hm .b3mktr-i{opacity:.6}
/* The graded unit result, beside the verdict. Tabular so a column of them lines up, and always signed so
   the meaning survives with no colour vision at all. */
.b3mktr-u{font-variant-numeric:tabular-nums;font-size:11.5px;font-weight:800;letter-spacing:.01em;
 margin-left:7px;white-space:nowrap}
.b3mh-dup{font-size:11.5px;color:var(--mut);line-height:1.5;padding:5px 0 3px;font-style:italic}
/* The boundary between markets you can act on and markets that merely have a past. */
.b3tail{display:flex;align-items:baseline;gap:9px;flex-wrap:wrap;margin:16px 0 6px;padding-top:12px;
 border-top:1px solid var(--line)}
.b3tail-k{font-size:11px;font-weight:800;letter-spacing:.09em;text-transform:uppercase;color:var(--mut)}
.b3tail-m{font-size:11px;color:var(--mut);opacity:.8}
.b3mh-log{margin-top:4px}
.b3mh-log>summary{cursor:pointer;list-style:none;font-size:11.5px;color:var(--txt);padding:6px 0;
 font-weight:700;letter-spacing:.01em}
.b3mh-cx{color:var(--gold);font-size:11.5px;display:inline-block;transition:transform .12s}
.b3mh-log[open]>summary .b3mh-cx{transform:rotate(0deg)}
.b3mh-log:not([open])>summary .b3mh-cx{transform:rotate(-90deg)}
.b3mh-cn{color:var(--mut);font-weight:400}
.b3mh-more{font-size:11.5px;color:var(--mut);padding:7px 0 2px}
.b3mh-log>summary::-webkit-details-marker{display:none}
.b3mh-log>summary:hover{color:var(--txt)}
.b3mh-d{font-size:11.5px;font-weight:800;letter-spacing:.06em;color:var(--mut);margin:8px 0 3px;
 display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.b3mh-dr{font-weight:700;letter-spacing:.02em;color:var(--txt);font-variant-numeric:tabular-nums}
.b3mh-swept{font-size:11px;font-weight:800;letter-spacing:.06em;color:#111;background:var(--gold);
 border-radius:5px;padding:1px 5px}
.b3mh-od{margin-left:7px;color:var(--mut);font-variant-numeric:tabular-nums;font-weight:700}
.b3mh-p{display:grid;grid-template-columns:auto minmax(0,1fr) auto;gap:8px;align-items:center;
  padding:4px 0;font-size:11.5px;border-top:1px solid var(--line)}
.b3mh-r{font-size:11px;font-weight:800;letter-spacing:.06em}
.b3mh-p.w .b3mh-r{color:var(--good)} .b3mh-p.l .b3mh-r{color:var(--bad)} .b3mh-p.p .b3mh-r{color:var(--mut)}
/* VOID reads dimmer than PUSH on purpose: a push is a settled result we observed, a void is a bet that
   never graded. Same stake back, different epistemic status, and the record must not let them look
   identical -- especially on half-lines, where a push cannot occur at all. */
.b3mh-p.v .b3mh-r{color:var(--mut);opacity:.72;font-style:italic}
.b3mh-b{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--txt)}
.b3mh-uu{font-weight:800;font-variant-numeric:tabular-nums;white-space:nowrap}
.b3mh-none{font-size:11.5px;color:var(--mut);padding:6px 0}
/* The sub-market read as a three-leg slip: how often all legs landed, the average combined price, what it
   paid, and the rate that price needs. The last two sit together on purpose -- a hit rate without the
   break-even beside it is the single most misleading number a betting page can print. */
.b3slip{display:flex;flex-wrap:wrap;align-items:baseline;gap:8px;padding:7px 9px;margin:6px 0 2px;
  border:1px solid var(--line);border-radius:8px;background:var(--card2,rgba(127,127,127,.06));font-size:11.5px}
.b3slip-k{font-weight:800;letter-spacing:.02em}
.b3slip-v{font-variant-numeric:tabular-nums}
.b3slip-o{font-variant-numeric:tabular-nums;color:var(--mut)}
.b3slip-u{font-weight:800;font-variant-numeric:tabular-nums;margin-left:auto}
.b3slip-b{font-size:11.5px}
.b3slip-test{font-size:12px;line-height:1.55;padding:9px 11px;margin:8px 0 10px;border:1px solid var(--line);
  border-radius:9px;background:var(--card2,rgba(127,127,127,.06))}
.b3slip-test .mut{display:block;margin-top:4px;font-size:11px}
@media(max-width:640px){ .b3mh-row{grid-template-columns:repeat(3,1fr);gap:5px} .b3mh-u{font-size:13.5px} }

/* ---- PRO STATUS IN THE HEADER --------------------------------------------------------------------------------
   The crown is small and sits on the baseline of the name; it marks an account, it is not a decoration. The
   pill is the only outbound sell in the header, so it stays quiet until hover. */
.who-pro{margin-left:5px;font-size:12px;line-height:1;color:var(--gold);
  text-shadow:0 0 10px rgba(var(--gold-rgb),.45);vertical-align:baseline}
.who-gopro{margin-left:6px;padding:3px 8px;border-radius:999px;cursor:pointer;flex:0 0 auto;
  font-size:11.5px;font-weight:800;letter-spacing:.03em;white-space:nowrap;line-height:1.5;
  color:#1b1405;background:linear-gradient(180deg,var(--gold-hi),var(--gold2));
  border:1px solid rgba(0,0,0,.18);box-shadow:0 1px 0 rgba(255,255,255,.35) inset}
.who-gopro:hover{filter:brightness(1.06)}
.who-gopro:active{transform:translateY(1px)}
.who-gopro:focus-visible{outline:2px solid var(--gold);outline-offset:2px}
/* THE HEADER HAS NO SPARE WIDTH. Adding this pill pushed the wallet chip over the nav and clipped "You".
   Below a comfortable desktop width it is hidden entirely -- Pro is still one tap away via the Shop button
   in the wallet strip, so nothing becomes unreachable, and a crowded bar is worse than a missing pill. */
@media(max-width:1180px){ .who-gopro{display:none} }
@media(max-width:640px){ .who-pro{font-size:11px} }

/* ---- COLLAPSIBLE MARKET BLOCKS -------------------------------------------------------------------------------
   The summary is the whole row, so the entire header is the click target rather than a small chevron. */
details.b3mktg{border-top:1px solid var(--line);padding:0}
details.b3mktg:first-of-type{border-top:0}
details.b3mktg>summary{list-style:none;cursor:pointer;padding:10px 0 9px;
  display:flex;flex-wrap:wrap;align-items:baseline;gap:8px;margin:0;border-radius:8px}
details.b3mktg>summary::-webkit-details-marker{display:none}
details.b3mktg>summary:hover .b3mktg-n{color:#fff}
details.b3mktg>summary:focus-visible{outline:2px solid var(--acc,var(--gold));outline-offset:2px}
/* a chevron that rotates, drawn in CSS so it needs no asset and no markup */
details.b3mktg>summary::before{content:"";flex:0 0 auto;width:6px;height:6px;margin-right:2px;
  border-right:2px solid var(--mut);border-bottom:2px solid var(--mut);
  transform:rotate(-45deg);transition:transform .16s ease;position:relative;top:-1px}
details.b3mktg[open]>summary::before{transform:rotate(45deg)}
/* how many plays this market has today -- the reason to open it, or not */
.b3tail.b3tail-sub{margin-top:18px;opacity:.92}.b3lg{margin:10px 0 4px;border:1px solid var(--line);border-radius:12px;background:var(--surf);overflow:hidden}.b3lg>.b3lg-h{display:flex;align-items:center;gap:10px;padding:10px 12px;cursor:pointer;list-style:none;font-size:13.5px;font-weight:800;letter-spacing:.01em}.b3lg>.b3lg-h::-webkit-details-marker{display:none}.b3lg[open]>.b3lg-h{border-bottom:1px solid var(--line)}.b3lg-n{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.b3lg-best{flex:0 0 auto;font-size:11.5px;color:var(--mut);white-space:nowrap;font-variant-numeric:tabular-nums}.b3lg-best b{color:var(--txt);font-weight:700}.b3lg-m{flex:0 0 auto;font-size:11px;font-weight:600;color:var(--mut)}.b3lg-u{flex:0 0 auto;font-size:12px;font-weight:800;font-variant-numeric:tabular-nums}.b3lg>.b3mktg{margin:0 8px}.b3mktg-tier{font-size:11px;font-weight:600;letter-spacing:.02em;padding:1px 6px;border-radius:999px;margin-left:8px;vertical-align:middle;white-space:nowrap}.b3mktg-tier.prov{background:rgba(251,191,36,.13);color:#fbbf24;border:1px solid rgba(251,191,36,.28)}.b3mktg-tier.meas{background:rgba(248,113,113,.12);color:#f87171;border:1px solid rgba(248,113,113,.26)}.b3mktg-t{font-size:11px;font-weight:800;letter-spacing:.06em;text-transform:uppercase;
  padding:2px 7px;border-radius:999px;white-space:nowrap;
  color:#0e1116;background:linear-gradient(180deg,var(--gold-hi),var(--gold2))}
.b3mktg-t.off{color:var(--mut);background:none;border:1px solid var(--line);font-weight:700}
.b3mktg-w{margin-left:auto}
details.b3mktg>*:not(summary){margin-bottom:4px}
details.b3mktg[open]{padding-bottom:8px}
@media(max-width:640px){
  details.b3mktg>summary{gap:6px;padding:9px 0}
  .b3mktg-t{font-size:11px;padding:2px 6px}
}

/* ---- SIGN-IN PROVIDER BUTTONS ---------------------------------------------------------------------------------
   Each provider keeps the treatment people already recognise: Google on a white card, X in true black. The mark
   sits in a fixed-width box so both labels start on the same x -- ragged icons are what make a stack of these
   look homemade. */
.sso{display:flex;align-items:center;gap:0;width:100%;margin:0 0 9px;padding:11px 14px;
  border-radius:12px;cursor:pointer;font-size:14px;font-weight:650;letter-spacing:-.01em;
  border:1px solid transparent;transition:transform .08s ease,filter .12s ease,box-shadow .12s ease}
.sso-m{flex:0 0 26px;display:flex;align-items:center;justify-content:center}
.sso-t{flex:1 1 auto;text-align:center;margin-left:-26px;pointer-events:none}
.sso:hover{filter:brightness(.97)}
.sso:active{transform:translateY(1px)}
.sso:focus-visible{outline:2px solid var(--acc,var(--gold));outline-offset:2px}
.sso-google{background:#fff;color:#1f1f1f;border-color:#dadce0;box-shadow:0 1px 2px rgba(0,0,0,.16)}
.sso-google:hover{background:#f7f8f8}
.sso-x{background:#000;color:#fff;border-color:#2f2f2f}
.sso-x:hover{background:#141414;filter:none}
.sso-apple{background:#fff;color:#1f1f1f;border-color:#dadce0}
/* the divider: a rule with the word sitting in it, not floating above it */
.sso-or{display:flex;align-items:center;gap:10px;margin:14px 0 12px;color:var(--mut);
  font-size:11px;letter-spacing:.08em;text-transform:uppercase}
.sso-or::before,.sso-or::after{content:"";flex:1 1 auto;height:1px;background:var(--line)}
@media(max-width:480px){ .sso{padding:10px 12px;font-size:13.5px} }

/* ---- FOLLOW ON X, IN THE HERO --------------------------------------------------------------------------------
   Reads as a row, not a badge: the mark, the promise, a chevron. Deliberately quieter than the signup CTA --
   it must not compete with the thing the page is actually for. */
.lp-x{display:inline-flex;align-items:center;gap:11px;margin-top:16px;padding:10px 14px;
  border:1px solid var(--line);border-radius:12px;text-decoration:none;cursor:pointer;max-width:400px;
  background:rgba(255,255,255,.02);transition:border-color .14s ease,background .14s ease,transform .08s ease}
.lp-x:hover{border-color:rgba(255,255,255,.28);background:rgba(255,255,255,.05)}
.lp-x:active{transform:translateY(1px)}
.lp-x:focus-visible{outline:2px solid var(--acc,var(--gold));outline-offset:2px}
.lp-x-m{flex:0 0 30px;height:30px;border-radius:8px;background:#000;color:#fff;
  display:flex;align-items:center;justify-content:center}
.lp-x-t{display:flex;flex-direction:column;line-height:1.35;min-width:0}
.lp-x-t b{font-size:13px;font-weight:800;color:var(--txt)}
.lp-x-t span{font-size:11.5px;color:var(--mut)}
.lp-x-go{margin-left:auto;color:var(--mut);font-size:18px;line-height:1}
body.theme-light .lp-x{background:rgba(0,0,0,.02)}
body.theme-light .lp-x:hover{border-color:rgba(0,0,0,.2);background:rgba(0,0,0,.04)}
@media(max-width:640px){ .lp-x{width:100%;max-width:none;margin-top:14px} }

/* ---- REACTION TRAY: STICKERS + GIFS ---------------------------------------------------------------------------
   The two tabs share one sheet because they are one gesture. */
.tray-tabs{display:flex;gap:6px;margin-bottom:10px;border-bottom:1px solid var(--line);padding-bottom:8px}
.tray-tab{padding:6px 13px;border-radius:999px;cursor:pointer;font-size:12px;font-weight:800;
  letter-spacing:.02em;color:var(--mut);background:transparent;border:1px solid var(--line)}
.tray-tab.on{color:var(--gold-bg);background:linear-gradient(180deg,var(--gold-hi),var(--gold2));border-color:transparent}
.tray-tab:focus-visible{outline:2px solid var(--acc,var(--gold));outline-offset:2px}

.gif-search{display:flex;gap:7px;margin-bottom:9px}
.gif-search input{flex:1 1 auto;min-width:0;padding:9px 12px;border-radius:10px;
  border:1px solid var(--line);background:rgba(255,255,255,.03);color:var(--txt);font-size:13px}
.gif-search input:focus{outline:none;border-color:rgba(var(--gold-rgb),.5)}
/* A masonry-ish grid: GIFs are wildly different shapes and a fixed square crops every one of them badly. */
.gif-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:6px;max-height:290px;overflow-y:auto;
  overflow-x:hidden;-webkit-overflow-scrolling:touch}
.gif-cell{padding:0;border:1px solid var(--line);border-radius:9px;overflow:hidden;cursor:pointer;
  background:rgba(255,255,255,.03);aspect-ratio:1/1;display:block}
.gif-cell img{width:100%;height:100%;object-fit:cover;display:block}
.gif-cell:hover{border-color:rgba(var(--gold-rgb),.55)}
.gif-cell:focus-visible{outline:2px solid var(--acc,var(--gold));outline-offset:1px}
.gif-note{grid-column:1/-1;padding:16px 6px;text-align:center;color:var(--mut);font-size:12px}
/* Tenor's terms require visible attribution wherever their content is shown. */
.gif-attr{margin-top:8px;font-size:11.5px;letter-spacing:.06em;text-transform:uppercase;color:var(--mut);text-align:right}

/* a GIF inside a post: capped so one cannot dominate the feed */
.fd-gif{display:block;margin:8px 0 2px;max-width:min(320px,100%);max-height:240px;
  border-radius:12px;border:1px solid var(--line)}
@media(max-width:640px){
  .gif-grid{grid-template-columns:repeat(3,1fr);max-height:240px}
  .fd-gif{max-width:100%}
}

/* ---- THE BOOK LINE UNDER A PICK'EM PAYOUT ---------------------------------------------------------------------
   Deliberately quieter than the payout: the payout is what the record is scored at, the book line is context
   for verifying the pick. Same size as the other meta so it does not read as a second headline price. */
.b3book{display:inline-block;margin-left:8px;font-size:11.5px;font-weight:700;letter-spacing:.02em;
  color:var(--mut);white-space:nowrap;font-variant-numeric:tabular-nums;cursor:help}
.b3book::before{content:"";display:inline-block;width:3px;height:3px;border-radius:50%;
  background:var(--mut);vertical-align:middle;margin-right:6px;opacity:.6}
@media(max-width:640px){ .b3book{margin-left:6px;font-size:11.5px} }

/* ---- THE NAV TAKES ITS OWN ROW BEFORE IT RUNS OUT OF SPACE ----------------------------------------------------
   "You" was rendering as "Yo" with the coin chip against it. Not an overlap -- a CLIP. `.nav` carries
   overflow-x:auto, and on desktop line ~10974 puts it inline (flex-basis:auto) inside a nowrap bar. Once the
   brand + 5 nav items + wallet + account chip + gear exceed the 1080px bar, the nav is the only thing that can
   give, so it scrolls -- and a scrolled nav with no visible affordance just looks like a broken word.
   min-width:0 was ALREADY set there, which is why adding it again did nothing.

   Below a comfortable desktop width the nav goes back to its own full-width row -- exactly what the base rule
   at .nav{flex-basis:100%;order:5} already does on mobile. Nothing is clipped, nothing overlaps, and the row
   stays one line on genuinely wide screens where it fits. */
/* REMOVED: the @media(max-width:1500px) block that lived here gave the nav its own FULL-WIDTH row while
   keeping it centred, which rendered as a bordered trough with 526px of empty box in it and doubled the
   header to 89px on every 1280/1366/1440 laptop. Its `overflow-x:visible` was also a no-op -- it computes
   to `auto` while overflow-y stays hidden. Replaced by the block at the end of this stylesheet. */
/* the account chip is what was being covered; give the name room to ellipse rather than vanish under a chip */
.who-me{min-width:0;max-width:190px}
.who-me b{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}
.dwallet,.who,.hdr-gear,.tdaywrap{flex:0 0 auto}
@media(max-width:900px){ .who-me{max-width:120px} }

/* Venue / home-away / weather line under a pick. Muted on purpose: it is context for a human, not a signal,
   and today's situational study found every one of these effects already priced by the market. */
.ctxline{margin-top:6px;font-size:11.5px;line-height:1.55;color:var(--mut);display:flex;flex-wrap:wrap;gap:4px 6px;align-items:baseline}
.ctxline .ctx-t{color:var(--fg);font-weight:600}
.ctxline .ctx-l{opacity:.75}
.ctxline .ctx-d{opacity:.45}
.ctxline .ctx-wx{color:#8fb8d8}

/* ============================================================================================================
   THE HEADER: ONE FLEXIBLE ITEM, NO SCROLL CONTAINER, NO EMPTY TROUGH.
   Measured before: nav clientWidth 432 vs scrollWidth 459 at 1578px, with justify-content:center putting
   27.25px past the LEFT edge where no scroll can reach it. Header 89px on desktop, 93px at 390px with the
   Settings gear orphaned on a second row.
   Tested after in headless Chrome at 320/360/390/414/1024/1280/1440/1600: single row at every width >= 360,
   nothing clipped, zero horizontal overflow, desktop header 46px.
   ============================================================================================================ */

/* 1. Log out leaves the header. 34px + 6px margin -- 44x44 once the phone tap-target rules apply -- spent on
      the one destructive action in the product, and the overflow it caused is what pushed Settings onto a
      second row on every iPhone narrower than a Plus. It belongs in Settings, one tap away. */
header .who .who-lock{display:none}

/* 2. Exactly ONE item in the bar may shrink, and it is the username, which already has its ellipsis. */
header .who{flex:0 1 auto;min-width:0}
header .who .who-me{flex:0 1 auto;min-width:0}
header .who .who-me b{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

/* 3. The nav never shrinks and never clips. overflow must be set on BOTH axes to undo the overflow:hidden
      further up -- setting only overflow-x is what made the previous fix compute to `auto`. */
header .nav,
header .bar>div:has(> .navg){flex:0 0 auto;min-width:auto;overflow:visible;
  justify-content:flex-start;order:0;margin-left:14px;margin-right:14px}

/* 4. One row wherever the groups genuinely fit. */
header .bar{flex-wrap:nowrap}

/* 5. Where they do not, the nav takes its own row SHRINK-TO-FIT and centred, so the recessed border wraps
      the five items instead of 526px of empty box. */
@media(max-width:1180px){
  header .bar{flex-wrap:wrap}
  header .bar>div:has(> .navg){flex:0 0 auto;order:5;width:auto;margin:4px auto 0}
}

/* 6. On a phone the nav is display:none, so nothing needs a second row: the last few px of pressure on a
      320px handset land on the username ellipsis instead of dropping the gear onto a row of its own. */
@media(max-width:768px){ header .bar{flex-wrap:nowrap} }

/* 7. The Go Pro pill is 62px in a bar already at capacity below 1500px (it is already hidden below 1180). */
@media(max-width:1500px){ .who-gopro{display:none} }

/* A dead pipeline must not look like a quiet slate. Amber, not red: nothing is broken for the READER, but
   this is a statement about us, not about the day's games. */
.b3-outage{margin:10px 2px 14px;padding:12px 14px;border:1px solid var(--gold-bg);border-radius:10px;
  background:#2a2210;color:var(--goldsoft);font-size:13px;line-height:1.6}
.b3-outage b{color:var(--gold-hi)}

/* ---- THE PARLAY OF THE DAY ------------------------------------------------------------------------------
   A slip is a different object from a pick and has to look like one, or a reader treats three correlated
   legs as three independent recommendations. The price is the loudest element because it is the thing that
   makes a parlay tempting, and the honest counterweight -- the fair hit rate and the edge -- sits directly
   under it rather than in a tooltip. When the legs are below the quality bar the card SAYS SO in its own
   body instead of quietly rendering the same as a good one. */
.b3-parlay{margin:14px 2px 18px;padding:14px 16px;border:1px solid var(--rule,var(--line));
  border-left:3px solid var(--goldsoft);border-radius:10px;background:var(--card,#161b21)}
.b3-plhead{display:flex;flex-wrap:wrap;align-items:baseline;gap:10px;justify-content:space-between}
.b3-plhead b{font-size:15px}
.b3-plrec{font-size:12.5px;font-variant-numeric:tabular-nums}
.b3-plprice{font-size:26px;font-weight:700;letter-spacing:-.5px;margin:6px 0 10px;
  font-variant-numeric:tabular-nums;color:var(--goldsoft)}
.b3-plprice .mut{font-size:14px;font-weight:400}
.b3-plleg{display:flex;align-items:baseline;gap:10px;padding:7px 0;
  border-top:1px solid var(--rule2,#222830)}
.b3-pllb{flex:1 1 auto;font-size:13.5px}
.b3-plbot{flex:0 0 auto;font-size:12px;opacity:.72}
.b3-plod{flex:0 0 auto;font-size:13px;font-variant-numeric:tabular-nums;min-width:52px;text-align:right}
.b3-pledge{margin-top:10px;font-size:12.5px;opacity:.85;font-variant-numeric:tabular-nums}
.b3-plwarn{margin-top:8px;font-size:12px;color:var(--goldsoft);opacity:.9}
@media (max-width:560px){.b3-plprice{font-size:22px}.b3-plbot{display:none}}

/* ---- HISTORY: THE MARKET LEDGER -------------------------------------------------------------------------
   The tab opens on this instead of on 34 date rows. Ranked by units with the sample size on every row, so the
   two questions a paying reader has -- what works, and on how much evidence -- are answered in one glance and
   in that order. The losing half is a fold, not a deletion: it says how many markets and what they cost. */
.hmk{margin:6px 2px 18px;padding:14px 16px;border:1px solid var(--line,var(--line));border-radius:12px;
  background:var(--card,#161b21)}
.hmk-h{display:flex;flex-wrap:wrap;align-items:baseline;gap:4px 10px}
.hmk-h b{font-size:16px;letter-spacing:-.2px}
.hmk-sub{font-size:12px;color:var(--mut)}
.hmk-ctx{display:flex;flex-wrap:wrap;gap:6px 16px;margin:9px 0 12px;padding-bottom:11px;
  border-bottom:1px solid var(--line,var(--line));font-size:12.5px;font-variant-numeric:tabular-nums}
.hmk-ctx b{font-variant-numeric:tabular-nums}
.hmk-sec{font-size:11.5px;letter-spacing:.06em;text-transform:uppercase;color:var(--mut);margin:4px 0 6px}
.hmk-r{display:grid;grid-template-columns:minmax(0,1fr) 84px 40px minmax(44px,1fr) 62px 58px 66px;
  align-items:center;gap:10px;padding:8px 8px;margin:0 -8px;border-radius:8px;cursor:pointer;
  font-variant-numeric:tabular-nums;font-size:13px}
.hmk-r:hover{background:rgba(var(--gold-rgb),.07)}
.hmk-nm{display:flex;flex-wrap:wrap;align-items:baseline;gap:6px;min-width:0}
.hmk-nm b{font-weight:650;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.hmk-nm i{font-style:normal;font-size:12px;color:var(--mut);white-space:nowrap}
.hmk-rec{font-size:12.5px;color:var(--mut)}
.hmk-nr{display:block;font-style:normal;font-size:11.5px;opacity:.7;white-space:nowrap}
.hmk-wr{font-size:12.5px;color:var(--mut);text-align:right}
.hmk-bar{position:relative;height:7px;border-radius:4px;background:rgba(var(--push-rgb),.16);overflow:hidden}
.hmk-bar i{position:absolute;left:0;top:0;bottom:0;border-radius:4px;background:#94a3b8}
.hmk-bar.pos i{background:var(--good)}
.hmk-bar.neg i{background:var(--bad-hi)}
.hmk-u{font-weight:750;text-align:right}
.hmk-roi{font-size:12.5px;text-align:right}
.hmk-n{font-size:11.5px;color:var(--mut);text-align:right}
.hmk-dn{margin-top:10px;border-top:1px solid var(--line,var(--line));padding-top:8px}
.hmk-dn>summary{cursor:pointer;font-size:11.5px;letter-spacing:.06em;text-transform:uppercase;
  color:var(--mut);list-style:none;padding:4px 0}
.hmk-dn>summary::-webkit-details-marker{display:none}
.hmk-dn>summary:before{content:'\25B8 ';display:inline-block;transition:transform .15s}
.hmk-dn[open]>summary:before{transform:rotate(90deg)}
.hmk-none{font-size:13px;color:var(--mut);padding:6px 0 2px}
.hmk-foot{margin-top:12px;font-size:11.5px;color:var(--mut);line-height:1.55}
/* An engine card that only exists because the board must never be blank says so on its own face. */
.b3below{color:var(--goldsoft);border-color:var(--gold-bg)!important;background:rgba(122,90,31,.16)}

/* ---- THE SIMULATED BACKTEST ------------------------------------------------------------------------------
   Deliberately does NOT look like the live record. Dashed border, cool slate hue instead of the gold the rest
   of this product uses, and a SIMULATED tag on every heading and every tile at the same weight as the number
   it labels. A backtest that is visually indistinguishable from a forward record is a lie told by a
   stylesheet, and this is the one number on the site most likely to be screenshotted out of context. */
.simb{margin:18px 2px;padding:14px 16px;border:1px dashed #4b5b6e;border-radius:12px;
  background:linear-gradient(180deg,rgba(75,91,110,.13),rgba(75,91,110,.05))}
.simtag{display:inline-block;font-size:11px;font-weight:800;letter-spacing:.13em;padding:2px 6px;
  border-radius:4px;background:#4b5b6e;color:#eaf1f8;vertical-align:1px;margin-right:7px}
.simtag.big{font-size:11px;padding:3px 8px;letter-spacing:.15em}
.simb-h{display:flex;flex-wrap:wrap;align-items:center;gap:4px 6px}
.simb-h b{font-size:15.5px;letter-spacing:-.2px}
.simb-warn{margin:8px 0 0;font-size:11.5px;line-height:1.55;color:#a9bccd}
.simb-ctx{display:flex;flex-wrap:wrap;gap:5px 15px;margin:9px 0 12px;padding-bottom:11px;
  border-bottom:1px dashed rgba(75,91,110,.6);font-size:12.5px;font-variant-numeric:tabular-nums}
.simb-tiles{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:10px}
.simt{padding:10px 12px;border:1px solid rgba(75,91,110,.55);border-radius:9px;background:rgba(0,0,0,.16)}
.simt-k{display:block;font-size:12px;color:var(--mut)}
.simt-v{display:flex;align-items:baseline;gap:5px;margin:4px 0 2px;font-variant-numeric:tabular-nums}
.simt-v b{font-size:19px;font-weight:750;letter-spacing:-.4px}
.simt-v i{font-style:normal;font-size:11.5px;color:var(--mut);margin-right:6px}
.simt-s{display:block;font-size:11px;color:var(--mut);font-variant-numeric:tabular-nums}
.simb-note{margin:12px 0 4px;font-size:12.5px;line-height:1.6}
.simb-sec{display:flex;flex-wrap:wrap;align-items:center;margin:14px 0 6px;font-size:12.5px;font-weight:650}
.simr{display:grid;grid-template-columns:minmax(0,1fr) 62px 78px 74px 68px;align-items:center;gap:10px;
  padding:7px 8px;margin:0 -8px;border-radius:7px;font-size:13px;font-variant-numeric:tabular-nums}
.simr-hd{font-size:11.5px;letter-spacing:.05em;text-transform:uppercase;color:var(--mut);padding-bottom:2px}
.simr-n{display:flex;flex-wrap:wrap;align-items:baseline;gap:6px;min-width:0}
.simr-n b{font-weight:650;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.simr-n i{font-style:normal;font-size:11.5px;color:var(--mut);white-space:nowrap}
.simr-k{font-size:12px;color:var(--mut);text-align:right}
.simr-u{font-weight:700;text-align:right}
.simr-r{font-weight:750;text-align:right}
.simb-warnrow{margin:10px 0 2px;padding:9px 11px;border-left:2px solid var(--gold-bg);background:rgba(122,90,31,.14);
  border-radius:0 8px 8px 0;font-size:12px;line-height:1.6;color:#e6d3ac}
/* The season disclosure hangs off its own row, indented under the number it qualifies, so the two can never
   be screenshotted apart. Amber when the recent window contradicts the lifetime figure. */
/* The Tier B card. Warmer than the rest of the simulated block because it is the one thing here anyone
   should consider acting on — but it keeps the SIMULATED tag and it renders its weakness in the same type
   size as its ROI, which is the whole point of the layout. */
.spec{margin:12px 0 4px}
.spec-c{padding:13px 15px;border:1px solid #6b5a2e;border-radius:10px;background:rgba(122,90,31,.10)}
.spec-h{display:flex;flex-wrap:wrap;align-items:center;gap:4px 8px}
.spec-h b{font-size:14.5px}
.spec-t{font-size:11px;font-weight:800;letter-spacing:.13em;padding:2px 7px;border-radius:4px;
  background:var(--goldsoft);color:#1a1408}
.spec-v{display:flex;flex-wrap:wrap;gap:8px 20px;margin:10px 0 11px;padding-bottom:10px;
  border-bottom:1px solid rgba(107,90,46,.55);font-variant-numeric:tabular-nums}
.spec-v span{display:flex;flex-direction:column}
.spec-v b{font-size:17px;font-weight:750;letter-spacing:-.3px}
.spec-v i{font-style:normal;font-size:11.5px;color:var(--mut);max-width:190px}
.spec-r{margin:7px 0;font-size:12px;line-height:1.6}
.spec-r.ok{color:#a8dcc0}
.spec-r.bad{color:#e6d3ac}
.spec-f{margin-top:10px;font-size:11px;color:var(--mut);line-height:1.55}
.simr-wrap{padding-bottom:2px}
.simr-sub{margin:-2px 0 7px 8px;font-size:11px;line-height:1.55;color:var(--mut);
  font-variant-numeric:tabular-nums}
.simr-sub.warn{color:#e6d3ac;border-left:2px solid var(--gold-bg);padding:4px 0 4px 9px;margin-left:2px;
  background:rgba(122,90,31,.10);border-radius:0 6px 6px 0}
.simb-dn{margin-top:12px}
.simb-dn>details>summary{cursor:pointer;font-size:12px;color:var(--mut);list-style:none;padding:5px 0}
.simb-dn>details>summary::-webkit-details-marker{display:none}
.simb-foot{margin-top:13px;padding-top:11px;border-top:1px dashed rgba(75,91,110,.6);
  font-size:11.5px;line-height:1.6;color:var(--mut)}
@media(max-width:700px){
  .simr{grid-template-columns:minmax(0,1fr) 70px 66px;row-gap:2px}
  .simr-k:first-of-type,.simr-hd .simr-k:first-of-type{display:none}
  .simr-u{display:none}
}
.hd-sec{display:flex;flex-wrap:wrap;align-items:center;gap:8px 12px;margin:0 2px 8px}
.hd-sec>b{font-size:14px}
.hrange{display:flex;flex-wrap:wrap;gap:6px}
.hrange .chip.rg{font-size:11.5px;padding:3px 10px}
@media(max-width:760px){
  .hmk-r{grid-template-columns:minmax(0,1fr) 74px 60px 54px;row-gap:2px}
  .hmk-bar,.hmk-n{display:none}
}

:root{
  /* ---- CANVAS -------------------------------------------------------------------------------
     Lifted off the void. The old --bg was #05070c: relative luminance 0.0026, a black hole that
     made every card edge a hard cut and every white glyph a glare source. #0A0D14 keeps the deep
     instrument feel and gives the layers somewhere to sit. Adjacent tiers separate by 1.05-1.13:1
     -- deliberately subtle, because BORDERS do the separating here, not fills. */
  --bg:      #0A0D14;   /* page                                                                */
  --bg2:     #0F131D;   /* recessed: troughs, wells, inset tracks                               */
  --surf:    #151B28;   /* card                                                                 */
  --surf2:   #1C2331;   /* raised: card header, active row, popover                             */
  --surf3:   #242C3D;   /* hover / pressed / selected cell                                      */

  /* ---- RULES --------------------------------------------------------------------------------
     Three weights. line2 is a whisper INSIDE a card, line is the card's own edge, line3 is
     emphasis and only earns its keep on a focused or selected element. */
  --line2:   #1A2130;
  --line:    #2A3345;
  --line3:   #3A4459;
  --hair:    1px solid var(--line);
  --hair2:   1px solid var(--line2);

  /* ---- INK ----------------------------------------------------------------------------------
     Four steps, all measured against --bg. Nothing here is below AA, including --faint, because
     this product publishes losing numbers and a de-emphasised loss is a dishonest loss.
       txt 17.18:1   txt2 12.20:1   mut 8.36:1   faint 5.33:1 */
  --txt:     #EEF1F7;
  --txt2:    #C6CDDD;
  --mut:     #A2AABF;
  --faint:   #7E8699;
  --ink:     var(--txt);          /* body copy alias used by older rules */
  --fg:      var(--txt);          /* was referenced with NO fallback -- silently invalid */
  --on-accent:#0A0D14;            /* text that sits ON a solid gold/green/red fill */

  /* ---- GOLD :: the identity -----------------------------------------------------------------
     #D4AF37 is the logo gold. The stylesheet had been running on #ffd166, a pale butter yellow
     that reads as a highlighter rather than as metal. 9.24:1 on --bg, so it is legible at the
     10px sizes this app actually uses it at. --gold-rgb exists so the ~257 tint call sites can
     track the accent instead of drifting from it. */
  --gold:      #D4AF37;
  --gold-hi:   #E8C55A;   /* hover, active, emphasis                                            */
  --gold2:     #B8912E;   /* the far stop of a metallic gradient                                */
  --goldsoft:  #C4A44E;   /* low-emphasis gold text                                             */
  --gold-bg:   #231C0C;   /* gold-tinted surface -- gold on it reads 8.04:1                     */
  --gold-rgb:  212,175,55;
  --gold2-rgb: 184,145,46;
  --acc:       var(--gold);
  --accent:    var(--gold);

  /* ---- STATUS :: exactly one WON, one LOST, one PUSH, one LIVE ------------------------------
     Before this, WON was drawn in five different greens (#34d399 #86efac #6ee7a8 #35c46a #4ade80)
     and LOST in five different reds, depending on which component you were looking at. A result
     that changes colour between two views of the same bet is not a result anyone trusts. */
  --good:     #3DD68C;  --good-hi: #7BE8B0;  --good-bg: #0F241A;  --good-rgb: 61,214,140;
  --bad:      #FF6B7E;  --bad-hi:  #FFA0AC;  --bad-bg:  #261218;  --bad-rgb:  255,107,126;
  --push:     #9AA3B8;  --push-hi: #C6CDDD;  --push-bg: #1A2130;  --push-rgb: 154,163,184;
  --info:     #7FD7FF;  --info-hi: #A9E5FF;  --info-bg: #0A1E2A;  --info-rgb: 127,215,255;
  --blue2:    #7FB5FF;
  --live:     var(--bad);          /* live == in play, drawn in the alert hue                   */
  --live-rgb: var(--bad-rgb);

  /* ---- SPACING ------------------------------------------------------------------------------
     --s-1..--s-6 keep their existing values byte for byte so nothing in the 3,000-odd existing
     padding/margin declarations shifts. --s-0/--s-7/--s-8 are new rungs so future work has
     somewhere to land instead of inventing an 81st value. */
  --s-0:2px; --s-1:4px; --s-2:6px; --s-3:8px; --s-4:12px;
  --s-5:16px; --s-6:24px; --s-7:32px; --s-8:48px;

  /* ---- TYPE ---------------------------------------------------------------------------------
     Existing rungs unchanged. The half-pixel sizes (12.5 / 11.5 / 10.5 / 13.5) are REAL in this
     codebase -- 464 declarations use them -- so they get names rather than being pretended away. */
  --fs-0:10px;  --fs-1:11px;   --fs-2:12px;   --fs-3:13px;
  --fs-4:14px;  --fs-5:16px;   --fs-6:18px;   --fs-7:28px;  --fs-page:20px;
  --fs-micro:9px;   --fs-00:10.5px; --fs-05:11.5px; --fs-15:12.5px; --fs-25:13.5px;
  --lh-1:1.2; --lh-2:1.35; --lh-3:1.5;
  --fw-nrm:400; --fw-med:600; --fw-semi:700; --fw-bold:800;
  --measure:68ch;

  /* ---- RADIUS -------------------------------------------------------------------------------
     NOTE, honestly: there are TWO radius scales in this file, --r1/--r2/--r3 (8/12/16) and
     --r-1/--r-2/--r-3 (4/8/12), and they disagree at every rung. Both are preserved at their
     current values because collapsing them would move ~750 border-radius declarations with no
     way to verify each one. Documented, not fixed. New work should use --rad-*. */
  --r1:8px;  --r2:12px; --r3:16px;
  --r-1:4px; --r-2:8px;  --r-3:12px;
  --rad-xs:4px; --rad-sm:6px; --rad-md:10px; --rad-lg:14px; --rad-xl:20px; --rad-pill:999px;

  /* ---- ELEVATION ----------------------------------------------------------------------------
     Softened. The old --e3 was rgba(0,0,0,.86); against a bg that is no longer near-black, that
     read as soot rather than as depth. --rim is the single top highlight that makes a surface
     look lit rather than painted. */
  --e1: 0 1px 2px rgba(0,0,0,.32);
  --e2: 0 4px 14px -6px rgba(0,0,0,.55);
  --e3: 0 16px 44px -18px rgba(0,0,0,.70);
  --rim: inset 0 1px 0 rgba(255,255,255,.045);
  --glow-gold: 0 0 0 1px rgba(var(--gold-rgb),.30), 0 6px 20px -8px rgba(var(--gold-rgb),.28);

  --font-mono: var(--font-num);
  --focus: 0 0 0 2px var(--bg), 0 0 0 4px var(--gold);
}

/* PREDICTION-MARKET MODE swaps the accent to ice. The tint channel has to swap with it, or every
   rgba() highlight stays yellow while the solid accents turn blue. */
body.mkt-pm{--gold-rgb:127,215,255;--gold2-rgb:58,166,216;--gold-hi:#A9E5FF;--goldsoft:#8FC4DE;--gold-bg:#0A1E2A}

/* LIGHT THEME has to carry every token the 1,503 migrated call sites now reference, or the tints
   resolve to nothing. Values are the light-theme equivalents, not the dark ones. */
body.theme-light{
  --bg2:#EEF1F8; --surf3:#E6EAF4; --line3:#CFD6E6;
  --txt2:#3A4258; --faint:#6A7288; --on-accent:#12151F; --fg:var(--txt);
  --gold-hi:#8A6A12; --goldsoft:#A9760A; --gold-bg:#FBF4E2;
  --gold-rgb:184,134,11; --gold2-rgb:169,118,10;
  --good-hi:#0C6B40; --good-bg:#E8F6EE; --good-rgb:15,138,82;
  --bad-hi:#A82A40;  --bad-bg:#FDECEF;  --bad-rgb:209,59,83;
  --push:#6A7288; --push-hi:#3A4258; --push-bg:#EEF1F8; --push-rgb:106,114,136;
  --info:#0F6F9E; --info-hi:#0D5A80; --info-bg:#E7F3F9; --info-rgb:15,111,158;
  --blue2:#2A5FBF;
  /* WON/LOST measured 4.40:1 and 4.21:1 on the light card -- under AA. A losing number
     that is hard to read is the one regression this product cannot ship. Now 5.99 / 5.70. */
  --good:#0C7245; --bad:#BE2F46;
  --e1:0 1px 2px rgba(30,40,80,.06);
  --e2:0 4px 14px -6px rgba(30,40,80,.14);
  --e3:0 16px 44px -18px rgba(30,40,80,.22);
  --rim:inset 0 1px 0 rgba(255,255,255,.70);
  --focus:0 0 0 2px #fff, 0 0 0 4px #B8860B;
}

/* LIGHT THEME, the last AA gaps. LIGHT_CSS states `.pos{color:#0f8a52}` as a direct rule, which
   outranks the token and measured 3.93:1 on a card and 4.40:1 on white -- both under AA for the
   11-12px these actually render at. Same specificity, stated later, so it wins, and it now reads
   the token instead of a literal. The red matters most: a loss nobody can read is the one thing
   this product is not allowed to ship. */
body.theme-light .pos,
body.theme-light .lk-win b,
body.theme-light .shadowline .pos,
body.theme-light .pl-lv.pos,
body.theme-light .pl-badge.w{color:var(--good)}
body.theme-light .neg,
body.theme-light .pl-badge.l{color:var(--bad)}

/* ==============================================================================================
   SETTLEMENT  ::  a graded result has to look like a fact, not like a label.
   ==============================================================================================
   The brief for this product is honesty, so the settled states get the strongest, flattest,
   least-decorated treatment in the stylesheet: a solid left rule in the status hue, a tinted
   field at low alpha, tabular figures, and NO opacity reduction on losses anywhere. A red number
   here is the whole market position -- it is never allowed to recede.
   These are additive classes. Nothing above is removed, because the JS assigns result classes
   dynamically and an unused-looking selector is not a safe thing to delete in this file. */

.won,.lost,.push,.settled-row{font-variant-numeric:tabular-nums}

/* The status badge: one shape, three fills, uppercase, tracked out, never larger than the number
   it qualifies. It is an annotation on the figure, not a competitor to it. */
.won,.b3done.won,.pl-badge.w,.fd-badge.won,.b3mktr-r.won,
.lost,.b3done.lost,.pl-badge.l,.fd-badge.lost,.b3mktr-r.lost,
.push,.pl-badge.push,.fd-badge.push{
  font-variant-numeric:tabular-nums;
  letter-spacing:.06em}

/* Field tints + left rule. Low alpha so a long settled list does not turn into a traffic light. */
.b3settled.won,.b3state.won,.b3card.done.won{
  border-color:rgba(var(--good-rgb),.34);
  background:linear-gradient(180deg,rgba(var(--good-rgb),.07),transparent 62%),var(--surf)}
.b3settled.lost,.b3state.lost,.b3card.done.lost{
  border-color:rgba(var(--bad-rgb),.34);
  background:linear-gradient(180deg,rgba(var(--bad-rgb),.07),transparent 62%),var(--surf)}

.pl-r.w{border-left-color:var(--good)}
.pl-r.l{border-left-color:var(--bad)}
.pl-r.push,.pl-g .pl-r.push{border-left-color:var(--push)}

/* Unit impact. The single most-scanned number in the product. Monospaced, tabular, aligned right,
   and it keeps its sign -- a leading + or - is information, not decoration. */
.hd-u,.sc-u,.gru,.gres,.b3wl,.pl-u,.evsum,.bk-big,.ps-v{
  font-variant-numeric:tabular-nums;
  font-feature-settings:"tnum" 1,"lnum" 1}
.gres,.hd-u,.sc-u,.gru{text-align:right}

/* pos/neg were hardcoded to two literals that matched no token. They are the same green and red
   as WON and LOST, because they mean the same thing. */
.pos{color:var(--good)}
.neg{color:var(--bad)}
.mut{color:var(--mut)}

/* Any figure that appears in a column lines up. 227 declarations already did this; these are the
   families that were missed. */
table td,table th,.st-cell,.lbtable td,.lbtable th,.jtable td,.jtable th,.rc-tbl td,.rc-tbl th,
.hmk-r,.hd-rec,.hd-n,.sc-rec,.cnt,.lb-count,.evtab-n{
  font-variant-numeric:tabular-nums}

/* ==============================================================================================
   ACCESSIBILITY + MOBILE  ::  the two things that are never anyone's ticket.
   ============================================================================================== */

/* 1. HORIZONTAL SCROLL. `clip` rather than `hidden`: hidden on <body> creates a scroll container
      and silently breaks every position:sticky descendant, which in this app is the header, the
      subnav and the bottom bar. clip does not. */
html{overflow-x:clip}
body{overflow-x:clip;max-width:100%}
img,svg,video,canvas{max-width:100%;height:auto}

/* Wide content scrolls INSIDE its own container rather than pushing the page. These wrappers all
   already exist in the markup; this only gives them the behaviour they were missing. */
.lbwrap,.tbl-scroll,.rc-scroll,.lb-scroll,.rc-tbl,.chartwrap,.rep-wrap,.inv-wrap,.st-grid{
  overflow-x:auto;
  -webkit-overflow-scrolling:touch;
  overscroll-behavior-x:contain}

/* 2. KEYBOARD FOCUS. A visible, high-contrast ring on everything interactive. :focus-visible only,
      so pointer users never see it. The double ring survives on both dark and light fields. */
a:focus-visible,button:focus-visible,input:focus-visible,select:focus-visible,
textarea:focus-visible,summary:focus-visible,[tabindex]:focus-visible,[role="button"]:focus-visible,
.chip:focus-visible,.navg:focus-visible,.subtab:focus-visible,.segbtn:focus-visible{
  outline:none;
  box-shadow:var(--focus);
  border-radius:var(--rad-sm);
  position:relative;
  z-index:1}

/* 3. REDUCED MOTION. There are 33 prefers-reduced-motion blocks already; this is the backstop for
      everything they missed, including the decorative keyframes. Transitions are cut to 1ms rather
      than 0 so transitionend handlers still fire and no JS stalls waiting for one. */
@media(prefers-reduced-motion:reduce){
  *,*::before,*::after{
    animation-duration:.001ms !important;
    animation-iteration-count:1 !important;
    transition-duration:.001ms !important;
    scroll-behavior:auto !important}
}

/* 4. TAP TARGETS. Below the tablet breakpoint nothing interactive is smaller than 44px of
      reachable area. Achieved with a transparent ::after so it costs no layout. */
@media(max-width:760px){
  button,.chip,.navg,.subtab,.segbtn,[role="button"]{min-height:32px}
  .botnav a,.botnav button{min-height:44px}
}

/* ==============================================================================================
   CONTROLS  ::  primary / secondary / tertiary, said once.
   ==============================================================================================
   Additive utility classes. Existing buttons are untouched -- these exist so the next thing built
   does not invent a sixth button treatment. */
.btn-1,.btn-2,.btn-3{
  display:inline-flex;align-items:center;justify-content:center;gap:var(--s-2);
  font-family:var(--font-ui);font-size:var(--fs-2);font-weight:var(--fw-semi);
  letter-spacing:.01em;line-height:1;
  padding:var(--s-3) var(--s-5);border-radius:var(--rad-md);
  cursor:pointer;white-space:nowrap;
  transition:background var(--dur-1,120ms) var(--ease-out,ease),
             border-color var(--dur-1,120ms) var(--ease-out,ease),
             color var(--dur-1,120ms) var(--ease-out,ease)}

/* PRIMARY: solid gold, dark ink, 9.24:1. One per view. */
.btn-1{background:linear-gradient(180deg,var(--gold-hi),var(--gold));
  border:1px solid var(--gold2);color:var(--on-accent);box-shadow:var(--e1),var(--rim)}
.btn-1:hover{background:var(--gold-hi);border-color:var(--gold-hi)}
.btn-1:active{background:var(--gold2);box-shadow:none}

/* SECONDARY: the surface with an edge. Carries the majority of the actions in the app. */
.btn-2{background:var(--surf2);border:var(--hair);color:var(--txt)}
.btn-2:hover{background:var(--surf3);border-color:var(--line3)}
.btn-2:active{background:var(--surf)}

/* TERTIARY: text only until you touch it. Destructive and low-stakes actions. */
.btn-3{background:transparent;border:1px solid transparent;color:var(--mut)}
.btn-3:hover{color:var(--txt);background:var(--surf2)}

.btn-1[disabled],.btn-2[disabled],.btn-3[disabled],
.btn-1[aria-disabled="true"],.btn-2[aria-disabled="true"]{
  cursor:not-allowed;opacity:.55;filter:saturate(.5)}

/* Status chips, if something needs one and does not already have a class. */
.stat-won{color:var(--good-hi);background:rgba(var(--good-rgb),.13);border:1px solid rgba(var(--good-rgb),.32)}
.stat-lost{color:var(--bad-hi);background:rgba(var(--bad-rgb),.13);border:1px solid rgba(var(--bad-rgb),.32)}
.stat-push{color:var(--push-hi);background:rgba(var(--push-rgb),.14);border:1px solid rgba(var(--push-rgb),.30)}
.stat-live{color:var(--info-hi);background:rgba(var(--info-rgb),.13);border:1px solid rgba(var(--info-rgb),.32)}
.stat-won,.stat-lost,.stat-push,.stat-live{
  display:inline-flex;align-items:center;gap:var(--s-2);
  font-size:var(--fs-micro);font-weight:var(--fw-bold);
  text-transform:uppercase;letter-spacing:.07em;
  padding:2px var(--s-2);border-radius:var(--rad-xs);
  font-variant-numeric:tabular-nums}

/* ==============================================================================================
   FLATTENED BOARD LEAVES  ::  a header that leads nowhere must not look like a door.
   ==============================================================================================
   The structure lane collapsed the one-child levels of the board: a .subcat holding <=2 picks and
   a .gamegrp holding a single bet-type group now render as `<details ... open data-keep-open>`.
   They are still <details>, so every selector and every querySelector keeps matching -- but the
   summary is now a LABEL, not a control, and a click on it would only close something that is
   meant to stay open.

   Suppressed with pointer-events rather than by hiding the summary, because the disclosure
   semantics (and the elements' own IDs, which JS scrolls to) have to survive.
   .unvgroup is deliberately excluded: that header carries the unproven/shadow-pick tooltip and
   has to stay hover- and focus-reachable. */
.subcat.sc-flat:not(.unvgroup) > .subhdr,
.gamegrp.gg-flat > .gamehdr{
  pointer-events:none;
  cursor:default}
.subcat.sc-flat:not(.unvgroup) > .subhdr::-webkit-details-marker,
.gamegrp.gg-flat > .gamehdr::-webkit-details-marker{display:none}
.subcat.sc-flat:not(.unvgroup) > .subhdr::marker,
.gamegrp.gg-flat > .gamehdr::marker{content:""}

/* The chevron is the affordance. With nothing to toggle, it is a lie -- but it keeps its box so
   the header's columns do not shift relative to the unflattened groups above and below it. */
.subcat.sc-flat:not(.unvgroup) > .subhdr .chev,
.gamegrp.gg-flat > .gamehdr .chev{visibility:hidden}

/* No hover affordance either -- a flat header should read as a caption. */
.subcat.sc-flat:not(.unvgroup) > .subhdr:hover,
.gamegrp.gg-flat > .gamehdr:hover{background:inherit}

/* The real controls inside the header stay live. pointer-events must be restored explicitly;
   it does not inherit back on its own. */
.subcat.sc-flat > .subhdr .evbtn,
.subcat.sc-flat > .subhdr .tailbtn,
.subcat.sc-flat > .subhdr .parbtn,
.gamegrp.gg-flat > .gamehdr .evbtn,
.gamegrp.gg-flat > .gamehdr .tailbtn,
.gamegrp.gg-flat > .gamehdr .parbtn,
.subcat.sc-flat > .subhdr a,
.gamegrp.gg-flat > .gamehdr a{
  pointer-events:auto;
  cursor:pointer}
