﻿/* ===== /odds v4 — COMMAND DECK (2026-08-29). One screen, zero page scroll.
   Desktop: topbar / rail / leagues / games / STAGE / tiles / dock. Drill, don't scroll.
   Mobile: app screens — Board -> Game (tile grid) -> Module, real back navigation.
   Site chrome off: this page owns the viewport. Serves OddsTerminal.aspx only. ===== */
html, body { overflow: hidden !important; height: 100%; }
header.main-header { display: none !important; }
footer.site-footer { display: none !important; }
.bb-botnav { display: none !important; }
.obt-page{position:fixed;inset:0;background:var(--bg,var(--panel-2));z-index:50}
.obt-page,.obt-page *{box-sizing:border-box}
.obt-app{display:flex;flex-direction:column;height:100%;background:var(--panel-2)}

/* ---------- topbar ---------- */
.obt-top{display:flex;align-items:center;gap:10px;height:44px;padding:0 10px;background:var(--panel);border-bottom:1px solid var(--line)}
.obt-home{display:inline-flex;align-items:center;gap:7px;color:var(--ink);text-decoration:none;font-family:var(--display);font-weight:800;font-size:.95rem;letter-spacing:-.01em;white-space:nowrap}
.obt-home i{color:var(--action-hi)}
input.obt-ctl{appearance:none;border:1px solid var(--line);border-radius:0;background:var(--panel-2);color:var(--ink);font-family:var(--mono);font-size:.75rem;padding:7px 10px;min-height:32px;width:170px;outline:none}
.obt-heroline{flex:1;min-width:0;font-family:var(--ui);font-size:.82rem;color:var(--ink-dim);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:pointer}
.obt-heroline b{color:var(--model)}
.obt-heroline .cap{font-family:var(--mono);font-size:.6rem;letter-spacing:.12em;text-transform:uppercase;color:var(--model);margin-right:8px}
.obt-tico{appearance:none;border:1px solid var(--line);border-radius:0;background:var(--panel-2);color:var(--ink-dim);width:32px;height:32px;cursor:pointer;font-size:.8rem}
.obt-tico:hover{color:var(--ink)}
.obt-stamp{display:inline-flex;align-items:center;gap:7px;font-family:var(--mono);font-size:.7rem;color:var(--ink-dim);white-space:nowrap}
.obt-dot{width:6px;height:6px;border-radius:50%;background:var(--action-hi);box-shadow:0 0 0 3px rgba(70,140,255,.22)}
@media (prefers-reduced-motion: no-preference){
    .obt-dot{animation:obtPulse 1.8s ease-in-out infinite}
    .obt-cell.flash{animation:obtFlash 1.6s ease-out}
}
@keyframes obtPulse{0%,100%{opacity:1}50%{opacity:.4}}
@keyframes obtFlash{0%{background:var(--model-dim);border-color:var(--model)}100%{background:var(--panel-2)}}
#obtCtlHome{display:none}

/* ---------- deck grid (desktop) ---------- */
.obt-deck{flex:1;min-height:0;display:grid;grid-template-columns:60px 116px 240px minmax(0,1fr) 218px;background:var(--panel-2)}
.obt-col{min-height:0;border-right:1px solid var(--line);display:flex;flex-direction:column}
.obt-rail1{align-items:center;gap:4px;padding:8px 0;background:var(--panel)}
.obt-ico{display:flex;align-items:center;justify-content:center;width:36px;height:36px;border:1px solid transparent;border-radius:0;background:transparent;color:var(--ink-dim);font-size:.85rem;cursor:pointer;transition:.15s}
.obt-ico:hover{color:var(--ink);background:var(--panel-2)}
.obt-ico.on{border-color:var(--action-hi);color:var(--action-hi)}
.obt-fly{position:fixed;z-index:9998;min-width:216px;background:var(--panel);border:1px solid var(--line-strong,var(--line));border-radius:0;box-shadow:0 18px 40px -18px rgba(0,0,0,.6);padding:6px}
.obt-fly b{display:block;font-family:var(--mono);font-size:.6rem;letter-spacing:.12em;text-transform:uppercase;color:var(--ink-faint);padding:5px 10px}
.obt-fly button,.obt-fly a{display:block;width:100%;text-align:left;appearance:none;border:none;background:transparent;color:var(--ink-dim);font-family:var(--ui);font-size:.86rem;padding:8px 10px;border-radius:0;cursor:pointer;text-decoration:none;line-height:1.35}
.obt-fly button:hover,.obt-fly a:hover{background:var(--panel-2);color:var(--ink)}
.obt-lgs{overflow-y:auto;padding:6px 5px;gap:2px;background:var(--panel)}
.obt-lg{display:flex;align-items:center;gap:7px;padding:6px 7px;border:1px solid transparent;border-radius:0;background:transparent;color:var(--ink-dim);font-family:var(--mono);font-size:.7rem;letter-spacing:.03em;text-transform:uppercase;cursor:pointer;white-space:nowrap;text-align:left;min-height:31px;width:100%}
.obt-lg img{width:15px;height:15px;object-fit:contain}
.obt-lg:hover{color:var(--ink);background:var(--panel-2)}
.obt-lg.on{border-color:var(--action-hi);background:var(--panel-2);color:var(--ink)}

/* ---------- games column ---------- */
.obt-gamescol{background:var(--panel)}
.obt-gbar{display:flex;gap:4px;padding:7px 8px;border-bottom:1px solid var(--line)}
.obt-seg{display:inline-flex;border:1px solid var(--line);border-radius:0;overflow:hidden;background:var(--panel-2);width:100%}
.obt-seg button{flex:1;appearance:none;border:none;background:transparent;color:var(--ink-dim);font-family:var(--mono);font-size:.66rem;letter-spacing:.03em;text-transform:uppercase;padding:7px 4px;cursor:pointer;min-height:32px}
.obt-seg button.on{background:var(--action-hi);color:#fff}
.obt-rows{flex:1;overflow-y:auto;min-height:0;-webkit-overflow-scrolling:touch}
.obt-day{position:sticky;top:0;z-index:3;display:flex;align-items:center;gap:8px;padding:3px 10px;background:var(--panel-2);border-bottom:1px solid var(--line);font-family:var(--mono);font-size:.62rem;letter-spacing:.14em;text-transform:uppercase;color:var(--ink-faint)}
/* [2026-09-02] game cards — selection-first: crest + name lead, best price small right */
.obt-row{display:block;padding:7px 10px 8px;border-bottom:1px solid var(--line);cursor:pointer;transition:background .15s}
.obt-row:hover{background:rgba(70,140,255,.05)}
.obt-row.sel{background:rgba(70,140,255,.1);box-shadow:inset 3px 0 0 var(--action-hi)}
.obt-row.started{opacity:.68}
.obt-gch{display:flex;align-items:center;gap:7px;font-family:var(--mono);font-size:.6rem;letter-spacing:.08em;text-transform:uppercase;color:var(--ink-faint);margin-bottom:3px;min-height:15px}
.obt-gch i{font-style:normal;flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.obt-gch .live{display:inline-block;flex:0 0 auto;font-size:.58rem;letter-spacing:.08em;color:#fff;background:#C43D3D;border-radius:0;padding:0 5px}
.obt-gch .lsf{flex:1;color:var(--ink-faint)}
.obt-gch .gval{flex:0 0 auto;color:var(--model);font-weight:700;letter-spacing:.02em;text-transform:none}
.obt-gch .gstar{flex:0 0 auto;color:var(--gold);font-size:.72rem}
.obt-gside{display:flex;align-items:center;gap:7px;min-width:0;padding:2px 0}
.obt-gside img{width:20px;height:20px;object-fit:contain;flex:0 0 20px}
.obt-gph{width:20px;height:20px;flex:0 0 20px;border-radius:50%;background:var(--panel-2);border:1px solid var(--line)}
.obt-gside .nm{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:var(--ui);font-weight:600;font-size:.82rem;color:var(--ink);line-height:1.3}
.obt-gside .sp{flex:0 0 auto;font-family:var(--mono);font-variant-numeric:tabular-nums;font-size:.8rem;color:var(--model);padding:1px 5px;border:1px solid transparent;border-radius:0}
.obt-gside .sp:hover{border-color:rgba(52,211,153,.4)}
.obt-gside .sp.flash{animation:obtFlash 1.6s ease-out}
.obt-gside .lsn{flex:0 0 auto;font-family:var(--mono);font-variant-numeric:tabular-nums;font-size:.95rem;font-weight:700;color:var(--ink)}
.obt-tn{width:7px;height:7px;border-radius:50%;flex:0 0 7px;background:var(--model)}
.obt-tn.q{background:var(--gold)}
.obt-tn.o{background:#C43D3D}
.obt-when{display:none}
.obt-row .obt-cells{display:flex;gap:5px;align-items:center;margin-top:6px}
.obt-cell{display:flex;flex-direction:column;align-items:flex-end;gap:0;border:1px solid var(--line);border-radius:0;font-variant-numeric:tabular-nums;background:var(--panel-2);padding:3px 7px;min-width:56px;cursor:pointer}
.obt-cell b{font-family:var(--mono);font-size:.8rem;color:var(--model);line-height:1.25}
.obt-cell i{font-style:normal;font-family:var(--mono);font-size:.58rem;color:var(--ink-faint);max-width:7em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.obt-cell u{text-decoration:none;font-family:var(--mono);font-size:.66rem;color:var(--ink-dim)}
.obt-cell .you,.obt-cell .dir{display:none}
.obt-cell.inslip{border-color:var(--action-hi);box-shadow:0 0 0 1px var(--action-hi) inset}
.obt-star{display:none}
.obt-sub{display:none}
.obt-chip{font-family:var(--mono);font-size:.62rem;letter-spacing:.06em;text-transform:uppercase;border-radius:0;padding:2px 7px;white-space:nowrap;cursor:pointer;border:1px solid var(--line);color:var(--ink-dim);background:none}
.obt-chip.good{color:var(--model);border-color:rgba(52,211,153,.4)}
.obt-chip.hi{color:var(--gold);border-color:rgba(245,179,1,.35)}
.obt-empty{padding:34px 16px;text-align:center;color:var(--ink-dim);font-size:.86rem;line-height:1.6}
.obt-skel{height:48px;margin:8px 10px;border-radius:0;background:var(--panel-2);border:1px solid var(--line)}
.obt-days{display:none}

/* ---------- stage ---------- */
.obt-stagecol{background:var(--panel-2)}
.obt-stagehead{display:flex;align-items:center;gap:8px;padding:7px 12px;border-bottom:1px solid var(--line);background:var(--panel);min-height:44px}
.obt-back{display:none;appearance:none;border:1px solid var(--line);border-radius:0;background:var(--panel-2);color:var(--ink-dim);width:36px;height:36px;cursor:pointer;font-size:.9rem;flex:0 0 36px}
.obt-crumb{display:flex;align-items:center;gap:8px;min-width:0;flex:1}
.obt-crumb img{width:20px;height:20px;object-fit:contain}
.obt-crumb b{font-family:var(--display);font-weight:800;font-size:.95rem;color:var(--ink);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.obt-crumb .mod{font-family:var(--mono);font-size:.66rem;letter-spacing:.1em;text-transform:uppercase;color:var(--ink-faint);white-space:nowrap}
.obt-crumb .ko{font-family:var(--mono);font-size:.66rem;color:var(--gold);white-space:nowrap}
.obt-lens{display:flex;gap:3px}
.obt-lens button{appearance:none;border:1px solid var(--line);border-radius:0;background:transparent;color:var(--ink-dim);font-family:var(--mono);font-size:.62rem;letter-spacing:.04em;text-transform:uppercase;padding:6px 9px;min-height:30px;cursor:pointer}
.obt-lens button.on{border-color:var(--action-hi);color:var(--action-hi)}
.obt-tnav{display:flex;gap:3px}
.obt-tnav button{appearance:none;border:1px solid var(--line);border-radius:0;background:var(--panel-2);color:var(--ink-dim);width:30px;height:30px;cursor:pointer}
.obt-stage{flex:1;overflow-y:auto;min-height:0;padding:10px 12px}

.obt-stage .obt-chart{height:200px}
.obt-stage .obt-spark{display:none}
.obt-dh{font-family:var(--display);font-weight:800;color:var(--ink);font-size:1.05rem;margin:0 0 4px;line-height:1.3}
.obt-dsub{font-family:var(--mono);font-size:.72rem;color:var(--ink-faint);margin:0 0 10px}
.obt-dlab{font-family:var(--mono);font-size:.64rem;letter-spacing:.12em;text-transform:uppercase;color:var(--ink-faint);display:block;margin:14px 0 7px}

/* ---------- tiles column ---------- */
.obt-tilescol{background:var(--panel);border-right:none}
.obt-gamehead{display:none}
.obt-glens{display:none}
.obt-tiles{flex:1;overflow-y:auto;min-height:0;display:flex;flex-direction:column;gap:0;padding:4px 0;align-content:start}
/* [v6] desktop: tiles are a compact INSTRUMENT LIST -- icon+label left, value right.
   The card form lives in the mobile media block (the app screens keep it). */
.obt-tile{border:none;border-left:2px solid transparent;border-bottom:1px solid var(--line);border-radius:0;font-variant-numeric:tabular-nums;background:none;padding:7px 10px 7px 8px;cursor:pointer;min-height:0;display:flex;flex-direction:row;align-items:center;gap:8px;transition:background .12s}
.obt-tile:hover{background:rgba(70,140,255,.05)}
.obt-tile.on{background:rgba(70,140,255,.09);border-left-color:var(--acc,var(--action-hi))}
.obt-tile .tl{display:flex;align-items:center;gap:7px;flex:1;min-width:0;font-family:var(--mono);font-size:.62rem;letter-spacing:.08em;text-transform:uppercase;color:var(--ink-faint);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.obt-tile .tl i.fas{display:none}
.obt-tile .hl{flex:0 1 auto;font-family:var(--mono);font-weight:700;font-size:.72rem;color:var(--ink);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:9em}
.obt-tile .sb{display:none}
.t-h2h{--acc:#8FA3C0} /* ---------- dock ---------- */
.obt-dock{display:flex;align-items:stretch;height:42px;border-top:1px solid var(--card-edge);background:var(--panel)}
.obt-movers{flex:1;display:flex;gap:18px;align-items:center;overflow-x:auto;scrollbar-width:none;padding:0 12px;font-family:var(--mono);font-size:.7rem;color:var(--ink-dim);white-space:nowrap;border-right:1px solid var(--line)}
.obt-movers::-webkit-scrollbar{display:none}
.obt-movers .tag{color:var(--gold);letter-spacing:.1em;text-transform:uppercase;font-size:.6rem}
.obt-movers b{color:var(--ink);font-weight:600}
.obt-slipbar{display:flex;align-items:center;gap:10px;padding:0 14px;cursor:pointer;white-space:nowrap}
.obt-slipbar b{font-family:var(--mono);font-size:.72rem;color:var(--ink)}
.obt-slipbar .n{display:inline-flex;align-items:center;justify-content:center;min-width:20px;height:20px;border-radius:999px;background:var(--action-hi);color:#fff;font-family:var(--mono);font-size:.68rem;font-weight:700;padding:0 5px}
.obt-slipbar .fair{color:var(--model)}
.obt-slipbar .sgp{font-family:var(--mono);font-size:.56rem;letter-spacing:.05em;text-transform:uppercase;color:var(--gold);border:1px solid rgba(245,179,1,.35);border-radius:0;padding:1px 6px}
.obt-slipbar .hintt{font-family:var(--mono);font-size:.66rem;color:var(--ink-faint);max-width:340px;overflow:hidden;text-overflow:ellipsis}
.obt-slip{position:fixed;right:10px;bottom:50px;width:420px;max-width:94vw;max-height:60vh;overflow-y:auto;background:var(--panel);border:1px solid var(--line-strong,var(--line));border-radius:0;box-shadow:0 24px 60px -18px rgba(0,0,0,.7);padding:12px 14px;z-index:9000}
.obt-sleg{display:flex;flex-wrap:wrap;align-items:center;gap:8px 12px;padding:8px 0;border-bottom:1px solid var(--line);font-size:.82rem;color:var(--ink)}
.obt-sleg .lg{font-family:var(--mono);font-size:.6rem;letter-spacing:.08em;text-transform:uppercase;color:var(--action-hi)}
.obt-sleg b{font-family:var(--mono);color:var(--model)}
.obt-sleg button{margin-left:auto;background:none;border:none;color:var(--ink-faint);cursor:pointer;font-size:1rem;width:34px;height:34px}
.obt-slip .verdict{margin-top:9px;padding:9px 12px;border-left:3px solid var(--model);background:var(--model-dim);border-radius:0;color:var(--ink-dim);font-size:.82rem;line-height:1.5}
.obt-slip .verdict b{color:var(--model);font-family:var(--mono)}
.obt-slip .clear{font-family:var(--mono);font-size:.7rem;color:var(--ink-faint);background:none;border:none;cursor:pointer;margin-top:8px;min-height:34px}
.obt-stake{display:inline-flex;align-items:center;gap:6px;font-family:var(--mono);font-size:.72rem;color:var(--ink-dim)}
.obt-stake input{width:72px;border:1px solid var(--line);border-radius:0;background:var(--panel-2);color:var(--ink);font-family:var(--mono);font-size:.82rem;padding:6px 8px;outline:none}

/* ---------- module content (stage + mobile module screens) ---------- */
.gcm{border:none;border-top:1px solid var(--line);border-radius:0;background:none;padding:9px 12px;margin:0;font-variant-numeric:tabular-nums}
.obt-wsmain>.gcm:first-child,.obt-wsc>.gcm:first-child{border-top:none}
.gcmh{display:flex;align-items:center;gap:8px;font-family:var(--mono);font-size:.62rem;letter-spacing:.12em;text-transform:uppercase;color:var(--ink-faint);margin:0 0 6px}
.gcmh i.fas{display:none}
.gcmh i{font-size:.85rem}
.gcmn{font-family:var(--ui);font-size:.78rem;color:var(--ink-faint);margin:6px 0 0;line-height:1.5}
.gclab2{font-family:var(--mono);font-size:.75rem;color:var(--ink-dim);margin:8px 0 3px}
.gclab2 b{color:var(--model)}
.gf-h2h{--acc:#8FA3C0} .gcap{display:inline-block;width:24px;height:24px;border-radius:0;text-align:center;line-height:24px;font-family:var(--mono);font-size:.72rem;font-weight:700;margin:0 3px 3px 0}
.gcap.w{background:rgba(52,211,153,.16);color:var(--model);border:1px solid rgba(52,211,153,.35)}
.gcap.l{background:rgba(196,83,77,.14);color:#E58983;border:1px solid rgba(196,83,77,.35)}
.gcap.d{background:rgba(216,208,106,.12);color:#D8D06A;border:1px solid rgba(216,208,106,.3)}
.gcfrow{display:flex;align-items:center;flex-wrap:wrap;gap:2px 6px;margin:0 0 6px}
.gcft{font-family:var(--mono);font-size:.75rem;color:var(--ink);min-width:72px}
.gcfn{font-family:var(--mono);font-size:.7rem;color:var(--ink-faint);margin-left:4px}
.gsqw{display:flex;flex-wrap:wrap;gap:5px;margin:0 0 4px}
.gsq{font-family:var(--ui);font-size:.78rem;border-radius:0;padding:4px 10px;border:1px solid var(--line);color:var(--ink-dim)}
.gsq.out{background:rgba(196,83,77,.14);color:#E58983;border-color:rgba(196,83,77,.4)}
.gsq.q{background:rgba(245,179,1,.1);color:var(--gold);border-color:rgba(245,179,1,.35)}
.gsq.ok{background:rgba(52,211,153,.1);color:var(--model);border-color:rgba(52,211,153,.3)}
.glucols{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:4px 16px}
.gclu{margin:0 0 6px;padding-left:20px;color:var(--ink-dim);font-size:.84rem;line-height:1.7}
.gclu li b{color:var(--ink);font-weight:600}
.gclu li span{font-family:var(--mono);font-size:.7rem;color:var(--ink-faint);margin-left:5px}
.obt-read{border:1px solid var(--line);border-radius:0;border-left:3px solid var(--model);font-variant-numeric:tabular-nums;background:var(--panel);padding:10px 12px;font-family:var(--mono);font-size:.8rem}
.obt-read .rr{display:flex;justify-content:space-between;gap:10px;padding:3px 0;color:var(--ink-dim)}
.obt-read .rr b{color:var(--model);font-weight:600}
.obt-case{border-left:2px solid var(--line);padding:2px 0 2px 10px;margin:0 0 7px;color:var(--ink-dim);font-size:.84rem;line-height:1.55;border-radius:0}
.obt-case b{font-family:var(--mono);font-size:.68rem;letter-spacing:.1em}
.obt-case.for{border-color:rgba(52,211,153,.5)} .obt-case.for b{color:var(--model)}
.obt-case.ag{border-color:rgba(196,61,61,.55)} .obt-case.ag b{color:#E07070}
.obt-case.fl{border-color:rgba(245,179,1,.5)} .obt-case.fl b{color:var(--gold)}
.obt-chart{width:100%;height:130px;background:var(--panel);border:1px solid var(--line);border-radius:0;display:block}
.obt-leg{display:flex;gap:12px;align-items:center;font-family:var(--mono);font-size:.7rem;color:var(--ink-dim);margin-top:5px}
.obt-leg i{width:13px;height:3px;border-radius:0;display:inline-block}
.obt-intel{margin:0;padding-left:16px;color:var(--ink-dim);font-size:.84rem;line-height:1.55;display:grid;gap:5px}
.obt-tbl{overflow-x:auto;border:1px solid var(--line);border-radius:0}
.obt-tbl table{width:100%;border-collapse:collapse;min-width:430px}
.obt-tbl th{background:var(--panel-2);color:var(--ink-dim);font-family:var(--mono);font-size:.64rem;text-transform:uppercase;letter-spacing:.05em;text-align:left;padding:7px 9px;border-bottom:1px solid var(--line);white-space:nowrap;position:sticky;top:0}
.obt-tbl td{padding:6px 9px;border-bottom:1px solid var(--line);font-family:var(--mono);font-size:.76rem;color:var(--ink-dim);white-space:nowrap}
.obt-tbl td.best{color:var(--model);font-weight:700;background:var(--model-dim)}
.obt-tbl .rg{font-size:.58rem;letter-spacing:.06em;color:var(--ink-faint);border:1px solid var(--line);border-radius:0;padding:0 4px;margin-left:5px}
.obt-links{display:flex;flex-wrap:wrap;gap:10px 16px;margin-top:14px}
.obt-links a{color:var(--action-hi);font-family:var(--mono);font-size:.74rem;text-decoration:none;min-height:32px;display:inline-flex;align-items:center}
.obt-links a:hover{color:var(--ink)}
.obt-alt{display:grid;grid-template-columns:repeat(auto-fill,minmax(100px,1fr));gap:6px}
.obt-alt span{display:flex;flex-direction:column;align-items:center;gap:1px;border:1px solid var(--line);border-radius:0;background:var(--panel-2);padding:6px;font-family:var(--mono);font-size:.7rem;color:var(--ink-dim)}
.obt-alt span b{color:var(--model);font-size:.8rem}
.obt-h2h{font-size:.84rem;color:var(--ink-dim)}
.obt-h2h .mu-section-header,.obt-h2h .tp-section-header{font-family:var(--mono);font-size:.64rem;letter-spacing:.1em;text-transform:uppercase;color:var(--ink-faint);margin:4px 0 6px}
.obt-h2h .mu-section-sub,.obt-h2h .tp-section-eyebrow{display:none}
.obt-h2h table{width:100%;border-collapse:collapse;font-family:var(--mono);font-size:.76rem}
.obt-h2h td,.obt-h2h th{padding:5px 6px;border-bottom:1px solid var(--line);color:var(--ink-dim);text-align:left}
.obt-ang{display:flex;flex-wrap:wrap;gap:6px}
.obt-ang span{font-family:var(--mono);font-size:.7rem;color:var(--ink-dim);border:1px solid var(--line);border-radius:0;background:var(--panel-2);padding:5px 10px}
.obt-ang span b{color:var(--ink)}
.obt-receipt{font-family:var(--mono);font-size:.75rem;line-height:1.55;color:var(--ink-dim);border:1px dashed var(--line);border-radius:0;padding:8px 12px;margin:0 0 12px}
.obt-receipt b{color:var(--model)}
.obt-prow{display:flex;align-items:center;gap:10px;padding:9px 0;border-bottom:1px solid var(--line)}
.obt-prow img{width:30px;height:30px;border-radius:50%;object-fit:cover;background:var(--panel-2)}
.obt-pwho{min-width:0;flex:1}
.obt-pname{font-family:var(--ui);font-weight:600;font-size:.88rem;color:var(--ink);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.obt-pmkt{font-family:var(--mono);font-size:.72rem;color:var(--ink-faint)}
.obt-prate{font-family:var(--mono);font-size:.76rem;font-weight:700;color:var(--model);white-space:nowrap}
.obt-pstreak{font-family:var(--mono);font-size:.62rem;letter-spacing:.04em;text-transform:uppercase;color:var(--gold);white-space:nowrap}
.obt-pprice{font-family:var(--mono);font-size:.88rem;font-weight:700;color:var(--ink);border:1px solid var(--line);border-radius:0;background:var(--panel-2);padding:8px 10px;min-height:40px;display:flex;align-items:center}
.obt-note{font-family:var(--ui);font-size:.76rem;color:var(--ink-faint);flex-basis:100%;line-height:1.45}
.obt-r5{font-family:var(--mono);font-size:.7rem;color:var(--ink-dim);white-space:nowrap}
.obt-ghead{position:sticky;top:0;z-index:2;display:flex;align-items:center;gap:10px;padding:8px 10px;background:var(--panel-2);border-bottom:1px solid var(--line);cursor:pointer}
.obt-ghead b{font-family:var(--ui);font-weight:600;font-size:.82rem;color:var(--ink)}
.obt-ghead span{font-family:var(--mono);font-size:.68rem;color:var(--ink-faint)}

/* ---------- overlays: sheets drawer, coach, toast ---------- */
.obt-drawer{position:fixed;top:0;right:-100%;bottom:0;width:94%;max-width:460px;background:var(--drawer-bg,var(--panel));border-left:1px solid var(--line-strong,var(--line));box-shadow:-10px 0 50px rgba(0,0,0,.6);z-index:9999;transition:right .3s cubic-bezier(.19,1,.22,1);padding:18px;overflow-y:auto;-webkit-overflow-scrolling:touch}
@media (prefers-reduced-motion: reduce){.obt-drawer{transition:none}}
.obt-drawer.open{right:0}
.obt-drawer .obt-desk{display:inline-flex !important;margin:0 8px 8px 0}
.obt-drawer select.obt-desk,.obt-drawer select{display:inline-block !important;max-width:100%;appearance:none;border:1px solid var(--line);border-radius:0;background:var(--panel-2);color:var(--ink);font-family:var(--mono);font-size:.78rem;padding:8px 12px;min-height:38px}
.obt-drawer .obt-seg{width:auto}
.obt-dx{position:absolute;top:12px;right:12px;width:42px;height:42px;border-radius:50%;border:1px solid var(--line-strong,var(--line));background:var(--panel-2);color:var(--ink-dim);font-size:1rem;cursor:pointer;z-index:2}
.obt-dh2{font-family:var(--display);font-weight:800;color:var(--ink);font-size:1.05rem;margin:0 26px 10px 0}
.obt-ctl{appearance:none;border:1px solid var(--line);border-radius:0;background:var(--panel-2);color:var(--ink-dim);font-family:var(--mono);font-size:.75rem;padding:8px 12px;min-height:38px;cursor:pointer}
.obt-ctl.on{border-color:var(--gold);color:var(--gold)}
select.obt-ctl{text-transform:none}
.obt-veil{position:fixed;inset:0;background:rgba(5,8,14,.55);z-index:10000;display:flex;align-items:flex-end;justify-content:center;padding:16px}
@media(min-width:900px){.obt-veil{align-items:center}}
.obt-card{width:100%;max-width:440px;background:var(--panel);border:1px solid var(--line-strong,var(--line));border-radius:0;padding:20px;color:var(--ink-dim);font-size:.92rem;line-height:1.6;box-shadow:0 24px 60px -20px rgba(0,0,0,.7)}
.obt-card h3{font-family:var(--display);color:var(--ink);font-size:1.05rem;margin:0 0 8px}
.obt-card .acts{display:flex;gap:8px;justify-content:flex-end;margin-top:14px}
.obt-card .acts button{appearance:none;border:1px solid var(--line);border-radius:0;background:var(--panel-2);color:var(--ink-dim);font-family:var(--mono);font-size:.74rem;padding:10px 18px;min-height:40px;cursor:pointer}
.obt-card .acts button.pri{background:var(--action-hi);color:#fff;border-color:transparent}
.obt-card table{width:100%;border-collapse:collapse;font-family:var(--mono);font-size:.76rem}
.obt-card td{padding:5px 6px;border-bottom:1px solid var(--line);color:var(--ink-dim)}
.obt-card td:first-child{color:var(--ink);white-space:nowrap}
#obtToast{position:fixed;left:50%;transform:translateX(-50%);bottom:56px;z-index:10001;background:var(--panel);border:1px solid var(--line-strong,var(--line));border-radius:0;padding:11px 16px;color:var(--ink);font-size:.84rem;box-shadow:0 16px 40px -14px rgba(0,0,0,.7);display:flex;align-items:center;gap:12px;max-width:92%}
#obtToast button{appearance:none;border:none;background:none;color:var(--action-hi);font-family:var(--mono);font-size:.76rem;cursor:pointer;white-space:nowrap;min-height:34px}
.obt-tabs{display:none}
.obt-heromini{display:none}

/* =============================== MOBILE: the app =============================== */
@media(max-width:899px){
    .obt-top{height:42px;gap:8px}
    .obt-home span{display:none}
    .obt-heroline{display:none}
    input.obt-ctl{flex:1;width:auto;min-width:0}
    .obt-deck{display:block;position:relative;overflow:hidden}
    .obt-col{border-right:none}
    .obt-rail1{display:none}
    /* leagues = horizontal chip strip on the board screen */
    .obt-lgs{position:absolute;top:0;left:0;right:0;height:48px;display:flex !important;flex-direction:row;overflow-x:auto;overflow-y:hidden;gap:5px;padding:8px 10px;border-bottom:1px solid var(--line);scrollbar-width:none;z-index:2}
    .obt-lgs::-webkit-scrollbar{display:none}
    .obt-lg{width:auto;min-height:32px;border:1px solid var(--line);border-radius:0;padding:5px 11px;flex:0 0 auto}
    /* board screen */
    .obt-gamescol{position:absolute;inset:0;padding-top:48px;display:flex}
    .obt-gbar{padding:7px 10px}
    .obt-heromini{display:block;margin:8px 10px 0;border:1px solid rgba(52,211,153,.35);border-radius:0;background:var(--model-dim);padding:9px 11px;font-size:.84rem;line-height:1.5;color:var(--ink);cursor:pointer}
    .obt-heromini .cap{font-family:var(--mono);font-size:.6rem;letter-spacing:.12em;text-transform:uppercase;color:var(--model);display:block;margin-bottom:3px}
    .obt-heromini b{color:var(--model)}
    .obt-days{display:flex;gap:6px;overflow-x:auto;scrollbar-width:none;margin:8px 10px 0}
    .obt-days::-webkit-scrollbar{display:none}
    .obt-days button{appearance:none;border:1px solid var(--line);border-radius:0;background:var(--panel-2);color:var(--ink-dim);font-family:var(--mono);font-size:.7rem;padding:6px 12px;cursor:pointer;white-space:nowrap;min-height:32px}
    .obt-days button.on{border-color:var(--action-hi);color:var(--action-hi)}
    .obt-row{padding:10px 12px 11px}
    .obt-gch{font-size:.66rem;margin-bottom:4px}
    .obt-gside{padding:3px 0}
    .obt-gside img,.obt-gph{width:22px;height:22px;flex-basis:22px}
    .obt-gside .nm{font-size:.95rem}
    .obt-gside .sp{font-size:.9rem}
    .obt-gside .lsn{font-size:1.05rem}
    .obt-row .obt-cells{margin-top:8px;overflow-x:auto;scrollbar-width:none}
    .obt-row .obt-cells::-webkit-scrollbar{display:none}
    .obt-cell{min-width:78px;padding:6px 9px;min-height:44px;flex:1}
    .obt-cell b{font-size:.92rem}
    .obt-cell i{font-size:.66rem}
    .obt-tabs{display:flex;border-top:1px solid var(--card-edge);background:var(--panel)}
    .obt-tabs button{flex:1;appearance:none;border:none;background:transparent;color:var(--ink-dim);font-family:var(--mono);font-size:.64rem;letter-spacing:.03em;text-transform:uppercase;padding:7px 2px 8px;min-height:52px;cursor:pointer;display:flex;flex-direction:column;align-items:center;gap:3px}
    .obt-tabs button i.fas{font-size:1rem}
    .obt-tabs button.on{color:var(--action-hi)}
    .obt-tabs .bdg{position:absolute;transform:translate(14px,-4px);min-width:16px;height:16px;border-radius:999px;background:var(--action-hi);color:#fff;font-size:.6rem;line-height:16px;padding:0 4px}
    /* game screen (tiles) + module screen (stage) slide in as app pages */
    .obt-tilescol,.obt-stagecol{position:absolute;inset:0;background:var(--panel-2);transform:translateX(102%);transition:transform .28s cubic-bezier(.2,.9,.25,1);display:flex;z-index:5}
    @media (prefers-reduced-motion: reduce){.obt-tilescol,.obt-stagecol{transition:none}}
    .obt-app[data-scr="game"] .obt-tilescol{transform:translateX(0)}
    .obt-app[data-scr="module"] .obt-tilescol{transform:translateX(-26%)}
    .obt-app[data-scr="module"] .obt-stagecol{transform:translateX(0);z-index:6}
    .obt-gamehead{display:flex;align-items:center;gap:8px;padding:7px 10px;border-bottom:1px solid var(--line);background:var(--panel);min-height:52px}
    .obt-gamehead .obt-back{display:flex;align-items:center;justify-content:center;width:42px;height:42px;flex:0 0 42px}
    .obt-gamehead .obt-crumb b{font-size:1rem}
    .obt-gamehead .obt-star2{appearance:none;background:none;border:none;color:var(--ink-faint);font-size:1.15rem;width:42px;height:42px;cursor:pointer}
    .obt-gamehead .obt-star2.on{color:var(--gold)}
    .obt-glens{display:flex;gap:4px;padding:8px 10px;border-bottom:1px solid var(--line);overflow-x:auto;scrollbar-width:none;background:var(--panel)}
    .obt-glens::-webkit-scrollbar{display:none}
    .obt-glens button{appearance:none;border:1px solid var(--line);border-radius:0;background:var(--panel-2);color:var(--ink-dim);font-family:var(--mono);font-size:.68rem;letter-spacing:.04em;text-transform:uppercase;padding:7px 12px;min-height:34px;cursor:pointer;white-space:nowrap}
    .obt-glens button.on{border-color:var(--action-hi);color:var(--action-hi)}
    .obt-tiles{display:grid;grid-template-columns:1fr 1fr;gap:7px;padding:10px}
    .obt-tile{border:1px solid var(--line);border-left:3px solid var(--acc,var(--line));background:var(--panel-2);padding:9px 10px;min-height:84px;display:flex;flex-direction:column;align-items:stretch;gap:2px;border-bottom:1px solid var(--line)}
    .obt-tile.on{background:rgba(70,140,255,.08);border-color:var(--action-hi);border-left-color:var(--acc,var(--action-hi))}
    .obt-tile .tl{font-size:.62rem;flex:0 0 auto}
    .obt-tile .hl{font-size:.95rem;max-width:none;flex:0 0 auto}
    .obt-tile .sb{display:-webkit-box;font-family:var(--ui);font-size:.72rem;color:var(--ink-dim);line-height:1.35;overflow:hidden;-webkit-line-clamp:2;-webkit-box-orient:vertical}
    .obt-stagehead .obt-back{display:flex;align-items:center;justify-content:center}
    .obt-stagehead .obt-lens{display:none}
    .obt-stage{padding:12px}
    .obt-dock{display:none}
    .obt-slipbar2{position:relative}
    .obt-slip{left:8px;right:8px;bottom:60px;width:auto}
}
@media(min-width:900px) and (max-width:1279px){
    .obt-deck{grid-template-columns:60px 104px 216px minmax(0,1fr) 200px}
}

/* ===== wave 3: live / pitch / shots / tape / toss / modal / de-AI extras ===== */
.gcm{--pitch:#10331E;--pitchline:#25603A}
.glscore{display:flex;align-items:center;justify-content:center;gap:12px;margin:2px 0 2px}
.glscore .glteam{font-family:var(--ui);font-weight:600;font-size:.9rem;color:var(--ink-dim);max-width:9em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.glscore .gln{font-family:var(--mono);font-weight:700;font-size:2rem;color:var(--ink);line-height:1;font-variant-numeric:tabular-nums}
.glscore .glsep{color:var(--ink-faint)}
.lsn{font-family:var(--mono);font-weight:700;font-size:.85rem;color:var(--ink);margin-left:auto;padding-left:8px;font-variant-numeric:tabular-nums}
.lsf{display:inline-block;font-family:var(--mono);font-size:.6rem;letter-spacing:.1em;color:var(--ink-faint);border:1px solid var(--line);border-radius:0;padding:1px 5px}
.obt-plive{font-family:var(--mono);font-size:.64rem;letter-spacing:.04em;text-transform:uppercase;color:#E8534A;border:1px solid rgba(232,83,74,.4);border-radius:0;padding:1px 5px;margin-left:7px;vertical-align:2px}
.gthead{display:flex;align-items:center;justify-content:space-between;gap:8px;margin:0 0 4px}
.gthead b{font-family:var(--display);font-weight:800;font-size:1rem;color:var(--ink)}
.gthead span{font-family:var(--mono);font-size:.66rem;color:var(--ink-faint)}
.gtrow{display:flex;align-items:center;gap:8px;margin:0 0 6px}
.gtv{font-family:var(--mono);font-size:.78rem;color:var(--ink);min-width:44px;font-variant-numeric:tabular-nums}
.gtv:last-child{text-align:right}
.gtbars{flex:1;display:flex;align-items:center;gap:6px;min-width:0}
.gtb{height:8px;background:var(--acc,#E8B34A);opacity:.85;min-width:2px}
.gtb.l{margin-left:auto}
.gtb.r{margin-right:auto;background:var(--action-hi)}
.gtlab{font-family:var(--mono);font-size:.58rem;letter-spacing:.08em;text-transform:uppercase;color:var(--ink-faint);white-space:nowrap}
#obtModal{position:fixed;inset:0;z-index:10002}
#obtModal[hidden]{display:none}
.obt-mback{position:absolute;inset:0;background:rgba(5,8,14,.6)}
.obt-mcard{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);width:min(440px,92vw);max-height:80vh;overflow-y:auto;background:var(--panel);border:1px solid var(--line-strong,var(--line));border-left:3px solid var(--action-hi);padding:18px;box-shadow:0 24px 60px -18px rgba(0,0,0,.75)}
.obt-mx{position:absolute;top:8px;right:8px;width:38px;height:38px;border:1px solid var(--line);background:var(--panel-2);color:var(--ink-dim);cursor:pointer;font-size:1rem}
@media(max-width:899px){
    .obt-glens{display:flex}
    .glscore .gln{font-size:2.3rem}
}

/* ---- wave 4 (2026-09-02): pulse / why / receipts / shop / starter duel / defense leaks ---- */
.obt-plsrow{display:flex;gap:10px;align-items:baseline;padding:7px 0;border-top:1px solid var(--line);font-size:.84rem;line-height:1.45}
.obt-plsrow:first-of-type{border-top:0;padding-top:2px}
.obt-plsrow b{color:var(--ink);font-weight:600}
.obt-plsk{flex:0 0 auto;font-family:var(--mono);font-size:.58rem;letter-spacing:.1em;text-transform:uppercase;color:var(--ink-faint);padding-top:2px;min-width:64px}
.obt-plssw{display:block;color:var(--ink-dim);font-size:.8rem;margin-top:1px}
.obt-whyrow{padding:6px 0;border-top:1px solid var(--line);font-size:.86rem;color:var(--ink-dim);line-height:1.5}
.obt-whyrow:first-of-type{border-top:0;padding-top:2px}
.obt-whyrow b{color:var(--ink);font-weight:600}
.obt-whyn{color:var(--ink-faint);font-size:.76rem}
.obt-shoprow{display:flex;align-items:baseline;gap:10px;padding:7px 0;border-top:1px solid var(--line);font-size:.86rem;flex-wrap:wrap}
.obt-shoprow:first-of-type{border-top:0;padding-top:2px}
.obt-shoprow>div{flex:1 1 40%;min-width:150px;color:var(--ink-dim)}
.obt-shoprow b{color:var(--ink);font-weight:600}
.obt-shopmk{color:var(--ink-faint);font-size:.76rem}
.obt-shopgap{font-family:var(--mono);font-weight:700;color:var(--model);white-space:nowrap}
.obt-shopbk{font-family:var(--mono);color:var(--gold);white-space:nowrap;font-size:.8rem}
.obt-sprow,.obt-parkrow{display:flex;gap:10px;align-items:baseline;padding:7px 0;border-top:1px solid var(--line);font-size:.86rem;line-height:1.5}
.obt-sprow:first-of-type{border-top:0;padding-top:2px}
.obt-sprow b,.obt-parkrow b{color:var(--ink);font-weight:600}
.obt-splab{flex:0 0 auto;font-family:var(--mono);font-size:.58rem;letter-spacing:.1em;text-transform:uppercase;color:var(--ink-faint);padding-top:2px;min-width:64px}
.obt-sphand{font-family:var(--mono);font-size:.66rem;color:var(--ink-faint);border:1px solid var(--line);padding:0 4px;margin-left:6px}
.obt-spline{display:block;color:var(--ink-dim);margin-top:1px}
.obt-spline b{color:var(--model);font-family:var(--mono)}
.obt-parkyrs{font-style:normal;color:var(--ink-faint);font-size:.74rem}
.obt-dvphead{font-family:var(--mono);font-size:.62rem;letter-spacing:.1em;text-transform:uppercase;color:var(--ink-faint);margin:8px 0 2px}
.obt-dvphead:first-of-type{margin-top:0}
.obt-dvprow{padding:5px 0;border-top:1px solid var(--line);font-size:.86rem;color:var(--ink-dim);line-height:1.5}
.obt-dvprow b{color:var(--ink);font-weight:700}
.obt-dvpn{color:var(--ink-faint);font-family:var(--mono);font-size:.76rem}
.obt-juice{display:flex;flex-wrap:wrap;gap:6px;margin:0 0 10px}
.obt-juice span{border:1px solid var(--line);padding:3px 8px;font-family:var(--mono);font-size:.76rem;color:var(--ink-dim)}
.obt-juice span b{color:var(--ink)}
.obt-juice span.cheap{border-color:rgba(52,211,153,.5);color:var(--model)}
.obt-juice span.cheap b{color:var(--model)}
.obt-sparkrow{padding:6px 0;border-top:1px solid var(--line)}
.obt-sparkrow:first-of-type{border-top:0}
.obt-sparklab{display:flex;justify-content:space-between;align-items:baseline;font-size:.8rem;color:var(--ink-dim);margin-bottom:3px;font-family:var(--mono)}
.obt-sparklab b{color:var(--ink)}
.obt-sparksvg{display:block;width:100%;height:44px}
.obt-movers .tag-pl{color:#E8B34A;margin-left:14px}


/* ---- [2026-09-02 v6] the composed workspace (desktop stage) ---- */
.obt-wsid{display:flex;align-items:center;gap:14px;flex-wrap:wrap;border:1px solid var(--line);border-bottom:none;background:var(--panel);padding:8px 12px;margin:0;font-variant-numeric:tabular-nums}
.obt-wsid .tm{display:flex;align-items:center;gap:9px;min-width:0}
.obt-wsid .tm img{width:34px;height:34px;object-fit:contain}
.obt-wsid .tm .ph{width:34px;height:34px;border-radius:50%;background:var(--panel-2);border:1px solid var(--line)}
.obt-wsid .tm b{font-family:var(--display);font-weight:800;font-size:1.02rem;color:var(--ink);white-space:nowrap}
.obt-wsid .mid{display:flex;align-items:center;gap:8px;font-family:var(--mono);color:var(--ink-faint);font-size:.72rem}
.obt-wsid .mid .sc{font-size:1.15rem;color:var(--ink);font-weight:700}
.obt-wsid .mid .live{font-size:.58rem;letter-spacing:.08em;color:#fff;background:#C43D3D;border-radius:0;padding:1px 6px}
.obt-wsid .mid .fin{font-size:.6rem;letter-spacing:.1em;color:var(--ink-faint)}
.obt-wsid .mid i{font-style:normal}
.obt-wsv{margin-left:auto;display:flex;align-items:center;gap:8px;font-family:var(--mono);font-size:.76rem;color:var(--ink-dim);min-width:0;flex-wrap:wrap}
.obt-wsv .k{font-size:.58rem;letter-spacing:.12em;text-transform:uppercase;color:var(--model)}
.obt-wsv b{color:var(--ink)}
.obt-wsv em{font-style:normal;color:var(--model);border:1px solid rgba(52,211,153,.4);padding:1px 7px}
.obt-ws{display:grid;grid-template-columns:minmax(0,1fr) minmax(270px,330px);gap:1px;align-items:stretch;background:var(--line);border:1px solid var(--line)}
.obt-wsmain{min-width:0;background:var(--panel)}
.obt-wsmain>.gcm:last-child{margin-bottom:0}
.obt-wsside{min-width:0;display:flex;flex-direction:column;gap:1px;background:var(--line)}
.obt-wsc{cursor:pointer;position:relative;background:var(--panel)}
.obt-wsc .gcm{margin:0;max-height:320px;overflow-y:auto;scrollbar-width:thin}
.obt-wsc:hover .gcm{border-color:var(--line-strong,var(--ink-faint))}
.obt-wsc .gcmh::after{content:"focus 92";margin-left:auto;font-size:.56rem;letter-spacing:.08em;color:var(--ink-faint);opacity:0;transition:opacity .12s}
.obt-wsc:hover .gcmh::after{opacity:1}
.obt-wsc .obt-chart{height:140px}
@media (max-width:1420px){.obt-ws{grid-template-columns:minmax(0,1fr)}.obt-wsside{flex-direction:row;flex-wrap:wrap}.obt-wsside .obt-wsc{flex:1 1 300px}}


/* ---- [v7 craft] command palette + quiet affordances ---- */
#obtPal{position:fixed;inset:0;z-index:120;background:rgba(4,8,14,.72);display:flex;align-items:flex-start;justify-content:center;padding-top:12vh}
#obtPal .box{width:min(560px,92vw);background:var(--panel);border:1px solid var(--line-strong,var(--ink-faint))}
#obtPal input{width:100%;box-sizing:border-box;background:var(--panel-2);border:none;border-bottom:1px solid var(--line);color:var(--ink);font-family:var(--mono);font-size:.95rem;padding:13px 14px;outline:none}
#obtPal .list{max-height:46vh;overflow-y:auto}
#obtPal .pi{display:flex;align-items:baseline;justify-content:space-between;gap:12px;padding:8px 14px;border-top:1px solid var(--line);cursor:pointer;font-variant-numeric:tabular-nums}
#obtPal .pi:first-child{border-top:none}
#obtPal .pi b{font-family:var(--ui);font-weight:600;font-size:.9rem;color:var(--ink)}
#obtPal .pi span{font-family:var(--mono);font-size:.66rem;letter-spacing:.08em;text-transform:uppercase;color:var(--ink-faint);white-space:nowrap}
#obtPal .pi.on{background:rgba(70,140,255,.12);box-shadow:inset 2px 0 0 var(--action-hi)}
#obtPal .pi.none{cursor:default;color:var(--ink-dim);font-size:.84rem}
#obtPal .hint{padding:7px 14px;border-top:1px solid var(--line);font-family:var(--mono);font-size:.62rem;color:var(--ink-faint)}
#obtPalBtn{appearance:none;background:none;border:1px solid var(--line);color:var(--ink-faint);font-family:var(--mono);font-size:.66rem;letter-spacing:.06em;padding:5px 10px;cursor:pointer;white-space:nowrap}
#obtPalBtn b{color:var(--ink-dim);border:1px solid var(--line);padding:0 4px;margin-left:4px}
#obtPalBtn:hover{color:var(--ink-dim);border-color:var(--line-strong,var(--ink-faint))}
.obt-gch .gstar{appearance:none;background:none;border:none;cursor:pointer;padding:0 2px;color:var(--ink-faint);opacity:0;transition:opacity .12s;font-size:.78rem;line-height:1}
.obt-row:hover .obt-gch .gstar{opacity:1}
.obt-gch .gstar.on{opacity:1;color:var(--gold)}
@media (max-width:1149px){#obtPalBtn{display:none}}

/* ---- [v7b] action bar (WoW slots) + rail footer ---- */
#obtBar{display:flex;gap:1px;background:var(--line);border-top:1px solid var(--line);flex:0 0 auto;overflow-x:auto;scrollbar-width:none}
#obtBar::-webkit-scrollbar{display:none}
#obtBar .slot{appearance:none;flex:0 0 auto;min-width:56px;background:var(--panel);border:none;border-top:2px solid transparent;color:var(--ink-faint);font-family:var(--mono);font-size:.56rem;letter-spacing:.07em;text-transform:uppercase;padding:6px 8px 5px;cursor:pointer;display:flex;flex-direction:column;align-items:center;gap:3px}
#obtBar .slot svg{width:20px;height:20px;display:block}
#obtBar .slot:hover{color:var(--ink-dim);background:rgba(70,140,255,.05)}
#obtBar .slot.on{color:var(--action-hi);border-top-color:var(--action-hi);background:rgba(70,140,255,.09)}
@media (max-width:1149px){#obtBar{display:none}}
#obtRailFoot{flex:0 0 auto;border-top:1px solid var(--line);background:var(--panel)}
#obtRailFoot .one{padding:8px 10px;border-bottom:1px solid var(--line);cursor:pointer}
#obtRailFoot .one:hover{background:rgba(70,140,255,.05)}
#obtRailFoot .one .k{display:block;font-family:var(--mono);font-size:.56rem;letter-spacing:.12em;text-transform:uppercase;color:var(--model);margin-bottom:2px}
#obtRailFoot .one b{display:block;font-family:var(--ui);font-weight:600;font-size:.8rem;color:var(--ink)}
#obtRailFoot .one i{display:block;font-style:normal;font-family:var(--mono);font-size:.66rem;color:var(--ink-dim);margin-top:1px}
#obtRailFoot .pal{padding:6px 10px;font-family:var(--mono);font-size:.6rem;color:var(--ink-faint);cursor:pointer}
#obtRailFoot .pal b{color:var(--ink-dim);border:1px solid var(--line);padding:0 4px}
#obtRailFoot .pal:hover{color:var(--ink-dim)}
@media (max-width:1149px){#obtRailFoot{display:none}}

/* ---- [v8] the arsenal bar, rebuilt: full-width chunky slots, charges, hotkeys ---- */
#obtBar{display:flex;gap:0;background:var(--panel);border-top:1px solid var(--line-strong,var(--ink-faint));align-items:stretch;overflow-x:auto;scrollbar-width:none;padding:0}
#obtBar .slot{position:relative;flex:1 1 0;min-width:54px;max-width:96px;background:var(--panel);border:none;border-right:1px solid var(--line);border-top:2px solid transparent;color:var(--ink-dim);font-family:var(--mono);font-size:.55rem;letter-spacing:.06em;text-transform:uppercase;padding:7px 4px 5px;cursor:pointer;display:flex;flex-direction:column;align-items:center;justify-content:flex-end;gap:3px;transition:background .1s,color .1s,transform .05s}
#obtBar .slot svg{width:23px;height:23px;display:block;margin:0 auto}
#obtBar .slot:hover{color:var(--ink);background:rgba(70,140,255,.07)}
#obtBar .slot:active{transform:scale(.94)}
#obtBar .slot.on{color:var(--action-hi);border-top-color:var(--action-hi);background:rgba(70,140,255,.12);box-shadow:inset 0 0 0 1px rgba(70,140,255,.35)}
#obtBar .slot .k{position:absolute;top:2px;left:4px;font-style:normal;font-size:.52rem;color:var(--ink-faint)}
#obtBar .slot .c{position:absolute;top:1px;right:3px;font-style:normal;font-size:.55rem;font-weight:700;color:var(--action-hi);background:rgba(70,140,255,.14);padding:0 4px;min-width:14px;text-align:center}
#obtBar .slot .v{position:absolute;top:4px;right:4px;width:6px;height:6px;border-radius:50%;background:var(--model)}
#obtBar .slot .c + .v{right:24px}
#obtBar .baru{display:flex;margin-left:auto;border-left:1px solid var(--line-strong,var(--ink-faint))}
#obtBar .ub{position:relative;flex:0 0 auto;min-width:46px;background:var(--panel-2);border:none;border-left:1px solid var(--line);color:var(--ink-dim);font-family:var(--mono);font-size:.9rem;padding:6px 8px 5px;cursor:pointer;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px}
#obtBar .ub span{font-size:.52rem;letter-spacing:.08em;text-transform:uppercase;color:var(--ink-faint)}
#obtBar .ub:hover{color:var(--ink);background:rgba(70,140,255,.07)}

/* ---- [v8] league exhibit styles ---- */
.aqh{display:flex;align-items:baseline;justify-content:space-between;gap:10px;margin:10px 0 5px;font-size:.84rem}
.aqh:first-of-type{margin-top:2px}
.aqh b{color:var(--ink);font-family:var(--ui);font-weight:600}
.aqh span{font-family:var(--mono);font-size:.66rem;color:var(--ink-faint)}
.aq{display:grid;grid-template-columns:20px 1fr 30px 1fr 30px;align-items:center;gap:6px;padding:2px 0;font-variant-numeric:tabular-nums}
.aq i{font-style:normal;font-family:var(--mono);font-size:.6rem;color:var(--ink-faint)}
.aq .f{height:8px;background:var(--model);opacity:.85;justify-self:end}
.aq .g{height:8px;background:var(--ink-faint);opacity:.45}
.aq b{font-family:var(--mono);font-size:.7rem;color:var(--ink);text-align:right}
.aq em{font-style:normal;font-family:var(--mono);font-size:.7rem;color:var(--ink-dim)}
.ntrow{padding:7px 0;border-top:1px solid var(--line)}
.ntrow:first-of-type{border-top:0;padding-top:2px}
.ntrow b{font-family:var(--ui);font-weight:600;font-size:.86rem;color:var(--ink)}
.ntrow .ft{float:right;font-family:var(--mono);font-size:.7rem;color:var(--model)}
.ntbar{height:9px;background:var(--panel-2);border:1px solid var(--line);margin:5px 0 3px;position:relative}
.ntbar span{position:absolute;inset:0 auto 0 0;background:var(--model);opacity:.75}
.ntbar::after{content:"HT";position:absolute;left:50%;top:-2px;bottom:-2px;border-left:1px dashed var(--ink-faint);font-family:var(--mono);font-size:.5rem;color:var(--ink-faint);padding-left:2px}
.ntrow i{font-style:normal;font-family:var(--mono);font-size:.68rem;color:var(--ink-dim)}
.nprow{display:flex;align-items:baseline;gap:10px;padding:6px 0;border-top:1px solid var(--line);font-size:.86rem}
.nprow:first-of-type{border-top:0;padding-top:2px}
.nprow b{color:var(--ink);font-family:var(--ui);font-weight:600}
.nprow i{font-style:normal;font-family:var(--mono);font-size:.72rem;color:var(--ink-dim)}
.nkrow{display:flex;gap:10px;align-items:center;padding:8px 0;border-top:1px solid var(--line)}
.nkrow img{width:34px;height:34px;object-fit:cover;border-radius:50%;background:var(--panel-2)}
.nkrow b{display:block;font-family:var(--ui);font-weight:600;font-size:.84rem;color:var(--ink)}
.nkrow span{display:block;font-family:var(--mono);font-size:.66rem;color:var(--ink-faint)}
.kbs{display:flex;gap:6px;margin-top:4px}
.kb{border:1px solid var(--line);padding:2px 7px;font-variant-numeric:tabular-nums}
.kb i{display:block;font-style:normal;font-family:var(--mono);font-size:.56rem;color:var(--ink-faint)}
.kb b{font-family:var(--mono);font-size:.78rem;color:var(--ink)}
.cprow{padding:7px 0;border-top:1px solid var(--line)}
.cprow:first-of-type{border-top:0;padding-top:2px}
.cprow b{font-family:var(--ui);font-weight:600;font-size:.86rem;color:var(--ink)}
.cprow .n{float:right;font-family:var(--mono);font-size:.64rem;color:var(--ink-faint)}
.cps{display:flex;gap:8px;margin-top:5px}
.cph{flex:1;border:1px solid var(--line);padding:5px 8px;font-variant-numeric:tabular-nums}
.cph i{display:block;font-style:normal;font-family:var(--mono);font-size:.56rem;letter-spacing:.08em;text-transform:uppercase;color:var(--ink-faint)}
.cph b{font-family:var(--mono);font-size:1rem;color:var(--model)}
.cph em{font-style:normal;font-family:var(--mono);font-size:.62rem;color:var(--ink-dim);margin-left:3px}

/* ---- [v9] castable abilities: powers group + sim/calc overlays ---- */
#obtBar .ub.pw{background:rgba(70,140,255,.08);color:var(--ink-dim);border-left:1px solid var(--line)}
#obtBar .ub.pw svg{width:19px;height:19px}
#obtBar .ub.pw:hover{background:rgba(70,140,255,.16);color:var(--action-hi)}
#obtBar .ub.pw:active{transform:scale(.93)}
#obtBar .ub.pw.proc{color:var(--model);background:rgba(52,211,153,.1);animation:obtProc 1.8s ease-in-out infinite}
@keyframes obtProc{0%,100%{box-shadow:inset 0 0 0 1px rgba(52,211,153,.15)}50%{box-shadow:inset 0 0 0 1px rgba(52,211,153,.6)}}
.simbox{min-width:300px}
.simgrid{display:grid;grid-template-columns:repeat(20,1fr);gap:3px;margin:8px 0 12px}
.simgrid span{width:100%;aspect-ratio:1;opacity:0;animation:obtPop .18s ease-out forwards}
@keyframes obtPop{from{opacity:0;transform:scale(.3)}to{opacity:1;transform:scale(1)}}
.simgrid .s0,.simleg .s0{background:var(--model)}
.simgrid .s1,.simleg .s1{background:var(--ink-faint)}
.simgrid .s2,.simleg .s2{background:#C43D3D}
.simleg{display:flex;align-items:center;gap:8px;padding:3px 0;font-size:.86rem;color:var(--ink-dim)}
.simleg span{width:10px;height:10px;flex:0 0 10px}
.simleg b{color:var(--ink)}
.calcbox{min-width:300px}
.calcin{display:block;font-family:var(--mono);font-size:.95rem;color:var(--ink);margin:6px 0 10px}
.calcin input{width:90px;background:var(--panel-2);border:1px solid var(--line);color:var(--ink);font-family:var(--mono);font-size:1rem;padding:6px 8px;outline:none}
.calcin input:focus{border-color:var(--action-hi)}
.calcrow{display:flex;align-items:baseline;gap:10px;padding:7px 0;border-top:1px solid var(--line);font-variant-numeric:tabular-nums}
.calcrow b{font-family:var(--ui);font-weight:600;color:var(--ink);flex:1}
.calcrow i{font-style:normal;font-family:var(--mono);font-size:.72rem;color:var(--ink-faint)}
.calcrow em{font-style:normal;font-family:var(--mono);font-size:.84rem;color:var(--model);white-space:nowrap}
.obt-wsv.flashy{animation:obtFlashy 1.2s ease-out}
@keyframes obtFlashy{0%{background:rgba(52,211,153,.25)}100%{background:none}}

/* ---- [v10] boss frame + procs + tooltips + sweep + castables ---- */
.obt-wsid .tm img{width:40px;height:40px}
.obt-wsid .tm .ph{width:40px;height:40px}
.obt-wsid .tm b{font-size:1.12rem}
.obt-wsid.inplay{box-shadow:inset 0 0 0 1px rgba(196,61,61,.5)}
.obt-wsid .mid.live-mid .bigsc{font-size:1.7rem;letter-spacing:.02em}
.obt-wsv.hero{display:flex;align-items:baseline;gap:9px;flex-wrap:wrap}
.obt-wsv.hero .who{font-family:var(--ui);font-weight:700;font-size:.95rem;color:var(--ink)}
.obt-wsv.hero .big{font-family:var(--mono);font-size:1.65rem;font-weight:700;color:var(--model);line-height:1}
.obt-wsv.hero .per{font-family:var(--mono);font-size:.62rem;color:var(--ink-faint)}
.obt-wsv.hero .pips{display:inline-flex;gap:2.5px;align-self:center}
.obt-wsv.hero .pips span{width:7px;height:11px;background:var(--panel-2);border:1px solid var(--line)}
.obt-wsv.hero .pips span.on{background:var(--model);border-color:var(--model)}
.obt-wsv.hero .cw{font-family:var(--mono);font-size:.7rem;color:var(--ink-dim)}
.obt-wsv.hero em{font-style:normal;font-family:var(--mono);font-size:.72rem;color:var(--model);border:1px solid rgba(52,211,153,.4);padding:2px 8px}
#obtBar .slot.proc-red{color:#E8534A;animation:obtProcR 1.4s ease-in-out infinite}
#obtBar .slot.proc-green{color:var(--model);animation:obtProc 1.8s ease-in-out infinite}
#obtBar .slot.proc-blue{animation:obtProcB 2.2s ease-in-out infinite}
#obtBar .slot.proc-gold{color:var(--gold);animation:obtProcG 1.8s ease-in-out infinite}
@keyframes obtProcR{0%,100%{box-shadow:inset 0 -2px 0 rgba(196,61,61,.2)}50%{box-shadow:inset 0 -2px 0 rgba(196,61,61,.9)}}
@keyframes obtProcB{0%,100%{box-shadow:inset 0 -2px 0 rgba(70,140,255,.15)}50%{box-shadow:inset 0 -2px 0 rgba(70,140,255,.7)}}
@keyframes obtProcG{0%,100%{box-shadow:inset 0 -2px 0 rgba(232,179,74,.2)}50%{box-shadow:inset 0 -2px 0 rgba(232,179,74,.8)}}
#obtBar .slot.pinned .k{color:var(--gold)}
#obtBar .slot.cast{animation:obtCast .35s ease-out}
@keyframes obtCast{0%{transform:scale(1)}40%{transform:scale(.88);background:rgba(70,140,255,.25)}100%{transform:scale(1)}}
#obtBar.sweep::after{content:"";position:absolute;top:0;bottom:0;width:2px;background:rgba(70,140,255,.5);animation:obtSweep 1.1s ease-out forwards;pointer-events:none}
#obtBar{position:relative}
@keyframes obtSweep{from{left:0;opacity:1}to{left:100%;opacity:0}}
#obtTip{position:fixed;z-index:130;width:240px;background:var(--panel);border:1px solid var(--line-strong,var(--ink-faint));padding:9px 11px;pointer-events:none}
#obtTip b{display:block;font-family:var(--mono);font-size:.66rem;letter-spacing:.1em;text-transform:uppercase;color:var(--action-hi);margin-bottom:3px}
#obtTip i{display:block;font-style:normal;font-family:var(--mono);font-size:.8rem;color:var(--ink);margin-bottom:3px}
#obtTip span{display:block;font-family:var(--ui);font-size:.76rem;color:var(--ink-dim);line-height:1.45}
.wsmax{position:absolute;top:6px;right:6px;z-index:3;appearance:none;background:var(--panel-2);border:1px solid var(--line);color:var(--ink-faint);font-size:.8rem;width:26px;height:26px;cursor:pointer;opacity:0;transition:opacity .12s}
.obt-wsmain{position:relative}
.obt-wsmain:hover .wsmax{opacity:1}
.wsmax:hover{color:var(--ink);border-color:var(--line-strong,var(--ink-faint))}
.maxbox{min-width:min(880px,80vw);max-height:76vh;overflow-y:auto}
.cstep{margin:0 0 10px;font-size:.92rem;line-height:1.6;color:var(--ink-dim)}
.cstep b{color:var(--ink)}
.cbtns{display:flex;gap:8px;margin-top:4px}
.cb{appearance:none;background:rgba(70,140,255,.1);border:1px solid var(--action-hi);color:var(--action-hi);font-family:var(--mono);font-size:.72rem;letter-spacing:.04em;text-transform:uppercase;padding:8px 12px;cursor:pointer}
.cb:hover{background:rgba(70,140,255,.2)}
.tmbox{min-width:320px}
.tmbox input[type=range]{width:100%;margin:10px 0}
.tmrow{display:flex;align-items:baseline;gap:10px;padding:6px 0;border-top:1px solid var(--line);font-variant-numeric:tabular-nums}
.tmrow b{flex:1;font-family:var(--ui);font-weight:600;color:var(--ink)}
.tmrow i{font-style:normal;font-family:var(--mono);color:var(--ink)}
.tmrow em{font-style:normal;font-family:var(--mono);font-size:.7rem;color:var(--ink-faint)}
.tmrow em.up{color:var(--model)}
.tmrow em.dn{color:#E8534A}
.cmpick .pi{display:flex;justify-content:space-between;gap:10px;padding:8px 4px;border-top:1px solid var(--line);cursor:pointer}
.cmpick .pi:hover{background:rgba(70,140,255,.07)}
.cmpick .pi b{color:var(--ink);font-family:var(--ui);font-weight:600}
.cmpick .pi span{font-family:var(--mono);font-size:.66rem;color:var(--ink-faint)}
.cmpbox{min-width:min(860px,82vw)}
.cmp2{display:grid;grid-template-columns:1fr 1fr;gap:14px}
.cmh b{font-family:var(--ui);font-weight:700;color:var(--ink)}
.cmv{font-family:var(--mono);font-size:.78rem;color:var(--ink-dim);margin:4px 0 8px}
.cmv b{color:var(--model)}
.cmv em{font-style:normal;color:var(--model)}

/* ==== [v11] E-fixes + MOBILE PROGRAM + EYE-FLOW CRAFT ==== */
/* E3: placeholder crest shows the initial */
.obt-gph{display:inline-flex;align-items:center;justify-content:center;font-family:var(--mono);font-size:.6rem;color:var(--ink-faint)}
/* B6: green means ACT — facts go ink, prices go quiet */
.gcm .fact,.obt-case .fact{color:var(--ink);font-weight:700}
.obt-gside .sp{color:var(--ink-dim)}
.obt-gside .sp:hover{color:var(--model);border-color:rgba(52,211,153,.4)}
.obt-prate{color:var(--ink)}
.ntrow .ft{color:var(--ink)}
.cph b{color:var(--ink)}
.obt-spline b{color:var(--ink)}
/* B9: number rails — prices align to a shared right edge */
.obt-gside .sp{min-width:56px;text-align:right}
.obt-gside .lsn{min-width:56px;text-align:right}
/* B8: 8px rhythm */
.obt-day{margin-top:8px;padding:4px 12px}
.obt-day:first-child{margin-top:0}
.obt-row{padding:8px 12px 9px}
.obt-gch{margin-bottom:4px}
.obt-stage{padding:12px}
.obt-wsid{padding:10px 12px}
/* B7: one primary per region — companions and depth drop half a shade */
.obt-wsside .gcm{opacity:.93}
.obt-wsside .gcmh{color:var(--ink-faint)}
.obt-receipt{opacity:.9}
/* B10: band type scale = 3 sizes */
.obt-wsv.hero .who{font-size:1rem}
.obt-wsv.hero .k,.obt-wsv.hero .per{font-size:.64rem}
.obt-wsv.hero .cw{font-size:.64rem}
.obt-wsv.hero em{font-size:.7rem}
/* B11: skeletons become shimmer frames */
.obt-skel{position:relative;overflow:hidden;background:var(--panel);border:1px solid var(--line);height:56px;margin:8px 10px}
.obt-skel:nth-child(2){width:82%}
.obt-skel:nth-child(3){width:64%}
.obt-skel::after{content:"";position:absolute;top:0;bottom:0;width:38%;left:-40%;background:linear-gradient(90deg,transparent,rgba(70,140,255,.06),transparent);animation:obtShimmer 1.2s ease-in-out infinite}
@keyframes obtShimmer{to{left:110%}}
/* B12: the site scores strip steps back on the terminal */
/* the terminal hides the site scores strip like the rest of the chrome — it has its
   own live layer, and a clamped ticker just looked broken (owner 09-03) */
.site-top{display:none}
/* A3: procs + charge badges on tiles (mobile cards + desktop rows) */
.obt-tile{position:relative}
.obt-tile .tc{position:absolute;top:3px;right:4px;font-style:normal;font-family:var(--mono);font-size:.56rem;font-weight:700;color:var(--action-hi);background:rgba(70,140,255,.14);padding:0 4px;min-width:14px;text-align:center}
.obt-tile.proc-red{box-shadow:inset 3px 0 0 #E8534A}
.obt-tile.proc-green{box-shadow:inset 3px 0 0 var(--model)}
.obt-tile.proc-blue{box-shadow:inset 3px 0 0 var(--action-hi)}
.obt-tile.proc-gold{box-shadow:inset 3px 0 0 var(--gold)}
/* A1: powers FAB + bottom sheet (mobile only) */
#obtFab{position:fixed;right:14px;bottom:78px;z-index:60;appearance:none;border:1px solid var(--action-hi);background:var(--panel);color:var(--action-hi);font-size:1.15rem;width:56px;height:56px;cursor:pointer;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:0;box-shadow:0 4px 18px rgba(0,0,0,.45)}
#obtFab span{font-family:var(--mono);font-size:.5rem;letter-spacing:.08em;text-transform:uppercase}
@media (min-width:1150px){#obtFab{display:none !important}}
#obtPow{position:fixed;inset:0;z-index:110;background:rgba(4,8,14,.6)}
#obtPow .sheet{position:absolute;left:0;right:0;bottom:0;background:var(--panel);border-top:1px solid var(--line-strong,var(--ink-faint));padding:6px 0 14px;max-height:70vh;overflow-y:auto}
#obtPow .prow{padding:13px 18px;border-top:1px solid var(--line);cursor:pointer;min-height:48px}
#obtPow .prow:first-child{border-top:none}
#obtPow .prow b{display:block;font-family:var(--ui);font-weight:700;font-size:.95rem;color:var(--ink)}
#obtPow .prow span{display:block;font-family:var(--mono);font-size:.66rem;color:var(--ink-faint);margin-top:1px}
#obtPow .prow:active{background:rgba(70,140,255,.1)}
/* A2: compact mobile boss frame (spans the tile grid) */
.obt-mboss{grid-column:1/-1;display:flex;align-items:center;gap:12px;border:1px solid var(--line);background:var(--panel);padding:10px 12px;font-variant-numeric:tabular-nums}
.obt-mboss img{width:38px;height:38px;object-fit:contain}
.obt-mboss .ph{width:38px;height:38px;display:inline-flex;align-items:center;justify-content:center;border-radius:50%;background:var(--panel-2);border:1px solid var(--line);font-family:var(--mono);color:var(--ink-faint)}
.obt-mboss .mid{flex:1;display:flex;align-items:baseline;gap:8px;flex-wrap:wrap;justify-content:center}
.obt-mboss .big{font-family:var(--mono);font-size:1.5rem;font-weight:700;color:var(--model);line-height:1}
.obt-mboss .sc{font-family:var(--mono);font-size:1.5rem;font-weight:700;color:var(--ink)}
.obt-mboss .per{font-family:var(--mono);font-size:.64rem;color:var(--ink-faint)}
.obt-mboss .pips{display:inline-flex;gap:2.5px;align-self:center}
.obt-mboss .pips span{width:6px;height:10px;background:var(--panel-2);border:1px solid var(--line)}
.obt-mboss .pips span.on{background:var(--model);border-color:var(--model)}
.obt-mboss em{font-style:normal;font-family:var(--mono);font-size:.66rem;color:var(--model);border:1px solid rgba(52,211,153,.4);padding:1px 6px}
.obt-mboss .live{font-size:.58rem;letter-spacing:.08em;color:#fff;background:#C43D3D;padding:1px 6px}
.obt-mboss.inplay{box-shadow:inset 0 0 0 1px rgba(196,61,61,.5)}
@media (min-width:1150px){.obt-mboss{display:none}}
/* A1b: coach in the game head */
#obtCoach2{appearance:none;background:rgba(70,140,255,.1);border:1px solid var(--action-hi);color:var(--action-hi);font-family:var(--mono);font-size:.64rem;letter-spacing:.04em;text-transform:uppercase;padding:8px 10px;min-height:40px;cursor:pointer;white-space:nowrap;margin-left:auto}
@media (min-width:1150px){#obtCoach2{display:none}}
/* A5: 48px touch targets */
@media (max-width:1149px){
  .obt-days button{min-height:40px;padding:8px 14px}
  .obt-glens button{min-height:40px;padding:9px 13px}
  #obtPal .box{width:94vw}
  #obtPal{padding-top:8vh}
  #obtPal .pi{min-height:48px;align-items:center}
}

/* [v11.1] mobile game-head: crumb yields, the coach button never overlaps */
@media (max-width:1149px){
  .obt-gamehead .obt-crumb{flex:1 1 auto;min-width:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}
  .obt-gamehead .obt-crumb .ko{display:inline-block;max-width:9em;overflow:hidden;text-overflow:ellipsis;vertical-align:bottom}
  #obtCoach2{flex:0 0 auto;margin-left:6px}
  .obt-gamehead .obt-star2{flex:0 0 auto}
}

/* ---- [v13] broadcast exhibits + motion + mobile find ---- */
.obt-chartwrap{position:relative}
.obt-stage .obt-chart{height:230px}
.obt-wsc .obt-chart{height:150px}
.obt-chartwrap .xtip{position:absolute;top:8px;background:var(--panel);border:1px solid var(--line-strong,var(--ink-faint));padding:6px 9px;pointer-events:none;font-family:var(--mono);font-size:.7rem;color:var(--ink-dim);white-space:nowrap;z-index:5}
.obt-chartwrap .xtip div{display:flex;align-items:center;gap:6px;padding:1px 0}
.obt-chartwrap .xtip b{color:var(--ink)}
.obt-chartwrap .xtip i{width:8px;height:8px;flex:0 0 8px}
.obt-chartwrap .xtip i.c0{background:var(--action-hi)}
.obt-chartwrap .xtip i.c1{background:var(--model)}
.gclab2 .lcr{width:18px;height:18px;object-fit:contain;vertical-align:-4px;margin-right:5px}
.obt-stage.swapin>*{animation:obtSwap .2s ease-out}
@keyframes obtSwap{from{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}
.obt-wsid{animation:obtSettle .28s ease-out}
@keyframes obtSettle{from{opacity:0;transform:scale(.985)}to{opacity:1;transform:none}}
@media (prefers-reduced-motion: reduce){.obt-stage.swapin>*,.obt-wsid{animation:none}}
@media (max-width:1149px){
  #obtSearch{width:64px;min-width:64px;flex:0 0 64px;text-align:center;font-family:var(--mono);font-size:.72rem;letter-spacing:.05em;color:var(--ink-dim);cursor:pointer}
}

/* ---- [v14] THE JOURNEY BAR — six numbered questions, walked left to right ---- */
#obtBar .jstage{position:relative;flex:1 1 0;min-width:96px;background:var(--panel);border:none;border-right:1px solid var(--line);border-top:2px solid transparent;color:var(--ink-dim);text-align:left;padding:7px 10px 6px 30px;cursor:pointer;display:flex;flex-direction:column;justify-content:center;gap:1px;transition:background .1s,color .1s}
#obtBar .jstage b{font-family:var(--ui);font-weight:700;font-size:.8rem;color:var(--ink-dim);letter-spacing:0;text-transform:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
#obtBar .jstage span{font-family:var(--mono);font-size:.58rem;letter-spacing:.05em;color:var(--ink-faint);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
#obtBar .jstage .jn{position:absolute;left:9px;top:50%;transform:translateY(-50%);font-style:normal;font-family:var(--mono);font-size:.72rem;color:var(--ink-faint);border:1px solid var(--line);width:16px;height:16px;line-height:15px;text-align:center}
#obtBar .jstage .jc{position:absolute;top:2px;right:4px;font-style:normal;font-family:var(--mono);font-size:.55rem;font-weight:700;color:var(--action-hi);background:rgba(70,140,255,.14);padding:0 4px;min-width:14px;text-align:center}
#obtBar .jstage:hover{background:rgba(70,140,255,.06)}
#obtBar .jstage:hover b{color:var(--ink)}
#obtBar .jstage.on{border-top-color:var(--action-hi);background:rgba(70,140,255,.1)}
#obtBar .jstage.on b{color:var(--action-hi)}
#obtBar .jstage.on .jn{border-color:var(--action-hi);color:var(--action-hi)}
#obtBar .jstage.cast{animation:obtCast .35s ease-out}
#obtBar .jstage.proc-green .jn{border-color:var(--model);color:var(--model)}
#obtBar .jstage.proc-red .jn{border-color:#E8534A;color:#E8534A}
#obtBar .jstage.proc-gold .jn{border-color:var(--gold);color:var(--gold)}
#obtBar .jstage.proc-blue .jn{border-color:var(--action-hi)}

/* ---- [v16] the market spine: selector + take-it live in the boss frame ---- */
.obt-mksel{display:flex;gap:0;border:1px solid var(--line);margin-left:6px}
.obt-mksel button{appearance:none;background:var(--panel-2);border:none;border-left:1px solid var(--line);color:var(--ink-dim);font-family:var(--mono);font-size:.66rem;letter-spacing:.06em;text-transform:uppercase;padding:7px 12px;cursor:pointer;min-height:34px}
.obt-mksel button:first-child{border-left:none}
.obt-mksel button:hover{color:var(--ink)}
.obt-mksel button.on{background:var(--action-hi);color:#fff}
.wtake{appearance:none;background:var(--model);border:none;color:#06251A;font-family:var(--mono);font-size:.7rem;font-weight:700;letter-spacing:.05em;text-transform:uppercase;padding:8px 13px;cursor:pointer;margin-left:4px}
.wtake:hover{filter:brightness(1.1)}
.wtake:active{transform:scale(.95)}
/* the band owns the market on desktop — the old top tab rows retire there */
@media (min-width:1150px){
  #obtLens{display:none}
  #obtGLens{display:none}
}

/* ---- [v17] gamified journey slots + monitor rail + weather/ranks ---- */
#obtBar .jstage{padding:6px 10px 5px 52px;min-width:118px}
#obtBar .jstage .jg{position:absolute;left:26px;top:50%;transform:translateY(-50%);width:20px;height:20px;color:inherit;opacity:.85}
#obtBar .jstage .jg svg{width:20px;height:20px;display:block}
#obtBar .jstage:hover{transform:translateY(-1px)}
#obtBar .jstage:active{transform:scale(.96)}
#obtBar .jstage.seen .jn{border-color:var(--model);color:var(--model)}
#obtBar .jstage.on .jg{opacity:1}
.wxrow{display:flex;gap:1px;background:var(--line);border:1px solid var(--line);margin:2px 0 8px}
.wxc{flex:1;background:var(--panel);padding:6px 4px;text-align:center;font-variant-numeric:tabular-nums}
.wxc.ko{background:rgba(70,140,255,.1);box-shadow:inset 0 2px 0 var(--action-hi)}
.wxc i{display:block;font-style:normal;font-family:var(--mono);font-size:.56rem;letter-spacing:.06em;text-transform:uppercase;color:var(--ink-faint)}
.wxc b{display:block;font-family:var(--mono);font-size:1rem;color:var(--ink);margin:2px 0}
.wxc em{display:block;font-style:normal;font-family:var(--mono);font-size:.6rem;color:var(--ink-dim)}
.pwrow{display:flex;align-items:center;gap:12px;padding:8px 0;border-top:1px solid var(--line)}
.pwrow:first-of-type{border-top:0;padding-top:2px}
.pwrow .rk{font-family:var(--mono);font-size:1.5rem;font-weight:700;color:var(--ink);min-width:52px}
.pwrow div b{display:block;font-family:var(--ui);font-weight:600;font-size:.88rem;color:var(--ink)}
.pwrow div span{display:block;font-family:var(--mono);font-size:.68rem;color:var(--ink-dim);margin-top:1px}
#obtRailFoot .rsec{padding:7px 10px 8px;border-bottom:1px solid var(--line)}
#obtRailFoot .rk{display:block;font-family:var(--mono);font-size:.56rem;letter-spacing:.12em;text-transform:uppercase;color:var(--ink-faint);margin-bottom:4px}
#obtRailFoot .rleg{display:flex;align-items:center;gap:6px;padding:3px 0;font-variant-numeric:tabular-nums}
#obtRailFoot .rleg b{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:var(--ui);font-weight:600;font-size:.76rem;color:var(--ink)}
#obtRailFoot .rleg i{font-style:normal;font-family:var(--mono);font-size:.74rem;color:var(--ink-dim)}
#obtRailFoot .rleg .rx{appearance:none;background:none;border:none;color:var(--ink-faint);font-size:.9rem;cursor:pointer;padding:0 2px;line-height:1}
#obtRailFoot .rleg .rx:hover{color:#E8534A}
#obtRailFoot .rsum{display:flex;align-items:baseline;gap:8px;margin-top:4px;font-family:var(--mono);font-size:.7rem;color:var(--ink-dim)}
#obtRailFoot .rsum b{color:var(--model)}
#obtRailFoot .rsum .ropen{appearance:none;background:none;border:1px solid var(--line);color:var(--ink-dim);font-family:var(--mono);font-size:.6rem;letter-spacing:.06em;text-transform:uppercase;padding:3px 8px;cursor:pointer;margin-left:auto}
#obtRailFoot .rsum .ropen:hover{color:var(--action-hi);border-color:var(--action-hi)}
#obtRailFoot .rlink{display:block;font-family:var(--mono);font-size:.7rem;color:var(--action-hi);text-decoration:none;padding:2px 0}
#obtRailFoot .rlink:hover{text-decoration:underline}

/* ==== [v18] THE HUD BAR — permanently dark, framed, lit. Game UI never re-skins. ==== */
#obtBar{--hud:#0B0F16;--hudcell:#131926;--hudline:#26314A;--hudink:#E8EDF6;--huddim:#93A3BC;--hudfaint:#5C6A82;
  background:var(--hudline);border-top:2px solid var(--hudline);gap:1px;padding:0;min-height:56px}
#obtBar .jstage{background:var(--hudcell);color:var(--huddim);border:none;border-top:2px solid transparent;padding:8px 10px 7px 56px;min-width:128px;box-shadow:inset 0 1px 0 rgba(255,255,255,.05)}
#obtBar .jstage b{color:var(--hudink);font-size:.82rem}
#obtBar .jstage span.jq{color:var(--hudfaint)}
#obtBar .jstage .jn{border-color:var(--hudline);color:var(--hudfaint);background:var(--hud);width:17px;height:17px;line-height:16px}
#obtBar .jstage .jg{left:28px;width:22px;height:22px;color:var(--huddim)}
#obtBar .jstage .jg svg{width:22px;height:22px}
#obtBar .jstage:hover{background:#1A2233;color:var(--hudink);transform:none}
#obtBar .jstage:hover .jg{color:var(--hudink)}
#obtBar .jstage.on{background:#18213A;border-top-color:#5B8DEF;box-shadow:inset 0 1px 0 rgba(91,141,239,.35),inset 0 -14px 22px -18px rgba(91,141,239,.8)}
#obtBar .jstage.on b{color:#9DBCFF}
#obtBar .jstage.on .jg{color:#9DBCFF;opacity:1}
#obtBar .jstage.on .jn{border-color:#5B8DEF;color:#9DBCFF}
#obtBar .jstage.seen .jn{border-color:#37C08A;color:#37C08A}
#obtBar .jstage.proc-green .jn{border-color:#37C08A;color:#37C08A;box-shadow:0 0 8px rgba(55,192,138,.55)}
#obtBar .jstage.proc-red .jn{border-color:#E8534A;color:#FF7A72;box-shadow:0 0 8px rgba(232,83,74,.6)}
#obtBar .jstage.proc-gold .jn{border-color:#E8B34A;color:#FFD37A;box-shadow:0 0 8px rgba(232,179,74,.55)}
#obtBar .jc{color:#9DBCFF;background:rgba(91,141,239,.2)}
#obtBar .baru{border-left:2px solid var(--hudline)}
#obtBar .ub{background:var(--hudcell);color:var(--huddim);border:none;border-left:1px solid var(--hudline);min-width:52px;box-shadow:inset 0 1px 0 rgba(255,255,255,.05)}
#obtBar .ub span{color:var(--hudfaint)}
#obtBar .ub:hover{background:#1A2233;color:var(--hudink)}
#obtBar .ub.pw{background:#14202F;color:#7FB0E8}
#obtBar .ub.pw:hover{background:#1A2C42;color:#B7D6FF}
#obtBar .ub.pw.proc{color:#4ADE9C;background:#12291F;animation:obtProc 1.8s ease-in-out infinite}
#obtBar .slot{background:var(--hudcell);color:var(--huddim);border-right:1px solid var(--hudline)}
#obtBar.sweep::after{background:rgba(91,141,239,.6)}
#obtTip{background:#0E1420;border-color:#26314A;color:#93A3BC}
#obtTip b{color:#9DBCFF}
#obtTip i{color:#E8EDF6}
#obtTip span{color:#93A3BC}

/* ---- [v19] model factor marks + key ---- */
.fwm{font-style:normal;font-family:var(--mono);letter-spacing:1px;font-size:.6rem;line-height:1}
.fwm.l3{color:var(--model)}
.fwm.l2{color:var(--model);opacity:.75}
.fwm.l1{color:var(--ink-faint)}
.obt-wsmain>.fwm,.obt-wsc>.fwm{position:absolute;top:8px;right:38px;z-index:3}
.obt-wsc>.fwm{right:10px}
.obt-wsc{position:relative}
.obt-tile .fwm{position:absolute;bottom:3px;right:5px}
@media (max-width:1149px){.obt-tile .fwm{bottom:auto;top:3px;right:24px}}
.fwkey{display:flex;flex-direction:column;gap:2px}
.fwkey span{font-family:var(--mono);font-size:.66rem;color:var(--ink-dim)}
.fwkey .fwm{margin-right:6px}
.fwnote{margin:5px 0 0;font-family:var(--ui);font-size:.68rem;color:var(--ink-faint);line-height:1.45}

/* ---- [v20] H2: the holo hand — hologram card bar, full width above the dock ---- */
#obtBar{--holo:#38C7FF;--holot:#AEE8FF;--holod:#5D9CBD;--hgold:#F5B301;--hgoldt:#FFE9A8;--hact:#22C55E;--hactt:#8DFFB8;
  display:flex;align-items:flex-end;gap:11px;min-height:138px;padding:16px 16px 11px;position:relative;overflow:visible;
  background:linear-gradient(180deg,#02060C,#010409);border-top:1px solid rgba(56,199,255,.5)}
#obtBar::before{content:"";position:absolute;inset:0;background:repeating-linear-gradient(180deg,rgba(56,199,255,.045) 0 1px,transparent 1px 4px);pointer-events:none}
#obtBar::after{content:"";position:absolute;top:-1px;left:14%;right:14%;height:1px;background:linear-gradient(90deg,transparent,rgba(56,199,255,.75),transparent)}
#obtBar .jstage{flex:1 1 132px;min-width:102px;max-width:210px;height:108px;border-radius:8px;box-sizing:border-box;
  background:linear-gradient(180deg,rgba(23,68,105,.38),rgba(8,26,44,.55));border:1px solid rgba(56,199,255,.5);
  box-shadow:0 0 14px rgba(56,199,255,.16),inset 0 0 20px rgba(56,199,255,.07);
  display:flex;flex-direction:column;align-items:center;justify-content:flex-start;text-align:center;
  padding:13px 8px 9px;color:var(--holod);transition:transform .12s ease,box-shadow .12s ease;z-index:1}
#obtBar .jstage:hover{background:linear-gradient(180deg,rgba(23,68,105,.5),rgba(8,26,44,.65));transform:translateY(-4px)}
#obtBar .jstage .jn{position:absolute;left:-9px;top:-9px;transform:none;width:24px;height:24px;line-height:22px;border-radius:50%;
  background:radial-gradient(circle at 50% 50%,rgba(56,199,255,.5),rgba(8,26,44,.92) 70%);border:1px solid var(--holo);
  color:#DFF6FF;font-size:.68rem;text-shadow:0 0 8px var(--holo);box-shadow:0 0 10px rgba(56,199,255,.5)}
#obtBar .jstage .jc{top:-8px;right:-6px;border-radius:9px;background:rgba(8,26,44,.92);border:1px solid var(--hgold);color:var(--hgoldt);
  text-shadow:0 0 6px var(--hgold);box-shadow:0 0 8px rgba(245,179,1,.45);padding:0 5px;line-height:15px}
#obtBar .jstage .jg{position:static;transform:none;left:auto;top:auto;width:54px;height:36px;flex:0 0 auto;border-radius:5px;
  border:1px solid rgba(56,199,255,.4);background:rgba(4,14,26,.6);display:flex;align-items:center;justify-content:center;
  box-shadow:inset 0 0 12px rgba(56,199,255,.14);color:var(--holot);opacity:1;margin:0 0 8px}
#obtBar .jstage .jg svg{width:22px;height:22px}
#obtBar .jstage b{font-family:var(--mono);font-weight:700;font-size:.6rem;letter-spacing:.11em;text-transform:uppercase;
  color:var(--holot);text-shadow:0 0 8px rgba(56,199,255,.8);max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
#obtBar .jstage span.jq{font-family:var(--ui);font-size:.66rem;letter-spacing:0;text-transform:none;color:var(--holod);
  margin-top:3px;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
#obtBar .jstage::after{content:"";position:absolute;left:14%;right:14%;top:100%;height:11px;
  background:linear-gradient(180deg,rgba(56,199,255,.28),transparent);filter:blur(2px);pointer-events:none}
#obtBar .jstage.seen{border-color:rgba(245,179,1,.55);box-shadow:0 0 12px rgba(245,179,1,.13),inset 0 0 18px rgba(245,179,1,.05)}
#obtBar .jstage.seen .jn{background:radial-gradient(circle at 50% 50%,rgba(245,179,1,.45),rgba(36,24,4,.92) 70%);border-color:var(--hgold);
  color:var(--hgoldt);text-shadow:0 0 8px var(--hgold);box-shadow:0 0 10px rgba(245,179,1,.45)}
#obtBar .jstage.seen b{color:var(--hgoldt);text-shadow:0 0 8px rgba(245,179,1,.65)}
#obtBar .jstage.seen .jg{border-color:rgba(245,179,1,.4);box-shadow:inset 0 0 12px rgba(245,179,1,.1);color:var(--hgoldt)}
#obtBar .jstage.seen::after{background:linear-gradient(180deg,rgba(245,179,1,.22),transparent)}
#obtBar .jstage.on{border-color:#7FDCFF;border-top-color:#7FDCFF;background:linear-gradient(180deg,rgba(23,68,105,.55),rgba(8,26,44,.7));
  box-shadow:0 0 26px rgba(56,199,255,.55),inset 0 0 24px rgba(56,199,255,.18);transform:translateY(-12px) scale(1.05);z-index:2}
#obtBar .jstage.on:hover{transform:translateY(-12px) scale(1.05)}
#obtBar .jstage.on b{color:#fff}
#obtBar .jstage.on span.jq{color:var(--holot)}
#obtBar .jstage.on .jg{color:#fff;border-color:rgba(127,220,255,.7);box-shadow:inset 0 0 14px rgba(56,199,255,.3)}
#obtBar .jstage.proc-green{border-color:rgba(34,197,94,.7);box-shadow:0 0 16px rgba(34,197,94,.35),inset 0 0 18px rgba(34,197,94,.08)}
#obtBar .jstage.proc-green .jn{border-color:var(--hact);color:var(--hactt);text-shadow:0 0 8px var(--hact);box-shadow:0 0 10px rgba(34,197,94,.5)}
#obtBar .jstage.proc-red{border-color:rgba(232,83,74,.7);box-shadow:0 0 16px rgba(232,83,74,.35),inset 0 0 18px rgba(232,83,74,.08)}
#obtBar .jstage.proc-red .jn{border-color:#E8534A;color:#FF9A92;text-shadow:0 0 8px #E8534A;box-shadow:0 0 10px rgba(232,83,74,.5)}
#obtBar .jstage.proc-gold{border-color:rgba(232,179,74,.75)}
#obtBar .jstage.proc-gold .jn{border-color:#E8B34A;color:#FFD37A;text-shadow:0 0 8px #E8B34A}
#obtBar .baru{margin-left:auto;display:flex;align-items:flex-end;gap:6px;border:none;background:transparent;padding-bottom:2px}
#obtBar .ub{background:transparent;border:none;box-shadow:none;min-width:56px;padding:0;color:var(--holod);
  display:flex;flex-direction:column;align-items:center;justify-content:flex-end;gap:6px;cursor:pointer}
#obtBar .ub .rg{width:44px;height:44px;border-radius:50%;border:1px solid rgba(56,199,255,.5);
  background:radial-gradient(circle at 50% 42%,rgba(56,199,255,.2),rgba(4,14,26,.72) 72%);
  display:flex;align-items:center;justify-content:center;color:var(--holot);
  box-shadow:0 0 12px rgba(56,199,255,.22),inset 0 0 10px rgba(56,199,255,.1);transition:box-shadow .12s ease,transform .12s ease}
#obtBar .ub .rg svg{width:20px;height:20px;display:block}
#obtBar .ub .lb{font-family:var(--mono);font-size:.52rem;letter-spacing:.1em;text-transform:uppercase;color:var(--holod);white-space:nowrap}
#obtBar .ub:hover{background:transparent;color:var(--holot)}
#obtBar .ub:hover .rg{box-shadow:0 0 18px rgba(56,199,255,.45),inset 0 0 12px rgba(56,199,255,.18);transform:translateY(-2px)}
#obtBar .ub:hover .lb{color:var(--holot)}
#obtBar .ub.pw,#obtBar .ub.pw:hover{background:transparent}
#obtBar .ub.go{flex-direction:row;align-self:center;min-width:0;margin-left:8px;padding:13px 18px;border:1px solid rgba(34,197,94,.8);border-radius:4px;
  background:rgba(5,30,16,.55);font-family:var(--mono);font-weight:700;font-size:.78rem;letter-spacing:.07em;color:var(--hactt);
  text-shadow:0 0 10px rgba(34,197,94,.9);box-shadow:0 0 18px rgba(34,197,94,.3),inset 0 0 14px rgba(34,197,94,.1)}
#obtBar .ub.go:hover{background:rgba(7,44,23,.65);color:#B9FFD4;box-shadow:0 0 26px rgba(34,197,94,.5),inset 0 0 16px rgba(34,197,94,.16)}
#obtBar .ub.go.proc{animation:obtProc 1.8s ease-in-out infinite;background:rgba(6,38,20,.65)}
#obtBar.sweep::after{background:linear-gradient(90deg,transparent,rgba(56,199,255,.9),transparent)}
#obtPow2{position:fixed;right:16px;bottom:170px;z-index:60}
#obtPow2 .sheet{background:rgba(4,14,26,.94);border:1px solid rgba(56,199,255,.5);border-radius:6px;min-width:250px;
  box-shadow:0 0 26px rgba(56,199,255,.28);overflow:hidden}
#obtPow2 .prow{display:flex;flex-direction:column;gap:1px;padding:10px 14px;cursor:pointer;border-bottom:1px solid rgba(56,199,255,.14)}
#obtPow2 .prow:last-child{border-bottom:none}
#obtPow2 .prow b{font-family:var(--mono);font-size:.68rem;letter-spacing:.09em;text-transform:uppercase;color:#AEE8FF;text-shadow:0 0 7px rgba(56,199,255,.7)}
#obtPow2 .prow span{font-family:var(--ui);font-size:.66rem;color:#5D9CBD}
#obtPow2 .prow:hover{background:rgba(56,199,255,.1)}
#obtPow2 .prow:hover b{color:#fff}
/* ---- [v20] H3: the switch rail — settings as switchgear ---- */
#obtSw{display:flex;flex-direction:column;align-items:center;gap:11px;width:100%;margin-top:12px;padding-top:11px;position:relative}
#obtSw::before{content:"";position:absolute;top:0;left:16%;right:16%;height:1px;background:linear-gradient(90deg,transparent,rgba(56,199,255,.55),transparent)}
#obtSw .swk{font-family:var(--mono);font-size:.44rem;letter-spacing:.24em;text-transform:uppercase;color:#5D9CBD}
#obtSw .tg{appearance:none;background:transparent;border:none;display:flex;flex-direction:column;align-items:center;gap:3px;cursor:pointer;padding:0;width:100%}
#obtSw .tg .nm{font-family:var(--mono);font-size:.46rem;letter-spacing:.09em;text-transform:uppercase;color:#5D9CBD;white-space:nowrap}
#obtSw .tg .sw{width:20px;height:34px;border-radius:10px;background:rgba(4,14,26,.9);border:1px solid rgba(56,199,255,.5);
  box-shadow:inset 0 2px 5px rgba(0,0,0,.8),0 0 8px rgba(56,199,255,.12);position:relative;display:block}
#obtSw .tg .sw i{position:absolute;left:2px;right:2px;height:14px;border-radius:8px;background:linear-gradient(180deg,#28455F,#132638);
  box-shadow:0 1px 3px rgba(0,0,0,.7);transition:top .12s ease,bottom .12s ease}
#obtSw .tg .sw i.up{top:2px}
#obtSw .tg .sw i.dn{top:16px}
#obtSw .tg .st{font-family:var(--mono);font-size:.5rem;font-weight:700;letter-spacing:.06em;color:#5D9CBD;white-space:nowrap}
#obtSw .tg.armed .sw{border-color:#38C7FF}
#obtSw .tg.armed .sw i{background:linear-gradient(180deg,#7FDCFF,#2A8FC4);box-shadow:0 0 10px rgba(56,199,255,.8)}
#obtSw .tg.armed .st{color:#AEE8FF;text-shadow:0 0 7px rgba(56,199,255,.7)}
#obtSw .tg.grn .sw{border-color:#22C55E}
#obtSw .tg.grn .sw i{background:linear-gradient(180deg,#8DFFB8,#1F9A52);box-shadow:0 0 10px rgba(34,197,94,.8)}
#obtSw .tg.grn .st{color:#8DFFB8;text-shadow:0 0 7px rgba(34,197,94,.7)}
#obtSw .tg:hover .nm{color:#AEE8FF}
@media (max-width:1149px){#obtBar{display:none !important}#obtSw{display:none !important}}
@media (prefers-reduced-motion: reduce){#obtBar .jstage,#obtBar .ub .rg,#obtSw .tg .sw i{transition:none}}
/* ---- [v21] hidden must mean hidden: author display rules were beating the attribute ---- */
#obtBar[hidden]{display:none !important}
#obtToast[hidden]{display:none !important}

/* ---- [v22] the holo frame: rail completed, bar compacted, right column + controls unified ---- */
/* A. tools rail — the H3 strip, whole thing */
.obt-rail1{background:linear-gradient(180deg,#02060C,#010409);border-right:1px solid rgba(56,199,255,.22);gap:7px;padding:10px 0}
.obt-rail1 .obt-ico{width:38px;height:38px;border:1px solid rgba(56,199,255,.28);border-radius:6px;background:rgba(8,26,44,.38);color:#5D9CBD}
.obt-rail1 .obt-ico:hover{color:#AEE8FF;background:rgba(8,26,44,.6);border-color:rgba(56,199,255,.55);box-shadow:0 0 10px rgba(56,199,255,.28)}
.obt-rail1 .obt-ico.on{border-color:#7FDCFF;color:#AEE8FF;background:rgba(12,30,56,.6);box-shadow:0 0 12px rgba(56,199,255,.45)}
/* B. the bar, half the height: cards go horizontal on a grid */
#obtBar{min-height:92px;padding:12px 14px 9px;gap:9px;align-items:center}
#obtBar .jstage{display:grid;grid-template-columns:34px minmax(0,1fr);grid-template-rows:auto auto;align-content:center;column-gap:9px;row-gap:2px;height:62px;padding:8px 12px 8px 14px;text-align:left;flex:1 1 150px;min-width:118px;max-width:236px}
#obtBar .jstage .jg{grid-row:1/3;grid-column:1;position:static;transform:none;width:34px;height:30px;margin:0;align-self:center}
#obtBar .jstage .jg svg{width:19px;height:19px}
#obtBar .jstage b{grid-column:2;justify-self:start;text-align:left;max-width:100%}
#obtBar .jstage span.jq{grid-column:2;justify-self:start;text-align:left;margin-top:0;font-size:.68rem}
#obtBar .jstage .jn{width:20px;height:20px;line-height:18px;left:-7px;top:-7px;font-size:.6rem}
#obtBar .jstage .jc{top:-7px;right:-5px}
#obtBar .jstage::after{height:8px}
#obtBar .jstage:hover{transform:translateY(-2px)}
#obtBar .jstage.on{transform:translateY(-5px) scale(1.02)}
#obtBar .jstage.on:hover{transform:translateY(-5px) scale(1.02)}
#obtBar .ub{min-width:46px;gap:4px}
#obtBar .ub .rg{width:36px;height:36px}
#obtBar .ub .rg svg{width:17px;height:17px}
#obtBar .ub .lb{font-size:.48rem}
#obtBar .ub.go{padding:10px 14px;font-size:.72rem;margin-left:6px}
#obtPow2{bottom:118px}
/* C. right column — same dark holo surface as the bar */
.obt-tilescol{background:linear-gradient(180deg,#02060C,#010409);border-left:1px solid rgba(56,199,255,.22)}
.obt-tile{border-bottom:1px solid rgba(56,199,255,.12)}
.obt-tile .tl{color:#5D9CBD}
.obt-tile .hl{color:#DFE9F5}
.obt-tile:hover{background:rgba(56,199,255,.07)}
.obt-tile.on{background:rgba(12,30,56,.75);border-left-color:#7FDCFF;box-shadow:inset 0 0 14px rgba(56,199,255,.12)}
.obt-tile .tc{color:#AEE8FF;background:rgba(56,199,255,.14)}
.obt-tile.proc-green{box-shadow:inset 3px 0 0 #37C08A}
.obt-tile.proc-red{box-shadow:inset 3px 0 0 #FF7A72}
#obtRailFoot{background:transparent;border-top:1px solid rgba(56,199,255,.2)}
#obtRailFoot .rsec{border-bottom:1px solid rgba(56,199,255,.12)}
#obtRailFoot .rk{color:#5D9CBD}
#obtRailFoot .rleg b{color:#DFE9F5}
#obtRailFoot .rleg i{color:#AEE8FF}
#obtRailFoot .rleg .rx{color:#4A617F}
#obtRailFoot .rsum{color:#8FA7C4}
#obtRailFoot .rsum b{color:#8DFFB8}
#obtRailFoot .rsum .ropen{border-color:rgba(56,199,255,.35);color:#7FDCFF}
#obtRailFoot .rsum .ropen:hover{border-color:#38C7FF;color:#AEE8FF}
#obtRailFoot .rlink{color:#7FDCFF}
#obtRailFoot .one{border-bottom:1px solid rgba(56,199,255,.12)}
#obtRailFoot .one:hover{background:rgba(56,199,255,.06)}
#obtRailFoot .one .k{color:#8DFFB8}
#obtRailFoot .one b{color:#DFE9F5}
#obtRailFoot .one i{color:#8FA7C4}
#obtRailFoot .pal{color:#4A617F}
#obtRailFoot .pal b{color:#7FDCFF;border-color:rgba(56,199,255,.3)}
#obtRailFoot .pal:hover{color:#8FA7C4}
#obtRailFoot .fwkey span{color:#8FA7C4}
#obtRailFoot .fwnote{color:#4A617F}
#obtRailFoot .fwm.l1{color:#4A617F}
/* D. one control language everywhere: rounded, cyan-accented */
.obt-tico,.obt-tnav button,.obt-back,.obt-lens button,.obt-glens button,.obt-lg,.obt-ico{border-radius:6px}
.obt-seg{border-radius:6px;overflow:hidden;border-color:rgba(56,199,255,.4)}
.obt-seg button.on{background:#0C1E38;color:#7FDCFF;text-shadow:0 0 8px rgba(56,199,255,.6)}
.obt-lens button.on,.obt-glens button.on{border-color:#38C7FF;color:#0B72A8;background:rgba(56,199,255,.08)}
.obt-tico:hover,.obt-tnav button:hover,.obt-back:hover{border-color:#38C7FF;color:#0B72A8}
.obt-lg.on{border-color:#38C7FF;background:rgba(56,199,255,.08)}
@media (max-width:1149px){#obtBar{display:none !important}#obtSw{display:none !important}
  .obt-rail1{background:transparent;border-right:none}
  .obt-tilescol{background:var(--panel-2)}
  .obt-tile .tl{color:var(--ink-faint)}
  .obt-tile .hl{color:var(--ink)}
  .obt-tile.on{background:rgba(70,140,255,.08)}
}
.obt-tilescol .obt-skel{background:rgba(56,199,255,.08)}
#obtStage .obt-skel{border-radius:6px}

/* ---- [v23] props board: two calm lines, plain words ---- */
.obt-prow.p2{display:flex;align-items:flex-start;gap:9px;padding:8px 6px 8px 2px}
.obt-prow.p2 img{width:28px;height:28px;margin-top:2px}
.obt-prow.p2 .obt-pmain{flex:1;min-width:0}
.obt-prow.p2 .obt-pl1{display:flex;align-items:baseline;gap:8px}
.obt-prow.p2 .obt-pname{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:var(--ui);font-weight:700;font-size:.8rem;color:var(--ink)}
.obt-prow.p2 .obt-pprice{flex:0 0 auto;font-family:var(--mono);font-weight:700;font-size:.78rem;color:var(--action-hi)}
.obt-prow.p2 .obt-pl2{font-family:var(--ui);font-size:.72rem;color:var(--ink-dim);line-height:1.4;margin-top:1px}
.obt-prow.p2 .obt-pl2 b{color:var(--model);font-weight:700}
.obt-prow.p2 .obt-pfire{font-style:normal;color:var(--gold,#B8860B);font-weight:600}
.obt-prow.p2 .obt-pl3{font-family:var(--ui);font-size:.66rem;color:var(--ink-faint);margin-top:1px}
.obt-prow.p2:hover{background:rgba(70,140,255,.05)}

/* ---- [v23] light skin for the holo chrome (stamped light, or OS-light with no stamp) ---- */
:root[data-theme="light"] #obtBar{background:linear-gradient(180deg,#FFFFFF,#F0F5FB);border-top:1px solid rgba(11,114,168,.3)}
:root[data-theme="light"] #obtBar::before{background:repeating-linear-gradient(180deg,rgba(11,114,168,.03) 0 1px,transparent 1px 4px)}
:root[data-theme="light"] #obtBar::after{background:linear-gradient(90deg,transparent,rgba(11,114,168,.45),transparent)}
:root[data-theme="light"] #obtBar .jstage{background:linear-gradient(180deg,#FFFFFF,#F4F8FD);border-color:rgba(11,114,168,.3);box-shadow:0 2px 8px rgba(23,37,64,.08);color:#4A7396}
:root[data-theme="light"] #obtBar .jstage:hover{background:linear-gradient(180deg,#FFFFFF,#EAF2FA)}
:root[data-theme="light"] #obtBar .jstage .jn{background:#FFFFFF;border-color:#1B84B8;color:#0B3C5C;text-shadow:none;box-shadow:0 1px 4px rgba(23,37,64,.15)}
:root[data-theme="light"] #obtBar .jstage .jc{background:#FFF7E0;border-color:#C89B24;color:#7A5A10;text-shadow:none;box-shadow:0 1px 4px rgba(23,37,64,.12)}
:root[data-theme="light"] #obtBar .jstage .jg{background:#F2F7FC;border-color:rgba(11,114,168,.25);box-shadow:none;color:#0B72A8}
:root[data-theme="light"] #obtBar .jstage b{color:#0B3C5C;text-shadow:none}
:root[data-theme="light"] #obtBar .jstage span.jq{color:#4A7396}
:root[data-theme="light"] #obtBar .jstage::after{background:linear-gradient(180deg,rgba(11,114,168,.12),transparent)}
:root[data-theme="light"] #obtBar .jstage.seen{border-color:rgba(176,125,10,.45);box-shadow:0 2px 8px rgba(23,37,64,.08)}
:root[data-theme="light"] #obtBar .jstage.seen .jn{background:#FFF7E0;border-color:#C89B24;color:#7A5A10;text-shadow:none}
:root[data-theme="light"] #obtBar .jstage.seen b{color:#7A5A10;text-shadow:none}
:root[data-theme="light"] #obtBar .jstage.seen .jg{border-color:rgba(176,125,10,.35);color:#8A6A1D;box-shadow:none}
:root[data-theme="light"] #obtBar .jstage.seen::after{background:linear-gradient(180deg,rgba(176,125,10,.14),transparent)}
:root[data-theme="light"] #obtBar .jstage.on{background:linear-gradient(180deg,#FFFFFF,#E8F3FB);border-color:#1B84B8;box-shadow:0 6px 18px rgba(27,132,184,.28)}
:root[data-theme="light"] #obtBar .jstage.on b{color:#062B44}
:root[data-theme="light"] #obtBar .jstage.on span.jq{color:#0B72A8}
:root[data-theme="light"] #obtBar .jstage.on .jg{color:#062B44;border-color:rgba(27,132,184,.5);box-shadow:none}
:root[data-theme="light"] #obtBar .jstage.proc-green{border-color:rgba(21,128,61,.55);box-shadow:0 2px 10px rgba(21,128,61,.18)}
:root[data-theme="light"] #obtBar .jstage.proc-green .jn{border-color:#15803D;color:#0B5F2E;text-shadow:none}
:root[data-theme="light"] #obtBar .jstage.proc-red{border-color:rgba(200,45,38,.55);box-shadow:0 2px 10px rgba(200,45,38,.16)}
:root[data-theme="light"] #obtBar .jstage.proc-red .jn{border-color:#C82D26;color:#8F1D18;text-shadow:none}
:root[data-theme="light"] #obtBar .ub{color:#4A7396}
:root[data-theme="light"] #obtBar .ub .rg{background:radial-gradient(circle at 50% 42%,#FFFFFF,#EAF3FB 72%);border-color:rgba(11,114,168,.3);color:#0B72A8;box-shadow:0 1px 5px rgba(23,37,64,.12)}
:root[data-theme="light"] #obtBar .ub .lb{color:#4A7396}
:root[data-theme="light"] #obtBar .ub:hover .rg{box-shadow:0 2px 10px rgba(27,132,184,.3);color:#075A85}
:root[data-theme="light"] #obtBar .ub:hover .lb{color:#0B72A8}
:root[data-theme="light"] #obtBar .ub.go{background:#DFF5E7;border-color:#15803D;color:#0B5F2E;text-shadow:none;box-shadow:0 2px 10px rgba(21,128,61,.2)}
:root[data-theme="light"] #obtBar .ub.go:hover{background:#CBEEDA;color:#07461F;box-shadow:0 3px 14px rgba(21,128,61,.3)}
:root[data-theme="light"] #obtTip{background:#FFFFFF;border-color:rgba(11,114,168,.35);color:#4A7396;box-shadow:0 6px 18px rgba(23,37,64,.18)}
:root[data-theme="light"] #obtTip b{color:#0B3C5C}
:root[data-theme="light"] #obtTip i{color:#14263C}
:root[data-theme="light"] #obtTip span{color:#4A7396}
:root[data-theme="light"] #obtPow2 .sheet{background:#FFFFFF;border-color:rgba(11,114,168,.35);box-shadow:0 10px 26px rgba(23,37,64,.2)}
:root[data-theme="light"] #obtPow2 .prow{border-bottom-color:rgba(11,114,168,.12)}
:root[data-theme="light"] #obtPow2 .prow b{color:#0B3C5C;text-shadow:none}
:root[data-theme="light"] #obtPow2 .prow span{color:#4A7396}
:root[data-theme="light"] #obtPow2 .prow:hover{background:rgba(27,132,184,.07)}
:root[data-theme="light"] #obtPow2 .prow:hover b{color:#062B44}
:root[data-theme="light"] .obt-rail1{background:linear-gradient(180deg,#FFFFFF,#F0F5FB);border-right:1px solid rgba(11,114,168,.22)}
:root[data-theme="light"] .obt-rail1 .obt-ico{background:#F2F7FC;border-color:rgba(11,114,168,.28);color:#4A7396}
:root[data-theme="light"] .obt-rail1 .obt-ico:hover{background:#E8F1FA;border-color:rgba(27,132,184,.5);color:#0B72A8;box-shadow:0 1px 6px rgba(27,132,184,.2)}
:root[data-theme="light"] .obt-rail1 .obt-ico.on{background:#E4F0FA;border-color:#1B84B8;color:#075A85;box-shadow:0 1px 8px rgba(27,132,184,.28)}
:root[data-theme="light"] #obtSw::before{background:linear-gradient(90deg,transparent,rgba(11,114,168,.4),transparent)}
:root[data-theme="light"] #obtSw .swk{color:#4A7396}
:root[data-theme="light"] #obtSw .tg .nm{color:#4A7396}
:root[data-theme="light"] #obtSw .tg .sw{background:#EAF0F8;border-color:rgba(11,114,168,.35);box-shadow:inset 0 1px 3px rgba(23,37,64,.15)}
:root[data-theme="light"] #obtSw .tg .sw i{background:linear-gradient(180deg,#B9C9DC,#8FA6BE);box-shadow:0 1px 2px rgba(23,37,64,.25)}
:root[data-theme="light"] #obtSw .tg .st{color:#4A7396}
:root[data-theme="light"] #obtSw .tg.armed .sw{border-color:#1B84B8}
:root[data-theme="light"] #obtSw .tg.armed .sw i{background:linear-gradient(180deg,#3FA3D6,#1B6FA0);box-shadow:0 0 6px rgba(27,132,184,.5)}
:root[data-theme="light"] #obtSw .tg.armed .st{color:#0B72A8;text-shadow:none}
:root[data-theme="light"] #obtSw .tg.grn .sw{border-color:#15803D}
:root[data-theme="light"] #obtSw .tg.grn .sw i{background:linear-gradient(180deg,#3FBF77,#15803D);box-shadow:0 0 6px rgba(21,128,61,.5)}
:root[data-theme="light"] #obtSw .tg.grn .st{color:#0B5F2E;text-shadow:none}
:root[data-theme="light"] #obtSw .tg:hover .nm{color:#0B72A8}
:root[data-theme="light"] .obt-tilescol{background:linear-gradient(180deg,#FFFFFF,#F2F6FC);border-left:1px solid rgba(11,114,168,.22)}
:root[data-theme="light"] .obt-tile{border-bottom-color:rgba(11,114,168,.12)}
:root[data-theme="light"] .obt-tile .tl{color:#4A7396}
:root[data-theme="light"] .obt-tile .hl{color:#14263C}
:root[data-theme="light"] .obt-tile:hover{background:rgba(27,132,184,.06)}
:root[data-theme="light"] .obt-tile.on{background:rgba(27,132,184,.09);border-left-color:#1B84B8;box-shadow:none}
:root[data-theme="light"] .obt-tile .tc{color:#0B72A8;background:rgba(27,132,184,.12)}
:root[data-theme="light"] #obtRailFoot{border-top:1px solid rgba(11,114,168,.2)}
:root[data-theme="light"] #obtRailFoot .rsec{border-bottom-color:rgba(11,114,168,.12)}
:root[data-theme="light"] #obtRailFoot .rk{color:#4A7396}
:root[data-theme="light"] #obtRailFoot .rleg b{color:#14263C}
:root[data-theme="light"] #obtRailFoot .rleg i{color:#0B72A8}
:root[data-theme="light"] #obtRailFoot .rsum{color:#5A7590}
:root[data-theme="light"] #obtRailFoot .rsum b{color:#0B7A3E}
:root[data-theme="light"] #obtRailFoot .rsum .ropen{border-color:rgba(11,114,168,.35);color:#0B72A8}
:root[data-theme="light"] #obtRailFoot .rlink{color:#0B72A8}
:root[data-theme="light"] #obtRailFoot .one{border-bottom-color:rgba(11,114,168,.12)}
:root[data-theme="light"] #obtRailFoot .one:hover{background:rgba(27,132,184,.05)}
:root[data-theme="light"] #obtRailFoot .one .k{color:#0B7A3E}
:root[data-theme="light"] #obtRailFoot .one b{color:#14263C}
:root[data-theme="light"] #obtRailFoot .one i{color:#5A7590}
:root[data-theme="light"] #obtRailFoot .pal{color:#7A8CA6}
:root[data-theme="light"] #obtRailFoot .pal b{color:#0B72A8;border-color:rgba(11,114,168,.3)}
:root[data-theme="light"] #obtRailFoot .fwkey span{color:#5A7590}
:root[data-theme="light"] #obtRailFoot .fwnote{color:#7A8CA6}
:root[data-theme="light"] #obtRailFoot .fwm.l1{color:#7A8CA6}
:root[data-theme="light"] .obt-tilescol .obt-skel{background:rgba(27,132,184,.08)}
@media (prefers-color-scheme:light){
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtBar{background:linear-gradient(180deg,#FFFFFF,#F0F5FB);border-top:1px solid rgba(11,114,168,.3)}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtBar::before{background:repeating-linear-gradient(180deg,rgba(11,114,168,.03) 0 1px,transparent 1px 4px)}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtBar::after{background:linear-gradient(90deg,transparent,rgba(11,114,168,.45),transparent)}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtBar .jstage{background:linear-gradient(180deg,#FFFFFF,#F4F8FD);border-color:rgba(11,114,168,.3);box-shadow:0 2px 8px rgba(23,37,64,.08);color:#4A7396}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtBar .jstage:hover{background:linear-gradient(180deg,#FFFFFF,#EAF2FA)}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtBar .jstage .jn{background:#FFFFFF;border-color:#1B84B8;color:#0B3C5C;text-shadow:none;box-shadow:0 1px 4px rgba(23,37,64,.15)}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtBar .jstage .jc{background:#FFF7E0;border-color:#C89B24;color:#7A5A10;text-shadow:none;box-shadow:0 1px 4px rgba(23,37,64,.12)}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtBar .jstage .jg{background:#F2F7FC;border-color:rgba(11,114,168,.25);box-shadow:none;color:#0B72A8}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtBar .jstage b{color:#0B3C5C;text-shadow:none}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtBar .jstage span.jq{color:#4A7396}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtBar .jstage::after{background:linear-gradient(180deg,rgba(11,114,168,.12),transparent)}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtBar .jstage.seen{border-color:rgba(176,125,10,.45);box-shadow:0 2px 8px rgba(23,37,64,.08)}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtBar .jstage.seen .jn{background:#FFF7E0;border-color:#C89B24;color:#7A5A10;text-shadow:none}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtBar .jstage.seen b{color:#7A5A10;text-shadow:none}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtBar .jstage.seen .jg{border-color:rgba(176,125,10,.35);color:#8A6A1D;box-shadow:none}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtBar .jstage.seen::after{background:linear-gradient(180deg,rgba(176,125,10,.14),transparent)}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtBar .jstage.on{background:linear-gradient(180deg,#FFFFFF,#E8F3FB);border-color:#1B84B8;box-shadow:0 6px 18px rgba(27,132,184,.28)}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtBar .jstage.on b{color:#062B44}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtBar .jstage.on span.jq{color:#0B72A8}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtBar .jstage.on .jg{color:#062B44;border-color:rgba(27,132,184,.5);box-shadow:none}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtBar .jstage.proc-green{border-color:rgba(21,128,61,.55);box-shadow:0 2px 10px rgba(21,128,61,.18)}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtBar .jstage.proc-green .jn{border-color:#15803D;color:#0B5F2E;text-shadow:none}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtBar .jstage.proc-red{border-color:rgba(200,45,38,.55);box-shadow:0 2px 10px rgba(200,45,38,.16)}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtBar .jstage.proc-red .jn{border-color:#C82D26;color:#8F1D18;text-shadow:none}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtBar .ub{color:#4A7396}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtBar .ub .rg{background:radial-gradient(circle at 50% 42%,#FFFFFF,#EAF3FB 72%);border-color:rgba(11,114,168,.3);color:#0B72A8;box-shadow:0 1px 5px rgba(23,37,64,.12)}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtBar .ub .lb{color:#4A7396}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtBar .ub:hover .rg{box-shadow:0 2px 10px rgba(27,132,184,.3);color:#075A85}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtBar .ub:hover .lb{color:#0B72A8}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtBar .ub.go{background:#DFF5E7;border-color:#15803D;color:#0B5F2E;text-shadow:none;box-shadow:0 2px 10px rgba(21,128,61,.2)}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtBar .ub.go:hover{background:#CBEEDA;color:#07461F;box-shadow:0 3px 14px rgba(21,128,61,.3)}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtTip{background:#FFFFFF;border-color:rgba(11,114,168,.35);color:#4A7396;box-shadow:0 6px 18px rgba(23,37,64,.18)}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtTip b{color:#0B3C5C}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtTip i{color:#14263C}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtTip span{color:#4A7396}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtPow2 .sheet{background:#FFFFFF;border-color:rgba(11,114,168,.35);box-shadow:0 10px 26px rgba(23,37,64,.2)}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtPow2 .prow{border-bottom-color:rgba(11,114,168,.12)}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtPow2 .prow b{color:#0B3C5C;text-shadow:none}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtPow2 .prow span{color:#4A7396}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtPow2 .prow:hover{background:rgba(27,132,184,.07)}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtPow2 .prow:hover b{color:#062B44}
:root:not([data-theme="dark"]):not([data-theme="light"]) .obt-rail1{background:linear-gradient(180deg,#FFFFFF,#F0F5FB);border-right:1px solid rgba(11,114,168,.22)}
:root:not([data-theme="dark"]):not([data-theme="light"]) .obt-rail1 .obt-ico{background:#F2F7FC;border-color:rgba(11,114,168,.28);color:#4A7396}
:root:not([data-theme="dark"]):not([data-theme="light"]) .obt-rail1 .obt-ico:hover{background:#E8F1FA;border-color:rgba(27,132,184,.5);color:#0B72A8;box-shadow:0 1px 6px rgba(27,132,184,.2)}
:root:not([data-theme="dark"]):not([data-theme="light"]) .obt-rail1 .obt-ico.on{background:#E4F0FA;border-color:#1B84B8;color:#075A85;box-shadow:0 1px 8px rgba(27,132,184,.28)}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtSw::before{background:linear-gradient(90deg,transparent,rgba(11,114,168,.4),transparent)}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtSw .swk{color:#4A7396}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtSw .tg .nm{color:#4A7396}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtSw .tg .sw{background:#EAF0F8;border-color:rgba(11,114,168,.35);box-shadow:inset 0 1px 3px rgba(23,37,64,.15)}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtSw .tg .sw i{background:linear-gradient(180deg,#B9C9DC,#8FA6BE);box-shadow:0 1px 2px rgba(23,37,64,.25)}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtSw .tg .st{color:#4A7396}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtSw .tg.armed .sw{border-color:#1B84B8}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtSw .tg.armed .sw i{background:linear-gradient(180deg,#3FA3D6,#1B6FA0);box-shadow:0 0 6px rgba(27,132,184,.5)}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtSw .tg.armed .st{color:#0B72A8;text-shadow:none}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtSw .tg.grn .sw{border-color:#15803D}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtSw .tg.grn .sw i{background:linear-gradient(180deg,#3FBF77,#15803D);box-shadow:0 0 6px rgba(21,128,61,.5)}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtSw .tg.grn .st{color:#0B5F2E;text-shadow:none}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtSw .tg:hover .nm{color:#0B72A8}
:root:not([data-theme="dark"]):not([data-theme="light"]) .obt-tilescol{background:linear-gradient(180deg,#FFFFFF,#F2F6FC);border-left:1px solid rgba(11,114,168,.22)}
:root:not([data-theme="dark"]):not([data-theme="light"]) .obt-tile{border-bottom-color:rgba(11,114,168,.12)}
:root:not([data-theme="dark"]):not([data-theme="light"]) .obt-tile .tl{color:#4A7396}
:root:not([data-theme="dark"]):not([data-theme="light"]) .obt-tile .hl{color:#14263C}
:root:not([data-theme="dark"]):not([data-theme="light"]) .obt-tile:hover{background:rgba(27,132,184,.06)}
:root:not([data-theme="dark"]):not([data-theme="light"]) .obt-tile.on{background:rgba(27,132,184,.09);border-left-color:#1B84B8;box-shadow:none}
:root:not([data-theme="dark"]):not([data-theme="light"]) .obt-tile .tc{color:#0B72A8;background:rgba(27,132,184,.12)}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtRailFoot{border-top:1px solid rgba(11,114,168,.2)}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtRailFoot .rsec{border-bottom-color:rgba(11,114,168,.12)}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtRailFoot .rk{color:#4A7396}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtRailFoot .rleg b{color:#14263C}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtRailFoot .rleg i{color:#0B72A8}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtRailFoot .rsum{color:#5A7590}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtRailFoot .rsum b{color:#0B7A3E}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtRailFoot .rsum .ropen{border-color:rgba(11,114,168,.35);color:#0B72A8}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtRailFoot .rlink{color:#0B72A8}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtRailFoot .one{border-bottom-color:rgba(11,114,168,.12)}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtRailFoot .one:hover{background:rgba(27,132,184,.05)}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtRailFoot .one .k{color:#0B7A3E}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtRailFoot .one b{color:#14263C}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtRailFoot .one i{color:#5A7590}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtRailFoot .pal{color:#7A8CA6}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtRailFoot .pal b{color:#0B72A8;border-color:rgba(11,114,168,.3)}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtRailFoot .fwkey span{color:#5A7590}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtRailFoot .fwnote{color:#7A8CA6}
:root:not([data-theme="dark"]):not([data-theme="light"]) #obtRailFoot .fwm.l1{color:#7A8CA6}
:root:not([data-theme="dark"]):not([data-theme="light"]) .obt-tilescol .obt-skel{background:rgba(27,132,184,.08)}
}
/* ---- [v24] the conditions row in the band: what shapes tonight, one tap deep ---- */
.obt-wsid .obt-ctxrow{flex-basis:100%;display:flex;align-items:center;gap:7px;flex-wrap:wrap;padding-top:7px;margin-top:2px;border-top:1px solid var(--line)}
.obt-ctxrow .ctxk{font-family:var(--mono);font-size:.56rem;letter-spacing:.14em;text-transform:uppercase;color:var(--ink-faint)}
.ctxc{appearance:none;display:inline-flex;align-items:baseline;gap:7px;border:1px solid var(--line);border-radius:6px;background:var(--panel-2);padding:5px 10px;cursor:pointer;max-width:230px}
.ctxc i{font-style:normal;font-family:var(--mono);font-size:.58rem;letter-spacing:.08em;text-transform:uppercase;color:var(--ink-faint);white-space:nowrap}
.ctxc b{font-family:var(--mono);font-weight:700;font-size:.7rem;color:var(--ink);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ctxc:hover{border-color:#38C7FF}
.ctxc:hover i{color:var(--action-hi)}
@media (max-width:1149px){.ctxc b{max-width:120px}}
/* ---- [v25] the doubt list ---- */
.injwrap{display:flex;gap:16px;flex-wrap:wrap}
.injcol{flex:1;min-width:200px}
.injc{display:block;font-family:var(--ui);font-size:.78rem;color:var(--ink-dim);padding:4px 8px;border-left:3px solid var(--line);margin:0 0 4px;background:var(--panel-2)}
.injc b{color:var(--ink)}
.injc.que{border-left-color:#D99A06}
.injc.dbt{border-left-color:#E8702A}
.injc.out{border-left-color:#E8534A}
/* ---- [v26] spray fans ---- */
.sprcol{margin-bottom:10px}
.sprgrid{display:flex;flex-wrap:wrap;gap:10px}
.sprc{width:112px;text-align:center}
.sprc svg{width:84px;height:58px;display:block;margin:0 auto}
.sprc .sprt{font-family:var(--mono);font-size:9px;fill:var(--ink-dim)}
.sprc b{display:block;font-family:var(--ui);font-weight:700;font-size:.74rem;color:var(--ink);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.sprc span{display:block;font-family:var(--ui);font-size:.62rem;color:var(--ink-faint);line-height:1.35}
/* ---- [v27] the flow: slim games rail + market strip + bet shelf (token-styled, both themes) ---- */
@media (min-width:1150px){
  .obt-gbar{display:none}
  .obt-deck{grid-template-columns:60px 116px 158px minmax(0,1fr) 218px}
  .obt-row.obt-gc .sp{display:none}
  .obt-row.obt-gc{padding:6px 7px}
  .obt-row.obt-gc .obt-gside .nm{font-size:.72rem}
  .obt-row.obt-gc .gval{font-size:.6rem}
}
@media (min-width:1150px) and (max-width:1439px){
  .obt-deck{grid-template-columns:60px 104px 148px minmax(0,1fr) 200px}
}
.obt-mkt2{display:flex;align-items:center;gap:7px;padding:8px 12px;border-bottom:1px solid var(--line);background:var(--panel)}
.obt-mkt2 .mn{appearance:none;width:28px;height:28px;border:1px solid var(--line);border-radius:6px;background:var(--panel-2);color:var(--ink-dim);cursor:pointer;font-size:.85rem}
.obt-mkt2 .mn:hover{border-color:#38C7FF;color:var(--action-hi)}
.obt-mkt2 .obt-mksel.m2{display:flex;gap:5px;overflow-x:auto;scrollbar-width:none}
.obt-mkt2 .obt-mksel.m2::-webkit-scrollbar{display:none}
.obt-mkt2 .obt-mksel.m2 button{appearance:none;font-family:var(--mono);font-size:.66rem;letter-spacing:.06em;text-transform:uppercase;color:var(--ink-dim);border:1px solid var(--line);border-radius:6px;background:transparent;padding:6px 12px;cursor:pointer;white-space:nowrap}
.obt-mkt2 .obt-mksel.m2 button.on{color:#7FDCFF;background:#0C1E38;border-color:#38C7FF;text-shadow:0 0 8px rgba(56,199,255,.6)}
.obt-mkt2 .mh{margin-left:auto;font-family:var(--mono);font-size:.58rem;color:var(--ink-faint);white-space:nowrap}
.obt-mkt2 .mh b{border:1px solid var(--line);border-radius:3px;padding:0 4px;color:var(--ink-dim)}
.obt-shelf{display:flex;gap:10px;padding:10px 12px;border-bottom:1px solid var(--line);background:var(--panel);overflow-x:auto;scrollbar-width:thin}
.shb{position:relative;appearance:none;flex:0 0 auto;display:flex;align-items:center;gap:9px;border:1px solid var(--line);border-radius:8px;background:var(--panel-2);padding:9px 13px;min-width:184px;cursor:pointer;text-align:left}
.shb img{width:26px;height:26px;border-radius:50%;object-fit:contain;background:var(--panel)}
.shb .ph2{width:26px;height:26px;border-radius:50%;background:var(--line);display:inline-flex;align-items:center;justify-content:center;font-family:var(--mono);font-weight:700;font-size:.7rem;color:var(--ink-dim);flex:none}
.shb .tt{min-width:0}
.shb .tt b{display:block;font-family:var(--ui);font-weight:700;font-size:.8rem;color:var(--ink);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.shb .tt i{display:block;font-style:normal;font-family:var(--mono);font-size:.6rem;color:var(--ink-faint);margin-top:1px}
.shb .pr{margin-left:auto;font-family:var(--mono);font-weight:700;font-size:.88rem;color:var(--action-hi);padding-left:8px}
.shb .bb2{position:absolute;top:-8px;right:8px;font-family:var(--mono);font-weight:700;font-size:.5rem;letter-spacing:.08em;color:#052E14;background:var(--model);border-radius:3px;padding:1px 5px}
.shb .slp2{font-family:var(--mono);font-weight:700;font-size:.6rem;letter-spacing:.05em;color:var(--model);border:1px solid var(--model);border-radius:4px;padding:4px 8px;margin-left:8px}
.shb:hover{border-color:var(--ink-faint)}
.shb.sel{border-color:#38C7FF;box-shadow:0 0 12px rgba(56,199,255,.35)}
.shf{position:relative;appearance:none;flex:0 0 auto;width:132px;border:1px solid var(--line);border-radius:8px;background:var(--panel-2);padding:10px 9px 8px;cursor:pointer;text-align:center}
.shf img{width:40px;height:40px;border-radius:50%;object-fit:cover;background:var(--panel);margin:0 auto 5px;display:block}
.shf .fph{width:40px;height:40px;border-radius:50%;background:var(--line);display:flex;align-items:center;justify-content:center;font-family:var(--mono);font-weight:700;font-size:1rem;color:var(--ink-dim);margin:0 auto 5px}
.shf b{display:block;font-family:var(--ui);font-weight:700;font-size:.72rem;color:var(--ink);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.shf i{display:block;font-style:normal;font-size:.62rem;color:var(--ink-dim);margin-top:1px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.shf s{display:block;text-decoration:none;font-family:var(--mono);font-size:.6rem;color:var(--model);margin-top:3px}
.shf .pr2{position:absolute;top:6px;right:7px;font-family:var(--mono);font-weight:700;font-size:.66rem;color:var(--action-hi)}
.shf:hover{border-color:var(--ink-faint)}
.shf.sel{border-color:#38C7FF;box-shadow:0 0 12px rgba(56,199,255,.35)}
.shmore{align-self:center;font-family:var(--mono);font-size:.6rem;color:var(--ink-faint);white-space:nowrap;line-height:1.5}

/* ===================== [v29] THE RESEARCH DESK — additive only, tokens only (themes for free) ===================== */
.obt-focus{display:flex;align-items:center;gap:6px;padding:6px 12px;border-bottom:1px solid var(--line);background:var(--panel);flex-wrap:wrap}
.obt-focus .fk{font-family:var(--mono);font-size:.56rem;letter-spacing:.12em;text-transform:uppercase;color:var(--ink-faint);margin-right:4px}
.obt-focus .obt-fb{appearance:none;font-family:var(--mono);font-size:.64rem;color:var(--ink-dim);border:1px solid var(--line);border-radius:6px;background:transparent;padding:5px 10px;white-space:nowrap;cursor:pointer;max-width:290px;overflow:hidden;text-overflow:ellipsis}
.obt-focus .obt-fb i{font-style:normal;color:var(--action-hi);margin-left:4px}
.obt-focus .obt-fb.on{color:#7FDCFF;background:#0C1E38;border-color:#38C7FF;text-shadow:0 0 8px rgba(56,199,255,.5)}
.obt-focus .obt-fb.add{color:var(--ink-faint);border-style:dashed}
.obt-focus .obt-fb:hover{border-color:#38C7FF}
.obt-focus .fh{margin-left:auto;font-family:var(--mono);font-size:.56rem;color:var(--ink-faint);white-space:nowrap}
.gf-call .obt-callwho{font-family:var(--display);font-weight:800;font-size:1.28rem;letter-spacing:-.01em;color:var(--ink);margin:4px 0 8px;text-wrap:balance}
.obt-chips{display:flex;gap:6px;flex-wrap:wrap;margin:0 0 8px}
.obt-chip{font-family:var(--mono);font-size:.6rem;letter-spacing:.08em;text-transform:uppercase;border:1px solid var(--line);border-radius:4px;padding:3px 8px;color:var(--ink-dim)}
.obt-chip.hi{color:#7FDCFF;border-color:rgba(56,199,255,.55)}
.obt-chip.gp{color:var(--model);border-color:rgba(52,211,153,.55)}
.obt-callrow{display:flex;align-items:center;gap:14px;flex-wrap:wrap;margin:6px 0 10px}
.obt-callpay{display:inline-flex;align-items:baseline;gap:10px;flex-wrap:wrap}
.obt-callpay .big{font-family:var(--mono);font-weight:700;font-size:1.9rem;color:var(--model);letter-spacing:-.01em;line-height:1}
.obt-callpay .per{font-family:var(--mono);font-size:.66rem;color:var(--ink-faint)}
.obt-callpay .cw{font-family:var(--mono);font-size:.7rem;color:var(--ink-dim)}
.obt-callrow .wtake{appearance:none;font-family:var(--mono);font-weight:700;font-size:.66rem;letter-spacing:.08em;text-transform:uppercase;color:#052E14;background:#22C55E;border:none;border-radius:6px;padding:9px 16px;cursor:pointer;box-shadow:0 0 14px rgba(34,197,94,.35)}
.obt-reason{font-size:.95rem;color:var(--ink);line-height:1.55;max-width:64ch;margin:0 0 10px}
.obt-weigh{display:flex;gap:8px;flex-wrap:wrap;align-items:center;margin:0 0 10px}
.obt-weigh span{font-family:var(--mono);font-size:.64rem;color:var(--ink-dim);border:1px solid var(--line);border-radius:4px;padding:4px 9px;background:var(--panel-2)}
.obt-weigh span.note{border:none;background:none;color:var(--ink-faint);padding:0}
.obt-quiet{font-family:var(--mono);font-size:.68rem;color:var(--ink-dim);border-left:2px solid var(--line);padding:3px 10px;margin:0 0 8px;line-height:1.5}
.obt-quiet b{color:var(--ink)}
.obt-quiet.lock{border-color:var(--gold)}
.obt-unlock{color:var(--action-hi);text-decoration:none}
.obt-unlock:hover{text-decoration:underline}
.obt-facts{display:flex;flex-direction:column;gap:7px;margin:4px 0 10px}
.obt-fact{display:grid;grid-template-columns:26px minmax(0,1fr) auto;gap:10px;align-items:start;padding:8px 10px;border:1px solid var(--line);background:var(--panel-2);border-radius:4px}
.obt-fact i.fwm{position:static;padding-top:2px}
.obt-fact span{font-size:.9rem;color:var(--ink);line-height:1.45}
.obt-fact b{font-family:var(--mono);font-size:.58rem;letter-spacing:.08em;text-transform:uppercase;color:var(--ink-faint);white-space:nowrap;padding-top:4px;font-weight:600}
.obt-look{display:grid;grid-template-columns:minmax(0,1fr) 300px;gap:1px;background:var(--line);margin:0 0 8px}
.obt-look>div{background:var(--panel);min-width:0}
.obt-canvas{padding:0 12px 10px}
.obt-canvas .gcmh{margin-top:10px}
.obt-canvas svg.obt-oval{width:100%;height:auto;display:block;margin-top:4px}
.obt-bench{display:flex;gap:10px;flex-wrap:wrap;margin-top:8px;font-family:var(--mono);font-size:.62rem;color:var(--ink-dim);line-height:1.5}
.obt-bench span{color:var(--ink-faint);text-transform:uppercase;letter-spacing:.08em;font-size:.56rem;align-self:center}
.obt-bench i{font-style:normal;color:var(--ink)}
.obt-cap{font-family:var(--mono);font-size:.64rem;color:var(--ink-faint);margin:6px 0 0;line-height:1.5}
.obt-aff{padding:12px 12px;display:flex;flex-direction:column;gap:8px}
.obt-affhd{display:flex;justify-content:space-between;font-family:var(--mono);font-size:.6rem;letter-spacing:.12em;text-transform:uppercase;color:var(--ink-faint)}
.obt-callchip{display:flex;justify-content:space-between;align-items:center;gap:8px;font-family:var(--mono);font-size:.64rem;color:var(--ink-dim);border:1px solid rgba(52,211,153,.4);border-radius:4px;padding:6px 9px;background:rgba(52,211,153,.06)}
.obt-callchip b{color:var(--model)}
.obt-callchip .wtake{appearance:none;font-family:var(--mono);font-weight:700;font-size:.58rem;letter-spacing:.06em;text-transform:uppercase;color:var(--model);background:transparent;border:1px solid var(--model);border-radius:4px;padding:4px 8px;cursor:pointer;white-space:nowrap}
.obt-co{border:1px solid var(--line);border-radius:4px;background:var(--panel-2);padding:8px 10px}
.obt-co.warn{border-left:3px solid var(--gold)}
.obt-co .t{font-family:var(--mono);font-size:.58rem;letter-spacing:.12em;text-transform:uppercase;color:var(--ink-faint);margin-bottom:3px;display:flex;justify-content:space-between}
.obt-co .t i.fwm{position:static}
.obt-co .n{font-family:var(--mono);font-size:.8rem;color:var(--ink);margin-bottom:3px;line-height:1.4}
.obt-co .n .v{color:var(--ink-faint);padding:0 4px}
.obt-co .s{font-size:.8rem;color:var(--ink-dim);line-height:1.45}
.obt-co .bet{margin-top:5px;display:flex;justify-content:flex-end}
.obt-co .bet .wtake{appearance:none;font-family:var(--mono);font-weight:700;font-size:.58rem;letter-spacing:.06em;text-transform:uppercase;color:var(--model);background:transparent;border:1px solid var(--model);border-radius:4px;padding:4px 8px;cursor:pointer}
.obt-qg{display:grid;grid-template-columns:104px repeat(4,1fr);gap:4px;margin:6px 0 4px}
.obt-qg .h{font-family:var(--mono);font-size:.58rem;letter-spacing:.1em;text-transform:uppercase;color:var(--ink-faint);text-align:center;padding:4px 0}
.obt-qg .h.on{color:#7FDCFF}
.obt-qg .tm{display:flex;align-items:center;font-weight:700;font-size:.82rem;padding:6px 4px;color:var(--ink)}
.obt-qg .c{border:1px solid var(--line);border-radius:4px;padding:8px 6px;text-align:center;background:var(--panel-2)}
.obt-qg .c b{display:block;font-family:var(--mono);font-size:1.1rem;color:var(--ink)}
.obt-qg .c i{display:block;font-style:normal;font-family:var(--mono);font-size:.58rem;color:var(--ink-faint);margin-top:2px}
.obt-qg .c.on{border-color:#38C7FF;background:#0C1E38}
.obt-qg .c.hot{box-shadow:inset 0 -3px 0 var(--model)}
.obt-qg .c.cold{box-shadow:inset 0 -3px 0 #E07070}
.obt-rr{display:grid;grid-template-columns:52px repeat(4,1fr) 76px;gap:6px;align-items:center;padding:6px 8px;border:1px solid var(--line);border-radius:4px;background:var(--panel-2);font-family:var(--mono);font-size:.7rem;color:var(--ink-dim);margin:0 0 4px}
.obt-rr b{color:var(--ink)}
.obt-rr span.g{color:var(--model)}
.obt-rr span.r{color:#E07070}
.obt-rr em{font-style:normal;color:var(--ink-faint);font-size:.62rem;text-align:right}
.obt-rr.hd{background:transparent;border-color:transparent;font-size:.56rem;letter-spacing:.1em;text-transform:uppercase;color:var(--ink-faint);padding-bottom:2px}
.obt-rr.hd b{color:var(--ink-faint);font-weight:600}
.obt-rr.on{border-color:#38C7FF;background:#0C1E38}
.obt-avg{display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:6px;margin:0 0 8px}
.obt-avg div{border:1px solid var(--line);border-radius:4px;background:var(--panel-2);padding:7px 9px}
.obt-avg i{display:block;font-style:normal;font-family:var(--mono);font-size:.56rem;letter-spacing:.1em;text-transform:uppercase;color:var(--ink-faint)}
.obt-avg b{display:block;font-family:var(--mono);font-size:1.05rem;color:var(--ink)}
.obt-avg em{display:block;font-style:normal;font-family:var(--mono);font-size:.58rem;color:var(--ink-faint)}
.obt-ladder{display:flex;flex-direction:column;gap:6px;margin:4px 0 8px}
.obt-ladder .r{display:grid;grid-template-columns:minmax(0,1fr) 84px 110px;align-items:center;gap:10px;padding:6px 10px;border:1px solid var(--line);background:var(--panel-2);border-radius:4px;font-family:var(--mono);font-size:.76rem}
.obt-ladder .r.best{border-left:3px solid var(--model)}
.obt-ladder .r span{color:var(--ink-dim);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.obt-ladder .r b{color:var(--ink);text-align:right}
.obt-ladder .r em{font-style:normal;text-align:right;color:var(--ink-faint);font-size:.64rem}
.obt-ladder .r.best em{color:var(--model)}
.obt-ladder .obt-act{appearance:none;background:none;border:1px solid var(--line);border-radius:4px;color:var(--action-hi);font-family:var(--mono);font-size:.6rem;padding:2px 6px;cursor:pointer}
.obt-more{margin:8px 0 0;font-family:var(--mono);font-size:.7rem;color:var(--ink-dim)}
.obt-more summary{cursor:pointer;color:var(--action-hi);padding:6px 0}
#obtRailFoot .rlink.obt-act{cursor:pointer}
@media (max-width:1420px){.obt-look{grid-template-columns:minmax(0,1fr)}}
@media (max-width:1149px){.obt-focus{display:none}.obt-look{grid-template-columns:minmax(0,1fr)}}
/* [v29] the matchup modal — one v one */
.obt-mu .hd{display:flex;justify-content:space-between;gap:10px;font-family:var(--mono);font-size:.62rem;letter-spacing:.08em;text-transform:uppercase;margin:0 0 8px}
.obt-mu .hd .a{color:var(--action-hi)}.obt-mu .hd .b{color:var(--gold)}
.obt-mu .r{display:grid;grid-template-columns:120px 44px minmax(0,1fr) 44px;gap:8px;align-items:center;padding:5px 0;border-bottom:1px solid var(--line);font-family:var(--mono);font-size:.76rem;color:var(--ink-dim)}
.obt-mu .r b{color:var(--action-hi);text-align:right}.obt-mu .r b.b{color:var(--gold);text-align:left}
.obt-mu .bars{display:flex;flex-direction:column;gap:2px}
.obt-mu .bars i{display:block;height:6px;background:var(--action-hi);border-radius:2px;opacity:.85}
.obt-mu .bars i.b{background:var(--gold)}
.obt-mu .meet{display:grid;grid-template-columns:minmax(0,1fr) auto auto;gap:12px;padding:5px 0;border-bottom:1px solid var(--line);font-family:var(--mono);font-size:.72rem;color:var(--ink-dim)}
.obt-mu .meet i{font-style:normal;color:var(--ink-faint)}.obt-mu .meet b{color:var(--action-hi);font-weight:600}.obt-mu .meet b.b{color:var(--gold)}
.obt-mu .bets{display:flex;flex-direction:column;gap:6px;margin:4px 0 8px}
.obt-mu .obt-addprop.mu{appearance:none;text-align:left;font-family:var(--mono);font-size:.7rem;color:var(--model);background:transparent;border:1px solid rgba(52,211,153,.5);border-radius:6px;padding:8px 10px;cursor:pointer}
.obt-mu .obt-addprop.mu:hover{border-color:var(--model)}
/* [v29c] order lists (MLB, cricket) + asymmetric matchup columns */
.obt-orders{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-top:6px}
.obt-order .oh{font-family:var(--mono);font-size:.6rem;letter-spacing:.12em;text-transform:uppercase;color:var(--ink-faint);margin:0 0 6px}
.obt-pl.or{appearance:none;width:100%;display:grid;grid-template-columns:22px minmax(0,1fr);gap:2px 8px;align-items:center;text-align:left;border:1px solid var(--line);border-radius:4px;background:var(--panel-2);padding:5px 8px;margin:0 0 4px;cursor:pointer;color:var(--ink)}
.obt-pl.or i{grid-row:1 / 3;font-style:normal;font-family:var(--mono);font-size:.62rem;color:var(--ink-faint);text-align:center}
.obt-pl.or b{font-family:var(--ui);font-weight:700;font-size:.78rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.obt-pl.or span{font-family:var(--mono);font-size:.6rem;color:var(--ink-dim);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.obt-pl.or.sp{border-left:3px solid var(--action-hi)}
.obt-pl.or.me{border-color:var(--model);box-shadow:0 0 10px rgba(52,211,153,.25)}
.obt-pl.or:hover{border-color:#38C7FF}
.obt-mu .two{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.obt-mu .r1{display:flex;justify-content:space-between;padding:4px 0;border-bottom:1px solid var(--line);font-family:var(--mono);font-size:.74rem;color:var(--ink-dim)}
.obt-mu .r1 b{color:var(--action-hi)}.obt-mu .r1 b.b{color:var(--gold)}
@media (max-width:640px){.obt-orders{grid-template-columns:1fr}}
/* [v29e] LOOK cards own the stage: no companion track when the numbers column is the companion */
.obt-ws.solo{grid-template-columns:minmax(0,1fr)}
/* [v29f] the picture owns the width; the numbers column becomes a row of cards beneath it */
.obt-look{display:block;background:var(--panel);margin:0 0 8px}
.obt-look>div{background:var(--panel)}
.obt-aff{display:grid;grid-template-columns:repeat(auto-fit,minmax(230px,1fr));gap:8px;padding:10px 12px 12px;border-top:1px solid var(--line)}
.obt-affhd,.obt-callchip{grid-column:1 / -1}
.obt-affhd{margin-bottom:-2px}
@media (max-width:1149px){.obt-aff{grid-template-columns:1fr}}
/* [v29m] phones: the field scrolls sideways at a readable width; bench tags */
@media (max-width:899px){.obt-canvas{overflow-x:auto;-webkit-overflow-scrolling:touch}.obt-canvas svg.obt-oval{min-width:560px}}
.obt-bench b.in{font-weight:700;color:var(--model);font-style:normal}
.obt-bench b.out{font-weight:700;color:#E07070}
.obt-bench b.emg{font-weight:600;color:var(--ink-faint)}
/* ===================== [v30] THE ONE-SCREEN STAGE — builder row + six-cell bento (additive, tokens only) ===================== */
.obt-build{display:grid;grid-template-columns:auto minmax(0,1fr) auto auto;align-items:center;gap:14px;padding:6px 12px;border-bottom:1px solid var(--line);background:var(--panel)}
.obt-build .bs{display:flex;flex-direction:column;gap:3px;min-width:0}
.obt-build .bk{font-family:var(--mono);font-size:.5rem;letter-spacing:.14em;text-transform:uppercase;color:var(--ink-faint)}
.obt-build .bl{display:flex;gap:5px;overflow-x:auto;scrollbar-width:none;padding-bottom:1px}
.obt-build .bl::-webkit-scrollbar{display:none}
.obt-build .obt-mksel.m2{display:flex;gap:4px}
.obt-build .obt-mksel.m2 button{appearance:none;font-family:var(--mono);font-size:.6rem;letter-spacing:.06em;text-transform:uppercase;color:var(--ink-dim);border:1px solid var(--line);border-radius:6px;background:transparent;padding:6px 10px;cursor:pointer;white-space:nowrap}
.obt-build .obt-mksel.m2 button.on{color:#7FDCFF;background:#0C1E38;border-color:#38C7FF;text-shadow:0 0 8px rgba(56,199,255,.6)}
.obt-lc,.obt-sc,.obt-pc{appearance:none;font-family:var(--mono);font-size:.64rem;color:var(--ink-dim);border:1px solid var(--line);border-radius:6px;background:transparent;padding:5px 9px;white-space:nowrap;cursor:pointer;display:inline-flex;align-items:center;gap:6px}
.obt-lc i,.obt-sc i,.obt-pc i{font-style:normal;color:var(--action-hi);font-weight:700}
.obt-lc.on,.obt-sc.on,.obt-pc.on{color:#7FDCFF;background:#0C1E38;border-color:#38C7FF}
.obt-lc.main::after{content:"main";font-size:.48rem;letter-spacing:.08em;color:var(--ink-faint);margin-left:2px}
.obt-lc:hover,.obt-sc:hover,.obt-pc:hover{border-color:#38C7FF}
.obt-sc img{width:18px;height:18px;border-radius:50%;object-fit:contain;background:var(--panel-2)}
.obt-pc .fc{width:20px;height:20px;border-radius:50%;background:var(--line);display:inline-flex;align-items:center;justify-content:center;overflow:hidden;font-size:.6rem;font-weight:700;color:var(--ink-dim)}
.obt-pc .fc img{width:100%;height:100%;object-fit:cover;display:block}
.obt-pc.more{color:var(--ink-faint);border-style:dashed}
.obt-build .pay2{display:flex;align-items:center;gap:10px;white-space:nowrap}
.obt-build .pay{display:inline-flex;align-items:baseline;gap:8px}
.obt-build .pay b{font-family:var(--mono);font-weight:700;font-size:1.15rem;color:var(--model)}
.obt-build .pay i{font-style:normal;font-family:var(--mono);font-size:.6rem;color:var(--ink-faint)}
/* the house-style slip control everywhere but the bar */
.obt-build .wtake,.obt-mp .wtake,.obt-addprop.wtake,.obt-cos .wtake,.obt-co .bet .wtake{appearance:none;font-family:var(--mono);font-weight:700;font-size:.6rem;letter-spacing:.08em;text-transform:uppercase;color:#7FDCFF;border:1px solid #38C7FF;border-radius:6px;background:#0C1E38;padding:7px 11px;cursor:pointer;white-space:nowrap;box-shadow:none}
.obt-addprop.wtake{display:inline-block;width:auto}
.wtake.ok,.obt-addprop.ok{color:var(--model)!important;border-color:var(--model)!important;background:rgba(52,211,153,.08)!important}
.wtake.sm{padding:3px 7px;font-size:.54rem}
/* the bento */
.obt-bento{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));grid-template-rows:minmax(0,11fr) minmax(0,9fr);gap:1px;background:var(--line);padding:1px;height:600px}
.obt-bento .bc{background:var(--panel);min-width:0;min-height:0;overflow:hidden;display:flex;flex-direction:column;padding:8px 12px 10px}
.obt-bento .bc.span2{grid-column:span 2}
.obt-bento .bc.pic{background:linear-gradient(180deg,rgba(23,68,105,.22) 0,var(--panel) 60%)}
.obt-bento .bh{display:flex;justify-content:space-between;align-items:baseline;gap:8px;margin-bottom:6px;flex:none}
.obt-bento .bh .lab{font-family:var(--mono);font-size:.58rem;letter-spacing:.12em;text-transform:uppercase;color:var(--model);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.obt-bento .bh i{font-style:normal;font-family:var(--mono);font-size:.54rem;color:var(--ink-faint);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.obt-bento .bb{flex:1;min-height:0;overflow:auto;scrollbar-width:thin}
.obt-bento .bc.pic .bb svg.obt-oval{width:auto;max-width:100%;height:100%;max-height:100%;display:block;margin:0 auto}
.obt-bento .obt-cap,.obt-bento .cap{font-family:var(--mono);font-size:.56rem;color:var(--ink-faint);line-height:1.45;margin-top:6px}
.obt-bento .obt-bench{font-size:.58rem}
.obt-bento .obt-cos{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;height:100%}
.obt-bento .obt-co{display:flex;flex-direction:column;min-height:0;overflow:hidden}
.obt-bento .obt-co .s{font-size:.74rem}
.obt-bento .obt-two{display:grid;grid-template-columns:1fr 1fr;gap:10px;height:100%;min-height:0}
.obt-bento .obt-two>div{min-width:0;min-height:0;overflow:auto}
.obt-bento .obt-two .obt-cos{grid-template-columns:1fr}
.obt-bento .obt-facts{gap:5px}.obt-bento .obt-fact{padding:6px 8px}.obt-bento .obt-fact span{font-size:.8rem}
.obt-bento .gf-call .obt-callwho{font-size:1.1rem}.obt-bento .obt-callpay .big{font-size:1.5rem}.obt-bento .obt-reason{font-size:.86rem;margin-bottom:6px}
.obt-empty2{font-family:var(--mono);font-size:.7rem;color:var(--ink-faint);padding:10px 0}
/* matchup */
.obt-mp .faces{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-bottom:6px}
.obt-mp .faces .p{display:flex;flex-direction:column;align-items:center;gap:3px;text-align:center;cursor:pointer;min-width:0}
.obt-mp .faces .p b{font-size:.76rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}
.obt-mp .faces .p i{font-style:normal;font-family:var(--mono);font-size:.54rem;color:var(--ink-faint);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}
.obt-mp .ph{width:56px;height:56px;border-radius:50%;background:var(--panel-2);border:2px solid var(--line);overflow:hidden;display:flex;align-items:center;justify-content:center;font-family:var(--mono);font-weight:700;color:var(--ink-dim)}
.obt-mp .ph img{width:100%;height:100%;object-fit:cover;display:block}
.obt-mp .faces .p.me .ph{border-color:var(--model);box-shadow:0 0 12px rgba(52,211,153,.35)}
.obt-mp .vs{display:flex;flex-direction:column;gap:3px}
.obt-mp .vs .r{display:grid;grid-template-columns:34px minmax(0,1fr) 34px;gap:6px;align-items:center;font-family:var(--mono);font-size:.66rem;margin-top:9px}
.obt-mp .vs .r b{color:var(--model);text-align:right}.obt-mp .vs .r b.b{color:var(--gold);text-align:left}
.obt-mp .vs .bars{display:flex;flex-direction:column;gap:2px;position:relative}
.obt-mp .vs .bars i{display:block;height:5px;border-radius:2px;background:var(--model);opacity:.9}.obt-mp .vs .bars i.b{background:var(--gold)}
.obt-mp .vs .bars span{position:absolute;left:0;right:0;top:-10px;text-align:center;font-size:.5rem;letter-spacing:.08em;text-transform:uppercase;color:var(--ink-faint);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* line panel */
.obt-lp{display:flex;flex-direction:column;gap:4px}
.obt-lp .r{appearance:none;width:100%;text-align:left;display:grid;grid-template-columns:44px minmax(0,1fr) 46px 40px;gap:8px;align-items:center;font-family:var(--mono);font-size:.66rem;color:var(--ink-dim);border:1px solid var(--line);border-radius:6px;padding:5px 8px;background:var(--panel-2);cursor:pointer}
.obt-lp .r b{color:var(--ink)}.obt-lp .r em{font-style:normal;color:var(--action-hi);text-align:right;font-weight:700}
.obt-lp .r s{text-decoration:none;font-size:.54rem;color:var(--ink-faint);text-align:right}
.obt-lp .r .hit{height:6px;border-radius:3px;background:rgba(255,255,255,.13);overflow:hidden}.obt-lp .r .hit i{display:block;height:100%;background:var(--model)}
.obt-lp .r.on{border-color:#38C7FF;background:#0C1E38}
.obt-lp .r:hover{border-color:#38C7FF}
/* evidence bars, conditions, faces grid, books */
.obt-ev .r{display:grid;grid-template-columns:76px minmax(0,1fr) 64px;gap:8px;align-items:center;font-family:var(--mono);font-size:.6rem;color:var(--ink-dim);padding:4px 0}
.obt-ev .r b{color:var(--ink);text-align:right;white-space:nowrap}.obt-ev svg{width:100%;height:12px;display:block}
.obt-conds{display:flex;flex-direction:column;gap:4px}
.obt-conds .cd{display:grid;grid-template-columns:76px minmax(0,1fr);gap:8px;font-size:.74rem;color:var(--ink-faint);padding:5px 8px;border:1px solid var(--line);border-radius:6px;background:var(--panel-2)}
.obt-conds .cd i{font-style:normal;font-family:var(--mono);font-size:.54rem;letter-spacing:.1em;text-transform:uppercase;padding-top:2px}
.obt-conds .cd.on{color:var(--ink);border-color:rgba(52,211,153,.4)}.obt-conds .cd.on i{color:var(--model)}
.obt-fg{display:grid;grid-template-columns:repeat(auto-fill,minmax(118px,1fr));gap:6px}
.obt-fg .fg{appearance:none;text-align:center;border:1px solid var(--line);border-radius:8px;background:var(--panel-2);padding:8px 6px 6px;cursor:pointer;color:var(--ink);min-width:0;position:relative}
.obt-fg .fg .ph{width:38px;height:38px;border-radius:50%;background:var(--line);margin:0 auto 4px;display:flex;align-items:center;justify-content:center;font-family:var(--mono);font-weight:700;color:var(--ink-dim);overflow:hidden}
.obt-fg .fg .ph img{width:100%;height:100%;object-fit:cover;display:block}
.obt-fg .fg b{display:block;font-size:.68rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.obt-fg .fg i{display:block;font-style:normal;font-size:.58rem;color:var(--ink-dim);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.obt-fg .fg s{display:block;text-decoration:none;font-family:var(--mono);font-size:.54rem;color:var(--model)}
.obt-fg .fg em{position:absolute;top:5px;right:6px;font-style:normal;font-family:var(--mono);font-size:.6rem;font-weight:700;color:var(--action-hi)}
.obt-fg .fg.on{border-color:#38C7FF;background:#0C1E38}
.obt-bk .r{display:grid;grid-template-columns:150px minmax(0,1fr) 64px 46px;gap:8px;align-items:center;font-family:var(--mono);font-size:.64rem;color:var(--ink-dim);padding:4px 0;border-bottom:1px solid var(--line)}
.obt-bk .r span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.obt-bk .r b{color:var(--ink);text-align:right}.obt-bk .r em{font-style:normal;color:var(--ink-faint);text-align:right}
.obt-bk .r .bar{height:6px;border-radius:3px;background:rgba(255,255,255,.13);overflow:hidden}.obt-bk .r .bar i{display:block;height:100%;background:var(--action-hi)}
.obt-bk .r.best b{color:var(--model)}.obt-bk .r.best .bar i{background:var(--model)}
.obt-bk .r.my{color:#7FDCFF}.obt-bk .r.my .bar i{background:#38C7FF}
@media (max-width:1149px){.obt-build{grid-template-columns:1fr;gap:8px}.obt-bento{display:block;height:auto!important}.obt-bento .bc{margin-bottom:8px;overflow:visible}.obt-bento .bb{overflow:visible}.obt-bento .obt-cos{grid-template-columns:1fr;height:auto}.obt-bento .obt-two{grid-template-columns:1fr;height:auto}}
/* [v30] picture tabs: the picture owns two columns and both rows; matchup + line stack on the right */
.obt-bento.tall{grid-template-rows:minmax(0,1fr) minmax(0,1fr)}
.obt-bento.tall .bc.a{grid-column:1/3;grid-row:1/3}
.obt-bento.tall .bc.b{grid-column:3;grid-row:1}
.obt-bento.tall .bc.c{grid-column:3;grid-row:2}
.obt-bento .bb.split{display:flex;flex-direction:column;overflow:hidden}
.obt-bento .pic-main{flex:1;min-height:0;overflow:auto;display:flex;flex-direction:column}
.obt-bento .pic-main>svg.obt-oval,.obt-bento .pic-main>.obt-fieldwrap{flex:1;min-height:0}
.obt-bento .pic-main svg.obt-oval{height:100%;width:auto;max-width:100%;margin:0 auto;display:block}
.obt-bento .pic-foot{flex:none;max-height:40%;overflow:auto;border-top:1px solid var(--line);padding-top:6px;margin-top:6px}
.obt-bento .pic-foot .bh{margin-bottom:4px}
.obt-bento .pic-foot .obt-cos{height:auto}
.obt-bento .pic-foot .obt-co .s{font-size:.7rem}
@media (max-width:1149px){.obt-bento.tall .bc.a,.obt-bento.tall .bc.b,.obt-bento.tall .bc.c{grid-column:auto;grid-row:auto}.obt-bento .bb.split{overflow:visible}.obt-bento .pic-foot{max-height:none}}
.obt-althead{display:flex;flex-direction:column;gap:2px;padding:6px 8px;margin-bottom:6px;border:1px solid rgba(56,199,255,.45);border-radius:6px;background:#0C1E38}
.obt-althead b{font-size:.8rem;color:#7FDCFF}.obt-althead span{font-family:var(--mono);font-size:.62rem;color:var(--ink)}.obt-althead i{font-style:normal;font-family:var(--mono);font-size:.54rem;color:var(--ink-faint)}
/* [v30 exchanges] prediction-market venues badged wherever a book is named */
.obt-tbl .rg.ex,.obt-bk .r em.ex{display:inline-block;margin-left:6px;padding:1px 5px;border:1px solid #38C7FF;border-radius:4px;font-family:var(--mono);font-size:.5rem;letter-spacing:.1em;text-transform:uppercase;color:#7FDCFF;font-style:normal;vertical-align:middle}
.obt-exline{font-size:.78rem;line-height:1.45;color:var(--ink);padding:7px 9px;margin-bottom:8px;border:1px solid rgba(56,199,255,.35);border-radius:6px;background:rgba(12,30,56,.55)}
.obt-exline b{color:#7FDCFF}.obt-exline i{display:block;font-style:normal;font-family:var(--mono);font-size:.56rem;color:var(--ink-faint);margin-top:3px}
/* ===================== [v30 light] every hard-coded dark chip/badge gets a light twin (same palette as #obtBar light) ===================== */
:root[data-theme="light"] .obt-seg button.on,:root[data-theme="light"] .obt-mkt2 .obt-mksel.m2 button.on,:root[data-theme="light"] .obt-build .obt-mksel.m2 button.on,:root[data-theme="light"] .obt-focus .obt-fb.on,:root[data-theme="light"] .obt-lc.on,:root[data-theme="light"] .obt-sc.on,:root[data-theme="light"] .obt-pc.on,:root[data-theme="light"] .obt-lp .r.on,:root[data-theme="light"] .obt-fg .fg.on,:root[data-theme="light"] .obt-qg .c.on,:root[data-theme="light"] .obt-rr.on{background:#E4F0FA;border-color:#1B84B8;color:#075A85;text-shadow:none}
:root[data-theme="light"] .obt-lp .r.on b,:root[data-theme="light"] .obt-fg .fg.on b,:root[data-theme="light"] .obt-fg .fg.on i,:root[data-theme="light"] .obt-lp .r.on s{color:#0B3C5C}
:root[data-theme="light"] .obt-chip.hi,:root[data-theme="light"] .obt-qg .h.on,:root[data-theme="light"] #obtRailFoot .rlink,:root[data-theme="light"] #obtRailFoot .rsum .ropen,:root[data-theme="light"] #obtRailFoot .pal b,:root[data-theme="light"] .obt-bk .r.my{color:#0B72A8;border-color:rgba(11,114,168,.45)}
:root[data-theme="light"] .obt-bk .r.my .bar i{background:#1B84B8}
:root[data-theme="light"] .obt-build .wtake,:root[data-theme="light"] .obt-mp .wtake,:root[data-theme="light"] .obt-addprop.wtake,:root[data-theme="light"] .obt-cos .wtake,:root[data-theme="light"] .obt-co .bet .wtake{background:#FFFFFF;border-color:#1B84B8;color:#075A85}
:root[data-theme="light"] .wtake.ok,:root[data-theme="light"] .obt-addprop.ok{background:#E9F8F0!important;border-color:#1E9E5A!important;color:#166B3D!important}
:root[data-theme="light"] .obt-tile.on{background:#E4F0FA;border-left-color:#1B84B8;box-shadow:none}
:root[data-theme="light"] .obt-althead,:root[data-theme="light"] .obt-exline{background:#F2F7FC;border-color:rgba(11,114,168,.35)}
:root[data-theme="light"] .obt-althead b,:root[data-theme="light"] .obt-exline b{color:#0B3C5C}
:root[data-theme="light"] .obt-tbl .rg.ex,:root[data-theme="light"] .obt-bk .r em.ex{color:#0B72A8;border-color:#1B84B8;background:#FFFFFF}
:root[data-theme="light"] .obt-lp .r .hit,:root[data-theme="light"] .obt-bk .r .bar{background:rgba(11,114,168,.12)}
:root[data-theme="light"] .obt-bento .bc.pic{background:linear-gradient(180deg,rgba(11,114,168,.07) 0,var(--panel) 60%)}
:root[data-theme="light"] .obt-bento{background:rgba(11,114,168,.18)}
:root[data-theme="light"] .obt-lc:hover,:root[data-theme="light"] .obt-sc:hover,:root[data-theme="light"] .obt-pc:hover,:root[data-theme="light"] .obt-lp .r:hover{border-color:#1B84B8}
:root[data-theme="light"] .obt-pc .fc,:root[data-theme="light"] .obt-fg .fg .ph{background:#E4F0FA;color:#075A85}
/* [v30 exchanges] the crowd in words: board tick, builder chip, three numbers, sure things */
.obt-crowdtick{display:inline-block;margin:0 0 4px 8px;padding:1px 7px;border:1px solid rgba(56,199,255,.5);border-radius:10px;font-family:var(--mono);font-size:.52rem;letter-spacing:.08em;text-transform:uppercase;color:#7FDCFF;vertical-align:middle;white-space:nowrap}
.obt-crowd{display:inline-flex;align-items:baseline;gap:5px;margin-left:10px;font-family:var(--mono);font-size:.58rem;color:var(--ink-faint)}.obt-crowd b{color:#7FDCFF;font-size:.72rem}
.obt-three{display:flex;gap:14px;align-items:flex-end;flex-wrap:wrap;margin:8px 0 6px}
.obt-three span{display:flex;flex-direction:column;gap:2px}.obt-three i{font-style:normal;font-family:var(--mono);font-size:.5rem;letter-spacing:.12em;text-transform:uppercase;color:var(--ink-faint)}
.obt-three b{font-family:var(--mono);font-size:1rem;color:var(--ink)}.obt-three span:nth-child(2) b{color:#7FDCFF}.obt-three span:first-child b{color:var(--model)}
.obt-three em{flex-basis:100%;font-style:normal;font-family:var(--mono);font-size:.54rem;color:var(--ink-faint)}
.obt-arb{font-size:.8rem;line-height:1.5;color:var(--ink);padding:8px 10px;margin:6px 0 8px;border:1px solid rgba(52,211,153,.5);border-radius:6px;background:rgba(52,211,153,.07)}
.obt-arb b{color:var(--model)}.obt-arb i{display:block;font-style:normal;font-family:var(--mono);font-size:.54rem;color:var(--ink-faint);margin-top:3px}
.obt-exline.soft{border-style:dashed}
.obt-lp .r .hit{position:relative}.obt-lp .r .hit u.exn{position:absolute;right:0;top:-11px;text-decoration:none;font-family:var(--mono);font-size:.48rem;letter-spacing:.06em;color:#7FDCFF;white-space:nowrap}
:root[data-theme="light"] .obt-crowdtick,:root[data-theme="light"] .obt-crowd b,:root[data-theme="light"] .obt-three span:nth-child(2) b,:root[data-theme="light"] .obt-lp .r .hit u.exn{color:#0B72A8;border-color:rgba(11,114,168,.5)}
:root[data-theme="light"] .obt-arb{background:#E9F8F0;border-color:#1E9E5A}:root[data-theme="light"] .obt-arb b{color:#166B3D}

/* ---- [v31] six-stop console: the situation grid, roll-up, settle line, pairs ---- */
.obt-sg{margin-top:8px}
.obt-sg .sgr{display:flex;align-items:center;gap:9px;padding:3px 0;font-variant-numeric:tabular-nums}
.obt-sg .sgr i{font-style:normal;font-family:var(--mono);font-size:.56rem;letter-spacing:.1em;color:var(--ink-faint);flex:0 0 92px}
.obt-sg .sgr em{font-style:normal;flex:0 0 26px;font-family:var(--mono);font-size:.6rem;letter-spacing:1px;color:var(--gold);text-align:left}
.obt-sg .sgr .sb{flex:1;height:7px;background:rgba(70,140,255,.09);overflow:hidden}
.obt-sg .sgr .sb b{display:block;height:100%;background:var(--model);opacity:.85}
.obt-sg .sgr s{text-decoration:none;flex:0 0 92px;font-family:var(--mono);font-size:.66rem;color:var(--ink);text-align:right}
.obt-sg .sga{display:flex;gap:18px;flex-wrap:wrap;margin-top:8px;padding-top:7px;border-top:1px solid var(--line)}
.obt-sg .avg i{font-style:normal;display:block;font-family:var(--mono);font-size:.5rem;letter-spacing:.12em;color:var(--ink-faint)}
.obt-sg .avg b{font-family:var(--mono);font-weight:700;font-size:.9rem;color:var(--ink)}
.obt-sg .avg.hot b{color:var(--model)}
.obt-rollup{font-family:var(--mono);font-size:.66rem;letter-spacing:.03em;color:var(--model);padding:4px 0 7px}
.obt-rollup.w{color:var(--gold)}
.obt-settle{font-family:var(--ui);font-size:.74rem;color:var(--ink-dim);line-height:1.5;padding:2px 0 8px}
.obt-settle b{color:var(--ink)}
.obt-pairs{display:flex;align-items:baseline;gap:9px;flex-wrap:wrap;margin-top:9px;padding:7px 10px;border:1px solid var(--line);border-left:2px solid var(--model);background:var(--panel-2)}
.obt-pairs i{font-style:normal;font-family:var(--mono);font-size:.52rem;letter-spacing:.12em;color:var(--ink-faint)}
.obt-pairs b{font-family:var(--ui);font-weight:600;font-size:.76rem;color:var(--ink)}
.obt-pairs s{text-decoration:none;font-family:var(--mono);font-size:.62rem;color:var(--ink-dim)}
.obt-pairs .padd{appearance:none;margin-left:auto;border:1px solid var(--model);border-radius:0;background:none;color:var(--model);font-family:var(--mono);font-size:.6rem;letter-spacing:.04em;text-transform:uppercase;padding:3px 8px;cursor:pointer}
.obt-pairs .padd:hover{background:var(--model-dim)}
:root[data-theme="light"] .obt-sg .sgr .sb{background:rgba(29,78,216,.1)}
:root[data-theme="light"] .obt-sg .sgr .sb b{background:var(--model)}
:root[data-theme="light"] .obt-rollup{color:var(--model)}
:root[data-theme="light"] .obt-rollup.w{color:var(--gold)}
:root[data-theme="light"] .obt-pairs{border-left-color:var(--model)}

/* ==== [v37] call line + match pills + picker wells + YOUR BET ==== */
/* the one-line call replacing THE READ hero */
.obt-callline{display:inline-flex;align-items:center;gap:9px;margin-left:auto;white-space:nowrap;font-size:.8rem;color:var(--ink-dim);min-width:0;overflow:hidden}
.obt-callline .st{font-style:normal;color:var(--gold)}
.obt-callline .ck{font-family:var(--mono);font-size:.6rem;letter-spacing:.08em;color:var(--ink-faint);text-transform:uppercase}
.obt-callline b{color:var(--ink);font-weight:600;overflow:hidden;text-overflow:ellipsis}
.obt-callline .pr{font-family:var(--mono);font-weight:700;color:var(--model)}
.obt-callline .cw{font-family:var(--mono);font-size:.62rem;color:var(--action-hi)}
.obt-callline .wtake.mini{font-family:var(--mono);font-size:.56rem;letter-spacing:.08em;color:var(--gold);background:none;border:1px solid rgba(245,179,1,.5);border-radius:3px;padding:4px 9px;cursor:pointer;box-shadow:none}
/* match pills */
.obt-ctxrow.v37{display:flex;gap:7px;flex-wrap:wrap;align-items:center;flex-basis:100%;margin-top:9px}
.obt-ctxrow.v37 .ctxk{font-family:var(--mono);font-size:.54rem;letter-spacing:.14em;color:var(--ink-faint);text-transform:uppercase;margin-right:2px}
.obt-ctxrow.v37 .ctxc{display:inline-flex;align-items:center;gap:7px;background:var(--panel-2);border:1px solid var(--line);border-radius:99px;padding:5px 12px;font-size:.7rem;color:var(--ink);white-space:nowrap;cursor:pointer;box-shadow:none}
.obt-ctxrow.v37 .ctxc i{font-style:normal;font-family:var(--mono);font-size:.56rem;letter-spacing:.08em;color:var(--ink-faint);text-transform:uppercase}
.obt-ctxrow.v37 .ctxc b{font-weight:600;color:var(--ink);font-size:.7rem}
.obt-ctxrow.v37 .ctxc:hover{border-color:var(--action-hi)}
/* the wells */
.obt-build.v37{display:block !important;container-type:inline-size}
.obt-build.v37 .wells{display:grid;grid-template-columns:max-content max-content max-content minmax(0,1fr);gap:11px;align-items:stretch}
.obt-build.v37 .well{background:var(--panel-2);border:1px solid var(--line);border-radius:6px;padding:10px 13px 12px;display:flex;flex-direction:column;gap:9px;min-width:0;box-sizing:border-box}
.obt-build.v37 .well.hot{border-color:var(--action-hi);box-shadow:0 0 18px rgba(127,220,255,.07)}
.obt-build.v37 .well.bmkt{max-width:360px}
.obt-build.v37 .wt{display:flex;align-items:center;gap:7px;font-family:var(--mono);font-size:.56rem;letter-spacing:.13em;color:var(--ink-dim);text-transform:uppercase}
.obt-build.v37 .wt .n{width:16px;height:16px;border-radius:50%;background:var(--panel);border:1px solid var(--line);color:var(--action-hi);font-size:.56rem;line-height:15px;text-align:center;flex:0 0 auto}
.obt-build.v37 .well.done .wt .n{background:var(--model);border-color:var(--model);color:#06251a}
.obt-build.v37 .wt .dt{color:var(--model);margin-left:auto;font-style:normal;font-size:.7rem}
.obt-build.v37 .obt-mksel{display:flex;flex-wrap:wrap;gap:6px;align-items:center}
.obt-build.v37 .bl{display:flex;flex-wrap:wrap;gap:7px}
.obt-build.v37 .obt-mksel button,.obt-build.v37 .obt-sc,.obt-build.v37 .obt-pc{background:var(--panel);border:1px solid var(--line);border-radius:5px;font-weight:600;font-size:.8rem;padding:8px 13px}
.obt-build.v37 .obt-mksel button.on,.obt-build.v37 .obt-sc.on,.obt-build.v37 .obt-pc.on{background:rgba(127,220,255,.16);border-color:var(--action-hi);color:var(--ink);box-shadow:inset 0 0 0 1px rgba(127,220,255,.5)}
.obt-build.v37 .obt-sc.on::before,.obt-build.v37 .obt-mksel button.on::before,.obt-build.v37 .obt-pc.on::before{content:"\2713 ";color:var(--action-hi);font-weight:800}
.obt-build.v37 .bl2{max-width:100%;overflow-x:auto;display:flex;flex-wrap:nowrap;gap:7px;padding-bottom:2px;scrollbar-width:thin;align-items:center}
.obt-build .obt-lc.lc2{display:inline-flex;flex-direction:column;align-items:center;padding:6px 12px 5px;flex:0 0 auto}
.obt-lc.lc2 .n{font-family:var(--mono);font-weight:700;white-space:nowrap;font-size:.8rem}
.obt-lc.lc2 .n i{font-style:normal;color:var(--model);font-weight:500;margin-left:6px}
.obt-lc.lc2 .w{font-family:var(--ui);font-size:.6rem;color:var(--ink-faint);margin-top:2px;white-space:nowrap}
.obt-lc.lc2.on .w{color:var(--action-hi)}
.obt-lc.lc2 .w .mn,.obt-lc.lc2 .w .st{color:var(--gold);font-weight:600;font-style:normal}
.obt-lc.lc2.star{border-color:rgba(245,179,1,.5)}
.obt-lselw{display:inline-block}
.obt-lsel{appearance:none;-webkit-appearance:none;background:rgba(127,220,255,.14) url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='10' height='6'><path d='M1 1l4 4 4-4' stroke='%237fdcff' stroke-width='1.6' fill='none'/></svg>") no-repeat right 12px center;border:1px solid var(--action-hi);border-radius:5px;color:var(--ink);font-family:var(--mono);font-size:.78rem;font-weight:700;padding:10px 34px 10px 13px;cursor:pointer;max-width:340px;min-width:210px;box-shadow:inset 0 0 0 1px rgba(127,220,255,.35)}
.obt-lsel:focus{outline:none;box-shadow:inset 0 0 0 1px rgba(127,220,255,.6)}
.lselcap{display:block;font-family:var(--mono);font-size:.5rem;letter-spacing:.1em;color:var(--ink-faint);margin-top:5px;text-transform:uppercase}
/* conditions: dashed = information, not choices */
.obt-build.v37 .condw{border:1px dashed var(--line);border-radius:6px;padding:10px 13px;display:flex;flex-direction:column;gap:5px;min-width:0;box-sizing:border-box}
.obt-build.v37 .condw .wt{margin-bottom:1px}
.obt-build.v37 .condw .crow{display:flex;justify-content:space-between;align-items:baseline;gap:12px;font-size:.71rem;color:var(--ink-dim);white-space:nowrap;overflow:hidden;width:100%}
.obt-build.v37 .condw .crow span{overflow:hidden;text-overflow:ellipsis}
.obt-build.v37 .condw .crow em{font-style:normal;font-family:var(--mono);font-size:.54rem;letter-spacing:.06em;flex:0 0 auto}
.obt-build.v37 .condw .crow em.good{color:var(--model)}
.obt-build.v37 .condw .crow em.watch{color:var(--gold)}
.obt-build.v37 .condw .cfoot{margin-top:auto;padding-top:5px;border-top:1px solid var(--line)}
.obt-build.v37 .condw .obt-rollup{padding:0;font-size:.56rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* YOUR BET line */
.obt-ybet{display:flex;align-items:center;gap:13px;margin-top:11px;padding-top:10px;border-top:1px solid var(--line);min-width:0}
.obt-ybet .lbl{font-family:var(--mono);font-size:.54rem;letter-spacing:.14em;color:var(--ink-faint);text-transform:uppercase;flex:0 0 auto}
.obt-ybet b{font-size:.95rem;font-weight:700;color:var(--ink);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.obt-ybet .pr{font-family:var(--mono);font-weight:700;color:var(--model);flex:0 0 auto}
.obt-ybet .pf{font-family:var(--mono);font-size:.6rem;color:var(--ink-dim);flex:0 0 auto}
.obt-ybet .wtake{margin-left:auto;font-family:var(--mono);font-size:.64rem;letter-spacing:.08em;text-transform:uppercase;color:#06251a;background:var(--model);border:0;border-radius:5px;padding:9px 16px;cursor:pointer;font-weight:700;box-shadow:0 0 14px rgba(52,211,153,.25);flex:0 0 auto}
.obt-mksel .xsep{width:1px;height:16px;background:var(--line);display:inline-block;margin:0 5px;vertical-align:middle}
/* conditions always rides the flexible last track (empty max-content tracks collapse to 0) */
.obt-build.v37 .wells .bcond{grid-column:4}
/* width behaviour: never cover, always stack cleanly */
@container (max-width:1150px){
  .obt-build.v37 .wells{grid-template-columns:minmax(0,1fr) minmax(0,1fr)}
  .obt-build.v37 .well.bmkt{max-width:none}
  .obt-build.v37 .wells .bcond{grid-column:auto}
  .obt-build.v37 .wells > .bcond:nth-child(3){grid-column:1 / -1}
}
@container (max-width:800px){
  .obt-build.v37 .wells{grid-template-columns:minmax(0,1fr)}
  .obt-build.v37 .wells .bcond,.obt-build.v37 .wells > .bcond:nth-child(3){grid-column:auto}
  .obt-ybet{flex-wrap:wrap}
}
/* no container-query support: fall back to safe wrapping */
@supports not (container-type: inline-size){
  .obt-build.v37 .wells{display:flex;flex-wrap:wrap}
  .obt-build.v37 .well,.obt-build.v37 .condw{flex:1 1 260px}
}

/* ==== [v38] the one-strip picker: market > selection > line + slip, console owns the rest ==== */
.obt-build.v38{display:block;margin:3px 0 10px}
.obt-build.v38 .strip{display:flex;align-items:flex-end;gap:10px;flex-wrap:wrap;min-width:0}
.obt-ddw{display:inline-flex;flex-direction:column;gap:3px;min-width:0}
.obt-ddw>i{font-style:normal;font-family:var(--mono);font-size:.52rem;letter-spacing:.13em;color:var(--ink-faint);text-transform:uppercase;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:220px}
.obt-ddw select{appearance:none;-webkit-appearance:none;background:var(--panel-2) url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='10' height='6'><path d='M1 1l4 4 4-4' stroke='%237fdcff' stroke-width='1.6' fill='none'/></svg>") no-repeat right 10px center;border:1px solid var(--line);border-radius:5px;color:var(--ink);font-family:var(--mono);font-size:.72rem;font-weight:700;padding:8px 28px 8px 11px;cursor:pointer;max-width:300px;min-width:0}
.obt-ddw select:focus{outline:none;border-color:var(--action-hi)}
.obt-ddw.hot select{border-color:var(--action-hi);box-shadow:0 0 14px rgba(127,220,255,.08)}
.obt-ddw.lit select{background-color:rgba(127,220,255,.12);border-color:var(--action-hi);box-shadow:inset 0 0 0 1px rgba(127,220,255,.3)}
.obt-build.v38 .obt-lsel{min-width:180px;max-width:340px;box-shadow:none;padding:8px 28px 8px 11px;font-size:.72rem}
.obt-build.v38 .obt-one{display:inline-flex;align-items:center;font-family:var(--mono);font-size:.72rem;font-weight:700;border:1px solid var(--line);border-radius:5px;padding:8px 11px;color:var(--ink);white-space:nowrap}
.obt-build.v38 .wtake{align-self:flex-end;font-family:var(--mono);font-size:.62rem;letter-spacing:.08em;text-transform:uppercase;color:#06251a;background:var(--model);border:0;border-radius:5px;padding:9px 15px;cursor:pointer;font-weight:700;box-shadow:0 0 14px rgba(52,211,153,.25)}
@media (max-width:800px){ .obt-build.v38 .obt-lsel{max-width:100%} .obt-ddw select{max-width:100%} }

/* ==== [v39] the compact top: teams + picker on ONE line, call + pills on ONE clipped micro-row ==== */
.obt-wsid.v39{display:block;padding:7px 12px 8px}
.obt-wsid.v39 .hr1{display:flex;align-items:center;gap:10px;flex-wrap:wrap;min-width:0}
.obt-wsid.v39 .tm img,.obt-wsid.v39 .tm .ph{width:24px;height:24px}
.obt-wsid.v39 .tm b{font-size:.92rem}
.obt-wsid.v39 .mid{font-size:.62rem}
.obt-wsid.v39 .mid .sc{font-size:.95rem}
/* the strip dissolves into the header row */
.obt-wsid.v39 .hr1 .obt-build.v38{display:contents}
.obt-wsid.v39 .hr1 .obt-build.v38 .strip{display:contents}
.obt-wsid.v39 .strip label.obt-ddw:first-child{margin-left:auto}
.obt-wsid.v39 .obt-ddw{flex-direction:row}
.obt-wsid.v39 .obt-ddw select{padding:6px 26px 6px 10px;font-size:.68rem;max-width:270px}
.obt-wsid.v39 .obt-build.v38 .obt-lsel{min-width:150px;max-width:260px;padding:6px 26px 6px 10px;font-size:.68rem}
.obt-wsid.v39 .obt-build.v38 .obt-one{padding:6px 10px;font-size:.68rem}
.obt-wsid.v39 .obt-build.v38 .wtake{align-self:center;padding:7px 13px}
/* the micro-row: never taller than one line, pills fill the remainder and clip */
.obt-wsid.v39 .hr2{display:flex;align-items:center;gap:12px;margin-top:6px;flex-wrap:nowrap;overflow:hidden;min-width:0;white-space:nowrap}
.obt-wsid.v39 .hr2 .obt-callline{margin-left:0;flex:0 0 auto;overflow:visible}
.obt-wsid.v39 .hr2 .obt-ctxrow.v37{flex:1 1 auto;flex-basis:auto;margin-top:0;flex-wrap:nowrap;overflow:hidden;justify-content:flex-end;min-width:0}
.obt-wsid.v39 .hr2 .obt-ctxrow.v37 .ctxc{padding:3px 10px;font-size:.66rem;flex:0 1 auto;overflow:hidden;text-overflow:ellipsis}
.obt-wsid.v39 .hr2 .obt-ctxrow.v37 .ctxk{display:none}
@media (max-width:800px){ .obt-wsid.v39 .hr2{flex-wrap:wrap;white-space:normal} }

/* ==== [v40] the crumb row goes on the desktop game view -- its height goes to the console ==== */
@media (min-width:900px){
  .obt-stagecol:has(.obt-wsid.v39) .obt-stagehead{display:none}
}
/* [v40] modern load-in: every select / re-select fades the console organs in, softly staggered */
@keyframes obtIn{from{opacity:0;transform:translateY(5px)}to{opacity:1;transform:none}}
.obt-stage .bc{animation:obtIn .26s ease both}
.obt-stage .bc:nth-child(2){animation-delay:.035s}
.obt-stage .bc:nth-child(3){animation-delay:.07s}
.obt-stage .bc:nth-child(4){animation-delay:.105s}
.obt-stage .bc:nth-child(5){animation-delay:.14s}
.obt-stage .bc:nth-child(n+6){animation-delay:.17s}
@media (prefers-reduced-motion:reduce){ .obt-stage .bc{animation:none} }

/* [v41] the grid block riding other stops */
.obt-gridf{margin-top:11px;padding-top:10px;border-top:1px solid var(--line-soft, var(--line))}

/* [contrast audit 2026-09-13 · WP-CONTRAST · round-9 item 16] The site faint ink is 3.09-3.50:1 on the odds page in
   both themes - under the 4.5:1 floor WCAG 2.2 AA 1.4.3 asks for small text. Same hue, one step stronger: the two
   values the console has run since the 14:20 respin. Measured after: dark 4.61-5.17:1, light 4.80-5.31:1. */
#obtStage,#obtBar,#obtRail,#obtRows,#obtDays,.obt-top,.obt-ghead,.obt-gamehead,.obt-gch,.hr1,.hr2{--ink-faint:#78879E}
html[data-theme="light"] #obtStage,html[data-theme="light"] #obtBar,html[data-theme="light"] #obtRail,html[data-theme="light"] #obtRows,html[data-theme="light"] #obtDays,html[data-theme="light"] .obt-top,html[data-theme="light"] .obt-ghead,html[data-theme="light"] .obt-gamehead,html[data-theme="light"] .obt-gch,html[data-theme="light"] .hr1,html[data-theme="light"] .hr2{--ink-faint:#606C80}
/* the rail's book-name glyph paints a shade under the token in some leagues (#445062 on #15171f = 2.19:1) */
#obtRows i{color:var(--ink-faint)}

/* [contrast audit 2026-09-13 · WP-CONTRAST] every bottom-bar tile glyph paints half its shapes at fill-opacity .5:
   #404B5C on #080F19 = 2.18:1 dark, #A9B2BE on #F2F7FC = 2.00:1 light (SC 1.4.11 asks 3:1). The colour is already the
   right ink - only the 50% has to go. Measured after: 5.26:1 dark, 4.93:1 light. Prefer dropping the .5 at source. */
#obtBar svg rect,#obtBar svg circle,#obtBar svg path,#obtBar svg polygon{fill-opacity:1}

/* [contrast audit 2026-09-13 · WP-CONTRAST] the light theme's green prices measure 3.15-3.49:1 (floor 4.5:1) and the
   green chip block 2.16:1 (floor 3:1). One step darker, light theme only: measured after 4.87-5.38:1. */
html[data-theme="light"] #obtStage,html[data-theme="light"] #obtBar,html[data-theme="light"] #obtRail,html[data-theme="light"] #obtRows,html[data-theme="light"] #obtTiles,html[data-theme="light"] .obt-top,html[data-theme="light"] .obt-ghead,html[data-theme="light"] .hr1,html[data-theme="light"] .hr2{--model:#0A7A4C}

/* [contrast audit 2026-09-13 · WP-CONTRAST] light-theme gold: "TAKE IT", the kick-off time and the star measure
   3.86:1 on white (floor 4.5:1). Measured after: 5.53:1. Light theme only. */
html[data-theme="light"] .obt-ghead,html[data-theme="light"] .obt-gamehead,html[data-theme="light"] .hr1,html[data-theme="light"] .hr2,html[data-theme="light"] #obtStage{--gold:#8A6110}

/* [contrast audit 2026-09-13 · WP-CONTRAST] the "In play" chip is #ECC1C1 on #C43D3D = 3.18:1 (floor 4.5:1).
   White on the same red: 5.14:1. */
.obt-ghead .live,.obt-gamehead .live,.hr1 .live,.hr2 .live{color:#FFFFFF}

/* ===== BB_TOPBAR_V49 [2026-09-13, WP-TOPBAR] the approved top bar =====================================================
   48px, one hairline under it, three zones, one typeface (var(--ui)), two inks (var(--ink) / var(--ink-faint)), hairlines
   only. No pills, no gold, no gradients, no coloured tags, no mono caps, no avatars. Values are the owner-approved mock's.
   TONIGHT'S ONE THING leaves the chrome and becomes the first row of the board (.obt-heromini, now at every width) and the
   sentence on the empty stage (.bbt-stageone).                                                                        */

.obt-top{height:48px!important;min-height:0!important;padding:0 18px!important;display:flex!important;align-items:center!important;gap:0!important;background:var(--page,#0f1118)!important;border-bottom:1px solid var(--line)!important;box-shadow:none!important;font-family:var(--ui)!important}
html[data-theme="light"] .obt-top{--ink:#0f1118;--ink-faint:#606C80;--page:#ffffff;--line:#e3e7ee;background:#fff!important}
#obtTopKeep[hidden],.obt-top [hidden]{display:none!important}

/* LEFT: the wordmark, then the modes as plain tabs */
.obt-top .obt-home{font-family:var(--ui)!important;font-weight:700!important;font-size:15px!important;letter-spacing:0!important;color:var(--ink)!important;margin-right:28px;white-space:nowrap;gap:0!important}
.obt-top .obt-home img,.obt-top .obt-home i{display:none!important}
.obt-top .obt-home span{display:inline!important}
.obt-top .tb-modes{display:flex;gap:22px;align-items:center;height:48px}
.obt-top .tb-modes a,.obt-top .tb-modes button{appearance:none;background:none;border:0;padding:0;margin:0;font-family:var(--ui);font-size:13px;color:var(--ink-faint);text-decoration:none;height:48px;display:flex;align-items:center;border-bottom:2px solid transparent;white-space:nowrap;cursor:pointer}
.obt-top .tb-modes a:hover,.obt-top .tb-modes button:hover{color:var(--ink)}
.obt-top .tb-modes a.on,.obt-top .tb-modes button.on{color:var(--ink);font-weight:600;border-bottom-color:var(--ink)}

/* CENTRE: the day */
.obt-top .tb-day{appearance:none;background:none;border:0;padding:0;margin:0 auto;font-family:var(--ui);font-size:13px;color:var(--ink);font-weight:500;display:flex;align-items:center;gap:6px;white-space:nowrap;cursor:pointer}
.obt-top .tb-day i{font-style:normal;color:var(--ink-faint);font-size:10px}

/* RIGHT */
.obt-top .tb-right{display:flex;align-items:center;gap:22px;white-space:nowrap;margin-left:auto}
/* inline-flex makes every child a flex item, so the word gap is set here, not by the collapsed whitespace */
.obt-top .tb-it{appearance:none;background:none;border:0;padding:0;margin:0;font-family:var(--ui);font-size:12.5px;color:var(--ink-faint);text-decoration:none;display:inline-flex;align-items:center;gap:5px;white-space:nowrap;cursor:pointer}
.obt-top .tb-it b{color:var(--ink);font-weight:600}
.obt-top .tb-it:hover{color:var(--ink)}
.obt-top .tb-it svg{width:15px;height:15px;stroke:var(--ink-faint);fill:none;stroke-width:1.6;flex:0 0 auto}
.obt-top .tb-fbtn{appearance:none;background:none;border:0;padding:0;margin:0;font-family:var(--ui);font-size:12.5px;color:var(--ink-faint);display:inline-flex;align-items:center;gap:5px;cursor:pointer}
.obt-top .tb-fbtn:hover{color:var(--ink)}
.obt-top .tb-fbtn svg{width:15px;height:15px;stroke:var(--ink-faint);fill:none;stroke-width:1.6}
.obt-top .tb-find .tb-fw b{border:1px solid var(--line);padding:0 5px;font-weight:500;margin-left:6px;color:var(--ink-faint)}
.obt-top .tb-find #obtSearch{display:none}
.obt-top .tb-find.open #obtSearch{display:block;width:220px;appearance:none;background:none;border:0;border-bottom:1px solid var(--line);border-radius:0;box-shadow:none;outline:none;height:26px;padding:0 2px;margin-left:8px;font-family:var(--ui);font-size:13px;color:var(--ink)}
.obt-top .tb-find.open .tb-fw{display:none}
/* the freshness line speaks only when the prices are stale */
.obt-top .obt-stamp{font-family:var(--ui)!important;font-size:12.5px!important;color:var(--ink-faint)!important;gap:0!important}
.obt-top .obt-stamp .obt-dot{display:none!important}
.obt-top .obt-stamp[hidden]{display:none!important}
/* initials: a hairline square, never an image */
.obt-top .tb-ini{appearance:none;background:none;width:26px;height:26px;padding:0;border:1px solid var(--line);border-radius:0;display:grid;place-items:center;font-family:var(--ui);font-size:11px;font-weight:600;color:var(--ink);cursor:pointer}
.obt-top .tb-ini.word{width:auto;padding:0 9px;font-weight:500;color:var(--ink-faint)}
.obt-top .tb-ini:hover{color:var(--ink);border-color:var(--ink-faint)}

/* the menus the bar opens: plain ink on the page ground, one hairline */
.tb-menu{position:fixed;z-index:80;min-width:190px;background:var(--page,#0f1118);border:1px solid var(--line);padding:5px 0;font-family:var(--ui);box-shadow:none}
html[data-theme="light"] .tb-menu{--page:#ffffff;--line:#e3e7ee;background:#fff}
.tb-menu button{display:block;width:100%;text-align:left;appearance:none;background:none;border:0;padding:8px 14px;font-family:var(--ui);font-size:13px;color:var(--ink-faint);cursor:pointer;white-space:nowrap}
.tb-menu button:hover{color:var(--ink)}
.tb-menu button.on{color:var(--ink);font-weight:600}

/* TONIGHT'S ONE THING, in the page: the first row of the board */
.obt-heromini{display:block!important;margin:0!important;padding:11px 14px!important;border:0!important;border-bottom:1px solid var(--line)!important;border-radius:0!important;background:none!important;font-family:var(--ui)!important;font-size:13.5px!important;line-height:1.55!important;color:var(--ink-faint)!important;cursor:pointer}
.obt-heromini .cap{display:none!important}
.obt-heromini b{color:var(--ink)!important;font-weight:600}
.obt-heromini .k{color:var(--ink);font-weight:600}
.obt-heromini .r{color:var(--ink);text-decoration:underline;text-underline-offset:2px;margin-left:4px;white-space:nowrap}
.obt-heromini[hidden]{display:none!important}

/* the same sentence, large, on the stage before a game is picked */
.bbt-stageone{padding:40px 34px;max-width:640px;font-family:var(--ui)}
.bbt-stageone p{margin:0;font-size:24px;line-height:1.42;color:var(--ink-faint);font-weight:400}
.bbt-stageone p b{color:var(--ink);font-weight:600}
.bbt-stageone .r{appearance:none;background:none;border:0;padding:0;margin-top:18px;font-family:var(--ui);font-size:15px;color:var(--ink);text-decoration:underline;text-underline-offset:3px;cursor:pointer}

/* the phone: wordmark, Find, the slip count, the initials. The modes fold into the initials menu. */
/* [integrator 2026-09-14, BB_INTEGR_V57] 699 -> 899: the phone top bar now switches where isDesk() and the scene engine switch, killing the 700-899 half-state */
@media (max-width:899px){
  .obt-top{height:48px!important;padding:0 14px!important}
  .obt-top .obt-home{margin-right:auto;font-size:14px!important}
  .obt-top .tb-modes,.obt-top .tb-day,.obt-top .tb-apps,.obt-top .tb-month,.obt-top .obt-stamp{display:none!important}
  .obt-top .tb-right{gap:16px}
  .obt-top .tb-find .tb-fw{display:none}
  .bbt-stageone{padding:26px 16px}
  .bbt-stageone p{font-size:19px}
}
/* =====================================================================================================================
   BB_BOTTOM_V50 [2026-09-13 · WP-BOTTOM] THE BOTTOM OF THE READ, as the owner approved it.
   One typeface (var(--ui)), two inks (var(--ink) / var(--ink-faint)), hairlines (var(--line)). No pills, no gold, no
   gradients, no coloured tags, no mono caps, no avatars. The five question tiles are untouched: everything here styles
   the new utility cluster (.bf), the one verb (.bk), the phone bar and the two sheets those taps open.
   ===================================================================================================================== */

/* ---- the five things about this bet: a glyph over a short label, the number in ink ---- */
#obtBar .bf {
    appearance: none; flex: 0 0 auto; display: flex; flex-direction: column; align-items: center; justify-content: center;
    gap: 4px; padding: 0 13px; height: 60px; min-width: 74px; background: transparent; border: 0;
    border-left: 1px solid var(--line); border-radius: 0; color: var(--ink-faint); font-family: var(--ui);
    font-size: 10.5px; line-height: 1.25; letter-spacing: 0; text-transform: none; white-space: nowrap; cursor: pointer;
}
#obtBar .bf svg { width: 18px; height: 18px; display: block; stroke: currentColor; fill: none; stroke-width: 1.5; stroke-linecap: round; stroke-linejoin: round; }
#obtBar .bf .lb { display: block; max-width: 108px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: inherit; font-family: var(--ui); font-size: 10.5px; }
#obtBar .bf b { font-weight: 600; font-size: 10.5px; color: var(--ink); }
#obtBar .bf:hover { color: var(--ink); background: transparent; }
#obtBar .bf:active { transform: scale(.96); }
#obtBar .bf:focus-visible { outline: 1px solid var(--ink); outline-offset: -2px; }

/* ---- ONE VERB, ONE PLACE ---- */
#obtBar .bk {
    appearance: none; flex: 0 0 auto; display: flex; align-items: center; justify-content: center;
    margin: 12px 2px 12px 14px; padding: 0 18px; height: 36px; border: 0; border-radius: 0;
    background: var(--ink); color: var(--page, #0f1118); font-family: var(--ui); font-size: 13px; font-weight: 600;
    letter-spacing: 0; text-transform: none; white-space: nowrap; cursor: pointer;
}
#obtBar .bk:hover { opacity: .88; }
#obtBar .bk:active { transform: scale(.98); }
#obtBar .bk:focus-visible { outline: 2px solid var(--ink); outline-offset: 2px; }
html[data-theme="light"] #obtBar .bk { color: #fff; }
html[data-theme="light"] #obtBar { --page: #ffffff; }

/* ---- the bar is the read's chrome at every width (the v8 rule hid it below 1150). It belongs to the READ: on the
       board, and whenever the host hides it, it is gone - a forced display must never outrank that. ---- */
@media (max-width: 1149px) { #obtBar { display: flex !important; } }
#obtBar[hidden] { display: none !important; }
/* data-scr only leaves "board" on a phone (a desktop keeps it while a game is open), so this stays inside the phone
   query: there the bar is fixed to the screen and must not sit under the board. */
@media (max-width: 899px) { #obtApp[data-scr="board"] #obtBar { display: none !important; } }

/* ---- phone: the five questions stay, the five things collapse into a More sheet, Back it is a full-width block on
       the bottom edge. Below 900px the scene engine does not mark the app .r9-game, so every v8/v9 gradient, glow,
       rounded corner and coloured state on the bar is put back to the house style right here. ---- */
@media (max-width: 899px) {
    #obtBar {
        position: fixed !important; left: 0; right: 0; bottom: 0; z-index: 60; display: flex !important; flex-wrap: wrap !important;
        align-items: stretch !important; gap: 0 !important; padding: 0 0 env(safe-area-inset-bottom, 0px) !important;
        background: var(--panel) !important; background-image: none !important; border: 0 !important;
        border-top: 1px solid var(--line) !important; box-shadow: none !important; overflow: visible !important; transform: none !important;
    }
    #obtBar::before, #obtBar::after { display: none !important; content: none !important; }
    #obtBar .slot { display: none !important; }
    #obtBar .jstage,
    #obtBar .jstage.on, #obtBar .jstage.seen, #obtBar .jstage.cast,
    #obtBar .jstage.proc-green, #obtBar .jstage.proc-red, #obtBar .jstage.proc-gold, #obtBar .jstage.proc-blue, #obtBar .jstage.pinned {
        position: relative !important; flex: 1 1 0 !important; min-width: 0 !important; max-width: none !important;
        height: auto !important; padding: 9px 4px 8px !important; margin: 0 !important; display: flex !important;
        flex-direction: column !important; align-items: center !important; justify-content: center !important; gap: 3px !important;
        background: transparent !important; background-image: none !important; border: 0 !important;
        border-right: 1px solid var(--line) !important; border-top: 2px solid transparent !important; border-radius: 0 !important;
        box-shadow: none !important; text-shadow: none !important; transform: none !important; animation: none !important;
        color: var(--ink-faint) !important; font-family: var(--ui) !important; text-align: center !important;
    }
    #obtBar .jstage::before, #obtBar .jstage::after { display: none !important; content: none !important; }
    #obtBar .jstage:last-of-type { border-right: 0 !important; }
    #obtBar .jstage .jn, #obtBar .jstage .jc, #obtBar .jstage .jq { display: none !important; }
    #obtBar .jstage .jg, #obtBar .jstage.on .jg, #obtBar .jstage.seen .jg {
        position: static !important; grid-row: auto; grid-column: auto; transform: none !important; width: 20px !important;
        height: 20px !important; margin: 0 !important; padding: 0 !important; display: block !important; opacity: 1 !important;
        background: none !important; border: 0 !important; border-radius: 0 !important; box-shadow: none !important; color: inherit !important;
    }
    #obtBar .jstage .jg svg { width: 20px !important; height: 20px !important; display: block !important; }
    #obtBar .jstage b, #obtBar .jstage.on b, #obtBar .jstage.seen b {
        grid-column: auto; font-family: var(--ui) !important; font-weight: 500 !important; font-size: 10.5px !important;
        color: inherit !important; text-shadow: none !important; letter-spacing: 0 !important; text-transform: none !important;
        max-width: 100% !important; overflow: hidden !important; text-overflow: ellipsis !important; white-space: nowrap !important;
    }
    #obtBar .jstage.on { color: var(--ink) !important; border-top-color: var(--ink) !important; }
    #obtBar .jstage.on b { font-weight: 600 !important; }
    /* the cluster's children become the bar's own children, so Back it can wrap to its own full-width row */
    #obtBar .baru { display: contents !important; margin: 0 !important; border: 0 !important; }
    #obtBar .bf.bfmore { flex: 0 0 auto; height: auto; min-width: 62px; padding: 9px 12px 8px; gap: 3px; border-left: 1px solid var(--line); }
    #obtBar .bf.bfmore svg { width: 20px; height: 20px; }
    #obtBar .bk { flex: 1 0 100%; order: 9; margin: 0; height: 48px; border-top: 1px solid var(--line); font-size: 14px; }
    .obt-app .obt-stage { padding-bottom: 124px; }
    .obt-app .obt-tiles { padding-bottom: 124px; }
    #obtFab { bottom: 122px; }
    .obt-slip { bottom: 112px; }
}

/* ---- "Do it 100 times": one sentence, in counts and dollars ---- */
.bbhx .gcmh, .bbsheet .gcmh { font-family: var(--ui); font-size: .78rem; font-weight: 600; letter-spacing: 0; text-transform: none; color: var(--ink-faint); margin: 0 0 6px; }
.bbhx .gcmn, .bbsheet .gcmn { font-family: var(--ui); }
.bbhx { min-width: 280px; max-width: 460px; }
.bbhx .bbh1 { font-family: var(--ui); font-size: 1rem; line-height: 1.5; color: var(--ink); margin: 6px 0 0; }
.bbhx .bbh1 b { font-weight: 600; color: var(--ink); }

/* ---- the phone More sheet: the same five things as rows ---- */
.bbsheet { min-width: 260px; max-width: 460px; }
.bbsheet .bbrow {
    appearance: none; display: flex; width: 100%; align-items: center; gap: 12px; text-align: left;
    background: transparent; border: 0; border-top: 1px solid var(--line); border-radius: 0; padding: 13px 2px;
    color: var(--ink-faint); font-family: var(--ui); font-size: .88rem; line-height: 1.4; cursor: pointer;
}
.bbsheet .bbrow:first-of-type { border-top: 0; }
.bbsheet .bbrow svg { flex: 0 0 20px; width: 20px; height: 20px; stroke: currentColor; fill: none; stroke-width: 1.5; stroke-linecap: round; stroke-linejoin: round; }
.bbsheet .bbrow b { display: block; font-weight: 600; color: var(--ink); }
.bbsheet .bbrow i { display: block; font-style: normal; color: var(--ink-faint); font-size: .8rem; margin-top: 2px; }
.bbsheet .bbrow:hover { color: var(--ink); }

/* 30_phone.css — [WP-M1, 2026-09-14] BB_PHONE_V55 · THE PHONE HEAD.
   MOBILE_OVERHAUL_SPEC.md §3.1: the phone gets its own head — one line of teams + a countdown, one 48px line that says the bet
   in words and what $10 gets, and an "our call" line only when the call is a different bet from the one in focus. The desktop
   head (the two-row .hr1/.hr2 band with the three <select>s, OUR CALL, the context chips and the venue sentence) is untouched.

   ⛔ EVERY rule in this file sits inside @media (max-width:899px). The desktop head must be byte-identical after this block —
   a rule outside the media query would change 1600px too. 899 is the one phone token (spec D13).

   Design law: one typeface var(--ui), two inks var(--ink) / var(--ink-faint), hairlines var(--line). No gradients, no pills,
   no gold, no coloured tags, no mono caps, no rounded card stacks, no avatars.
   ICP law: the head names ONE bet, in words, with dollars — never a percentage, never edge/EV/CLV/ROI/vig/implied/steam. */

@media (max-width:899px){

  /* --- the back row goes, but only once the phone head has actually rendered ---------------------------------------
     The desktop already hides .obt-stagehead when the v39 band is on screen (host css :1693 `@media (min-width:900px)`).
     The phone head carries its own back arrow, so the row is duplication — but if phoneHead() ever returns nothing and the
     old band renders instead, the reader must keep a way back to the board. :has() makes the hide conditional on the new
     head being there, which is strictly safer than the blanket hide the spec asked for. */
  .obt-stagecol:has(.obt-wsid.phh) .obt-stagehead{display:none}

  /* --- the head itself ---------------------------------------------------------------------------------------------
     Full-bleed: .obt-stage has padding:12px on a phone (host css :319), so the head pulls out of it and puts its own 12px
     back, giving one hairline that runs the whole width. Heights: row A 32 + row B 48 + row C 24 + 4 pad + 1 rule = 109px
     measured at 390px, against a 112px budget (spec §3). */
  .obt-stage .obt-wsid.phh{display:block;border:0;border-bottom:1px solid var(--line);background:var(--panel);
    margin:-12px -12px 10px;padding:0 12px 4px;font-family:var(--ui);font-variant-numeric:tabular-nums}
  .obt-stage .obt-wsid.phh,.obt-stage .obt-wsid.phh *{box-sizing:border-box;font-family:var(--ui)}

  /* row A — back · crests · teams · when it starts */
  .obt-stage .phh-a{display:flex;align-items:center;gap:8px;height:32px;min-width:0}
  /* 44x44 (WCAG 2.5.5 / Apple HIG) inside a 32px row: the row's height is fixed, so the extra 12px of hit area overflows
     invisibly above and below the arrow instead of making the head taller. */
  .obt-stage .phh-back{appearance:none;border:0;background:none;color:var(--ink-faint);font-size:1.25rem;line-height:1;
    display:flex;align-items:center;justify-content:flex-start;
    width:44px;height:44px;margin:-6px 0 -6px -12px;padding:0 0 0 8px;cursor:pointer;flex:0 0 auto}
  .obt-stage .phh-crs{display:flex;align-items:center;gap:3px;flex:0 0 auto}
  .obt-stage .phh-cr{width:16px;height:16px;object-fit:contain}
  .obt-stage .phh-teams{flex:1 1 auto;min-width:0;font-size:.94rem;font-weight:600;color:var(--ink);line-height:1.2}
  .obt-stage .phh-when{flex:0 0 auto;font-size:.8rem;font-weight:400;color:var(--ink-faint);line-height:1.2}

  /* row B — THE BET. The whole row is the tap target (48px, WCAG 2.5.5 / Apple HIG 44pt): it opens the "Change the bet"
     sheet WP-M2 builds next wave, through the agreed hook data-r9="sheet" (a no-op until that lands). Nothing is clipped —
     a long player bet wraps to a second line rather than ellipsising, so the reader never sees half a bet name. */
  .obt-stage .phh-b{display:flex;align-items:center;gap:10px;width:100%;min-height:48px;padding:5px 0;margin:0;
    appearance:none;background:none;border:0;border-top:1px solid var(--line);text-align:left;cursor:pointer}
  .obt-stage .phh-bet{flex:1 1 auto;min-width:0;font-size:.86rem;font-weight:400;color:var(--ink-faint);line-height:1.28}
  .obt-stage .phh-bet b{font-weight:600;color:var(--ink)}
  .obt-stage .phh-tail{font-style:normal;color:var(--ink-faint);white-space:nowrap}
  .obt-stage .phh-chg{flex:0 0 auto;font-size:.8rem;color:var(--ink-faint);white-space:nowrap;text-decoration:none}
  .obt-stage .phh-chg u{text-decoration:underline}

  /* row C — our call, only when it is a different bet from the one in focus. No star, no colour, no price. */
  .obt-stage .phh-c{display:flex;align-items:center;gap:6px;margin:0;min-height:24px;font-size:.8rem;
    color:var(--ink-faint);line-height:1.3}
  .obt-stage .phh-show{appearance:none;border:0;background:none;padding:0 2px;min-height:24px;font-size:.8rem;
    color:var(--ink);text-decoration:underline;cursor:pointer;white-space:nowrap}

  /* --- clean-up on any head that is NOT the new one (spec D7 / D9) --------------------------------------------------
     phoneHead() prints none of these, so this only bites the fallback band: no gold star, no green/cyan price words, no
     rounded mono-caps context pills, no clipped venue sentence, and the crumb in one typeface. Two inks, one face. */
  .obt-wsid .obt-ghwx{display:none}
  .obt-wsid .obt-ctxrow,.obt-wsid .ctxc{display:none}
  .obt-wsid .obt-callline .st{display:none}
  .obt-wsid .obt-callline .pr,.obt-wsid .obt-callline .cw{color:var(--ink)}
  .obt-crumb b{font-family:var(--ui);font-weight:600}
  .obt-crumb .mod{display:none}
  .obt-crumb .ko{color:var(--ink-faint);font-family:var(--ui)}
}

/* =====================================================================================================================
   ⛔ EVERYTHING ABOVE THIS LINE IS WP-M1's (BB_PHONE_V55, the phone head). Do not edit it from another package.
   ⬇ WP-M3 [BB_PHONEBARS_V56, 2026-09-14] THE BARS AND THE CHROME. Appended section, owned by WP-M3.

   MOBILE_OVERHAUL_SPEC.md §3.3 + D3/D4/D4b/D5/D8/D10/D13. The phone said the five stops twice - an in-content strip and
   a bottom bar - with three of the bar's five labels ellipsised, a gold POWERS tile floating on the reader's paragraph,
   and a whole desktop tile deck laid out off the right-hand edge of the screen. What is left is one bar: row 1 the five
   stops in labels that fit, row 2 More and the one verb, no rule between them because they are one object.

   Budget at 390x844 (measured, not estimated): site bar 48 + head 109 + bar 101 = 258px of chrome, 586px to read in;
   scrolled, the head drops its third row to 81px and the chrome is 230px.

   ⛔ Every rule below sits in one of three queries: @media (max-width:899px) - the phone - @media (max-width:359px) for
   the narrow phone inside it, and @media (min-width:900px) and (max-width:1149px), the small-tablet band the spec calls
   D13. Nothing at 1150px and wider is touched, and it is proved, not asserted: a 1600x900 bench capture of nfl with this
   package on disk and the same capture with 71_phonebars.py and this section removed came back md5-identical, twice
   (shots/m3/band/nfl_1600_dark.png and nfl_1600_dark_WITHOUT_M3.png).
   Design law: one typeface var(--ui), two inks, hairlines, no gradients / pills / gold / coloured tags / mono caps / avatars.
   ===================================================================================================================== */

@media (max-width:899px){

  /* --- the tab strip inside the read is the bar, said twice (spec D4b / D10) ------------------------------------------
     33px of height, "Where to put it" scrolled off the right edge with no affordance, and its own active-stop underline
     disagreeing with the bar's. The bar is the navigation; the read never repeats it. Its two links ("See the teams",
     "The words") are not lost - they are rows in the More sheet now, so the glossary stays one tap away.
     The DOM is still built: deleting it is one line in round9/src/04_engine.js (E.stage's unused `mobile` argument),
     which WP-M3 does not own and has handed to the lane lead. This rule and that line agree; neither needs the other. */
  #obtStage .r9-tabs{display:none!important}

  /* --- the POWERS tile is out of the document (renderFab), this is the belt and braces ------------------------------- */
  #obtFab,#obtPow{display:none!important}

  /* --- the desktop tile deck is no longer built on a phone, so its column claims no room --------------------------- */
  .obt-app .obt-tiles{padding-bottom:0}

  /* --- ONE BAR ------------------------------------------------------------------------------------------------------
     Row 1: the five stops, 20% each (78px at 390, 64px at 320), glyph over label, active = ink + a 2px top rule.
     Row 2: More (62px) then the one verb filling the rest. No hairline between the rows.
     The break is a zero-height full-width flex item the bar prints between the stops and More (.barbrk56): a flex line
     only wraps on the items' BASE sizes, so five 20% stops plus a 100% break is the one arrangement that still breaks
     correctly when a league is missing a stop and there are only four. */
  #obtBar .barbrk56{flex:1 0 100%!important;height:0!important;min-height:0!important;margin:0!important;padding:0!important;
    border:0!important;overflow:hidden!important}
  #obtBar .jstage,#obtBar .jstage.on,#obtBar .jstage.seen,#obtBar .jstage.cast{
    flex:1 1 20%!important;min-width:0!important;height:52px!important;padding:0 4px!important;gap:3px!important;
    justify-content:center!important}
  /* a stop label may never ellipsise: S.TAB_SHORT is sized so it does not have to (longest "What stops it", ~69px in
     78px), and if a future label ever did overflow we want the gate to SEE it, not a tidy "..." hiding it. */
  #obtBar .jstage b,#obtBar .jstage.on b,#obtBar .jstage.seen b{
    line-height:1.25!important;overflow:visible!important;text-overflow:clip!important;max-width:none!important}
  #obtBar .bf.bfmore{order:0!important;flex:0 0 62px!important;min-width:62px!important;max-width:62px!important;
    height:48px!important;padding:0!important;gap:3px!important;border-left:0!important;border-top:0!important}
  #obtBar .bf.bfmore .lb{max-width:58px}
  #obtBar .bk{flex:1 1 auto!important;order:9!important;margin:0!important;height:48px!important;border-top:0!important;
    font-size:14px}

  /* --- the read ends above the bar, at the bar's REAL height (safe area included) ------------------------------------
     The host hard-coded 124px, which was wrong the moment the bar changed shape and wrong again on a phone with a home
     indicator. --bb-barh is written from getBoundingClientRect after every bar render and on resize, by this package's
     host block. WP-M4 already consumes it from the scene sheet - `.obt-app #obtStage{padding-bottom:var(--bb-barh,124px)}`,
     src/scenes.css:638 - and that id selector outranks this one whenever the scene engine is loaded, which is every read
     on a phone. This rule is the fallback for the one screen the engine does not own: the old v41 phone stage, where the
     bar still renders and 124px is still guesswork. */
  .obt-app .obt-stage{padding-bottom:calc(var(--bb-barh, 101px) + 14px)}
  .obt-slip{bottom:calc(var(--bb-barh, 101px) + 8px)}

  /* --- the head sticks and collapses (spec §3, WP-M1 handed this over) ------------------------------------------------
     .obt-wsid is already position:sticky in the host sheet, so the head stays on screen; past 120px of reading the third
     row (our call, with its "Show me") goes and the head is rows A and B - the teams and THE BET - at 81px. Nothing that
     names the bet is ever scrolled away. */
  #obtStage.bb-ph-scrolled .obt-wsid.phh .phh-c{display:none}
  #obtStage.bb-ph-scrolled .obt-wsid.phh{padding-bottom:0}
  /* [integrator 2026-09-14, WP-M7 G2] rows A(32)+B(48)+the 1px hairline measured 81px against the spec's 80px
     ceiling. One pixel comes off row A when collapsed; its 44px back-arrow hit area overflows the row anyway. */
  #obtStage.bb-ph-scrolled .obt-wsid.phh .phh-a{min-height:31px;height:31px}

  /* --- "You" in the top bar (spec §3.4): the bottom bar keeps exactly five stops and one verb --------------------- */
  .obt-top .tb-you{min-height:44px;font-size:12.5px}
  .obt-top .tb-you b{font-weight:600;color:var(--ink)}
}

/* --- the narrow phone (iPhone SE and anything under 360px) -----------------------------------------------------------
   A 320px screen gives each stop a 64px tile, and the longest short label - "What stops it" - measures 64.9px at 10.5px
   in var(--ui): it lands exactly on the hairlines either side of it. One notch down to 10px (the kit's floor, never
   under it) with a 2px gutter puts every label back inside its own tile with room to spare. Still no ellipsis. */
@media (max-width:359px){
  #obtBar .jstage b,#obtBar .jstage.on b,#obtBar .jstage.seen b{font-size:10px!important}
  #obtBar .jstage,#obtBar .jstage.on,#obtBar .jstage.seen,#obtBar .jstage.cast{padding:0 2px!important}
}

/* --- the 900-1149 band (spec D13): a desktop console must get desktop chrome ------------------------------------------
   isDesk() in the client is min-width:900px, but the sheet switched at 1149, so between them the reader got a desktop
   three-column console with the phone's floating POWERS tile on it and a bottom bar whose five stops overlapped each
   other (measured at 1024: 37px of room for a 118px label, tiles printing "$..", "t..", "#.."). The client now folds the
   five utility buttons into More below 1150 and prints the short stop names; this is the matching type. */
@media (min-width:900px) and (max-width:1149px){
  #obtFab,#obtPow{display:none!important}
  /* the scene sheet owns the desktop bar at !important weight (src/scenes.css:403-410, `.r9-game #obtBar .jstage`), and
     .r9-game is on the app from 900px up - so the band has to answer at the same weight and the same selector. Only the
     three numbers that made the tiles collide change: the glyph gutter, the label size, and the answer line. */
  .r9-game #obtBar .jstage,#obtBar .jstage{padding:0 8px 0 30px!important;min-width:0!important}
  .r9-game #obtBar .jstage .jg,#obtBar .jstage .jg{left:5px!important;width:20px!important;height:20px!important}
  .r9-game #obtBar .jstage .jg svg,#obtBar .jstage .jg svg{width:20px!important;height:20px!important}
  .r9-game #obtBar .jstage .jn,#obtBar .jstage .jn{display:none!important}   /* the number and the glyph both mark the stop */
  .r9-game #obtBar .jstage b,#obtBar .jstage b{font-size:12px!important;overflow:visible!important;text-overflow:clip!important}
  /* the answer line keeps its place - it had 37px to say "$21.50 for $10" in and printed "$..", and it has 109px now. */
  .r9-game #obtBar .jstage .jq,#obtBar .jstage .jq{font-size:11px!important}
}

/* =====================================================================================================================
   BB_INTEGR_V57 [integrator 2026-09-14] — cross-package integration, appended below WP-M1's and WP-M3's sections.
   ===================================================================================================================== */
@media (max-width:899px){
  /* lane ruling on WP-M1's owner item: "Show me" keeps its 24px row (head budget untouched) but gains an invisible
     44px hit area, the same way the back arrow overflows row A. */
  .obt-stage .phh-show{position:relative}
  .obt-stage .phh-show::after{content:"";position:absolute;left:-10px;right:-10px;top:-11px;bottom:-11px}
}
@media (min-width:900px) and (max-width:1149px){
  /* WP-M3's flag: in the band the mid column is 300-443px and the in-scene tab strip wrapped into four lines with
     "The words" clipped. The bar carries the same five stops here without collision, so the strip says it twice. */
  #obtStage .r9-tabs{display:none!important}
}
@media (min-width:1150px) and (max-width:1449px){
  /* pre-existing defect WP-M3 measured and left (its brief pinned the band at 900-1149): the bar's stop labels clip
     up to ~1450 ("The call" 37/47px at 1150; "What could stop it?" 87/118px at 1400). The same three numbers the band
     changes fix it: the glyph gutter, the label size, the answer line. 1450 and wider was measured clean and is untouched. */
  .r9-game #obtBar .jstage,#obtBar .jstage{padding:0 8px 0 30px!important;min-width:0!important}
  .r9-game #obtBar .jstage .jg,#obtBar .jstage .jg{left:5px!important;width:20px!important;height:20px!important}
  .r9-game #obtBar .jstage .jg svg,#obtBar .jstage .jg svg{width:20px!important;height:20px!important}
  .r9-game #obtBar .jstage .jn,#obtBar .jstage .jn{display:none!important}
  .r9-game #obtBar .jstage b,#obtBar .jstage b{font-size:12px!important;overflow:visible!important;text-overflow:clip!important}
  .r9-game #obtBar .jstage .jq,#obtBar .jstage .jq{font-size:11px!important}
}

/* 40_mine.css — [WP-P6, 2026-09-14] BB_MINE_V58 · THE BOARD MARK.
   One plain word in a game's head row when the reader has money running on that game: "your bet" / "2 of your bets"
   (PBI_TOPTIER_SPEC.md S4 + 9.8). Paid only, drawn by tools/host_blocks/73_mine.py after every board render.

   Design law: one typeface var(--ui), two inks var(--ink) / var(--ink-faint), hairlines var(--line). No colour, no
   dot, no badge, no pill, no gold, no avatar — the mark is a word, and the row it sits in already carries the rules.
   ICP law: the mark is the whole sentence. Never a number of dollars here, never a percentage, never "due".

   NO LAYOUT SHIFT. .obt-gch is a flex row whose countdown <i> is flex:1 and already ellipsises; the mark is
   flex:0 0 auto and is inserted before the star, so at 320px the countdown gives up the width and the row's
   min-height (15px) is untouched. line-height is pinned under that 15px so a taller mark can never grow the row.
   The whole file is one rule plus a phone-scoped width cap: nothing else on the board changes. */

.obt-gch .bb-mine73{
  flex:0 0 auto;
  font-family:var(--ui);
  font-size:.68rem;
  line-height:14px;
  letter-spacing:0;
  text-transform:none;
  font-weight:600;
  color:var(--ink);
  white-space:nowrap;
  max-width:10em;
  overflow:hidden;
  text-overflow:ellipsis;
}

/* the phone board is narrower and the head row also carries the price cells below it, so the mark gives up width
   before the countdown and the "$N more" tile do. 899 is the one phone token (MOBILE_OVERHAUL_SPEC.md D13). */
@media (max-width:899px){
  .obt-gch .bb-mine73{font-size:.66rem;max-width:8em}
}

/* BB_LIVE_V60 - WP-L3, the live group in the games column (tools/host_blocks/75_live.py).
   House rules kept: NO new colour, NO new chip, NO badge. The one coloured element on a board row is still the
   "In play" mark the column already ships (.obt-gch .live). The only difference a live group makes is weight:
   its header reads at full ink where every other day header reads faint, so the eye finds it without a decoration. */
.obt-day.obt-daylive { color: var(--ink); border-bottom: 1px solid var(--line-strong, var(--line)); }

/* the state words that now ride beside the mark ("2nd quarter, 5:00 left", "Top 5th", "score not in yet").
   .obt-gch i already ellipsises; this only stops the score cell being crowded out of a narrow rail. */
.obt-gch .live + i { flex: 1 1 auto; min-width: 0; }

/* a row in the live group sits a hair proud of the rest of the column: one hairline, no fill, no glow. */
.obt-day.obt-daylive + .obt-row { border-top: 0; }

@media (max-width: 899px) {
  .obt-day.obt-daylive { letter-spacing: .12em; }
}

/* BB_RAILFIX_V62 - WP-M3 2026-09-15, the left column's settings (tools/host_blocks/78_railfix.py).
   Sizes and focus only: no new colour, no new fill, no new shape. Both themes come free because nothing here
   names a colour - the rules borrow --ink / --line / the accent the page already focuses with. */

/* The five tool-group buttons measured 38 x 13 px on the live page (the Font Awesome glyph is the whole height
   of the button, and one of them had no glyph at all). A real target, and the icon centred in it. */
.obt-rail1 .obt-grp { min-height: 34px; display: flex; align-items: center; justify-content: center; }
.obt-rail1 .obt-grp svg { width: 15px; height: 15px; display: block; }

/* On a 1366x768 laptop the switch column runs past the bottom of the window - measured: the last switch sits at
   y=865 in a 768px viewport - and the rail did not scroll (overflow: visible), so the reader simply could not
   reach it. The leagues column beside it already solves this exactly this way: it scrolls, and draws no bar. */
@media (min-width: 900px) {
  .obt-rail1 { overflow-y: auto; overscroll-behavior: contain; scrollbar-width: none; }
  .obt-rail1::-webkit-scrollbar { display: none; }
}

/* The rail flyout is a menu now: the item under the keyboard has to be visible as such. */
.obt-fly [role="menuitem"]:focus-visible { outline: 2px solid currentColor; outline-offset: -2px; }

@media (max-width: 899px) {
  /* On a phone the rail is gone and every setting lives in the drawer, so the drawer IS the settings screen.
     Measured before this block: the selects 38-39px, the odds-format pair 32px, the three links 32px, the close
     42px - every one of them under a thumb's 44. */
  #obtDrawer select,
  #obtDrawer .obt-ctl,
  #obtDrawer button.obt-ctl { min-height: 44px; }
  #obtDrawer #obtFmt { min-height: 44px; }
  #obtDrawer #obtFmt button { min-height: 44px; padding-top: 10px; padding-bottom: 10px; }
  #obtDrawer .obt-links a { display: flex; align-items: center; min-height: 44px; }
  #obtDx { min-width: 44px; min-height: 44px; }
}

/* =====================================================================================================================
   BB_SWITCHES_V68 - [WP-W6F 2026-09-15] THE SWITCH COLUMN, PUT BACK INTO THE HOUSE RULES.

   OWNER NOTE OFF THE WAVE-4 WALK (changelog 2026-09-15 16:00): "switch column styling = the rejected pills/glow/
   mono-caps look". WP-M3 made every control in that column WORK; nobody made it look like the rest of the product.
   What was actually on the page, measured off the live stylesheet (assets/bb-oddst.ecacd8ca.css):
     * a mono-caps eyebrow - `SWITCHES` in var(--mono) at .44rem with .24em of letter-spacing - which is the exact
       shape the owner struck everywhere else on the site;
     * every label and every state value also in var(--mono), also uppercase, also letter-spaced;
     * a 20 x 34 iOS-shaped pill (border-radius:10px) per switch, with an inset shadow, a gradient thumb, and
       `box-shadow:0 0 10px` of cyan or green glow around the thumb when the switch is on;
     * `text-shadow:0 0 7px` behind the state word when it is on - a lit-neon readout;
     * three more gradients: the rail's own background, the divider above the switches, and the tool buttons, each
       with its own hard-coded cyan/green literal per theme (four near-identical blocks of them).
   None of that is in the design law and none of it is how the console reads. THE RULE HERE: one typeface - var(--ui);
   three inks - var(--ink) / var(--ink-dim) / var(--ink-faint); hairlines - var(--line) / var(--line-strong); and the
   STATE OF A SWITCH IS SHOWN BY WEIGHT AND INK, never by light. On is the darker ink and the heavier word; off is the
   faint ink and the regular word. Nothing glows, nothing is filled, nothing has a colour of its own.

   THE SWITCH ITSELF IS STILL A SWITCH. The metaphor was right - this column is switchgear, and a reader flicking
   "prices" between 1.91 and -110 is throwing a switch - so it stays a two-position toggle. It is just drawn the way
   the rest of the terminal draws things: a square-cornered track in a hairline, a solid block for the lever, and the
   lever moves. It reads as a breaker on a panel, not as a phone setting.

   NOT ONE COLOUR IS NAMED IN THIS FILE. Every value is a token, so light and dark both come free and stay right if
   the palette ever moves. The GREEN "best 1st" switch loses its green on purpose: a switch that is on is a switch
   that is on, and two different on-colours taught the reader a distinction that does not exist.

   ---------------------------------------------------------------------------------------------------------------
   WHY EVERY SELECTOR STARTS WITH THE SAME PREFIX. The rules being replaced are written FOUR times in the live
   stylesheet - once bare, once under `:root[data-theme="light"]`, and once under
   `:root:not([data-theme="dark"]):not([data-theme="light"])` inside `@media (prefers-color-scheme:light)` (twice,
   in two v-blocks). That last one carries three class-points of specificity, so a plain `#obtSw .tg .st` here would
   simply lose to it on a light-preference machine with no explicit theme - the worst kind of bug, because it is
   invisible on the box you test on. The prefix
        :root:is(:not([data-theme="dark"]):not([data-theme="light"]),[data-theme])
   reads "every root, however its theme is set" (no attribute -> the first arm; dark or light -> the second), and
   :is() takes the specificity of its most specific arm, which is exactly the three points those blocks carry. Equal
   specificity, and this file is appended last, so these win - in all three theme states and no other way.
   Everything here is token-only, so ONE declaration block serves every theme; there are no per-theme copies below.
   ---------------------------------------------------------------------------------------------------------------

   THE MARKER. BB_SWITCHES_V68, and it has never been minted, so it can still be renamed - after a mint it is frozen
   (see the note in tools/host_blocks/78_railfix.py about why). V66 is 90_names.py and V67 is the speed package's
   BB_FASTOPEN_V67, so 68 is the first free number at the time of writing. A clash of NUMBERS would in fact be
   harmless - mint_host_css.py and patch_host_v44.py both guard on the literal marker STRING and neither keeps a
   registry of numbers - but two blocks called V67 is a thing a reader has to stop and check, so it is worth a minute.

   SCOPE. Nothing outside the far-left rail is touched: every selector is under `.obt-rail1` or `#obtSw`, and #obtSw
   only exists on a desktop (renderSwitches returns early otherwise). The container rule is fenced to >=1150px
   because the live sheet deliberately strips the rail's background and border below that
   (`@media (max-width:1149px){.obt-rail1{background:transparent;border-right:none}}`) and a higher-specificity rule
   here would have quietly put them back on a 1024px laptop.
   ===================================================================================================================== */

/* ---- the column itself: a panel with a hairline edge, not a gradient with a lit border ---- */
@media (min-width: 1150px) {
  :root:is(:not([data-theme="dark"]):not([data-theme="light"]),[data-theme]) .obt-rail1 {
    background: var(--panel);
    border-right: 1px solid var(--line);
  }
}

/* ---- the five tool buttons: quiet by default, a hairline on hover, ink when their menu is open ----
   THE INK HERE IS --ink-dim AND NOT --ink-faint, ON PURPOSE, and it is the one place in this file where quieter
   would have been wrong. Taking the resting box away leaves the GLYPH as the whole control: there is no border and
   no fill behind it any more, so if the glyph is also the faintest ink in the palette then five live controls -
   Find, Good prices, Mine, the help card, the theme - read as an empty strip of column. The old sheet drew them at
   rgb(74,115,150) on light / a lit cyan on dark, which sits at about --ink-dim's weight, so this KEEPS the resting
   legibility the reader already had and drops only the chrome the owner struck. Hover then adds the hairline and
   open goes to full ink, so the three states still separate. CANNOT BE JUDGED ON THE BENCH: the bench does not
   serve bb-fa-subset.min.css, so four of the five glyphs are absent in every capture here and only WP-M3's inline
   dollar fallback draws. Look at these five on prod after the publish - that is the only honest test of this line. */
:root:is(:not([data-theme="dark"]):not([data-theme="light"]),[data-theme]) .obt-rail1 .obt-ico {
  background: transparent;
  border: 1px solid transparent;
  border-radius: 3px;
  color: var(--ink-dim);
  box-shadow: none;
  transition: color .12s ease, border-color .12s ease;
}
:root:is(:not([data-theme="dark"]):not([data-theme="light"]),[data-theme]) .obt-rail1 .obt-ico:hover {
  background: transparent;
  border-color: var(--line-strong);
  color: var(--ink);
  box-shadow: none;
}
:root:is(:not([data-theme="dark"]):not([data-theme="light"]),[data-theme]) .obt-rail1 .obt-ico.on,
:root:is(:not([data-theme="dark"]):not([data-theme="light"]),[data-theme]) .obt-rail1 .obt-grp[aria-expanded="true"] {
  background: transparent;
  border-color: var(--ink-faint);
  color: var(--ink);
  box-shadow: none;
}

/* ---- the divider above the switches: a hairline, the full width of the column, no fade ---- */
:root:is(:not([data-theme="dark"]):not([data-theme="light"]),[data-theme]) #obtSw::before {
  left: 0;
  right: 0;
  background: var(--line);
}

/* ---- the group label. `capitalize` renders the host's own lower-case word as "Switches": sentence case, one
        typeface, no tracking, no caps. The word itself stays in the host, so a screen reader hears it unchanged. ---- */
:root:is(:not([data-theme="dark"]):not([data-theme="light"]),[data-theme]) #obtSw .swk {
  font-family: var(--ui);
  font-size: 10px;
  font-weight: 500;
  letter-spacing: 0;
  text-transform: capitalize;
  color: var(--ink-faint);
}

/* ---- the name of each switch: plain, lower case, quiet ---- */
:root:is(:not([data-theme="dark"]):not([data-theme="light"]),[data-theme]) #obtSw .tg .nm {
  font-family: var(--ui);
  font-size: 11px;
  font-weight: 400;
  letter-spacing: 0;
  text-transform: none;
  color: var(--ink-faint);
}
:root:is(:not([data-theme="dark"]):not([data-theme="light"]),[data-theme]) #obtSw .tg:hover .nm {
  color: var(--ink-dim);
}

/* ---- the toggle: a square-cornered track in a hairline and a solid lever. No pill, no inset, no gradient. ---- */
:root:is(:not([data-theme="dark"]):not([data-theme="light"]),[data-theme]) #obtSw .tg .sw {
  width: 18px;
  height: 28px;
  border: 1px solid var(--line-strong);
  border-radius: 2px;
  background: transparent;
  box-shadow: none;
}
/* The lever is a BAR, not a dot: wide and shallow, so which end of the track it is at is the thing the eye reads
   first, before it reads the ink. A square in a square is a button; a bar at one end is a switch. */
:root:is(:not([data-theme="dark"]):not([data-theme="light"]),[data-theme]) #obtSw .tg .sw i {
  left: 2px;
  right: 2px;
  height: 8px;
  border-radius: 1px;
  background: var(--ink-faint);
  box-shadow: none;
}
/* 28px track, 1px borders, 26px inside, an 8px bar: 3px of clearance at whichever end it is resting on. */
:root:is(:not([data-theme="dark"]):not([data-theme="light"]),[data-theme]) #obtSw .tg .sw i.up { top: 3px; bottom: auto; }
:root:is(:not([data-theme="dark"]):not([data-theme="light"]),[data-theme]) #obtSw .tg .sw i.dn { top: 15px; bottom: auto; }

/* ---- the state value: the host writes it in caps (AU, VALUE, $10, 1.91) and caps is right for a readout, but it
        is our typeface, on the number-aligned figures, with no tracking and no light behind it. ---- */
:root:is(:not([data-theme="dark"]):not([data-theme="light"]),[data-theme]) #obtSw .tg .st {
  font-family: var(--ui);
  font-size: 11px;
  font-weight: 500;
  letter-spacing: 0;
  font-variant-numeric: tabular-nums;
  color: var(--ink-faint);
  text-shadow: none;
}

/* ---- ON. The whole state change is: the lever goes to full ink, the track's hairline firms up, and the value gets
        one weight heavier and one ink darker. `.grn` (best 1st) is treated identically to `.armed` - see the header. ---- */
:root:is(:not([data-theme="dark"]):not([data-theme="light"]),[data-theme]) #obtSw .tg.armed .sw,
:root:is(:not([data-theme="dark"]):not([data-theme="light"]),[data-theme]) #obtSw .tg.grn .sw {
  border-color: var(--ink-faint);
  box-shadow: none;
}
:root:is(:not([data-theme="dark"]):not([data-theme="light"]),[data-theme]) #obtSw .tg.armed .sw i,
:root:is(:not([data-theme="dark"]):not([data-theme="light"]),[data-theme]) #obtSw .tg.grn .sw i {
  background: var(--ink);
  box-shadow: none;
}
:root:is(:not([data-theme="dark"]):not([data-theme="light"]),[data-theme]) #obtSw .tg.armed .st,
:root:is(:not([data-theme="dark"]):not([data-theme="light"]),[data-theme]) #obtSw .tg.grn .st {
  color: var(--ink);
  font-weight: 600;
  text-shadow: none;
}
:root:is(:not([data-theme="dark"]):not([data-theme="light"]),[data-theme]) #obtSw .tg.armed .nm,
:root:is(:not([data-theme="dark"]):not([data-theme="light"]),[data-theme]) #obtSw .tg.grn .nm {
  color: var(--ink-dim);
}

/* ---- the keyboard. renderSwitches rewrites the whole column on every flick and BB_RAILFIX_V62 puts the focus back
        on the button that was pressed; a reader driving this column from the keyboard has to be able to SEE that. ---- */
:root:is(:not([data-theme="dark"]):not([data-theme="light"]),[data-theme]) #obtSw .tg:focus-visible {
  outline: 2px solid var(--ink-dim);
  outline-offset: 2px;
  border-radius: 2px;
}

/* 81_apps.css - [W9A 2026-09-16, marker BB_APPS_CSS_V72] THE MY APPS PANEL.
   STATUS: complete. Chrome for tools/host_blocks/86_apps.py and nothing else.
   DESIGN LAW: one typeface (var(--ui)), inks, hairlines. No pill, no gauge, no glow, no colour ramp, no lift -
   the panel sits on a hairline border and the page's own panel ink, and nothing else separates it.
   The panel is a plain sheet of rows with checkboxes - the subject-native object for "pick the apps you use"
   is a list you tick, not a set of chips. At 390 it is a full-width sheet anchored under the control.
   MINT: python tools/mint_host_css.py tools/host_css/81_apps.css BB_APPS_CSS_V72  (chains off the css named
   in OddsTerminal.aspx line ~37; delete never-published intermediates + their csproj lines). */

/* The picker lives inside the settings sheet (the controls reparent into it), which is a narrow scrolling
   column. A floating layer inside a narrow column is a layer half off the screen, so the panel is IN FLOW:
   the button opens it, it pushes the rest of the sheet down, and the sheet scrolls as it always has. */
.bba-wrap { display: block; width: 100%; }
.bba-btn { font-family: var(--ui); width: 100%; text-align: left; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }

.bba-panel {
    margin-top: 6px; width: 100%; max-height: min(60vh, 26rem);
    display: flex; flex-direction: column;
    background: var(--panel-2, var(--panel)); color: var(--ink);
    border: 1px solid var(--line); border-radius: 4px; font-family: var(--ui);
}
.bba-head { display: flex; gap: .5rem; align-items: center; padding: .5rem; border-bottom: 1px solid var(--line); }
.bba-q {
    flex: 1 1 auto; min-width: 0; font-family: var(--ui); font-size: .85rem; color: var(--ink);
    background: transparent; border: 1px solid var(--line); border-radius: 3px; padding: .35rem .5rem;
}
.bba-x, .bba-foot button {
    font-family: var(--ui); font-size: .78rem; color: var(--ink-dim); background: transparent;
    border: 1px solid var(--line); border-radius: 3px; padding: .3rem .55rem; cursor: pointer;
}
.bba-x:hover, .bba-foot button:hover { color: var(--ink); }

.bba-list { overflow-y: auto; padding: .25rem 0; }
.bba-g {
    margin: .5rem 0 .15rem; padding: 0 .65rem; font-size: .68rem; letter-spacing: .06em;
    text-transform: uppercase; color: var(--ink-faint);
}
.bba-row {
    display: flex; align-items: center; gap: .55rem; padding: .4rem .65rem;
    font-size: .88rem; line-height: 1.25; cursor: pointer;
}
.bba-row:hover { background: rgba(127, 127, 127, .09); }
.bba-row input { flex: 0 0 auto; margin: 0; }
.bba-row span { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.bba-ex { flex: 0 0 auto; font-style: normal; font-size: .68rem; color: var(--ink-faint); }
.bba-none { padding: .8rem .65rem; font-size: .85rem; color: var(--ink-faint); }

.bba-foot {
    display: flex; align-items: center; justify-content: space-between; gap: .5rem;
    padding: .5rem; border-top: 1px solid var(--line); font-size: .78rem; color: var(--ink-faint);
}

@media (max-width: 560px) {
    .bba-panel { max-height: 60vh; }
    .bba-row { padding: .55rem .65rem; }   /* a 44px tap target on a phone */
}

/* =====================================================================================================================
   BB_DRAWER_CSS_V74 - [W9E 2026-09-16] THE SETTINGS DRAWER, DRAWN AS A SETTINGS PAGE.

   STATUS (for a resumer): COMPLETE on disk. CSS only - no host block was needed, because every word the drawer shows
   is ALREADY written in sentence case by the host ("Watching", "Your apps", "Which country's apps", "Odds shown as",
   "Sort", "More", and the my-apps groups "Australia" / "United States" / "United Kingdom" / "Everywhere else"); the
   old look uppercased them in CSS. Removing `text-transform` gives the owner's sentence case for free and leaves the
   accessible name the screen reader hears exactly as it was. NOT MINTED by this package - the mint command is in the
   package's asks: python tools/mint_host_css.py tools/host_css/82_drawer.css BB_DRAWER_CSS_V74

   THE "UNUSED NUMBER 82" (brief item 3), ANSWERED. It is a HOST BLOCK number, not a css slot, and it is FREE. The
   changelog block of 2026-09-16 that closed wave 7 ends: "NOT built: host block 82_liveleg ('your leg' word on
   Live-now rows, spec in WAVE7_RESULTS LE2 asks) - next mint that touches the host." W8C then built exactly that
   thing the next day and numbered it 83_liveleg.py (BB_LIVELEG_V69), so tools/host_blocks/ runs ... 80_gapmark,
   81_fastopen, [nothing], 83_liveleg ... and 82 was never claimed. Checked, not assumed: `ls tools/host_blocks/`
   has no 82_*, and the only other "82" in the lane's writing is a millisecond figure in the 2026-09-15 live-spine
   block ("NFL 82->168ms"). The two numbering sequences are independent - host_blocks/NN_name.py and
   host_css/NN_name.css each count on their own - so this file taking 82 in the CSS sequence leaves host block 82
   free for whoever needs the next one. It is worth leaving free rather than back-filling: a resumer reading the
   wave-7 changelog will look for 82_liveleg, and finding nothing at 82 is a much smaller trap than finding some
   unrelated block wearing the number the changelog promised.

   WHAT WAS WRONG (measured off round9/out/shots/w9a_panel_390.png + w9a_panel_1600.png and off the live stylesheet
   assets/bb-oddst.ff07cfee.css, the one OddsTerminal.aspx line 37 names):
     * mono-caps eyebrows - `.obt-dlab` is var(--mono) at .64rem with .12em of tracking, uppercased, so the body reads
       WATCHING / YOUR APPS / WHICH COUNTRY'S APPS / ODDS SHOWN AS / SORT / MORE. That is the exact shape the owner
       struck off the switch rail on 2026-09-15 (see 70_switches.css) and off the site everywhere else;
     * a stack of boxed rows - `.obt-ctl` is a 1px box with a var(--panel-2) fill and mono text, and every control in
       the sheet is one, so six settings read as six floating cards inside a card;
     * the odds-format control (`.obt-seg`) lights its chosen side with a filled cyan block and a text-shadow glow;
     * the "More" links are var(--mono) in var(--action-hi) - a third typeface colour in a nine-line panel;
     * the RG line at the foot is var(--mono) by an INLINE style;
     * the close control is a 42px circle with a fill and a ring - a button shaped like nothing else on the page.

   THE RULE HERE, and it is the same rule 70_switches.css set for the rail: one typeface, var(--ui). Three inks,
   var(--ink) / var(--ink-dim) / var(--ink-faint). Hairlines, var(--line) / var(--line-strong). A section title is a
   sentence in the dim ink at the body size. A setting is a 44px ROW with a hairline under it - the way a settings
   page in a good native app is built - not a box. State is shown by INK AND WEIGHT, never by light or fill. Nothing
   here names a colour: every value is a token, so light and dark both come free.

   SCOPE. Two areas, and nothing else on the page:
     (a) `#obtDrawer` and its body - which is the settings sheet, the Good-prices sheet and every other sheet the
         host writes into it, so they all speak the same language;
     (b) the game head's three <select>s (`.obt-ddw` wrapping .obt-msel / .obt-ssel / .obt-lsel) - market, selection
         and line. Their LOOK only: not one selector here changes what they contain, what they do, or their size.
         Behaviour and contents are the picker package's (W9B).
   The my-apps panel's BEHAVIOUR is untouched: this file sets no display, no position, no hidden, no pointer-events
   and no width on any .bba-* element - only type, ink, rules and row height.

   WHY THE `:root:is(...)` PREFIX ON THE NON-DRAWER RULES. The live sheet writes the chip/badge rules FOUR times -
   once bare, once under `:root[data-theme="light"]`, and twice under `:root:not([data-theme="dark"]):not(
   [data-theme="light"])` inside `@media (prefers-color-scheme:light)`. That last form carries three class-points, so
   a bare `.obt-ddw select` here would LOSE on a light-preference machine with no explicit theme - the worst kind of
   bug, because it is invisible on the box you test on. `:root:is(:not([data-theme="dark"]):not([data-theme="light"]),
   [data-theme])` reads "every root, however its theme is set" and :is() takes its most specific arm, which is exactly
   those three points. Equal specificity, and this block is appended last, so these win in all three theme states.
   The drawer rules do not need it: `#obtDrawer` is an id and outranks every one of those blocks already.

   THE THREE `!important`s, each one earned (counted, not estimated - `grep -n '!important' 82_drawer.css | grep ';'`
   returns exactly three DECLARATIONS - and it names them by SELECTOR below rather than by line, because a line
   number in a note is wrong the moment anybody edits the note; that grep also echoes this sentence itself, which
   carries a ';' inside its backticks; a plain
   `grep -c` says 7 because this note names the word four more times. An earlier draft claimed a fourth, on
   `.obt-ddw select`, that was never needed, because no inline style is written on those selects).
   `.obt-drawer p` (the RG line) and the odds-format group carry
   INLINE styles written by the host - font-family:var(--mono) on the RG line, width/text-align on the buttons,
   width:auto on #obtFmt. An inline style beats every selector ever written, so the only way to put the RG line in the
   product's typeface without editing the host is `!important` on that one declaration. The three, by selector, so
   the next reader does not have to hunt: `#obtDrawer .obt-seg` width (section 4 - #obtFmt IS that .obt-seg, and the
   aspx writes width:auto on it inline), and `#obtDrawer > div > p, #obtDrawer p` font-family and font-size
   (section 5 - the RG line, whose font-family:var(--mono) is inline too). Nothing else in this file uses one.
   ===================================================================================================================== */

/* ---------------------------------------------------------------------------------------------------------------
   1. THE DRAWER ITSELF. A sheet of paper with a hairline edge. The old shadow was `-10px 0 50px rgba(0,0,0,.6)`,
   which on a light theme is a black smear down the left of a white panel; a drawer needs to say "this is above the
   page" and one soft step does that.
   --------------------------------------------------------------------------------------------------------------- */
#obtDrawer {
  box-shadow: -1px 0 0 var(--line-strong), -18px 0 40px rgba(0, 0, 0, .18);
  padding: 16px 18px 28px;
}

/* ---- the title. One typeface: the drawer's heading is the page's heading, not a display face. ---- */
#obtDrawer .obt-dh,
#obtDrawer .obt-dh2 {
  font-family: var(--ui);
  font-weight: 600;
  font-size: 1.12rem;
  letter-spacing: -.01em;
  color: var(--ink);
  margin: 2px 52px 14px 0;
  line-height: 1.25;
}
#obtDrawer .obt-dsub {
  font-family: var(--ui);
  font-size: .82rem;
  color: var(--ink-dim);
}

/* ---- the close control. No circle, no fill, no ring - the glyph IS the control, the way the rail's five tools
        became their glyphs in 70_switches.css. It keeps its 42px box as a TAP TARGET (44 at phone widths, below),
        and it keeps --ink-dim rather than --ink-faint for the same reason given there: with the box gone, the
        faintest ink in the palette would read as an empty corner. ---- */
#obtDrawer .obt-dx {
  width: 44px;
  height: 44px;
  top: 8px;
  right: 10px;
  border: 1px solid transparent;
  border-radius: 2px;
  background: transparent;
  color: var(--ink-dim);
  font-size: 1.5rem;
  line-height: 1;
  box-shadow: none;
  transition: color .12s ease, border-color .12s ease;
}
#obtDrawer .obt-dx:hover { color: var(--ink); background: transparent; }
#obtDrawer .obt-dx:focus-visible { outline: 2px solid var(--ink-dim); outline-offset: 2px; }

/* ---------------------------------------------------------------------------------------------------------------
   2. THE SECTION TITLE. A sentence in the dim ink at the body size - "Watching", not WATCHING. The host already
   writes the words this way; all that is taken away is the uppercasing, the tracking and the mono face.
   --------------------------------------------------------------------------------------------------------------- */
#obtDrawer .obt-dlab {
  display: block;
  font-family: var(--ui);
  font-size: .8rem;
  font-weight: 500;
  letter-spacing: 0;
  text-transform: none;
  color: var(--ink-dim);
  margin: 22px 0 2px;
}
#obtDrawer .obt-dlab:first-of-type { margin-top: 12px; }

/* ---------------------------------------------------------------------------------------------------------------
   3. THE ROWS. Every setting in the sheet is the same object: a 44px full-width row, ink on the page's own ground,
   with ONE hairline under it. No box, no fill, no radius. A run of them reads as a list, which is what it is.
   `.obt-ctl` covers the watched-games button, the country <select>, the sort <select> and the my-apps button
   (86_apps.py gives it `class="obt-ctl bba-btn"`); `#obtDrawer select` covers any select the host reparents in.
   --------------------------------------------------------------------------------------------------------------- */
#obtDrawer .obt-ctl,
#obtDrawer select,
#obtDrawer select.obt-ctl,
#obtDrawer button.obt-ctl,
#obtDrawer .obt-links a {
  appearance: none;
  -webkit-appearance: none;
  box-sizing: border-box;
  width: 100%;
  min-height: 44px;
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 0;
  border: 0;
  border-bottom: 1px solid var(--line);
  border-radius: 0;
  background: transparent;
  color: var(--ink);
  font-family: var(--ui);
  font-size: .95rem;
  font-weight: 400;
  letter-spacing: 0;
  text-transform: none;
  text-align: left;
  cursor: pointer;
}
/* a <select> cannot be a flex container in every engine - give it the same height and baseline the other way */
#obtDrawer select,
#obtDrawer select.obt-ctl {
  display: block;
  line-height: 44px;
  padding-right: 24px;
}
#obtDrawer .obt-ctl:hover,
#obtDrawer select:hover,
#obtDrawer .obt-links a:hover { color: var(--ink); border-bottom-color: var(--line-strong); }
#obtDrawer .obt-ctl:focus-visible,
#obtDrawer select:focus-visible,
#obtDrawer .obt-links a:focus-visible { outline: 2px solid var(--ink-dim); outline-offset: -2px; }
#obtDrawer .obt-ctl.on { border-color: transparent; border-bottom-color: var(--line-strong); color: var(--ink); font-weight: 600; }

/* the search input the host also draws as .obt-ctl reads as a row you type into, not a box */
#obtDrawer input.obt-ctl { cursor: text; width: 100%; }

/* ---- the chevron. Drawn, not downloaded: the old one is a cyan stroke baked into a data: URI, which cannot follow
        the ink. Two borders on the wrapper, rotated, in --ink-faint. The wrapper is the host's own <div id="shX">
        holding the reparented control, so nothing new is needed in the DOM. ---- */
#obtDrawer #shRegion,
#obtDrawer #shSort,
#obtDrawer #shBook { position: relative; }
#obtDrawer #shRegion::after,
#obtDrawer #shSort::after {
  content: "";
  position: absolute;
  right: 4px;
  top: 17px;
  width: 7px;
  height: 7px;
  border-right: 1.5px solid var(--ink-faint);
  border-bottom: 1.5px solid var(--ink-faint);
  transform: rotate(45deg);
  pointer-events: none;
}

/* ---------------------------------------------------------------------------------------------------------------
   4. ODDS SHOWN AS. Two words on one row. The chosen one is the darker ink one weight heavier; the other is faint.
   No fill, no glow - the same language the switch rail speaks (70_switches.css: "the state of a switch is shown by
   weight and ink, never by light"). `width:auto` is set INLINE on #obtFmt by the aspx, hence the one !important.
   --------------------------------------------------------------------------------------------------------------- */
#obtDrawer .obt-seg {
  width: 100% !important;
  display: flex;
  border: 0;
  border-bottom: 1px solid var(--line);
  border-radius: 0;
  background: transparent;
  overflow: visible;
  min-height: 44px;
}
#obtDrawer .obt-seg button {
  flex: 0 0 auto;
  min-height: 44px;
  padding: 0 28px 0 0;
  border: 0;
  background: transparent;
  font-family: var(--ui);
  font-size: .95rem;
  font-weight: 400;
  letter-spacing: 0;
  text-transform: none;
  color: var(--ink-faint);
  text-shadow: none;
  box-shadow: none;
  cursor: pointer;
}
#obtDrawer .obt-seg button.on {
  background: transparent;
  color: var(--ink);
  font-weight: 600;
  text-shadow: none;
}
#obtDrawer .obt-seg button:focus-visible { outline: 2px solid var(--ink-dim); outline-offset: -2px; }

/* ---------------------------------------------------------------------------------------------------------------
   5. MORE. Three links, three rows, the same as every other row - in the page's ink, not a link colour. The arrow
   the host writes stays; it is the only thing that says these leave the screen.
   --------------------------------------------------------------------------------------------------------------- */
#obtDrawer .obt-links {
  display: block;
  margin-top: 0;
  gap: 0;
}
#obtDrawer .obt-links a {
  justify-content: space-between;
  font-size: .95rem;
  color: var(--ink);
  text-decoration: none;
}

/* ---- the RG line. The words are untouched and stay exactly where the host puts them; only the typeface and the
        size move, and only because the host writes them INLINE. ---- */
#obtDrawer > div > p,
#obtDrawer p {
  font-family: var(--ui) !important;
  font-size: .78rem !important;
  color: var(--ink-faint);
  line-height: 1.6;
}

/* ---------------------------------------------------------------------------------------------------------------
   6. THE MY-APPS PANEL (86_apps.py / 81_apps.css, W9A). BEHAVIOUR UNTOUCHED - in flow, opens and closes the same
   way, the same rows, the same checkboxes. What changes: the group headings stop shouting (the host already writes
   "Australia"), the rows are 44px everywhere rather than only on a phone, and the sheet sits on hairlines instead of
   a second rounded card inside the first one.
   --------------------------------------------------------------------------------------------------------------- */
#obtDrawer .bba-panel {
  border-left: 0;
  border-right: 0;
  border-radius: 0;
  background: transparent;
}
/* A ONE-LINE FIX FOR A REAL BUG, and it is a LOOK bug so it belongs here. 81_apps.css gives .bba-panel
   `display:flex`, and an author rule beats the browser's own `[hidden]{display:none}` - so bbAppsToggle(false)
   sets the attribute, the picker stays on the screen, and "Close" and "Done" do nothing a reader can see.
   Measured on the bench at 1600 and 390 in both themes before this line, and it is why drawer_capture.py check
   D9 exists. The attribute is the state; this makes the state visible. */
:root:is(:not([data-theme="dark"]):not([data-theme="light"]),[data-theme]) .bba-panel[hidden] { display: none; }
#obtDrawer .bba-head,
#obtDrawer .bba-foot { padding: 6px 0; }
#obtDrawer .bba-q {
  font-family: var(--ui);
  font-size: .92rem;
  min-height: 40px;
  border: 0;
  border-bottom: 1px solid var(--line);
  border-radius: 0;
  background: transparent;
  padding: 0 0 0 2px;
}
#obtDrawer .bba-x,
#obtDrawer .bba-foot button {
  font-family: var(--ui);
  font-size: .88rem;
  min-height: 40px;
  border: 0;
  border-radius: 0;
  background: transparent;
  color: var(--ink-dim);
  padding: 0 2px;
}
#obtDrawer .bba-x:hover,
#obtDrawer .bba-foot button:hover { color: var(--ink); }
#obtDrawer .bba-g {
  font-family: var(--ui);
  font-size: .8rem;
  font-weight: 500;
  letter-spacing: 0;
  text-transform: none;
  color: var(--ink-dim);
  margin: 16px 0 2px;
  padding: 0;
}
#obtDrawer .bba-row {
  min-height: 44px;
  padding: 0;
  font-family: var(--ui);
  font-size: .95rem;
  color: var(--ink);
  border-bottom: 1px solid var(--line);
}
#obtDrawer .bba-row:hover { background: transparent; color: var(--ink); }
#obtDrawer .bba-ex,
#obtDrawer .bba-none { font-family: var(--ui); font-size: .8rem; color: var(--ink-faint); }
#obtDrawer .bba-none { padding: 12px 0; }
#obtDrawer .bba-foot { color: var(--ink-faint); font-family: var(--ui); font-size: .88rem; }

/* ---------------------------------------------------------------------------------------------------------------
   7. THE TWO TOP-BAR GLYPHS that open this drawer and the help card. The live sheet hovers them to a hard-coded
   #0B72A8 on a #38C7FF border (`.obt-tico:hover,.obt-tnav button:hover,.obt-back:hover{border-color:#38C7FF;
   color:#0B72A8}`, read out of assets/bb-oddst.63ba3492.css, the sheet prod serves today) - a mid blue that is
   legible on a white page and nearly invisible on the dark one, which is finding (2) in this package's brief.

   MEASURED ON PROD BEFORE WRITING THIS, as a guest with bb_noga=1, at 1600 and at 390, in dark and in light
   (tools/drawer_prod_ink.py + tools/drawer_prod_probe2.py), because a claim about the live site has to be read off
   the live site. THE HONEST RESULT, and it is not what the brief assumed:
     * the RESTING ink of every one of these glyphs is already on palette - --ink-dim, rgb(147,161,181) dark and
       rgb(72,86,107) light, identical at both widths. Nothing to fix there;
     * their LIGHT border is `rgb(227,231,238)`, a hard-coded opaque grey that is not any token on the page
       (--line light is rgba(16,24,40,.08)). Off palette;
     * and the reason nobody has complained: `#obtTopKeep`, the strip that holds all three `.obt-tico`s including
       `#obtGear`, computes `display:none` on prod - the three glyphs measure 0x0 at 1600 AND at 390. The door a
       reader actually uses is the rail switch `#obtSw .tg[data-s="app"]` (59x62) or the new top bar's "Pick your
       apps" (`#bbtApps`). So this section is a fix for chrome that is currently PARKED, and it earns its place by
       making sure that whenever the strip is shown again it is on palette from the first paint, not by curing
       something the reader can see today. The thing the reader CAN see is the close control, section 1: on prod it
       is a 42x42 (44 at phone) filled circle with a --line-strong ring - ink on palette, shape belonging to nothing
       else on the page.
   Same treatment as the rail's five tools: the glyph is the control, a hairline appears on hover, the ink goes to
   full --ink.
   --------------------------------------------------------------------------------------------------------------- */
:root:is(:not([data-theme="dark"]):not([data-theme="light"]),[data-theme]) .obt-top .obt-tico {
  border: 1px solid transparent;
  border-radius: 2px;
  background: transparent;
  color: var(--ink-dim);
  box-shadow: none;
  transition: color .12s ease, border-color .12s ease;
}
:root:is(:not([data-theme="dark"]):not([data-theme="light"]),[data-theme]) .obt-top .obt-tico:hover {
  border-color: var(--line-strong);
  color: var(--ink);
  background: transparent;
  box-shadow: none;
}
:root:is(:not([data-theme="dark"]):not([data-theme="light"]),[data-theme]) .obt-top .obt-tico:focus-visible {
  outline: 2px solid var(--ink-dim);
  outline-offset: 2px;
}

/* ---------------------------------------------------------------------------------------------------------------
   8. THE GAME HEAD'S THREE DROPDOWNS - market, selection, line. LOOK ONLY.
   What was there: a cyan chevron baked into a data: URI, a 5px radius, var(--mono) at 700, `.hot` adding
   `box-shadow:0 0 14px rgba(127,220,255,.08)` and `.lit` adding a cyan fill plus an inset cyan ring. Three coloured
   boxes in a row across the top of the read.
   What is here: a plain ink row with a hairline under it and a drawn chevron. The wrapper `.obt-ddw` is a label the
   host already emits, so the chevron has somewhere to live with no DOM change. Which one is in focus is still said -
   `.hot` (nothing picked yet) is the dim ink with a firmer rule; `.lit` (the line in play) is full ink, one weight
   heavier. Sizes, widths and paddings are left exactly as the layout rules set them.
   --------------------------------------------------------------------------------------------------------------- */
:root:is(:not([data-theme="dark"]):not([data-theme="light"]),[data-theme]) .obt-ddw { position: relative; }
:root:is(:not([data-theme="dark"]):not([data-theme="light"]),[data-theme]) .obt-ddw > i {
  font-family: var(--ui);
  font-size: .68rem;
  letter-spacing: 0;
  text-transform: none;
  color: var(--ink-faint);
}
:root:is(:not([data-theme="dark"]):not([data-theme="light"]),[data-theme]) .obt-ddw select,
:root:is(:not([data-theme="dark"]):not([data-theme="light"]),[data-theme]) .obt-ddw .obt-lsel {
  background-image: none;
  background-color: transparent;
  border: 0;
  border-bottom: 1px solid var(--line);
  border-radius: 0;
  color: var(--ink);
  font-family: var(--ui);
  font-weight: 500;
  box-shadow: none;
}
:root:is(:not([data-theme="dark"]):not([data-theme="light"]),[data-theme]) .obt-ddw::after {
  content: "";
  position: absolute;
  right: 5px;
  bottom: 13px;
  width: 6px;
  height: 6px;
  border-right: 1.5px solid var(--ink-faint);
  border-bottom: 1.5px solid var(--ink-faint);
  transform: rotate(45deg);
  pointer-events: none;
}
:root:is(:not([data-theme="dark"]):not([data-theme="light"]),[data-theme]) .obt-ddw.hot select,
:root:is(:not([data-theme="dark"]):not([data-theme="light"]),[data-theme]) .obt-ddw.hot .obt-lsel {
  color: var(--ink-dim);
  border-bottom-color: var(--line-strong);
  background-color: transparent;
  box-shadow: none;
}
:root:is(:not([data-theme="dark"]):not([data-theme="light"]),[data-theme]) .obt-ddw.lit select,
:root:is(:not([data-theme="dark"]):not([data-theme="light"]),[data-theme]) .obt-ddw.lit .obt-lsel {
  color: var(--ink);
  font-weight: 600;
  border-bottom-color: var(--ink-faint);
  background-color: transparent;
  box-shadow: none;
}
:root:is(:not([data-theme="dark"]):not([data-theme="light"]),[data-theme]) .obt-ddw select:focus,
:root:is(:not([data-theme="dark"]):not([data-theme="light"]),[data-theme]) .obt-ddw .obt-lsel:focus {
  outline: 2px solid var(--ink-dim);
  outline-offset: -2px;
  border-bottom-color: var(--ink-faint);
  box-shadow: none;
}
/* the one-line read of the same strip, when there is nothing to choose */
:root:is(:not([data-theme="dark"]):not([data-theme="light"]),[data-theme]) .obt-build.v38 .obt-one {
  font-family: var(--ui);
  font-weight: 500;
  border: 0;
  border-bottom: 1px solid var(--line);
  border-radius: 0;
  color: var(--ink);
}

/* ---------------------------------------------------------------------------------------------------------------
   9. PHONE. The drawer IS the settings screen there, so every row stays a thumb's 44px and the sheet gets a little
   more air at the foot for the home bar.
   --------------------------------------------------------------------------------------------------------------- */
@media (max-width: 899px) {
  #obtDrawer .obt-ctl,
  #obtDrawer select,
  #obtDrawer button.obt-ctl,
  #obtDrawer .obt-links a,
  #obtDrawer .obt-seg,
  #obtDrawer .obt-seg button,
  #obtDrawer .bba-row { min-height: 44px; }
  #obtDrawer { padding-bottom: 34px; }
}

/* 83_hero.css - [W10A 2026-09-16] BB_HERO_CSS_V77 - THE HERO BAND.
   ================================================================================================================
   STATUS: complete on disk. Minted by tools/mint_host_css.py onto the css named in OddsTerminal.aspx line ~37.
   Owned by W10A with tools/host_blocks/89_hero.py, src/00d_hero.js and src/00e_colours.js.

   WHAT IT DRESSES. The band the host block emits at the top of the game view: back arrow, away crest + name, "@"
   (or the live score), home crest + name, and when it starts. Plus the two club-colour edge bars that run the
   full height of the head, the skeleton bars that stand in for the bet while it resolves, and the scroll offset
   that keeps the sticky head off the first line of the read.

   THE HEAD BUDGET IS REAL. tools/phone_metrics.py asserts H1 (.obt-wsid <= 112 CSS px on every stop, every
   league, both themes) and G2 (<= 80px once scrolled). The band is 34px, the bet line 34-40px (src/06_sheet.css),
   the "our call" line 24px when it is there, plus 4px of pad and a hairline: about 97-103px. Scrolled, the "our
   call" line goes and the band drops to 31px with 20px crests: about 66px. Both inside the budget, measured.

   COLOUR. --bbh-a and --bbh-h are written onto the head by BBHero.paint() (src/00d_hero.js) from the 327-team
   table in src/00e_colours.js, and ONLY when the club's colour clears 3:1 against the real ground behind the
   band. Every rule here therefore falls back to var(--ink-dim): a league we have no table for (UFC fighters,
   NCAAF programs) and a club whose colour dies on this panel both get honest ink, never an invented hue.

   Design law: one typeface var(--ui), inks, hairlines. No pills, no glow, no gradients, no mono caps. The crests
   are club marks, not avatars, and drop themselves when the image does not load.
   ================================================================================================================ */

/* --- the scroll offset (D1), both widths ---------------------------------------------------------------------
   The head is position:sticky (src/scenes.css:141) and pulls itself 12px up out of the stage's padding, so
   anything the browser scrolls to lands under it. 89_hero.py measures the head after every render and writes its
   real height (+12 for the pull) here; these two rules are what spends it. Default 0px, so a browser that never
   gets the measurement behaves exactly as before. */
#obtStage{scroll-padding-top:var(--bb-headh,0px)}
#obtStage .bc,#obtStage .r9-rule,#obtStage .r9-lead,#obtStage .r9-tabs,
#obtStage .r9-door,#obtStage .obt-pickrow,#obtStage .r9-helpers{scroll-margin-top:var(--bb-headh,0px)}

/* --- the two club colours, on the two edges of the head ------------------------------------------------------
   .obt-wsid.v39 is position:sticky, which is a positioned box, so these two absolute children anchor to it
   without adding position:relative (which would kill the sticky). The head is full-bleed on a phone
   (margin:-12px -12px), so left:0 / right:0 are the screen edges. */
.obt-wsid[data-bbh]{--bbh-w:3px}
.obt-wsid[data-bbh]::before,.obt-wsid[data-bbh]::after{
  content:"";position:absolute;top:0;bottom:0;width:var(--bbh-w);pointer-events:none;z-index:1}
.obt-wsid[data-bbh]::before{left:0;background:var(--bbh-a,var(--ink-dim))}
.obt-wsid[data-bbh]::after{right:0;background:var(--bbh-h,var(--ink-dim))}

/* --- the band ------------------------------------------------------------------------------------------------ */
@media (max-width:899px){
  .obt-stage .obt-wsid.phh .bbh{display:flex;align-items:center;gap:6px;height:34px;min-width:0}
  /* MEASURED at 390px: back 44 + 2 crests + 2 names + "@" + "starts in 45h" came to 378 of 378 usable px and both
     club names ellipsised ("Docke...", "Sydney Swa..."). The back arrow keeps its 44px hit area (WCAG 2.5.5) and
     gives 14px of it back to the LAYOUT with a negative margin - the same trick row A already used vertically. */
  .obt-stage .obt-wsid.phh .bbh .phh-back{margin-right:-14px}
  .obt-stage .bbh-tm{display:flex;align-items:center;gap:5px;min-width:0;flex:0 1 auto}
  .obt-stage .bbh-tm b{font-family:var(--ui);font-size:.92rem;font-weight:600;color:var(--ink);line-height:1.15;
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}
  /* THE CRESTS, LARGE. 16px was a favicon; 26px is a club mark a reader recognises at arm's length in an ad break. */
  .obt-stage .bbh-cr{width:26px;height:26px;object-fit:contain;flex:0 0 auto;display:block}
  .obt-stage .bbh-cr.off{width:0;height:26px}
  .obt-stage .bbh-at{flex:0 0 auto;color:var(--ink-faint);font-size:.78rem;line-height:1}
  .obt-stage .bbh-sc{flex:0 0 auto}
  .obt-stage .bbh-sc b{font-family:var(--ui);font-size:1rem;font-weight:600;color:var(--ink);
    font-variant-numeric:tabular-nums;white-space:nowrap}
  .obt-stage .bbh-when{flex:0 0 auto;margin-left:auto;padding-left:6px;font-family:var(--ui);font-size:.78rem;
    font-weight:400;color:var(--ink-faint);line-height:1.2;white-space:nowrap}
  .obt-stage .bbh-when.on{color:var(--ink)}

  /* collapsed (the head shrinks past 120px of reading, tools/host_css/30_phone.css). 31 + the bet line + the
     hairline keeps G2's 80px ceiling. */
  #obtStage.bb-ph-scrolled .obt-wsid.phh .bbh{height:31px}
  #obtStage.bb-ph-scrolled .obt-wsid.phh .bbh-cr{width:20px;height:20px}
  #obtStage.bb-ph-scrolled .obt-wsid.phh .bbh-cr.off{height:20px}

  /* THE NARROW PHONE (iPhone SE, 320px). MEASURED with the phone gate's H2: at 320 the two club names ellipsised
     on AFL, EPL and UFC - the row needed about 43px it did not have. Nothing is abbreviated into a code and no
     name is cut: the word "starts" goes (the countdown still reads "in 45h" beside two crests), the crests give
     up 6px, the gaps 2px each and the back arrow 4px more of its hit area. That is 49px, and every name fits. */
  @media (max-width:359px){
    .obt-stage .obt-wsid.phh .bbh{gap:4px}
    .obt-stage .obt-wsid.phh .bbh .phh-back{margin-right:-18px}
    .obt-stage .bbh-cr{width:20px;height:20px}
    .obt-stage .bbh-cr.off{height:20px}
    .obt-stage .bbh-tm b{font-size:.86rem}
    .obt-stage .bbh-when{font-size:.74rem;padding-left:4px}
    .obt-stage .bbh-when .bbh-pre{display:none}
    .obt-stage .bbh-at{margin:0 -2px}
  }
  .obt-stage .bbh-when .bbh-pre{font-style:normal}
}

/* --- the desktop band ----------------------------------------------------------------------------------------
   The desktop keeps its own composition this wave (W10B owns the desktop law); all that changes here is the two
   edge bars above and the size of the two crests, so a 1600px reader gets the same "whose game is this" answer. */
@media (min-width:900px){
  .obt-stage .obt-wsid.v39.bbhd .hr1 .tm img{width:33px;height:33px;object-fit:contain}
  .obt-stage .obt-wsid.v39.bbhd .hr1 .tm .ph{width:33px;height:33px;display:inline-block}
  .obt-stage .obt-wsid.v39.bbhd{padding-left:14px;padding-right:14px}
  .obt-wsid.bbhd{--bbh-w:4px}
}

/* --- the skeleton (D6): the shape of what is coming, never the word "Loading" -------------------------------- */
.obt-stage .phh-line.skel{display:flex;align-items:center;gap:9px}
.obt-stage .phh-line.skel .bbh-sk{display:block;height:11px;border-radius:2px;background:var(--ink-faint);opacity:.22;
  animation:bbhsk76 1.15s ease-in-out infinite alternate}
.obt-stage .phh-line.skel .bbh-sk.w1{width:44%;max-width:210px}
.obt-stage .phh-line.skel .bbh-sk.w2{width:22%;max-width:104px}
@keyframes bbhsk76{from{opacity:.16}to{opacity:.34}}
@media (prefers-reduced-motion:reduce){
  .obt-stage .phh-line.skel .bbh-sk{animation:none;opacity:.24}
}

/* 84_desklaw.css - [W10B, 2026-09-16, marker BB_DESKLAW_CSS_V78] THE DESIGN LAW ON THE CONSOLE.
   ==================================================================================================================
   STATUS: complete on disk, measured green by tools/desk_law_test.py at 1600 and 390 over afl / nfl / mlb, every
   tab. Chained the way 81_apps.css / 82_drawer.css are - the INTEGRATOR mints, this package never does:
       python tools/mint_host_css.py tools/host_css/84_desklaw.css BB_DESKLAW_CSS_V78
   Bench copy: python tools/bench_css_chain.py   (it is in that script's CHAIN; --resync 84_desklaw re-appends it
   after an edit).

   OWNER, 2026-09-15 (memory feedback-design-never-ai-looking): the pills, the mono-caps eyebrows, the glow and the
   nested cards were rejected by name. The 2026-09-16 18:20 desktop walk found them still all over the console -
   OUR CALL, THE FORECAST, MACHINE RANKS, the left rail in mono caps, a vertical "GAMES" label - plus 11-14 CLIPPED
   texts and 7-20 texts under 10 px per tab (round9/shots/live_desk/report.json). Critique defects D5 and D7,
   lenses L4 and L7.

   MEASURED BEFORE (bench, 1600, NFL, five tabs): 368 upper-cased or letter-spaced elements, 22 pills, 5 clipped
   texts, 436 texts under 12 px. AFTER: 0 / 0 / 0 / 0. Same at 390 with the 13 px floor.

   THE SECTIONS
     0. THE BLANKET. Nothing in the console is upper-cased or letter-spaced by css any more - one exception, the
        owner's own CTA pill (.r9cta) and everything inside it. Sections 1-6 are the manners: each converted label
        also gets the right typeface, ink and size instead of merely losing its capitals.
     1. THE LEFT RAIL - league names in sentence case; the open league marked by INK WEIGHT and a hairline.
     2. THE SWITCHES COLUMN + the top chrome.
     3. THE GAMES COLUMN - day headers, kick-off times, the "In play" mark, the vertical label, the crowd tick.
     4. THE GAME HEAD - "Our call" in words; the forecast / ranks chips become plain ink readings separated by a
        hairline; the venue sentence wraps instead of being cut mid-word.
     5. THE BOTTOM BAR + THE CHAT COLUMN.
     6. THE FIVE TABS (scene engine).
     7. THE FLOOR - one list, one variable: 12 px on a desktop, 13 px on a phone.

   WHY !important IS USED HERE AND NOT ELSEWHERE. The scene stylesheet (assets/bb-oddst-scenes.<h8>.css) is injected
   by the scene loader at RUNTIME, so it lands after this host sheet in the cascade and wins every tie; several of
   its own rules are already !important. The blanket, the scene-facing rules and the floor therefore carry
   !important on the properties they own. Host-only rules do not.

   WHAT THIS SHEET DOES NOT DO: no layout rewrite, no colour system, no new component. Team colours, the hero band
   and the strips are W10A's and wave 11's work.
   ================================================================================================================== */

/* ---- 0. THE BLANKET -------------------------------------------------------------------------------------------
   Every element and every ::before / ::after inside the terminal page, except the CTA pill. A label that needs
   capitals now has to carry them in its own HTML (a team abbreviation, "AU"), which is the honest place for them. */
.obt-page *:not(.r9cta):not(.r9cta *),
.obt-page *:not(.r9cta):not(.r9cta *)::before,
.obt-page *:not(.r9cta):not(.r9cta *)::after {
  text-transform: none !important;
  letter-spacing: normal !important;
}
/* the switches column names itself in sentence case, which is capitalisation, not shouting */
.obt-page #obtSw .swk,
.obt-page #obtSw .tg .nm { text-transform: capitalize !important; }

/* the floor, declared once and read by section 7 */
.obt-page { --bbfloor: 12px; }
@media (max-width: 767px) { .obt-page { --bbfloor: 13px; } }

/* ---- 1. THE LEFT RAIL ------------------------------------------------------------------------------------------
   Was: mono, upper-cased, letter-spaced, .7rem, every league in a bordered box and the open one in a cyan box.
   Now: the league's own name ("La Liga", "Cricket" - they are proper names in the host's LEAGUES table, so losing
   the transform gives the right word, not a lower-case one), the crest bigger, ink weight for the one that is open. */
@media (min-width: 768px) {
  .obt-page #obtRail .obt-lg {
    font-family: var(--ui);
    font-weight: 400;
    color: var(--ink-dim);
    background: transparent;
    border: 0;
    border-radius: 0;
    padding: 7px 9px 7px 10px;
    min-height: 34px;
  }
  .obt-page #obtRail .obt-lg img { width: 18px; height: 18px; }
  .obt-page #obtRail .obt-lg:hover { color: var(--ink); background: transparent; }
  .obt-page #obtRail .obt-lg.on {
    color: var(--ink);
    font-weight: 600;
    background: transparent;
    border: 0;
    border-left: 1px solid var(--ink);
    padding-left: 9px;
  }
}

/* ---- 2. THE SWITCHES COLUMN + THE TOP CHROME ------------------------------------------------------------------
   70_switches.css (W9E) already gave these sentence case; what it left behind is 10-11 px. */
.obt-page #obtSw .swk { font-family: var(--ui) !important; color: var(--ink-faint) !important; }
.obt-page #obtSw .nm,
.obt-page #obtSw .st,
.obt-page #obtSw .tg .nm,
.obt-page #obtSw .tg .st { font-family: var(--ui) !important; }

/* ---- 3. THE GAMES COLUMN -------------------------------------------------------------------------------------- */
.obt-page .obt-day { font-family: var(--ui); font-weight: 600; color: var(--ink-dim); }
.obt-page .obt-gch { font-family: var(--ui); }
.obt-page .obt-gch .live { padding: 1px 6px; }
.obt-page .obt-days button { font-family: var(--ui); }
/* the crowd tick was a 8.3 px lozenge on the board row */
.obt-page .obt-crowdtick { border-radius: 0 !important; }
/* the vertical label on the collapsed games column: a word, not a letter-spaced 9 px monogram */
.obt-page .obt-app.r9-game .obt-gamescol:before {
  content: 'Games' !important;
  font-family: var(--ui) !important;
  font-size: var(--bbfloor) !important;
  width: 22px !important;
  color: var(--ink-dim) !important;
}

/* ---- 4. THE GAME HEAD ------------------------------------------------------------------------------------------
   THE ROW. It was one line that never wrapped and hid whatever did not fit ("MetLife Stadium, wind 16 km/h from the
   north, rain looks likely, about" - cut mid-sentence on every tab). It now wraps: the call stays on the first line
   and the readings take the room they need underneath. */
.obt-page .obt-wsid.v39 .hr2 {
  flex-wrap: wrap;
  white-space: normal;
  overflow: visible;
  row-gap: 5px;
  column-gap: 14px;
}
.obt-page .obt-wsid.v39 .hr2 .obt-ctxrow.v37 {
  flex: 1 1 100%;
  flex-wrap: wrap;
  overflow: visible;
  justify-content: flex-start;
  gap: 4px 0;
}
/* THE READINGS. Were rounded chips on a panel fill - the exact thing the owner rejected. Now a plain ink row:
   a label, its number, and a hairline between one reading and the next. */
.obt-page .ctxc,
.obt-page .obt-ctxrow.v37 .ctxc {
  background: transparent;
  border: 0;
  border-radius: 0;
  box-shadow: none;
  padding: 1px 0;
  margin: 0;
  max-width: none;
  white-space: normal;
  overflow: visible;
  text-overflow: clip;
  align-items: baseline;
  gap: 6px;
}
.obt-page .obt-ctxrow.v37 .ctxc + .ctxc,
.obt-page .obt-ctxrow .ctxc + .ctxc { border-left: 1px solid var(--line); padding-left: 16px; margin-left: 16px; }
.obt-page .ctxc:hover,
.obt-page .obt-ctxrow.v37 .ctxc:hover { border-color: transparent; }
.obt-page .ctxc:hover b,
.obt-page .obt-ctxrow.v37 .ctxc:hover b { text-decoration: underline; text-underline-offset: 3px; }
.obt-page .ctxc i,
.obt-page .obt-ctxrow.v37 .ctxc i {
  font-family: var(--ui);
  font-style: normal;
  font-weight: 400;
  color: var(--ink-dim);
  white-space: normal;
}
.obt-page .ctxc b,
.obt-page .obt-ctxrow.v37 .ctxc b {
  font-family: var(--ui);
  font-weight: 600;
  color: var(--ink);
  white-space: normal;
  overflow: visible;
  text-overflow: clip;
}
.obt-page .obt-ctxrow .ctxk,
.obt-page .obt-ctxrow.v37 .ctxk { font-family: var(--ui); color: var(--ink-faint); }
/* "OUR CALL" -> "Our call". The words in the host are lower case ("our call"), so losing the transform alone would
   leave a lower-case label at the top of the page; ::first-letter puts the sentence case back without touching the
   host string, and a pseudo-element the blanket does not reach. */
.obt-page .obt-callline .ck { font-family: var(--ui); color: var(--ink-dim); }
.obt-page .obt-callline .ck::first-letter { text-transform: uppercase; }
.obt-page .obt-callline b,
.obt-page .obt-callline .pr,
.obt-page .obt-callline .cw { font-size: 13px; }
/* THE GROUND / ROOF / WIND SENTENCE. The inline style on the element says nowrap + ellipsis, so this is the one
   place the sheet has to shout over an attribute. It gets its own line and says all of itself. */
.obt-page .obt-ghwx {
  white-space: normal !important;
  overflow: visible !important;
  text-overflow: clip !important;
  min-width: 0 !important;
  flex: 1 1 100% !important;
  line-height: 1.4;
}

/* ---- 5. THE CHAT COLUMN ----------------------------------------------------------------------------------------
   the chat's own "what the question was about" line was one nowrap line that cut the bet in half
   ("Steelers with the line in the first quarter . $2.15" - 78 px of it hidden). It wraps. */
.obt-page .r9o .msg .who small,
.obt-page .r9o-tabs .me {
  white-space: normal !important;
  overflow: visible !important;
  text-overflow: clip !important;
}

/* ---- 6. THE FIVE TABS (scene engine) --------------------------------------------------------------------------
   THE INITIALS CIRCLE. Owner law, 2026-09-12 (memory betbetter-console-closeout-go): no avatars on this console,
   ever, faces OR initials. The who-is-out rows still draw one as a 10 px "JJ" disc when a player has no headshot.
   It goes; the name it sat beside says everything it said. A real headshot is left alone - that is a separate
   ruling and a separate package's file (wave 11, J5). */
.obt-page #obtStage .r9-face.ini { display: none !important; }

/* ---- 6b. THE TWO BOXES THE FLOOR ITSELF WOULD HAVE BURST -------------------------------------------------------
   Raising a label from 9-10 px to the floor makes it wider, and two places were sized for the old number:
   the tick strip's team codes sat in a 30 px cell ("NMFC" then hid 7 px of itself), and a bookmaker name in a
   board price cell was already cut ("Betfair Exchange" in 91 px). Both get room instead of a smaller word. */
.obt-page #obtStage .r9-tl2 span {
  width: auto !important;
  min-width: 30px;
  padding: 0 1px;
  overflow: visible !important;
  text-overflow: clip !important;
}
.obt-page #obtRows .obt-cell i {
  white-space: normal !important;
  overflow: visible !important;
  text-overflow: clip !important;
  line-height: 1.25;
}

/* ---- 7. THE FLOOR ---------------------------------------------------------------------------------------------
   Every text the walk measured under the floor, by the selector it actually sits on (the paths came out of
   desk_law_test.py's own report, so this list is measured, not guessed). One value: --bbfloor, 12 px on a desktop
   and 13 px on a phone. SVG labels are NOT here - a drawing's label is painted at viewBox scale, so its floor is
   host block 91_desklaw.py (BB_DESKLAW_V79). */
.obt-page #obtRail .obt-lg,
.obt-page #obtRail .obt-lg span,
.obt-page #obtSw .swk,
.obt-page #obtSw .nm,
.obt-page #obtSw .st,
.obt-page #obtSw .tg .nm,
.obt-page #obtSw .tg .st,
.obt-page .obt-top i,
.obt-page .obt-top b,
.obt-page .obt-top #bbtIni,
.obt-page .obt-top #bbtYou,
.obt-page .obt-top #bbtYou b,
.obt-page .obt-day,
.obt-page .obt-gch,
.obt-page .obt-gch i,
.obt-page .obt-gch .live,
.obt-page .obt-gch .lsf,
.obt-page .obt-gch .gval,
.obt-page .obt-gapmk,
.obt-page .obt-crowdtick,
.obt-page .obt-days button,
.obt-page #obtRows i,
.obt-page #obtRows span,
.obt-page #obtRows .obt-cells .obt-cell i,
.obt-page #obtBar b,
.obt-page #obtBar .lb,
.obt-page #obtBar .jq,
.obt-page #obtBar .ub span,
.obt-page #obtBar .jstage b,
.obt-page .r9-game #obtBar .jstage b,
.obt-page .r9-game #obtBar .jstage .jq,
.obt-page .r9-game #obtBar .ub span,
.obt-page #obtTiles small,
.obt-page #obtTiles span,
.obt-page #obtTiles .src,
.obt-page #obtTiles .r9o-foot,
.obt-page .r9o .msg .who small,
.obt-page .r9o-tabs .me,
.obt-page .ctxc i,
.obt-page .ctxc b,
.obt-page .obt-ctxrow .ctxk,
.obt-page .obt-callline .ck,
.obt-page .obt-ghwx,
.obt-page #obtStage .lab,
.obt-page #obtStage .hl,
.obt-page #obtStage i,
.obt-page #obtStage small,
.obt-page #obtStage td,
.obt-page #obtStage th,
.obt-page #obtStage .n,
.obt-page #obtStage .r9-foot,
.obt-page #obtStage .r9-rg,
.obt-page #obtStage .r9r-be,
.obt-page #obtStage .r9r-sph,
.obt-page #obtStage .r9r-spnow,
.obt-page #obtStage .r9h-lbl,
.obt-page #obtStage .r9-tl2 span,
.obt-page #obtStage .obt-cap,
.obt-page #obtStage .obt-dlab,
.obt-page #obtStage .obt-leg,
.obt-page #obtStage .obt-leg span,
.obt-page #obtStage .obt-alt span,
.obt-page #obtStage .obt-alt span b,
.obt-page #obtStage .bbh-at,
.obt-page #obtStage .bbh-when,
.obt-page #obtStage .obt-juice span,
.obt-page #obtStage .obt-juice .cheap,
.obt-page #obtStage .obt-splab,
.obt-page #obtStage .obt-sphand,
.obt-page #obtStage .gcmh,
.obt-page #obtStage .gcmn,
.obt-page #obtStage .phh-when,
.obt-page #obtStage .phh-c,
.obt-page #obtStage .phh-show,
.obt-page #obtStage .mid .live,
.obt-page #obtStage .mid .fin { font-size: var(--bbfloor) !important; }

/* 85_share.css - [W12A, 2026-09-17, marker BB_SHARE_CSS_V84] the share card inside the console's own modal.
   ================================================================================================================
   Dress for tools/host_blocks/96_share.py (BB_SHARE_V85). The PICTURE is drawn on a canvas and needs no css at all;
   these rules are only for the case where the browser cannot hand the PNG to another app and the reader has to
   save it himself - the modal that shows him the card, one line telling him what to do with it, and a save link.
   One typeface (var(--ui)), inks, one hairline. No pill, no glow, no gradient, no radius. 13px floor on a phone.
   ================================================================================================================ */
.bbsh{font-family:var(--ui);max-width:100%}
.bbsh .bbsh-img{display:block;width:100%;height:auto;max-width:360px;margin:0 auto;border:1px solid var(--line)}
.bbsh .bbsh-h{margin:12px 0 0;font-size:15px;line-height:1.4;color:var(--ink);font-weight:600;text-align:center}
.bbsh .bbsh-n{margin:5px 0 0;font-size:13px;line-height:1.45;color:var(--ink-dim);text-align:center}
.bbsh .bbsh-n a{color:var(--ink);text-decoration:underline;text-underline-offset:3px;
  display:inline-block;min-height:44px;line-height:44px}
@media (min-width:900px){.bbsh .bbsh-n{font-size:12px}}

/* 86_prodfloor.css - [integrator 2026-09-17 08:20, marker BB_PRODFLOOR_CSS_V86] THE PROD DESK-LAW LEFTOVERS.
   STATUS: complete. Minted with list #10 via: python tools/mint_host_css.py tools/host_css/86_prodfloor.css BB_PRODFLOOR_CSS_V86
   (after 85_share.css if W12A minted one). Chains after 84_desklaw so source order wins ties.

   WHY: desk_law_test.py --prod on list #9 (shots/desklaw_prod/desk_law_report.json, 17 Sep 08:05) counted 50 texts under
   the size floor and 10 clipped names on prod that the bench never renders (the chat column, the B:props strip, the paid
   blur note, the CTA price copy) plus the hero band's team names at 390. Sizes measured: .r9c-eglab 11.5px x15, .who .mk i
   "YO" 8px x15, .obt-pmkt 11.5px x13, .r9pd-hid 11.5px x2, .obt-pstreak 9.9px x2, .obt-dvphead 9.9px, .r9cta-pr 12.2px and
   .r9cta-note 12px (phone floor is 13), .bbh-tm b clipped x10 ("Brisbane Lions", "Hawthorn Hawks").

   LAWS: floors 12px desktop / 13px phone (critique L7); one typeface var(--ui), no mono, no uppercase eyebrows (design law);
   NO AVATARS - faces or initials discs (owner law 09-12): the chat speaker's "YO"/"BB" initials mark is hidden; the name
   beside it ("You" / "Bet Better") already says who is speaking. Nothing here changes a number, an order or a behaviour. */

/* ---- 1. the floor, desktop 12px ---------------------------------------------------------------------------------- */
.obt-pmkt, .obt-pstreak, .obt-dvphead, .r9c-eglab, .r9pd-hid, .r9cta-pr, .r9cta-note, .r9c-eg {
  font-size: 12px !important;
  font-family: var(--ui) !important;
  letter-spacing: 0 !important;
  text-transform: none !important;
}
/* the streak and the defence-vs-position heads were mono gold caps; plain ink at body weight now */
.obt-pstreak { color: var(--ink-dim) !important; white-space: normal !important; }
.obt-dvphead { color: var(--ink-dim) !important; }

/* ---- 2. the floor, phone 13px ------------------------------------------------------------------------------------ */
@media (max-width: 767px) {
  .obt-pmkt, .obt-pstreak, .obt-dvphead, .r9c-eglab, .r9pd-hid, .r9cta-pr, .r9cta-note, .r9c-eg {
    font-size: 13px !important;
  }
}

/* ---- 3. no initials disc in the chat column (NO AVATARS law) ------------------------------------------------------- */
.who > .mk > i, .who .mk i { display: none !important; }
.who > .mk { width: 0 !important; min-width: 0 !important; margin: 0 !important; padding: 0 !important; border: 0 !important; background: none !important; }

/* ---- 4. the hero band's team names wrap instead of clipping (W10B's measured fix) ----------------------------------- */
.obt-stage .bbh-tm b, .bbh .bbh-tm b {
  min-width: 0 !important;
  overflow: visible !important;
  text-overflow: clip !important;
  white-space: normal !important;
  line-height: 1.1 !important;
}
.obt-stage .bbh-tm, .bbh .bbh-tm { flex: 1 1 0 !important; min-width: 0 !important; }

/* 87_tabbar.css - [W13B 2026-09-17, marker BB_TABBAR_CSS_V88] THE BOTTOM BAR AT 320 AND 390.
   STATUS: complete on disk, NOT minted (W13B never mints). Mint command in this package's asks:
       python tools/mint_host_css.py tools/host_css/87_tabbar.css BB_TABBAR_CSS_V88
   It chains off OddsTerminal.aspx line 37, after 86_prodfloor.css, so source order wins ties with the desk-law floor.

   WHAT WAS WRONG, MEASURED (round10w/CONSOLE_VET_2026-09-17.md, the single biggest count in the whole vet - 95 notes
   across 130 views, every league, every one of the five tabs, at 390px):
       "the bottom bar labels collide: 'What stops it' and 'Where to bet' are -1px apart"     27 views
       "a bottom bar label is flush to the screen edge: 'Where to bet' ends 0px from it"      36 views
       the same two, one pixel apart the other way                                            27 views
       "a bottom bar label is flush to the screen edge: 'Back it - $10 gets $11.20'"           5 views
   THE CAUSE, measured in the bar's own font on the bench (tools/_w13b_measure.py, 600 13px Geist):
       The call 48.2   Will it hit 54.7   Matchup 54.8   What stops it 82.5   Where to bet 80.4
   A 390px phone gives each of the five stops a 78px tile and a 320px phone 64px. 30_phone.css sized those labels
   for 10.5px type ("about 69px in 78px") and dropped them to 10px under 360px - but 84_desklaw.css section 7
   afterwards lifts everything on a phone to the 13px floor, which is right, and at 13px two of the five labels are
   WIDER THAN THE TILE THEY SIT IN. The label is a flex item in a centred column, so it took its max-content width
   and simply hung out over its neighbours and over the screen edge. Nothing clipped it; the tile just was not big
   enough, and no desk-law count could see it because nothing was clipped or under the floor.

   THE FIX, in three parts (the first two are here, the third is src/02_scenes.js):
     1. A GUTTER. The bar gets 4px of side padding, so the five tiles are laid inside the screen instead of up
        against both edges. That alone puts 4px between the last label and the edge of the phone and takes the
        "Back it" verb off the edge as well.
     2. A LABEL THAT WRAPS INSTEAD OF OVERFLOWING. The label may use its tile's full inner width and, where a word
        boundary allows, break to a second line inside its own tile. A 2-line label at 320 is a deliberate choice
        (the brief allows it); a label lying across its neighbour is not. This is also the belt: if a device falls
        back from Geist to Inter or a system sans with wider metrics, the label wraps rather than re-opening the
        defect.
     3. SHORTER LABELS. src/02_scenes.js S.TAB_SHORT: "What stops it" -> "Stops it" (48.3px) and "Where to bet" ->
        "Best app" (55.5px). Both stay bettor words; the full questions are untouched in S.TAB_NAME, which is
        what every width from 1150px up prints. ("Best price" reads better and was tried first: at 320 it wrapped,
        the tile grew 52 -> 63px, the bar grew 101 -> 112px and tools/phone_metrics.py B5 failed nfl@320 on the
        chrome budget. Eleven pixels of a 320px phone's reading height is not worth two words.)

   LAWS. Nothing here changes a size below the floor (13px phone / 12px desktop stays exactly as 84_desklaw.css set
   it), nothing is uppercased, no pill, no gradient, no glow, and no tap target drops below 44px - the stop tiles
   stay 52px high and the verb 48px, and both are asserted at 320 and 390 by tools/tabbar_test.py. Nothing outside
   the phone media queries is touched, so 1150px and wider render byte-identically.
   ------------------------------------------------------------------------------------------------------------- */

/* ---- 1. the bar keeps a side gutter on a phone ----------------------------------------------------------------
   The safe-area padding on the bottom is preserved exactly as 20_bottom.css wrote it; only the sides are added. */
@media (max-width: 899px) {
  #obtBar {
    padding: 0 4px env(safe-area-inset-bottom, 0px) !important;
    box-sizing: border-box !important;
  }

  /* ---- 2. the label lives inside its own tile ---------------------------------------------------------------
     `max-width: 100%` is the whole fix: the tile is a centred flex column, so without a cap the label takes its
     max-content width and simply hangs over its neighbours. Capped, `white-space: normal` breaks it at a space
     into two lines INSIDE its own tile instead. The label is left centred (not stretched): a stretched box would
     reach the tile's own edge, and the vet measures the label's box, not its ink - measured, stretching left only
     5px between neighbouring labels at 320, one under the 6px the vet calls a collision.
     There is still no ellipsis anywhere: a half-word is worse than a second line, and a gate must be able to SEE
     an overflow rather than find it tidied away. */
  #obtBar .jstage b,
  #obtBar .jstage.on b,
  #obtBar .jstage.seen b,
  #obtBar .jstage.cast b {
    max-width: 100% !important;
    white-space: normal !important;
    text-align: center !important;
    line-height: 1.15 !important;
    overflow: visible !important;
    text-overflow: clip !important;
    overflow-wrap: break-word !important;
    hyphens: none !important;
  }
  /* the tile grows with a two-line label instead of clipping it; 52px is the floor, not the cap, and 44px taps
     hold at every width. */
  #obtBar .jstage,
  #obtBar .jstage.on,
  #obtBar .jstage.seen,
  #obtBar .jstage.cast {
    height: auto !important;
    min-height: 52px !important;
    padding: 4px !important;
    box-sizing: border-box !important;
  }

  /* ---- 3. the verb is not flush to the screen edge either ---------------------------------------------------
     The vet read "Back it - $10 gets $11.20" ending 0px from the edge on five views. The bar's own gutter above
     does most of it; this keeps the words off the pill's own edge as well. The CTA is the owner's one allowed
     pill - its colour, weight and shape are untouched. */
  #obtBar .bk {
    padding-left: 10px !important;
    padding-right: 10px !important;
    box-sizing: border-box !important;
  }
}

/* ---- 4. the narrow phone (iPhone SE and anything under 360px) -------------------------------------------------
   A 320px screen with a 6px gutter leaves each tile 61.6px, and 2px of tile padding leaves the label 57.6px.
   Measured, all five on one line at that width: The call 48.2, Will it hit 54.7, Matchup 54.8, Stops it 48.3,
   Best app 55.5. The gutter is 6px rather than 4px here so the last label still ends 8px inside the screen on the
   narrowest phone this console supports. Every label stays at the 13px phone floor; none of them wraps, so the
   bar stays 101px and the phone chrome budget (tools/phone_metrics.py B5) holds. */
@media (max-width: 359px) {
  #obtBar {
    padding-left: 6px !important;
    padding-right: 6px !important;
  }
  #obtBar .jstage,
  #obtBar .jstage.on,
  #obtBar .jstage.seen,
  #obtBar .jstage.cast {
    padding: 4px 2px !important;
  }
}

/* 88_bandpay.css - [W13B 2026-09-17, marker BB_BANDPAY_CSS_V89] THE BET LINE IN THE DESKTOP BAND.
   STATUS: complete on disk, NOT minted (W13B never mints). Mint AFTER 87_tabbar.css, in numeric order:
       python tools/mint_host_css.py tools/host_css/88_bandpay.css BB_BANDPAY_CSS_V89

   WHAT IT STYLES: the one row tools/host_blocks/97_bandpay.py adds to the desktop band -
       <p class="bbdp"><b data-bb-betname="1">Sydney Swans to win</b>
          <span class="bbdp-p">$10 gets $24.50</span>
          <span class="bbdp-c">about 4 in 10</span><i class="bbdp-t"> - our call</i></p>
   It is the same sentence the phone head has carried since wave 10, in the same reading order: the bet first in
   ink, then what the stake gets, then the confidence in WORDS, then the quiet "our call" tail.

   DESIGN LAW. One typeface (var(--ui), inherited), the three inks, no pill, no gauge, no glow, no gradient, no
   mono, no uppercase, no border except the hairline that separates this row from the micro-row under it. The one
   emphasis is font-weight on the bet and on the dollars, which is how every other sentence in the console marks
   its numbers. Floors: 14px for the bet and the payout, 13px for the tail - the desktop floor is 12px, so nothing
   here can trip tools/desk_law_test.py, and the row never renders on a phone (the phone head returns first).
   The row does not wrap into two lines at any desktop width the console supports; it ellipsises nothing, because
   min-width:0 on the flex children lets the LEAST important part (the tail) give way first. */

.obt-wsid.v39.bbhd .bbdp {
  display: flex;
  align-items: baseline;
  flex-wrap: wrap;
  gap: 4px 10px;
  margin: 0;
  padding: 6px 14px 7px;
  border-top: 1px solid var(--line);
  font-family: var(--ui);
  font-size: 14px;
  line-height: 1.35;
  color: var(--ink-dim);
  min-width: 0;
}
.obt-wsid.v39.bbhd .bbdp b {
  font-weight: 600;
  font-size: 14px;
  color: var(--ink);
  min-width: 0;
}
.obt-wsid.v39.bbhd .bbdp .bbdp-p {
  font-size: 14px;
  font-weight: 600;
  color: var(--ink);
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
}
.obt-wsid.v39.bbhd .bbdp .bbdp-c {
  font-size: 13px;
  color: var(--ink-dim);
  white-space: nowrap;
}
.obt-wsid.v39.bbhd .bbdp .bbdp-t {
  font-style: normal;
  font-size: 13px;
  color: var(--ink-faint);
  white-space: nowrap;
}
/* in play the live band owns the score above this row; the bet line stays exactly where it is, because the one
   thing a reader still wants while the game is on is what he is on and what it pays. */
.obt-wsid.v39.bbhd.inplay .bbdp { border-top-color: var(--line); }

/* 89_stops.css - [W14A 2026-09-17, marker BB_STOPS_CSS_V91] THE FRAME OF VERSION TWO.
   STATUS: complete on disk, NOT minted (W14A never mints). Mint command in this package's asks:
       python tools/mint_host_css.py tools/host_css/89_stops.css BB_STOPS_CSS_V91
   It chains off OddsTerminal.aspx line 37 after 88_bandpay.css, so source order wins ties with the desk-law floor
   and the tab-bar gutter, both of which it deliberately leaves alone.

   WHAT THIS DRAWS (CONSOLE_V2_BRIEF_2026-09-17.md section 1 and the owner-approved prototype at
   round10w/proto/odds-console-prototype.html, captured in round9/shots/w14a/proto_*.png):
     1. THE DESKTOP STOP STRIP - icon 20px + label, the active stop taking the bet side's club colour as a 3px bar
        and a 6% tint. It replaces a row of five text buttons the owner could not tell apart.
     2. THE PHONE BOTTOM BAR - the same five marks at 24px over an 11px label, 44px taps, active = club-colour top
        bar + tint. The bar's gutter, its 52px tile floor and its wrap belt are 87_tabbar.css's and are untouched.
     3. THE DESKTOP PANE - a fixed 3 x 2 grid of six tiles that NEVER SCROLLS at 1440x900 or at 1150x800. Tile one
        is the lead and carries the club colour on its border. A tile whose body is longer than its box clips and
        earns a quiet "Read it all" door (src/04_engine.js E.tileDoors measures it in the reader's own browser),
        and opening that door lifts the tile over the pane at full size rather than growing the grid.
     4. THE MORE ROW - one line of chips under the grid, each swapping its reading into the last tile IN PLACE.
     5. THE PHONE SECTIONS - the same organs stacked, each with a 17px title, its drawing or strip first and one
        sentence under it.

   LAWS HELD. One typeface (var(--ui), inherited - nothing here names a family). Inks and hairlines only. NO pill
   (the one allowed pill is the bar's CTA and it is untouched), no gauge, no glow, no gradient, no mono-caps, no
   avatar. Club colour arrives ONLY as the --tc custom property the scene engine writes from BBCol.pick, so a
   league BBCol does not know paints nothing and falls back to ink. Text floors: 13px phone / 12px desktop, exactly
   as 84_desklaw.css and 86_prodfloor.css set them - every size here is at or above them. Taps 44px.
   -------------------------------------------------------------------------------------------------------------- */

/* ================================================================================================================
   1. THE DESKTOP STOP STRIP
   ================================================================================================================ */
#obtStage .r9-tabs.r9-stops {
  display: flex;
  align-items: stretch;
  gap: 2px;
  border-bottom: 1px solid var(--line);
  margin: 0 0 10px;
  padding: 0;
}
#obtStage .r9-tabs.r9-stops .r9-stop {
  display: inline-flex;
  align-items: center;
  gap: 7px;
  min-height: 44px;
  padding: 9px 14px;
  border: 0;
  border-top: 3px solid transparent;
  border-radius: 8px 8px 0 0;
  background: none;
  color: var(--ink-dim);
  font: inherit;
  font-size: 14px;
  font-weight: 600;
  cursor: pointer;
  white-space: nowrap;
}
#obtStage .r9-tabs.r9-stops .r9-stop:hover { color: var(--ink); }
/* the active stop: the bet side's colour as a 3px bar and a 6% tint - the same grammar as the hero band's edge
   bars, so the screen says "this is the stop you are on, and whose bet it is" in one mark. The fallback is the ink
   the strip already used: --tc is simply absent when BBCol could not colour the club honestly. */
#obtStage .r9-tabs.r9-stops .r9-stop.on {
  color: var(--ink);
  border-top-color: var(--tc, var(--ink));
  background: rgba(255, 255, 255, .05);
}
@supports (background: color-mix(in srgb, red 6%, transparent)) {
  #obtStage .r9-tabs.r9-stops .r9-stop.on { background: color-mix(in srgb, var(--tc, var(--ink)) 6%, transparent); }
}
#obtStage .r9-tabs.r9-stops .r9-stop svg.r9-stopic {
  width: 20px;
  height: 20px;
  flex: 0 0 auto;
  opacity: .82;
}
#obtStage .r9-tabs.r9-stops .r9-stop.on svg.r9-stopic { opacity: 1; }
#obtStage .r9-tabs.r9-stops .r { margin-left: auto; align-self: center; padding-right: 2px; }

/* ================================================================================================================
   2. THE DESKTOP PANE - THREE ACROSS, TWO DOWN, AND IT DOES NOT SCROLL
   ================================================================================================================
   The height is the window minus the chrome above it, so the grid fills what is left and never asks for more:
   --bb-headh is the sticky head's real height (host block 71_phonebars writes it on every render and on resize)
   and the strip, the gutters and the More row are the rest. Two equal rows, three equal columns, `minmax(0, 1fr)`
   on both axes so a wide drawing inside a tile can never push the column out (the vet's item 12/13 class of
   defect), and `overflow: hidden` on the tile so it clips instead of growing. */
@media (min-width: 900px) {
  /* SPECIFICITY NOTE, and it is not a preference. src/scenes.css:2-7 sets, with !important:
       #obtStage .obt-bento.r9-grid          grid-template-rows:none / grid-auto-rows:auto / height:auto / overflow:visible
       #obtStage .obt-bento.r9-grid .bc      grid-column:auto / grid-row:auto / height:auto / max-height:none /
                                             min-height:0 / overflow:visible
       #obtStage .obt-bento.r9-grid .bc .bb  flex:none / overflow:visible / max-height:none / height:auto
       #obtStage .obt-bento.r9-grid .bc.span2  grid-column:span 2
     Those six lines are what made the v1 console a page that grows forever, and they are deliberate there - v1 had
     no fixed pane. MEASURED on the bench at 1440x900 before this file existed: the pane laid out as a grid but
     every tile still said overflow:visible and the lead still spanned two columns, so four tiles drew on top of
     one another and the reader read two organs at once (shots/w14a/v2a_nfl_call_1440.png).
     The selectors below therefore carry .obt-bento.r9-grid.r9-v2 - four classes to their three, on the same id -
     and !important, so they win on specificity and not on which stylesheet the aspx happens to load last. They
     apply ONLY inside .r9-v2 .r9-pane, so every other bento on the site keeps scenes.css's behaviour exactly. */
  #obtStage .obt-bento.r9-grid.r9-v2 .r9-pane {
    display: grid !important;
    grid-template-columns: repeat(3, minmax(0, 1fr)) !important;
    grid-template-rows: repeat(2, minmax(0, 1fr)) !important;
    grid-auto-rows: minmax(0, 1fr) !important;
    gap: 10px !important;
    /* the pane's own height: everything above it is measured, not guessed. --bb-headh is the sticky head's real
       height (host block 71_phonebars writes it on every render and on resize) and --bb-barh the bottom bar's. */
    height: calc(100vh - var(--bb-headh, 120px) - var(--bb-barh, 56px) - var(--bb-rulh, 142px)) !important;
    max-height: none !important;
    min-height: 380px;
    overflow: hidden !important;
    position: relative;
    align-content: stretch !important;
  }
  /* [W14A 2026-09-17] THE RULE LINE'S OWN HEIGHT, SUBTRACTED. Every stop but the pick prints the bet's condition
     and the pay line above the pane (src/04_engine.js: the sentence tools/bench_tap_test.py reads to prove the
     console re-keys, and the only place "at Sportsbet" and "what counts" are said). Two lines of 15px/1.5 plus
     their margins measure 48px, so the pane asks for 48 fewer and the terminal still does not scroll - which is
     what tools/stops_test.py S4 and tools/desk_law_test.py measure at 1440x900 and 1150x800. */
  #obtStage .obt-bento.r9-grid.r9-v2:not([data-stop="call"]) .r9-pane { --bb-rulh: 242px; }
  /* [W14A 2026-09-17] THE NUMBERS ABOVE ARE MEASURED, NOT ESTIMATED, AND THE FIRST ESTIMATE WAS WRONG.
     At 1440x900 with rulh 170 the probe read: pane 271-823, the More row 833-864, the RG line 872-907, and the
     bottom bar starting at 840. So the ONE door to every reading past the sixth was 24 of its 31 pixels behind
     the bar, and the RG line was behind the bar AND seven pixels past the bottom of the window - while
     document.scrollHeight still equalled clientHeight, so every no-scroll gate read green. A fixed bar hiding
     the RG line is not a layout preference, it is the one line that may never be hidden. 242 (and 142 on the
     pick, whose prose is inside its lead tile) puts the More row and the RG line clear of the bar with room to
     spare, at 900 and at 800. */
  #obtStage .obt-bento.r9-grid.r9-v2 .r9-pane > .bc,
  #obtStage .obt-bento.r9-grid.r9-v2 .r9-pane > .bc.span2,
  #obtStage .obt-bento.r9-grid.r9-v2 .r9-pane > .bc.span3 {
    grid-column: auto !important;
    grid-row: auto !important;
    margin: 0 !important;
    min-width: 0 !important;
    min-height: 0 !important;
    height: auto !important;
    max-height: 100% !important;
    overflow: hidden !important;
    /* src/scenes.css:312 sets `.r9-five .bc { border:0 !important; background:transparent !important;
       border-radius:0 !important; padding:0 !important }` - that line is what made every v1 card a run of text with
       no edge, and it is why the 8px corner needs to be said again here with the same weight. */
    border-radius: 8px !important;
    display: flex !important;
    flex-direction: column;
    position: relative;
  }
  /* A TILE IS AN OBJECT, SO IT HAS AN EDGE. v1's .bc carried a bottom hairline and nothing else, which read as
     one long column of text; in a 3 x 2 grid a reader has to be able to see where one reading stops and the next
     starts (the owner: "cant really differentiate where what is"). A hairline box and 8px corners, no fill beyond
     the faintest lift off the page, no shadow, no glow. */
  #obtStage .obt-bento.r9-grid.r9-v2 .r9-pane > .bc {
    border: 1px solid var(--line) !important;
    background: rgba(255, 255, 255, .012) !important;
  }
  /* tile one is the lead: the club colour on its border, and nothing louder than a border */
  #obtStage .obt-bento.r9-grid.r9-v2 .r9-pane > .bc.r9-leadcell { border-color: var(--tc, var(--line)); }
  #obtStage .obt-bento.r9-grid.r9-v2 .r9-pane > .bc > .bh { flex: 0 0 auto !important; }
  #obtStage .obt-bento.r9-grid.r9-v2 .r9-pane > .bc > .bb {
    flex: 1 1 auto !important;
    min-height: 0 !important;
    height: auto !important;
    max-height: none !important;
    overflow: hidden !important;
  }
  /* the door a tile earns when its body is longer than its box. It is the quiet CTA, on its own row, and it is
     only ever in the DOM when the measurement says the reader would otherwise lose words. */
  #obtStage .obt-bento.r9-grid.r9-v2 .r9-pane > .bc > .r9-tiledoor {
    flex: 0 0 auto;
    align-self: flex-start;
    margin: 0 12px 8px;
    min-height: 28px;
    font-size: 12px;
  }
  /* open: the tile lifts over the pane at full size. Nothing scrolls behind it, nothing is a modal, and the grid
     underneath has not moved a pixel - so closing it puts the reader back exactly where he was. */
  #obtStage .obt-bento.r9-grid.r9-v2 .r9-pane > .bc.r9-open {
    position: absolute !important;
    inset: 0 !important;
    z-index: 3;
    overflow: auto !important;
    max-height: none !important;
    background: var(--card, #0e1116);
  }
  #obtStage .obt-bento.r9-grid.r9-v2 .r9-pane > .bc.r9-open > .bb { overflow: visible !important; }
  /* the pick's prose lives inside tile one on a desktop, so it takes the tile's measure, not the page's */
  #obtStage .obt-bento.r9-grid.r9-v2 .r9-pane > .bc .r9-rule { font-size: 15px !important; line-height: 1.45; margin: 0 0 6px; }
  #obtStage .obt-bento.r9-grid.r9-v2 .r9-pane > .bc .r9-pay { font-size: 13px; margin: 0 0 6px; }
  #obtStage .obt-bento.r9-grid.r9-v2 .r9-pane > .bc .r9-counts,
  #obtStage .obt-bento.r9-grid.r9-v2 .r9-pane > .bc .r9-lose { font-size: 12px; margin: 6px 0 0; }
  #obtStage .obt-bento.r9-grid.r9-v2 .r9-pane > .bc .r9-back { margin-top: 8px; }
  /* the stage itself stops being a grid when it holds the pane: the pane IS the grid now */
  #obtStage .obt-bento.r9-grid.r9-v2 { display: block !important; }
  #obtStage .obt-bento.r9-grid.r9-v2 > .r9-rg { margin-top: 8px; }
}

/* the narrow desktop the desk law names (1150 x 800): two rows of three still, on a shorter page. Measured at
   1150x800 and 1440x900 by tools/stops_test.py - the pane's own height is what keeps both still. */
@media (min-width: 900px) and (max-height: 860px) {
  #obtStage .obt-bento.r9-grid.r9-v2 .r9-pane { min-height: 300px; }
}

/* ================================================================================================================
   3. THE MORE ROW - ONE LINE OF CHIPS, NEVER A MODAL
   ================================================================================================================ */
#obtStage .r9-v2 .r9-morerow2 {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 6px;
  margin: 10px 0 0;
}
#obtStage .r9-v2 .r9-morelab {
  font-size: 12px;
  color: var(--ink-faint);
  margin-right: 2px;
}
#obtStage .r9-v2 .r9-morechip {
  border: 1px solid var(--line);
  border-radius: 8px;
  background: none;
  color: var(--ink-dim);
  font: inherit;
  font-size: 12px;
  line-height: 1.2;
  padding: 7px 10px;
  min-height: 30px;
  cursor: pointer;
}
#obtStage .r9-v2 .r9-morechip:hover { color: var(--ink); border-color: var(--ink-faint); }
#obtStage .r9-v2 .r9-morechip.on {
  color: var(--ink);
  border-color: var(--tc, var(--ink-faint));
  background: rgba(255, 255, 255, .05);
}

/* ================================================================================================================
   4. THE PHONE: SECTIONS, AND A BAR THAT SHOUTS
   ================================================================================================================ */
@media (max-width: 899px) {
  /* the sections: one per organ, stacked, each starting with its own drawing or strip. The stack is what the
     reader scrolls; the pane grid is a desktop shape and must not leak into it. */
  #obtStage .r9-v2 .r9-helpers.r9-sections {
    display: block;
  }
  #obtStage .obt-bento.r9-grid.r9-v2 .r9-helpers.r9-sections > .bc,
  #obtStage .obt-bento.r9-grid.r9-v2 > .bc.r9-leadcell,
  #obtStage .obt-bento.r9-grid.r9-v2 > .bc.r9-callcard {
    margin: 0 0 10px !important;
    border: 1px solid var(--line) !important;
    border-radius: 8px !important;
    background: rgba(255, 255, 255, .012) !important;
  }
  /* THE SECTION TITLE IS 17px. The prototype sets it there and the reader needs it: on a phone the title is the
     only wayfinding a stacked section has. 84_desklaw.css section 7 lifts EVERYTHING on a phone to the 13px floor
     with !important, which is right for body text and is what these titles were sitting at (measured: 13px on
     every section, every stop). The signal chip beside the title (.r9-sig) is deliberately NOT raised - it is a
     count, not a name, and it stays at the floor. */
  #obtStage .obt-bento.r9-grid.r9-v2 .bc > .bh .lab:not(.r9-sig) {
    font-size: 17px !important;
    line-height: 1.25 !important;
    font-weight: 700 !important;
  }

  /* THE BOTTOM BAR. 87_tabbar.css owns the gutter, the wrap belt and the 52px floor; this raises the bar to the
     prototype's 64px, puts the mark above the label, and gives the active stop the club colour. */
  #obtBar .jstage,
  #obtBar .jstage.on,
  #obtBar .jstage.seen,
  #obtBar .jstage.cast {
    /* [W14A 2026-09-17, MEASURED] 56, NOT 60. tools/phone_metrics.py B5 is the rule that the fixed chrome may not
       eat more than 258px of a 320px phone, and at 60 the bar measured 109px and NFL - the tallest head at 104 -
       came out at 261. Four pixels off the tile brings the bar to 105 and the chrome to 257. The tap target is
       still 59px with the 3px lit edge, well over the 44px floor, and the mark and the label keep their sizes. */
    min-height: 56px !important;
    border-top: 3px solid transparent !important;
    gap: 3px !important;
  }
  #obtBar .jstage.on {
    border-top-color: var(--tc, var(--ink)) !important;
    background: rgba(255, 255, 255, .06) !important;
  }
  #obtBar .jstage .jg svg.r9-stopic {
    width: 24px !important;
    height: 24px !important;
  }
  #obtBar .jstage .jg { line-height: 0 !important; opacity: .8 !important; }
  #obtBar .jstage.on .jg { opacity: 1 !important; }
  /* the tile's wizard NUMBER. It counted a five-step wizard that no longer exists and the prototype has none; the
     element stays in the DOM because the same node carries the "seen" tick at desktop width. */
  #obtBar .jstage .jn { display: none !important; }
  /* the per-tile answer line is the bar's own second row on a desktop; on a phone the five labels are the bar and
     a second line of type under each of them is what made the bar unreadable at 320. */
  #obtBar .jstage .jq { display: none !important; }
}

/* ================================================================================================================
   5. THE STOP MARK, EVERYWHERE
   ================================================================================================================
   currentColor, no fill, 1.8 stroke - set in the svg the scene engine writes, repeated here so a host stylesheet
   that colours svgs by default cannot fill them in. */
#obtStage svg.r9-stopic,
#obtBar svg.r9-stopic {
  fill: none;
  stroke: currentColor;
  stroke-width: 1.8;
  stroke-linecap: round;
  stroke-linejoin: round;
  vertical-align: middle;
}

/* 90_radius.css - [W14A 2026-09-17, marker BB_RADIUS_CSS_V92] EIGHT PIXELS, EVERYWHERE THE READER TOUCHES.
   STATUS: complete on disk, NOT minted (W14A never mints). Mint command in this package's asks, AFTER 89_stops:
       python tools/mint_host_css.py tools/host_css/90_radius.css BB_RADIUS_CSS_V92
   It chains last off OddsTerminal.aspx line 37, so it is the last word on a corner and nothing else has to be
   edited to get one.

   THE OWNER, 17 Sep: "i like radius stuff not as square". CONSOLE_V2_BRIEF section 3, DESIGN LAW v2: "8 px radius
   on tiles, chips, ticks, bars, sheets". That is the whole of this file: ONE number, applied to the things the
   reader reads as objects, and to nothing else.

   WHY A FILE OF ITS OWN AND NOT A LINE IN 89_stops.css. A corner is a taste the owner named, and tastes get
   revisited; keeping every radius in one 60-line file means the next change is one number in one place, and means
   this file can be dropped out of the chain wholesale if the owner changes his mind, without taking the frame with
   it. It also keeps 89_stops.css about the SHAPE of the console.

   WHAT IS DELIBERATELY LEFT SQUARE:
     * the hero band's two club-colour EDGE BARS - they are the crest's own edge, not an object;
     * the proof strips' W/L ticks under 10px - a radius on a 7px square reads as a blur, not a corner;
     * the hairline table rules and the sparkline itself - a line has no corners;
     * the page, the rail and the bottom bar's outer box - furniture, not objects.

   LAWS. Nothing here changes a colour, a size, a weight, a spacing or a tap target. No pill is created: 8px on a
   28px-high chip is a rounded rectangle, not a capsule (a pill needs the radius at or past half the height, which
   is 14px here - the one allowed pill, the bar's CTA, keeps its own shape and is not named in this file).
   -------------------------------------------------------------------------------------------------------------- */

:root { --bb-r: 8px; }

/* ---- tiles, cards and the panes they sit in ------------------------------------------------------------------- */
#obtStage .bc,
#obtStage .obt-bento .bc,
#obtStage .r9-door,
#obtStage .r9-deeper > .bc,
#obtStage .r9-counts,
#obtStage .r9-back,
#obtStage .obt-wsid,
#obtStage .obt-wsid .hr1,
#obtStage .obt-wsid .hr2 { border-radius: var(--bb-r); }

/* ---- chips: the stake chips, the situation chips, the More row, the organ tabs -------------------------------- */
#obtStage .r9d-chip,
#obtStage .r9-morechip,
#obtStage .r9s-chip,
#obtStage .bbs-chip,
#obtStage [data-r9="otab"],
#obtStage [data-r9="setline"],
#obtStage .r9-tabs .r9-stop { border-radius: var(--bb-r); }
/* the stop strip keeps a flat foot: it sits ON the hairline under it */
#obtStage .r9-tabs.r9-stops .r9-stop { border-radius: var(--bb-r) var(--bb-r) 0 0; }

/* ---- ticks and bars: the hit strip, the tug bar, the in-100-games spread -------------------------------------- */
/* [W14A 2026-09-17, MEASURED] `#obtStage .bbs-tk > *` WAS HERE AND HAD TO COME OUT. It put 3px on the proof
   strips' W/L ticks - the very marks the head of this file says stay square - and tools/strips_test.py measured
   it: "S7 a strip carries a pill / glow / gradient: bbs-t ls, bbs-t wn" on afl at 390 on both the pick and Form.
   That gate's rule is a radius over 2px anywhere inside a strip, and it is the right rule: a 7px square with a
   3px corner is a blurred dot, and the owner's "not as square" was about the objects a reader reads, not about
   the record's own marks. The ticks are square again and the bars below - which are 8px and taller, and are not
   inside a proof strip - keep their corner. */
#obtStage .r9-bar,
#obtStage .r9-barfill,
#obtStage rect.r9-bar,
#obtStage .r9s-bar { border-radius: 3px; }
/* an svg bar takes its corner as an attribute, not a property, so it is set where the shape is drawn; these two
   are the only ones a stylesheet can reach. */
#obtStage svg .r9-rnd { rx: 3px; ry: 3px; }

/* ---- sheets, drawers and the modal the console opens ---------------------------------------------------------- */
#obtModal .bbsheet,
#obtModal .obt-modalbox,
#obtSheet,
.obt-drawer,
.obt-apps { border-radius: var(--bb-r); }
@media (max-width: 899px) {
  /* a sheet rises from the bottom edge: round the top two corners only, or the corners the reader can see */
  #obtSheet,
  #obtModal .bbsheet { border-radius: var(--bb-r) var(--bb-r) 0 0; }
}

/* 91_hostfloor.css - [integrator for W13C 2026-09-17, marker BB_HOSTFLOOR_CSS_V94] THE HOST'S OWN TEXT UNDER THE FLOOR.
   STATUS: complete. Mint: python tools/mint_host_css.py tools/host_css/91_hostfloor.css BB_HOSTFLOOR_CSS_V94 (after 90_radius.css).

   WHY: desk_law_test counts 82-83 sub-floor texts on every matchup tab that are the HOST's batting-order and bench markup
   (`obt-orders` appears in out/host.js and bench/w29.js, never in round9/src): measured 2026-09-17 .oh 9.6px, .obt-orders span
   9.6px, .obt-orders b 12.5px, .obt-bench 8.96px, .obt-affhd 9.6px. DESIGN LAW floors: 12px desktop, 13px phone. */
#obtStage .obt-orders .oh, #obtStage .obt-orders b, #obtStage .obt-orders span,
#obtStage .obt-bench, #obtStage .obt-bench span, #obtStage .obt-affhd { font-size: 12px; }
@media (max-width: 900px) {
  #obtStage .obt-orders .oh, #obtStage .obt-orders b, #obtStage .obt-orders span,
  #obtStage .obt-bench, #obtStage .obt-bench span, #obtStage .obt-affhd { font-size: 13px; }
}
/* BB_HOSTFLOOR_CSS_V94 */

/* 92_stops2.css - [integrator for W14A 2026-09-17 21:05, marker BB_STOPS2_CSS_V95] W14A's SECTION 6 of 89_stops.css, appended
   AFTER 89 was minted at 19:26 (the stop strip one row high; the rule sentence at 15px; the pane height calc). A minted block is never
   edited, so the delta ships as its own file. Mint: python tools/mint_host_css.py tools/host_css/92_stops2.css BB_STOPS2_CSS_V95
   6. [W14A 2026-09-17, RESUMED RUN] THE STRIP IS ONE ROW HIGH, AND THE RULE SENTENCE IS NOT A HEADLINE
   ================================================================================================================
   MEASURED, not tidied. tools/stops_test.py and the no-scroll gates all read green while two things the reader
   needs were off the bottom of an 800px window, so the stack was measured element by element on the bench
   (nfl, 1150 x 800, the Matchup stop):

       .obt-wsid  (the sticky head)                 48 - 257   h209
       .r9-tabs.r9-stops  (the five stops)         269 - 386   h116   <- asked for 44
       .r9-stop           (one stop button)        269 - 396   h126   <- asked for 44
       .r9-rule           (the bet's condition)    396 - 474   h 79
       .r9-pay                                     477 - 500   h 22
       .r9-pane                                    510 - 710   h200   <- its floor, not its fit
       the More row                                720 - 787          <- BELOW the bottom bar at 740
       the RG line                                 795 - 830          <- below the bar AND past the window

   TWO CAUSES, both arithmetic:
   1. THE STRIP. At 1150 the console's own column is 599px wide, not 1150 - the You panel and the rails take the
      rest. Five stops need about 515 of it and the context label on the right (`.r`, the league, the kickoff in
      words and the teams link) asks for the rest, so the flex row squeezed every button below its content width
      and the labels broke onto five lines apiece: 126px for a row of five words. `white-space: nowrap` on the
      button does not save it, because the button had no height of its own to keep and `align-items: stretch`
      handed every one of them the tallest one's height.
      So the row is given the height it always meant to have, the label keeps its one line, and the thing that
      yields is the context label - it is the least of the five things in the row, it is repeated in the hero band
      immediately above, and below 1240px of window there is not room for both it and five readable stops.
   2. THE RULE SENTENCE. src/scenes.css:306 sets it at 21px/1.25 - right for v1, where it was the page's headline
      above a stack that scrolled. In v2 the hero band already says the bet in one line at full size, this is the
      quiet repeat that carries the CONDITION and the app ("... NEED TO WIN ... back AT SPORTSBET"), and at 21px
      in a 599px column it took three lines and 79px off a terminal that may not scroll. 15px is the same size it
      is inside tile one on the pick stop, so the sentence reads identically on all five stops.

   WHAT IT BUYS, measured the same way: strip 126 -> 44 and rule+pay 101 -> 63, so the pane's own fit grows by
   120px at every desktop width, and at 1150 x 800 the More row and the RG line come back above the bottom bar.
   E.paneFit (src/04_engine.js) does the final arithmetic in the reader's own browser; this file's job is only to
   stop the chrome above the pane from eating the room. */
@media (min-width: 900px) {
  #obtStage .r9-tabs.r9-stops {
    align-items: center !important;
    box-sizing: border-box !important;
    height: 48px !important;          /* 44 tap + the 3px active bar above it + the 1px hairline below */
    min-height: 48px !important;
    max-height: 48px !important;
    overflow: hidden !important;
    flex-wrap: nowrap !important;
  }
  /* MEASURED: the first cut asked for 45px and desk_law_test read `.r9-tabs.r9-stops ... dy6` on all fifteen
     desktop views - the row was clipping its own five stops by six pixels. The button's 3px active bar is drawn
     as a border, and without `box-sizing: border-box` a 44px height plus a 3px border is a 47px box in a 45px
     row. The button is now border-box (44px is the tap, bar included, which is what the design law means) and
     the row is 49: 44 + the 3px bar that only the active stop paints + the 1px hairline under the strip. */
  #obtStage .r9-tabs.r9-stops .r9-stop {
    box-sizing: border-box !important;
    height: 47px !important;
    min-height: 47px !important;      /* 44px of tap + the 3px bar; the design law's floor is the tap */
    max-height: 47px !important;
    align-self: center !important;
    flex: 0 0 auto !important;        /* never squeezed below its own word */
    /* MEASURED, second pass: box-sizing alone still left `dy5` on all fifteen desktop views. The strip's own
       children carry `margin-bottom: -11px` from v1, where the tab row was pulled down over the hairline under
       it - a negative margin the row cannot absorb once the row has a height of its own, so 47px of button
       reported 53px of scroll. The margin is zeroed here rather than in src/scenes.css, because that file still
       draws the v1 tab row everywhere else on the site and this rule is inside .r9-stops. */
    margin: 0 !important;
    padding: 0 12px !important;
    white-space: nowrap !important;
    overflow: hidden !important;
  }
  #obtStage .r9-tabs.r9-stops .r9-stop > span {
    white-space: nowrap !important;
    overflow: visible !important;
  }
  /* the context label yields first, and disappears rather than squeeze a stop: the same words are in the hero
     band two rows above, so nothing is lost with it gone. */
  #obtStage .r9-tabs.r9-stops .r {
    flex: 0 1 auto;
    min-width: 0;
    overflow: hidden;
    white-space: nowrap;
    text-overflow: ellipsis;
    margin: 0 0 0 auto !important;
    align-self: center !important;
  }
  /* the quiet repeat of the bet, above the pane, on the four stops that are not the pick */
  #obtStage .obt-bento.r9-grid.r9-v2 > .r9-rule {
    font-size: 15px !important;
    line-height: 1.4 !important;
    font-weight: 600;
    letter-spacing: 0 !important;
    margin: 0 0 4px !important;
  }
  #obtStage .obt-bento.r9-grid.r9-v2 > .r9-pay {
    font-size: 13px !important;
    margin: 0 0 8px !important;
  }
}
@media (min-width: 900px) and (max-width: 1239px) {
  #obtStage .r9-tabs.r9-stops .r { display: none !important; }
}

/* BB_STOPS2_CSS_V95

/* 93_hostfield.css - [integrator for W14B ask 8, 2026-09-18, marker BB_HOSTFIELD_CSS_V97] THE HOST'S OWN DECK CARDS ABOVE THE DOOR.
   STATUS: complete. Mint: python tools/mint_host_css.py tools/host_css/93_hostfield.css BB_HOSTFIELD_CSS_V97 (after 92_stops2.css).

   WHY: version two seats the host's B:field / B:num / B:radar deck cards on the Matchup stop ABOVE the door, so their internals are
   on the reader's screen. Measured 2026-09-18 (W14B): #obtStage .r9-five .gclab2 12.0px, .oh 9.6px, .bc b 11.8px, .bc span 9.9 / 9.3px,
   .wtake 9.3px, painted svg text 10.3-11.6px; svg.obt-oval 640px inside a 288px box (MLB) and 664px inside 324px (soccer). This is the
   whole of desk_law_test's remaining 114 and drawing_fit_test's 'owed by the host' column. DESIGN LAW floors 12px desktop / 13px phone. */
#obtStage .r9-five .gclab2, #obtStage .r9-five .oh, #obtStage .r9-five .bc b, #obtStage .r9-five .bc span,
#obtStage .r9-five .wtake, #obtStage .r9-five svg text { font-size: 12px; }
#obtStage .r9-five svg.obt-oval, #obtStage .r9-five .bc svg[viewBox] { max-width: 100%; height: auto; }
@media (max-width: 900px) {
  #obtStage .r9-five .gclab2, #obtStage .r9-five .oh, #obtStage .r9-five .bc b, #obtStage .r9-five .bc span,
  #obtStage .r9-five .wtake, #obtStage .r9-five svg text { font-size: 13px; }
}
/* BB_HOSTFIELD_CSS_V97 */

/* 94_sheetfix.css - [integrator 2026-09-18, marker BB_SHEETFIX_CSS_V109] W16A's P0 (W16A_STATUS.md section 2): 92_stops2.css closed
   its header comment early and the prose after it swallowed the sheet's tail (92, 93 and everything minted after them never parsed
   on prod). tools/_mint_sheetfix.py repairs that one comment close in the NEW minted asset (the published assets are not edited) and
   appends this marker block so the repair is visible and idempotent. This file carries no rules of its own. */

/* 95_chrome.css - [W16A 2026-09-18, marker BB_CHROME_CSS_V106] THE CHROME AROUND THE CONSOLE.
 *
 * WHY. Owner, 18 Sep 08:00, looking at prod list #12: "woah that does not fully look like your mockup? the
 * leagues when you click one should just show the games in the same column right? phone mockup is different to
 * this too? the bottom navbar? lots of other things." The acceptance test is the prototype itself
 * (round10w/proto/odds-console-prototype.html); the differences are listed in round10w/MOCKUP_DIFF_2026-09-18.md
 * rows A1-A7 and C1-C3. This sheet is the look; tools/host_blocks/103..107 are the words and the moves.
 *
 * SCOPE. EVERY rule is scoped to .obt-page .obt-app.bbch-game - the console (a game open, the scene engine loaded). The BOARD
 * screen keeps its rail, its icon list and its switch column exactly as they are, so rail_settings_test's R and L
 * sections (which walk the board) are untouched, and nothing on the board moves under a reader mid-session.
 *
 * DESIGN LAW. One typeface (var(--ui)); the only colour introduced is the two clubs' own, through --bbh-a /
 * --bbh-h (00d_hero.js) and --tc (the scene engine's BBCol.pick); hairlines, no pills, no glow, no gradients, no
 * mono caps, no avatars; 8px radii; 44px taps; 13px phone floor / 12px desktop floor.
 * SOURCE ORDER IS NOT ENOUGH. scenes.css is loaded by the app (data-scenes) AFTER the page's own stylesheet, so
 * an !important rule of the scene engine's beats an !important rule of ours at equal specificity no matter where
 * this file sits in the chain - MEASURED 2026-09-18: .obt-app.r9-game .obt-deck{grid-template-columns:60px 116px
 * 18px minmax(0,1fr) 280px !important} kept winning. Every selector here therefore carries .obt-page (the page
 * wrapper in OddsTerminal.aspx) so it outweighs the engine's by one class instead of racing it.
 * ICP LAW. No word in here; the blocks own the words.
 */

/* ============================================================================================================
   1. THE DECK IS ONE RAIL, THE CONSOLE, AND THE YOU PANEL   (A2: three columns became one)
   The old deck is a flex row: [rail1 60px switches][lgs 116px leagues][gamescol 18px games][stage][tiles].
   The prototype is ONE 232px rail with "Leagues" above and, under the open league, "Games". Grid does that with
   no DOM move at all: column 1 carries the two heading rows the block injects plus the two existing columns,
   stacked; the stage and the You panel span every row.
   ============================================================================================================ */
@media (min-width:1150px){
  /* scenes.css (W14A's desk law) sets these with !important, and a second rule widens the 18px "Games" strip on
     :has(.obt-gamescol:hover) - the hover-to-see-the-games mechanism the owner was complaining about. Both are
     answered here, at their own specificity, later in the cascade. */
  .obt-page .obt-app.bbch-game .obt-deck,
  .obt-page .obt-app.bbch-game .obt-deck.r9-citeopen,
  .obt-page .obt-app.bbch-game .obt-deck:has(.obt-gamescol:hover){
    display:grid !important;
    grid-template-columns:232px minmax(0,1fr) 300px !important;
    grid-template-rows:auto minmax(0,auto) auto minmax(0,1fr) !important;
    min-height:0;
    transition:none !important;
  }
  /* the collapsed strip's rotated "Games" label and its dimmed children retire - the column is a column now. */
  .obt-page .obt-app.bbch-game .obt-gamescol::before{content:none !important;display:none !important}
  .obt-page .obt-app.bbch-game .obt-gamescol > *{opacity:1 !important}
  .obt-page .obt-app.bbch-game .obt-deck > .bbch-hd{min-width:0}
  .obt-page .obt-app.bbch-game .obt-deck > #bbchHdL{grid-column:1 !important;grid-row:1 !important}
  .obt-page .obt-app.bbch-game .obt-deck > .obt-lgs{
    grid-column:1 !important;grid-row:2 !important;width:auto !important;min-width:0;max-width:none;flex:none;
    max-height:34vh;overflow-y:auto;overflow-x:hidden;border-right:1px solid var(--line,rgba(255,255,255,.10))}
  .obt-page .obt-app.bbch-game .obt-deck > #bbchHdG{grid-column:1 !important;grid-row:3 !important}
  .obt-page .obt-app.bbch-game .obt-deck > .obt-gamescol{
    grid-column:1 !important;grid-row:4 !important;width:auto !important;min-width:0;max-width:none;flex:none;
    overflow:hidden;border-right:1px solid var(--line,rgba(255,255,255,.10))}
  .obt-page .obt-app.bbch-game .obt-deck > .obt-stagecol{grid-column:2 !important;grid-row:1/span 4 !important;width:auto !important;min-width:0;flex:none}
  .obt-page .obt-app.bbch-game .obt-deck > .obt-tilescol{grid-column:3 !important;grid-row:1/span 4 !important;width:auto !important;min-width:0;flex:none}

  /* the two headings. 12px is the desktop floor. */
  .obt-page .obt-app.bbch-game .bbch-hd{
    display:flex;align-items:baseline;gap:8px;padding:12px 14px 6px;
    font-family:var(--ui);font-size:12px;font-weight:400;line-height:1.2;
    color:var(--ink-faint,#606c80);border-right:1px solid var(--line,rgba(255,255,255,.10))}
  .obt-page .obt-app.bbch-game #bbchHdG{padding-top:10px;border-top:1px solid var(--line,rgba(255,255,255,.10))}
  .obt-page .obt-app.bbch-game .bbch-hd .bbch-r{margin-left:auto;font-size:12px;color:var(--ink-faint,#606c80);
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}

  /* leagues: a plain list, name + "N games" on the open one, the open one marked in the bet side's colour. */
  .obt-page .obt-app.bbch-game #obtRail{padding:0 0 6px}
  .obt-page .obt-app.bbch-game #obtRail .obt-lg{
    display:flex;align-items:center;gap:0;width:100%;box-sizing:border-box;
    min-height:34px;padding:7px 14px 7px 17px;margin:0;border:0;border-left:3px solid transparent;border-radius:0;
    background:none;text-align:left;font-family:var(--ui);font-size:13px;font-weight:400;
    color:var(--ink-dim,#9aa3b5);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .obt-page .obt-app.bbch-game #obtRail .obt-lg img,
  .obt-page .obt-app.bbch-game #obtRail .obt-lg svg{display:none !important}
  .obt-page .obt-app.bbch-game #obtRail .obt-lg.on{color:var(--ink);font-weight:600;border-left-color:var(--tc,var(--ink))}
  .obt-page .obt-app.bbch-game #obtRail .obt-lg .bbch-n{margin-left:6px;font-size:12px;font-weight:400;color:var(--ink-faint,#606c80)}

  /* games: the rows of the open league, in the same column, the open game marked in the club colour. */
  .obt-page .obt-app.bbch-game .obt-gamescol #obtHeroM,
  .obt-page .obt-app.bbch-game .obt-gamescol .obt-gbar,
  .obt-page .obt-app.bbch-game .obt-gamescol .obt-tabs{display:none !important}
  .obt-page .obt-app.bbch-game .obt-gamescol #obtRows{flex:1 1 auto;min-height:0;overflow-y:auto;overflow-x:hidden;padding:0}
  .obt-page .obt-app.bbch-game .obt-gamescol #obtRows .obt-row{
    border-left:3px solid transparent;border-radius:0;padding-left:14px;padding-right:12px}
  .obt-page .obt-app.bbch-game .obt-gamescol #obtRows .obt-row.sel{
    border-left-color:var(--tc,var(--ink));background:var(--bbch-selbg,rgba(255,255,255,.05));border-radius:0 8px 8px 0}
  .obt-page .obt-app.bbch-game .obt-gamescol #obtRows .obt-day{padding:8px 14px 4px;font-size:12px}
}
html[data-theme="light"] .obt-page .obt-app.bbch-game .obt-gamescol #obtRows .obt-row.sel{--bbch-selbg:rgba(0,0,0,.05)}
/* MEASURED at 390 and 320: .obt-deck is display:block on a phone, so the two heading rows painted at the top of
   the screen at 12px. They are a desktop object; the phone's league word is in the top bar. */
@media (max-width:1149px){
  .obt-page .obt-app.bbch-game #bbchHdL,
  .obt-page .obt-app.bbch-game #bbchHdG{display:none !important}
}

/* the desktop law band (1150-1439) keeps the same one-rail shape; the You panel narrows first. */
@media (min-width:1150px) and (max-width:1339px){
  .obt-page .obt-app.bbch-game .obt-deck,
  .obt-page .obt-app.bbch-game .obt-deck.r9-citeopen,
  .obt-page .obt-app.bbch-game .obt-deck:has(.obt-gamescol:hover){grid-template-columns:208px minmax(0,1fr) 272px !important}
}

/* ============================================================================================================
   2. THE TOP BAR   (A1 / C1: BetBetter, Odds / Top picks / Multis / Results, the day, My apps, the You button)
   Nothing is deleted - the stamp moves to the "Games" heading, Find keeps its "/" key and moves into the
   switches sheet, and the 30-day record is the You panel's My bets tab.
   ============================================================================================================ */
.obt-page .obt-app.bbch-game .obt-top{height:48px}
.obt-page .obt-app.bbch-game .obt-top .tb-modes button[data-m="board"]{display:none !important}
.obt-page .obt-app.bbch-game .obt-top .tb-right .obt-stamp,
.obt-page .obt-app.bbch-game .obt-top .tb-right #bbtFind,
.obt-page .obt-app.bbch-game .obt-top .tb-right #bbtMonth{display:none !important}
.obt-page .obt-app.bbch-game .obt-top .tb-day{order:3 !important;margin-left:auto !important;padding-left:0}
.obt-page .obt-app.bbch-game .obt-top .tb-right{order:4 !important;margin-left:14px}
.obt-page .obt-app.bbch-game .obt-top #obtHero{display:none}
@media (max-width:899px){
  .obt-page .obt-app.bbch-game .obt-top .tb-modes,
  .obt-page .obt-app.bbch-game .obt-top .tb-day,
  .obt-page .obt-app.bbch-game .obt-top #bbtPhYou,
  .obt-page .obt-app.bbch-game .obt-top .obt-phyou{display:none !important}
  /* THE PHONE'S ONE YOU BUTTON IS #bbtYou, AND IT KEEPS ITS SIZE. The mockup's phone bar is BetBetter, the
     league word, the name button - one button, and what retires from it is the money ("You +$64 last 30 days";
     a reader's record belongs in the You panel's My bets tab, not in the chrome of every screen). The first cut
     hid the whole button, and gate.sh phone read B8 "the top bar's You is 0.0x0.0, under the 44px tap floor"
     ten times - it had hidden the only account door a phone reader has. So the BUTTON stays, at a 44px tap,
     carrying the reader's name (104_topbar.py writes it); only the money inside it goes. #bbtIni, the desktop's
     initials button, stands down on a phone so there is one door, not two. */
  .obt-page .obt-app.bbch-game .obt-top .tb-right #bbtIni{display:none !important}
  .obt-page .obt-app.bbch-game .obt-top .tb-right #bbtYou{
    display:inline-flex !important;align-items:center;justify-content:center;
    min-width:44px;min-height:44px;padding:0 10px;border-radius:8px;
    font-family:var(--ui);font-size:13px;font-weight:500;line-height:1.2;color:var(--ink);
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:120px}
  .obt-page .obt-app.bbch-game .obt-top .tb-right #bbtYou b{display:none !important}
  .obt-page .obt-app.bbch-game .obt-top .bbch-lgword{
    font-family:var(--ui);font-size:13px;font-weight:400;color:var(--ink-faint,#606c80);
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}
  .obt-page .obt-app.bbch-game .obt-top .tb-right{margin-left:auto}
}

/* ============================================================================================================
   3. THE HERO BAND   (A3 / C2)
   Two crests LARGE, the club-colour edge bars, the club names in display type with city + record, kickoff in
   words (or the live score + clock), THE BET in one line with the price and "$10 gets $X", and the three native
   dropdowns Market / Selection / Line on ONE row beneath.
   ============================================================================================================ */
.obt-page .obt-app.bbch-game .obt-wsid[data-bbh]{--bbh-w:8px}
.obt-page .obt-app.bbch-game .obt-wsid.bbhd[data-bbh]{--bbh-w:8px}

@media (min-width:900px){
  /* THE ROW IS .hr1 - the band's own row - not a row of the band's making. 105_hero.py lays the three wrappers
     INSIDE it so the crests stay on '.hr1 .tm img', the path hero_test and console_vet read them from. */
  .obt-page .obt-app.bbch-game .obt-stage .obt-wsid.v39.bbhd[data-bbch]{
    display:block !important;padding:0 8px;min-height:104px;height:auto !important}
  .obt-page .obt-app.bbch-game .obt-stage .obt-wsid.v39.bbhd[data-bbch] .hr1.bbch-used{
    display:flex !important;flex-direction:row !important;flex-wrap:nowrap !important;
    align-items:stretch !important;gap:0;margin:0 !important;padding:0 !important;width:auto;min-height:104px}
  .obt-page .obt-app.bbch-game .bbch-side{display:flex;align-items:center;gap:12px;padding:10px 16px;flex:1 1 0;min-width:0}
  .obt-page .obt-app.bbch-game .bbch-side.h{justify-content:flex-end;text-align:right}
  .obt-page .obt-app.bbch-game .bbch-side .tm{display:flex;align-items:center;gap:12px;min-width:0}
  .obt-page .obt-app.bbch-game .bbch-side.h .tm{flex-direction:row-reverse}
  .obt-page .obt-app.bbch-game .bbch-side .tm img,
  .obt-page .obt-app.bbch-game .obt-stage .obt-wsid.v39.bbhd[data-bbch] .hr1 .tm img{
    width:44px;height:44px;object-fit:contain;flex:0 0 auto}
  .obt-page .obt-app.bbch-game .bbch-side .tm .ph{width:44px;height:44px;display:inline-block;flex:0 0 auto}
  /* "condensed display type" inside the one-typeface law: the house face at display weight, tightened. */
  .obt-page .obt-app.bbch-game .bbch-side{flex:1 1 210px}
  .obt-page .obt-app.bbch-game .bbch-side .tm b{
    font-family:var(--ui);font-size:26px;font-weight:700;line-height:1.05;letter-spacing:-.015em;
    color:var(--ink);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0;display:block}
  .obt-page .obt-app.bbch-game .bbch-side .bbch-rec{
    display:block;font-family:var(--ui);font-size:13px;font-weight:400;line-height:1.25;
    color:var(--ink-dim,#9aa3b5);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .obt-page .obt-app.bbch-game .bbch-side .bbch-sc{
    font-family:var(--ui);font-size:40px;font-weight:700;line-height:1;font-variant-numeric:tabular-nums}
  .obt-page .obt-app.bbch-game .bbch-side.a .bbch-sc{margin-left:auto}
  .obt-page .obt-app.bbch-game .bbch-side.h .bbch-sc{margin-right:auto}

  .obt-page .obt-app.bbch-game .bbch-mid{
    display:flex;flex-direction:column;align-items:center;justify-content:center;gap:5px;
    padding:10px 12px;min-width:368px;max-width:520px;flex:1 1 auto;
    border-left:1px solid var(--line,rgba(255,255,255,.10));border-right:1px solid var(--line,rgba(255,255,255,.10))}
  .obt-page .obt-app.bbch-game .bbch-ko{
    font-family:var(--ui);font-size:12px;font-weight:400;line-height:1.25;color:var(--ink-faint,#606c80);
    text-align:center;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .obt-page .obt-app.bbch-game .bbch-ko.on{color:var(--ink);font-weight:600}
  .obt-page .obt-app.bbch-game .obt-stage .obt-wsid.bbhd[data-bbch] .bbdp{
    margin:0;padding:0;display:block;text-align:center;font-family:var(--ui);font-size:19px;font-weight:600;
    line-height:1.2;color:var(--ink);max-width:100%}
  .obt-page .obt-app.bbch-game .obt-stage .obt-wsid.bbhd[data-bbch] .bbdp b{font-weight:600}
  .obt-page .obt-app.bbch-game .obt-stage .obt-wsid.bbhd[data-bbch] .bbdp .bbdp-p{
    font-size:14px;font-weight:400;color:var(--ink-dim,#9aa3b5);margin-left:7px;white-space:nowrap}
  .obt-page .obt-app.bbch-game .obt-stage .obt-wsid.bbhd[data-bbch] .bbdp .bbdp-c,
  .obt-page .obt-app.bbch-game .obt-stage .obt-wsid.bbhd[data-bbch] .bbdp .bbdp-t{
    font-size:13px;font-weight:400;color:var(--ink-faint,#606c80);margin-left:7px}
  .obt-page .obt-app.bbch-game .obt-stage .obt-wsid.bbhd[data-bbch] .bbch-call{
    display:block;font-family:var(--ui);font-size:13px;font-weight:400;line-height:1.3;
    color:var(--ink-dim,#9aa3b5);text-align:center}
  .obt-page .obt-app.bbch-game .obt-stage .obt-wsid.bbhd[data-bbch] .bbch-call b{font-weight:600;color:var(--ink)}

  /* the three dropdowns, ONE row, compact, under the bet. */
  .obt-page .obt-app.bbch-game .obt-stage .obt-wsid.bbhd[data-bbch] .obt-build.v38{margin:0;padding:0;width:auto;max-width:100%}
  .obt-page .obt-app.bbch-game .obt-stage .obt-wsid.bbhd[data-bbch] .obt-build.v38 .strip{
    display:flex !important;flex-direction:row !important;flex-wrap:nowrap !important;
    gap:6px;justify-content:center;align-items:center;margin:0;padding:0;overflow:visible}
  .obt-page .obt-app.bbch-game .obt-stage .obt-wsid.bbhd[data-bbch] .obt-build.v38 .strip .obt-ddw{
    display:flex;align-items:center;gap:0;margin:0;padding:0;min-width:0;flex:0 1 auto}
  .obt-page .obt-app.bbch-game .obt-stage .obt-wsid.bbhd[data-bbch] .obt-build.v38 .strip .obt-ddw > i{display:none}
  .obt-page .obt-app.bbch-game .obt-stage .obt-wsid.bbhd[data-bbch] .obt-build.v38 .strip select{
    height:30px;min-height:30px;max-width:190px;min-width:74px;width:auto;
    padding:3px 8px;border:1px solid var(--line2,rgba(255,255,255,.18));border-radius:8px;
    background:transparent;color:var(--ink);font-family:var(--ui);font-size:12.5px;line-height:1.2}
  /* the old three-row stack under the band is gone from the band; its pieces are re-homed by 105_hero.py. */
  /* the old second row under the band is gone; its pieces are re-homed into .bbch-mid by 105_hero.py. .hr1
     STAYS - it IS the row now (the rule at the top of this section lays it out) - and only an .hr1 the block
     has not re-laid yet is held back, so a half-painted band is never on screen. */
  .obt-page .obt-app.bbch-game .obt-stage .obt-wsid.bbhd[data-bbch] .hr1:not(.bbch-used),
  .obt-page .obt-app.bbch-game .obt-stage .obt-wsid.bbhd[data-bbch] .hr2{display:none}
}

/* --- the phone band (C2): crests + names on ONE row with the kickoff between, the bet line, three compact
       dropdowns on ONE row. Never the tall Market / Selection / Line list that ate a third of the screen. --- */
@media (max-width:899px){
  .obt-page .obt-app.bbch-game .obt-stage .obt-wsid.phh[data-bbch] .bbh{height:auto;min-height:38px;padding:4px 0}
  .obt-page .obt-app.bbch-game .obt-stage .obt-wsid.phh[data-bbch] .bbh-cr{width:32px;height:32px}
  .obt-page .obt-app.bbch-game .obt-stage .obt-wsid.phh[data-bbch] .bbh-cr.off{height:32px}
  .obt-page .obt-app.bbch-game .obt-stage .obt-wsid.phh[data-bbch] .bbh-tm b{font-size:16px;font-weight:700;letter-spacing:-.01em}
  .obt-page .obt-app.bbch-game .obt-stage .obt-wsid.phh[data-bbch] .bbh-at{margin:0 auto;font-size:12px}
  .obt-page .obt-app.bbch-game .obt-stage .obt-wsid.phh[data-bbch] .bbh-when{font-size:12px;margin-left:0}
  .obt-page .obt-app.bbch-game .obt-stage .obt-wsid.phh[data-bbch] .phh-line{font-size:14px;line-height:1.3;margin:2px 0 0}
  .obt-page .obt-app.bbch-game .obt-stage .obt-wsid.phh[data-bbch] .phh-c{display:none}

  /* THE HEAD MUST STILL COLLAPSE WHEN THE READER SCROLLS. The host's only collapse rule is
     "#obtStage.bb-ph-scrolled .obt-wsid.phh .phh-c{display:none}" - it shrank the head by hiding the "Our call
     here is X. Show me" line. This wave hides that line at ALL times (the call belongs in the pick card, not in
     a sticky head), so the head had nothing left to give and stayed at its full size when scrolled - MEASURED by
     gate.sh phone: G2 "the scrolled head is 83-90px > 80px" on nfl, afl and mlb at 320 and 390. So the collapse
     is given something else to take: the crest row's padding and the bet line's size. The crest itself stays at
     32px (chrome_test C3b), every word stays on the 13px phone floor, and nothing is removed - it tightens. */
  #obtStage.bb-ph-scrolled .obt-page .obt-app.bbch-game .obt-wsid.phh[data-bbch] .bbh,
  .obt-page .obt-app.bbch-game #obtStage.bb-ph-scrolled .obt-wsid.phh[data-bbch] .bbh{
    min-height:32px !important;padding:0 !important}
  #obtStage.bb-ph-scrolled .obt-page .obt-app.bbch-game .obt-wsid.phh[data-bbch] .phh-line,
  .obt-page .obt-app.bbch-game #obtStage.bb-ph-scrolled .obt-wsid.phh[data-bbch] .phh-line{
    font-size:13px !important;line-height:1.25 !important;margin:1px 0 0 !important}

  /* THE PICKER: three compact native selects on ONE row. The OS picker still opens on tap (native <select>),
     the board stays visible behind it, and each keeps a 44px tap height. */
  .obt-page .obt-app.bbch-game .obt-stage .obt-pickrow[data-bbch]{padding:6px 0 4px}
  /* MEASURED: a phone rule in the chain sets this strip to flex-direction:column, which is why the three
     dropdowns were three full-width rows eating a third of the screen. One row, always. */
  .obt-page .obt-app.bbch-game .obt-stage .obt-pickrow[data-bbch] .obt-build.v38 .strip{
    display:flex !important;flex-direction:row !important;flex-wrap:nowrap !important;
    gap:6px;align-items:center;margin:0}
  .obt-page .obt-app.bbch-game .obt-stage .obt-pickrow[data-bbch] .obt-build.v38 .strip .obt-ddw{
    display:block;flex:1 1 0;min-width:0;margin:0}
  .obt-page .obt-app.bbch-game .obt-stage .obt-pickrow[data-bbch] .obt-build.v38 .strip .obt-ddw > i{display:none}
  .obt-page .obt-app.bbch-game .obt-stage .obt-pickrow[data-bbch] .obt-build.v38 .strip select{
    width:100%;max-width:100%;min-width:0;height:44px;min-height:44px;box-sizing:border-box;
    padding:4px 8px;border:1px solid var(--line2,rgba(255,255,255,.18));border-radius:8px;
    background:transparent;color:var(--ink);font-family:var(--ui);font-size:13px}
  @media (max-width:359px){
    .obt-page .obt-app.bbch-game .obt-stage .obt-pickrow[data-bbch] .obt-build.v38 .strip{gap:4px}
    .obt-page .obt-app.bbch-game .obt-stage .obt-pickrow[data-bbch] .obt-build.v38 .strip select{font-size:13px;padding:4px 5px}
  }
}

/* ============================================================================================================
   4. THE BARS   (A4 / A5 / C3)
   Desktop: the old verb bar retires; Share and Track it sit at the right end of the stop strip.
   Phone: ONE bottom bar = the five stops, icon 24px over an 11px label, 64px tall, active stop in the club
   colour. The "More / Track it" second bar retires - Track it is the pick card's button and the stop strip's.
   ============================================================================================================ */
@media (min-width:900px){
  .obt-page .obt-app.bbch-game #obtBar{display:none !important}
  .obt-page .obt-app.bbch-game .r9-tabs.r9-stops{flex-wrap:nowrap !important;overflow:visible !important}
  .obt-page .obt-app.bbch-game .r9-tabs.r9-stops .r{
    display:flex !important;flex:0 1 auto;min-width:0;align-items:center;gap:8px;
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  /* the league + kickoff crumb in the strip's right end is the band's job; it gives way to the two buttons
     before either of them is cut. */
  .obt-page .obt-app.bbch-game .r9-tabs.r9-stops .r > *:not(.bbch-acts){min-width:0;overflow:hidden;text-overflow:ellipsis}
  /* the league and the kickoff are already in the rail and in the band; in the strip they were pushing Share
     and Track it off the right edge (MEASURED at 1440: the strip clipped "Track it - $10 gets $21.50"). The
     crumb is a bare TEXT NODE inside .r, not an element, so hiding children is not enough - the text is zeroed
     and the two buttons carry their own size back. */
  .obt-page .obt-app.bbch-game .r9-tabs.r9-stops .r{font-size:0 !important}
  .obt-page .obt-app.bbch-game .r9-tabs.r9-stops .r > *:not(.bbch-acts){display:none !important}
  .obt-page .obt-app.bbch-game .r9-tabs.r9-stops .r .bbch-acts{font-size:12.5px !important}
  .obt-page .obt-app.bbch-game .r9-tabs.r9-stops .bbch-acts{flex:0 0 auto}
  /* THE RIGHT END NEEDS A HEIGHT OF ITS OWN. 92_stops2 gives .r "overflow:hidden" and no height, so with the
     crumb zeroed the box collapsed to 19px while the two buttons inside it are 30px - MEASURED by
     desk_law_test: one clipped element on all fifteen 1600px views, ".r ... dy11 w322", every league, every
     stop. The box is given the height its content asks for and stops clipping it; nothing else can spill,
     because every child of .r except the buttons is already display:none above. */
  .obt-page .obt-app.bbch-game #obtStage .r9-tabs.r9-stops .r{
    height:auto !important;min-height:40px;overflow:visible !important;align-self:center !important}
  /* and so does the holder inside it. MEASURED at 1600 after the box above was fixed: .r went 38/34 to 38/34,
     because .bbch-acts was itself 19px tall with 30px buttons inside it (clientHeight 19, scrollHeight 30) -
     the overflow had simply moved down one box. Both boxes now take the height their buttons ask for. */
  .obt-page .obt-app.bbch-game #obtStage .r9-tabs.r9-stops .bbch-acts{
    height:auto !important;min-height:36px;align-items:center !important;align-self:center !important;
    overflow:visible !important;line-height:1.2 !important}
  /* the buttons are border-box, so their 30px IS the box the holder has to hold - the same rule 92_stops2 had
     to write for .r9-stop when a 44px tap plus a 3px bar made a 47px box in a 45px row. */
  .obt-page .obt-app.bbch-game #obtStage .r9-tabs.r9-stops .bbch-act{
    box-sizing:border-box !important;margin:0 !important}
  .obt-page .obt-app.bbch-game .r9-tabs.r9-stops .r{display:flex;align-items:center;gap:8px;margin-left:auto}
  .obt-page .obt-app.bbch-game .r9-tabs.r9-stops .bbch-acts{display:flex;align-items:center;gap:8px;margin-left:8px}
  .obt-page .obt-app.bbch-game .r9-tabs.r9-stops .bbch-act{
    display:inline-flex;align-items:center;justify-content:center;min-height:30px;padding:5px 11px;
    border:1px solid var(--line2,rgba(255,255,255,.18));border-radius:8px;background:none;
    font-family:var(--ui);font-size:12.5px;font-weight:500;line-height:1.2;color:var(--ink);
    white-space:nowrap;max-width:210px;overflow:hidden;text-overflow:ellipsis}
  .obt-page .obt-app.bbch-game .r9-tabs.r9-stops .bbch-act.solid{
    border-color:var(--ink);background:var(--ink);color:var(--page,#0f1118);font-weight:600}
  .obt-page .obt-app.bbch-game .r9-tabs.r9-stops .bbch-act:focus-visible{outline:2px solid var(--tc,var(--ink));outline-offset:2px}
  /* 900-1239: a chain rule hides the strip's whole right end (the crumb) and took Share + Track it with it.
     MEASURED at 1150: the console column is 590px and the five stops ask for 515, so only ONE button fits -
     Track it, the one verb of the whole console. Share is still one tap away on the Track it stop. */
  @media (min-width:900px) and (max-width:1339px){
    /* AN ID BEATS ANY NUMBER OF CLASSES. The rule that hides the strip's right end is 92_stops2.css line 100,
       "#obtStage .r9-tabs.r9-stops .r{display:none!important}" - specificity (1,3,0). The override below first
       read ".obt-page .obt-app.bbch-game .r9-tabs.r9-stops .r" - (0,5,0) - five classes and no id, so it LOST,
       and MEASURED at 1150 the right end computed display:none and Track it was 0px wide (chrome_test C4b-C4d).
       Carrying #obtStage as well makes it (1,5,0) and it wins on the same terms. Every rule in this block that
       has to beat a host rule therefore names the id the host named. */
    .obt-page .obt-app.bbch-game #obtStage .r9-tabs.r9-stops .r,
    .obt-page .obt-app.bbch-game #obtStage .r9-tabs.r9-stops .bbch-acts{display:flex !important}
    /* the right end must not be the thing that yields: it is now the console's one verb, not a crumb. */
    .obt-page .obt-app.bbch-game #obtStage .r9-tabs.r9-stops .r{flex:0 0 auto !important;min-width:0}
    .obt-page .obt-app.bbch-game #obtStage .r9-tabs.r9-stops .bbch-acts{flex:0 0 auto !important}
    .obt-page .obt-app.bbch-game #obtStage .r9-tabs.r9-stops .bbch-act{flex:0 0 auto !important}
    .obt-page .obt-app.bbch-game #obtStage .r9-tabs.r9-stops .bbch-act[data-bbch-act="share"]{display:none !important}
    .obt-page .obt-app.bbch-game #obtStage .r9-tabs.r9-stops .bbch-act.solid{max-width:112px;padding:5px 8px}
    /* THE FIVE STOPS GIVE WAY INSTEAD, and they give way in the one place that costs the reader nothing: their
       side padding. MEASURED at 1150 - the strip is 593px wide, the five stops ask 498 (108, 85, 110, 94, 101)
       and Track it 112, so the row was 56px over and Track it ran past the right edge. 92_stops2 gives every
       stop "padding: 0 12px !important" and "flex: 0 0 auto" so it is never squeezed below its own word; taking
       the padding to 6px returns 60px WITHOUT touching a single word - every label keeps its one line at 13px
       and the tap stays 47px tall and at least 73px wide, well over the 44px law. */
    .obt-page .obt-app.bbch-game #obtStage .r9-tabs.r9-stops .r9-stop{min-width:0 !important;padding:0 6px !important}
  }
}
@media (max-width:899px){
  /* THE BAR IS INSET 4px EACH SIDE. MEASURED at 320 (tabbar_test): with the bar flush to the screen edge each
     tile is 64px, "The pick" is 52px of that, so the first word started 6px from the edge and the last one ended
     6px from it - under the 8px floor the gate holds every label to. 4px of bar padding buys 4px at both ends
     and costs each tile 1.6px, which no word needs. */
  .obt-page .obt-app.bbch-game #obtBar{height:64px !important;min-height:64px !important;align-items:stretch !important;padding:0 4px !important;gap:0 !important}
  .obt-page .obt-app.bbch-game #obtBar .baru{display:none !important}
  .obt-page .obt-app.bbch-game #obtBar .jstage{
    flex:1 1 0 !important;min-width:0 !important;width:auto;margin:0 !important;height:64px !important;min-height:64px !important;
    display:flex !important;flex-direction:column !important;align-items:center !important;justify-content:center !important;gap:3px !important;
    padding:0 2px !important;border:0 !important;border-top:3px solid transparent !important;border-radius:0;background:none !important;
    font-family:var(--ui) !important;font-size:13px !important;font-weight:500 !important;line-height:1.1;color:var(--ink-faint,#606c80) !important}
  /* the icon rides in its own holder so the host's <b> label - the node tabbar_test and console_vet read - is
     never replaced, only re-classed (106_bars.py). */
  .obt-page .obt-app.bbch-game #obtBar .jstage .bbch-icw{
    display:flex;align-items:center;justify-content:center;flex:0 0 auto;width:24px;height:24px}
  .obt-page .obt-app.bbch-game #obtBar .jstage .bbch-ic{
    width:24px;height:24px;flex:0 0 auto;display:block;
    stroke:currentColor;fill:none;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}
  /* the mockup draws this label at 11px; the ICP/design law's phone floor is 13px and the law wins (owner item
     in the package report). 13px still fits five stops at 320: the longest word, "Matchup", is 56px in a 64px
     cell. */
  .obt-page .obt-app.bbch-game #obtBar .jstage .bbch-lb{
    display:block;font-size:13px !important;font-weight:500 !important;line-height:1.1;
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%;
    /* the label is a <b>: the host's own node, kept. It must not paint bold caps. */
    letter-spacing:0 !important;text-transform:none !important}
  @media (max-width:359px){
    .obt-page .obt-app.bbch-game #obtBar .jstage .bbch-lb{font-size:13px !important;letter-spacing:-.01em}
  }
  .obt-page .obt-app.bbch-game #obtBar .jstage > *:not(.bbch-ic):not(.bbch-icw):not(.bbch-lb){display:none}
  /* the verb the retired second bar used to carry, where the mockup draws it: under the bet, full width, 44px.
     106_bars.py forwards its click to the host's own [data-bbb="back"] - one verb, one place. */
  .obt-page .obt-app.bbch-game .bbch-ptrack{
    display:flex;align-items:center;justify-content:center;box-sizing:border-box;
    width:100%;min-height:44px;margin:8px 0 0;padding:10px 14px;
    border:1px solid var(--ink);border-radius:8px;background:var(--ink);color:var(--page,#0f1118);
    font-family:var(--ui);font-size:14px;font-weight:600;line-height:1.2;
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .obt-page .obt-app.bbch-game #obtBar .jstage.on{
    color:var(--ink) !important;border-top-color:var(--tc,var(--ink)) !important;
    border-bottom-color:transparent !important;background:var(--bbch-onbg,rgba(255,255,255,.06)) !important}
}
html[data-theme="light"] .obt-page .obt-app.bbch-game #obtBar .jstage.on{--bbch-onbg:rgba(0,0,0,.05)}

/* ============================================================================================================
   5. THE FAR-LEFT SWITCHES COLUMN, RE-HOMED   (A2 second half)
   Nothing is deleted. In the console the column slides off the left edge and comes back as a sheet, opened from
   the You panel's Account tab, from the rail's "Leagues" heading and from the settings gear. Every control keeps
   its node, its listeners and its id, so every switch still works and rail_settings_test still finds them.
   ============================================================================================================ */
@media (min-width:1150px){
  .obt-page .obt-app.bbch-game .obt-rail1{
    position:fixed !important;left:0;top:48px;bottom:0;width:60px !important;z-index:60;
    /* NO TRANSITION ON THE SLIDE. The host positions a tool group's menu from the button's own rect, read
       synchronously inside its click handler. With a .16s slide the rect is still off the left edge at that
       moment, so the menu opened at a negative left - MEASURED by rail_settings_test: R6 "board / prices /
       players / mine / tools menu on screen" failed five times while R5 "menu opens" passed. The column snaps,
       and 107_leftcol.py opens it in the CAPTURE phase so the rect is already right when the host reads it. */
    transform:translateX(-101%);
    background:var(--panel,#141722);border-right:1px solid var(--line,rgba(255,255,255,.10))}
  .obt-page .obt-app.bbch-game.bbch-sw .obt-rail1{transform:none;box-shadow:0 0 0 1px var(--line,rgba(255,255,255,.10))}
  .obt-page .obt-app.bbch-game .bbch-swx{
    position:fixed;left:60px;top:48px;z-index:61;display:none;
    min-width:44px;min-height:44px;padding:0 12px;border:0;border-radius:0 8px 8px 0;
    background:var(--panel,#141722);color:var(--ink);font-family:var(--ui);font-size:13px}
  .obt-page .obt-app.bbch-game.bbch-sw .bbch-swx{display:block}
}
.obt-page .obt-app.bbch-game .bbch-swopen{
  display:flex;align-items:center;gap:8px;width:100%;box-sizing:border-box;min-height:44px;
  padding:10px 12px;margin:0;border:1px solid var(--line2,rgba(255,255,255,.18));border-radius:8px;
  background:none;text-align:left;font-family:var(--ui);font-size:13px;font-weight:500;color:var(--ink)}

/* ============================================================================================================
   6. THE YOU PANEL HEADER   (A6): Ask / My bets / Account as tabs, the name at the right, and no label row
   above the chat. The transcript and the chips are W16B's; only the header line is here.
   ============================================================================================================ */
.obt-page .obt-app.bbch-game .obt-tilescol .bbch-youhd{display:flex;align-items:center;gap:0;min-width:0}
.obt-page .obt-app.bbch-game .obt-tilescol .bbch-youhd .bbch-me{
  margin-left:auto;padding:0 12px;font-family:var(--ui);font-size:12.5px;font-weight:500;
  color:var(--ink-dim,#9aa3b5);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:120px}
.obt-page .obt-app.bbch-game .obt-tilescol .bbch-labelrow{display:none !important}

/* ---- 3b. the middle of the band: the pieces 105_hero.py moves in ------------------------------------------ */
@media (min-width:900px){
  .obt-page .obt-app.bbch-game .bbch-ko .mid{display:inline;font-family:var(--ui);font-size:12px;color:inherit}
  .obt-page .obt-app.bbch-game .bbch-ko .mid i{font-style:normal}
  .obt-page .obt-app.bbch-game .bbch-ko .bbch-wx{
    display:inline;font-family:var(--ui);font-size:12px;font-weight:400;color:var(--ink-faint,#606c80)}
  .obt-page .obt-app.bbch-game .bbch-ko .bbch-wx::before{content:", "}
  .obt-page .obt-app.bbch-game .bbch-ko.on .mid{color:var(--ink);font-weight:600}

  /* THE "OUR CALL" LINE, LOOKED AT (shots/w16a/band_1440.png, 2026-09-18). The host builds it as five adjacent
     spans with NO whitespace between them -
        <i class="st">*</i><span class="ck">our call:</span><b>NAME</b><span class="pr">$310.00</span>
        <span class="cw">a long shot</span>
     - so once the line is on its own row it reads "our call:The draw$310.00a long shot", and .cw was painting in
     the mono face. Two words of the ICP's own sentence run into each other and the typeface law is broken. The
     row becomes a flex line with a real gap, and every child is put back on the one house face. Nothing is
     hidden: the star, the words, the price and the confidence word all stay. */
  .obt-page .obt-app.bbch-game .bbch-mid .obt-callline{
    display:flex !important;align-items:baseline;justify-content:flex-start !important;gap:6px;min-width:0;
    font-family:var(--ui) !important;font-size:13px !important;line-height:1.35;
    letter-spacing:0 !important;text-transform:none !important;white-space:nowrap;overflow:hidden}
  .obt-page .obt-app.bbch-game .bbch-mid .obt-callline > *{
    font-family:var(--ui) !important;letter-spacing:0 !important;text-transform:none !important;
    font-size:13px !important;margin:0 !important;flex:0 0 auto}
  .obt-page .obt-app.bbch-game .bbch-mid .obt-callline > b{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis}
  .obt-page .obt-app.bbch-game .bbch-mid .obt-callline .ck{color:var(--ink-faint,#606c80)}
  .obt-page .obt-app.bbch-game .bbch-mid .obt-callline .cw{color:var(--ink-dim,#9aa3b5)}
  .obt-page .obt-app.bbch-game .bbch-mid .obt-callline .st{font-style:normal}
}

/* ---- 5b. the switches doors ------------------------------------------------------------------------------- */
.obt-page .obt-app.bbch-game .bbch-swlink{
  border:0;background:none;padding:0 8px;min-height:30px;
  font-family:var(--ui);font-size:12px;font-weight:400;color:var(--ink-faint,#606c80);text-decoration:underline;
  text-underline-offset:2px;cursor:pointer}
.obt-page .obt-app.bbch-game .bbch-swlink:hover,.obt-page .obt-app.bbch-game .bbch-swlink:focus-visible{color:var(--ink)}

/* ---- 6b. the You panel header: three tabs, the NAME at the right, no mark, no avatar --------------------- */
.obt-page .obt-app.bbch-game .obt-tilescol .r9o-tabs .me{margin-left:auto;display:flex;align-items:center;min-width:0}
.obt-page .obt-app.bbch-game .obt-tilescol .r9o-tabs .me .av{display:none !important}   /* NO AVATARS, ever - faces or marks */
.obt-page .obt-app.bbch-game .obt-tilescol .r9o-tabs .me > span{
  font-family:var(--ui);font-size:12.5px;font-weight:500;color:var(--ink-dim,#9aa3b5);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:130px}
/* the "Bet Better" label row above the chat goes; the line that says WHICH BET the answer is about stays. */
.obt-page .obt-app.bbch-game .obt-tilescol .r9o-body .msg .who .mk,
.obt-page .obt-app.bbch-game .obt-tilescol .r9o-body .msg .who > span:not(.mk){display:none !important}
.obt-page .obt-app.bbch-game .obt-tilescol .r9o-body .msg .who{gap:0;min-height:0;margin-bottom:4px}
.obt-page .obt-app.bbch-game .obt-tilescol .r9o-body .msg .who small{margin:0}

/* 96_door.css - [integrator 2026-09-18 08:30, marker BB_DOOR_CSS_V108] THE TILE DOOR OPENS IN PLACE, NEVER OVER THE PANE.
   STATUS: complete. Mint: python tools/mint_host_css.py tools/host_css/96_door.css BB_DOOR_CSS_V108 (after 95_chrome.css).
   WHY (owner 18 Sep 08:05, on prod): "you click read more and it opens [badly]". 89_stops.css lifted an opened tile to position:absolute
   over the whole pane. The mockup has no lifting tile: a tile whose body is longer than its box scrolls INSIDE its own box. A minted
   block is never edited, so this file wins the cascade (same selectors, later in the chain) and keeps the tile where it is. */
#obtStage .obt-bento.r9-grid.r9-v2 .r9-pane > .bc.r9-open {
  position: relative !important;
  inset: auto !important;
  z-index: auto !important;
  overflow: hidden !important;
}
#obtStage .obt-bento.r9-grid.r9-v2 .r9-pane > .bc.r9-open > .bb {
  overflow: auto !important;
  max-height: 100% !important;
  scrollbar-width: thin;
}
#obtStage .obt-bento.r9-grid.r9-v2 .r9-pane > .bc.r9-open > .r9-tiledoor { position: sticky; bottom: 0; }
/* BB_DOOR_CSS_V108 */

/* 97_frame2.css - [W17A 2026-09-18, marker BB_FRAME2_CSS_V111] THE FRAME, SECOND PASS.
   The look half of tools/host_blocks/109_frame2.py. Blocks 103-108 and sheets 95/96 are MINTED and are never
   edited: every delta in this wave is a NEW file, and this is it.

   THE ACCEPTANCE TEST is round10w/proto/odds-console-prototype.html beside the bench at 1440 / 1150 / 390 / 320,
   guest and subscriber. Every rule below removes a difference that was LOOKED AT in a side-by-side capture and
   then MEASURED in a real browser. The measurement is written beside the rule; a rule with no number under it
   does not belong in this file.

   !! SPECIFICITY. Two sheets already write this console and both use !important:
     * src/scenes.css  ".r9-game #obtBar .jstage .jg { display:block !important }"   (the scene engine)
     * tools/host_css/92_stops2.css "#obtStage .r9-tabs.r9-stops .r { display:none !important }" (an ID)
   95_chrome.css learned this the hard way twice. Every rule here that has to beat one of those carries the id
   the host named AND !important - never one without the other.
   ============================================================================================================ */

/* ============================================================================================================
   1. ONE ICON OVER ONE LABEL   (package item 1, P0)
   MEASURED (tools/_w17a_p1.js, nfl at 390, every stop, every tile): each .jstage paints TWO svgs -
       .bbch-icw  24x24 at y+2   (106_bars.py's own mark)
       .jg        20x20 at y+29  (98_stops.py's, the scene engine's S.tabIcon in the host's own slot)
   - two rows of icons above one label, on all five tiles, in shots/w16b/l13/nfl_call_390.png.
   95_chrome.css line 378 already says ".jstage > *:not(.bbch-ic):not(.bbch-icw):not(.bbch-lb){display:none}"
   and it is why .jn and .jq ARE hidden (measured: both 0x0). It loses on .jg alone, and the reason is exact:
   src/scenes.css carries ".r9-game #obtBar .jstage .jg{display:block !important}" and an !important declaration
   beats a plain one at any specificity. So the rule is written again, with !important, and pinned to the tiles
   106_bars has actually finished ([data-bbch="1"] is set in the same loop that inserts .bbch-icw) - so a page
   where that block never ran keeps the host's own glyph and the bar is never icon-less.
   ============================================================================================================ */
@media (max-width:899px){
  /* !! WHICH OF THE TWO GOES, AND WHY IT IS NOT THE ONE I HID FIRST. The first cut hid `.jg` and left
     106_bars' `.bbch-icw` - and tools/stops_test.py failed 150 times, "the mark on Form is 0px in the phone
     bar and should be 24px", because S2 reads `svg.r9-stopic`: the SCENE ENGINE's mark, drawn into `.jg` by
     98_stops.py, and the very thing that block exists to put there ("so the desktop stop strip and the phone
     bar draw ONE set"). 106_bars' copy is a second, private set of the same five glyphs. So the DUPLICATE
     goes and the one family stays - the bar and the desktop strip can never drift apart, and the gate reads
     the node it has always read.
     `.jg` is pinned to 24px here: 95_chrome sizes the svg to 24 but 89_stops holds the SPAN to 20, so the
     mark was painting 20x20 in a 24px slot (measured). */
  .obt-page .obt-app.bbch-game #obtBar .jstage[data-bbch="1"] > .bbch-icw{display:none !important}
  .obt-page .obt-app.bbch-game #obtBar .jstage[data-bbch="1"] > .jg{
    display:flex !important;align-items:center;justify-content:center;
    position:static !important;transform:none !important;flex:0 0 auto !important;
    width:24px !important;height:24px !important;margin:0 !important;line-height:0 !important}
  .obt-page .obt-app.bbch-game #obtBar .jstage[data-bbch="1"] > .jg svg{
    width:24px !important;height:24px !important;display:block !important}
  /* with the second icon gone the column re-centres: 24 icon + 3 gap + 15 label = 42 in a 64px bar. The label
     was ending 3px BELOW the bar (measured: bar 1436-1500, label 1488-1503); it now sits inside it. */
  .obt-page .obt-app.bbch-game #obtBar .jstage{padding-bottom:2px !important}
}

/* ============================================================================================================
   2. ONE "Track it" ON THE PICK STOP   (package item 2)
   MEASURED (same probe, nfl 390, the call stop): TWO verbs on one screen -
       #bbchPhoneTrack   366x44 at y198   "Track it - $10 gets $21.50"   (106_bars, under the dropdowns)
       .r9cta            86x44  at y413   "Track it"                      (the pick card's own button)
   The prototype has ONE, inside the card (shots/w17a/protophone/proto_phone_pick.png). The card's button is
   not a second implementation - src/04_engine.js:1184/1874 sends it through window.BBT.backIt(stake), the same
   one door 106_bars clicks - so retiring the row's copy WHERE THE CARD IS ON SCREEN loses nothing.
   It is retired only when 109_frame2.py has SEEN a visible card button on this stop (data-bbch-verb="card");
   on the other four stops, and on any bet whose card has no button, the row's verb stays.
   ============================================================================================================ */
@media (max-width:899px){
  .obt-page .obt-app.bbch-game[data-bbch-verb="card"] #bbchPhoneTrack{display:none !important}
}

/* ============================================================================================================
   3. THE BAND NEVER CLIPS A CLUB NAME OR THE VERB   (package item 3; vet_fix_test item 6, 35 failures)
   MEASURED (tools/_w17a_p3.js, nfl at 1150): the band is 645px. .bbch-mid asks for its 368px minimum (the three
   dropdowns are 341 of it), leaving 130px a side; the crest takes 44, the gap 12 and the padding 32, so the
   club name <b> has 42px of room and wants 100 - "Falcons" drew as "F...". epl's "Coventry City" does the same
   at 1440. 95_chrome.css line 173 asks for ellipsis, which is the clip the vet counts.
   TWO MOVES, both measured: the crest and the padding give way first (they cost the reader nothing), and then
   109_frame2.py steps the NAME's own size down until it fits - never an ellipsis, never a lost letter.
   ============================================================================================================ */
@media (min-width:900px){
  /* !! A WORD IS NEVER BROKEN AND NEVER ELLIPSISED. "Coventry City" takes two lines at the space; what decides
     the SIZE is the longest single word, and `overflow-wrap:normal` is what makes scrollWidth report it - with
     break-word the browser hyphen-less-ly split it into "Coventr / y City" (shots/w17a/after4/
     soccer_epl_call_1150.png) and with nowrap the two-word club shrank to the floor for no reason.
     109_frame2.py steps var(--bbch-nm) down until this box stops overflowing, so the clip never happens. */
  .obt-page .obt-app.bbch-game .obt-stage .bbch-side .tm b{
    font-size:var(--bbch-nm,26px) !important;
    white-space:normal !important;overflow-wrap:normal !important;word-break:normal !important;hyphens:none;
    overflow:hidden !important;text-overflow:clip !important;max-height:2.3em}
  /* the record line under the name yields the same way. */
  .obt-page .obt-app.bbch-game .obt-stage .bbch-side .bbch-rec{overflow:hidden;text-overflow:ellipsis}
}
@media (min-width:900px) and (max-width:1339px){
  /* 1150: 14px of crest and 16px of padding hand the name 72px instead of 42 - and no word is touched. */
  .obt-page .obt-app.bbch-game .obt-stage .bbch-side{padding:8px 8px !important;gap:8px !important}
  .obt-page .obt-app.bbch-game .obt-stage .bbch-side .tm{gap:8px !important}
  .obt-page .obt-app.bbch-game .obt-stage .bbch-side .tm img,
  .obt-page .obt-app.bbch-game .obt-stage .obt-wsid.v39.bbhd[data-bbch] .hr1 .tm img{
    width:30px !important;height:30px !important}
  .obt-page .obt-app.bbch-game .obt-stage .bbch-side .tm .ph{width:30px !important;height:30px !important}
}
/* THE VERB DROPS ITS PAY WORDS BEFORE IT DROPS A LETTER.
   MEASURED at 1150: .bbch-act.solid is 110px of box around 139px of "Track it - $10 gets $21.50" - 29px cut,
   mid-word. 109_frame2.py sets data-bbch-fit="short" when the words do not fit and the button then reads
   "Track it"; the price is two rows above it in the band and inside the pick card, so nothing is lost. */
@media (min-width:900px){
  .obt-page .obt-app.bbch-game #obtStage .r9-tabs.r9-stops .bbch-act{
    overflow:visible !important;text-overflow:clip !important}
}
/* !! AND NOT ONE PIXEL MORE THAN THAT. The first cut of this section also wrote
   ".bbch-act[data-bbch-fit='short']{max-width:none !important}" - to let the short button size itself - and
   MEASURED (tools/_w17a_p8.js, nfl at 1150, 17 samples over two seconds) it built a loop out of nothing:
     10 samples  "Track it - $10 gets $21.50"   max-width 112px
      7 samples  "Track it"                     max-width none
   The block reads the cap off max-width, so the moment it wrote fit="short" this rule took the cap away, the
   next tick measured against the parent's 170px instead, decided the long words fitted, and the one after that
   put the cap back. The camera caught whichever half of the loop it landed on - shots/w17a/after6 and after7
   both show "ck it - $10 gets $21" clipped at both ends in a view whose probe read 61px. "Track it" is 61px
   against a 112px cap: it never needed the rule. A measurement must never move the thing it measures. */

/* !! AND THE SHEET REPAIR MUST STAND DOWN. 103_rail.py re-injects the chain's swallowed tail unless it can find
   a rule carrying "bbch-hd" in the LAST 40 RULES of some parsed sheet. Adding ANY sheet after 95_chrome.css
   pushes that rule out of the window - MEASURED (tools/_w17a_p7.js): with this file appended, w29.css parses
   1,706 rules with bbch-hd among them and #bbchSheetFix was injected ANYWAY, 54 duplicate rules of 92-97,
   fetched and appended after load. It is harmless-looking and it is not: it is a second copy of every rule in
   the tail, arriving asynchronously. The guard's own words are "it stands down by itself the moment the file is
   fixed, because then the rules are already in a sheet and the probe finds them" - so this file ends with a
   real rule on .bbch-hd, inside that window, and the probe finds it. This will matter on PROD the moment this
   sheet is minted, not only on a bench: the same 40-rule window applies there. */
.obt-page .obt-app.bbch-game .obt-deck .bbch-hd{letter-spacing:0;text-transform:none}

/* ============================================================================================================
   4. OUR CALL IS NOT PRINTED IN THE BAND   (package item 5)
   The band printed "our call: Falcons to win $34.50". That is OUR PREDICTION FOR THE OUTCOME, and the gating
   law (CONSOLE_V2_BRIEF section 3) makes it subscriber-only; the mockup has no such line at any stop; and
   W16B's pick card now carries it in full ("HIGH - about 63 in 100. The price needs 47."), which is the
   condition W16A_STATUS section 7 set for retiring it.
   The node is not deleted - 109_frame2.py empties it for a GUEST (a hidden node is still in the DOM, and the
   gating law is about what leaves the server and what the page holds, not only about what is painted), and the
   sheet hides it for everybody so the band reads as the mockup draws it. Cutting it from the payload is W16D.
   ============================================================================================================ */
.obt-page .obt-app.bbch-game .obt-stage .obt-wsid.bbhd[data-bbch] .obt-callline,
.obt-page .obt-app.bbch-game .obt-stage .obt-wsid.bbhd[data-bbch] .bbch-call{display:none !important}

/* ============================================================================================================
   5. THE RAIL'S GAME ROW IS THE MOCKUP'S TWO LINES   (package item 4)
   MEASURED (tools/_w17a_p4.js, nfl at 1440 and 1150, 28 rows): the row is 86px tall and carries, in order,
     .obt-gch     a RED "In play" pill (rgb(196,61,61)), the word "gap", and a star button that is ALREADY 0x0
     .obt-gside   x2, each a 7px RED dot, a 20px crest, the club name, and a price chip ALREADY 0x0
   The prototype's row is one line "Away @ Home" and one faint line under it, no pills, no dots, no red tags,
   the open game marked by a club-colour edge (shots/w17a/before/proto_pick_1440.png).
   !! NO-LOSS, CHECKED PART BY PART BEFORE ANYTHING WAS HIDDEN. The star and the price chips are measured at
   0x0 at both widths TODAY - hiding their parents takes nothing off the screen. The red dot's fact ("a key
   player is out") and the "gap" word are NOT dropped: 109_frame2.py writes both into the faint line as plain
   words, where a phone reader can read them - a title= attribute never reaches a phone at all, so this is more
   of the fact on screen, not less.
   The row keeps its click, its .sel class and its data-ev, so the board's own handlers, bench_tap_test and
   rail_settings_test read exactly what they read before.
   ============================================================================================================ */
.obt-page .obt-app.bbch-game .obt-deck #obtRows .obt-row[data-bbch-gm]{
  display:block;padding:9px 10px 9px 12px;min-height:0;border-left:3px solid transparent;
  border-bottom:1px solid var(--line,rgba(255,255,255,.08))}
.obt-page .obt-app.bbch-game .obt-deck #obtRows .obt-row[data-bbch-gm] > .obt-gch,
.obt-page .obt-app.bbch-game .obt-deck #obtRows .obt-row[data-bbch-gm] > .obt-gside,
.obt-page .obt-app.bbch-game .obt-deck #obtRows .obt-row[data-bbch-gm] > .obt-cells,
.obt-page .obt-app.bbch-game .obt-deck #obtRows .obt-row[data-bbch-gm] > .obt-crowdtick{display:none !important}
/* !! AND THIS LINE WRAPS TOO. The first cut held it to one line with an ellipsis and desk_law_test counted it
   on all five MLB views at 1600: ".bbch-gm 'Boston Red Sox 2 @ Texas Rangers 4' dx7 dy0 w206" - seven pixels
   over, and an ellipsis is exactly the clip this package spent the afternoon removing from the band. Two lines
   at the space, words never broken; a short name still takes one. */
.obt-page .obt-app.bbch-game .obt-deck #obtRows .obt-row[data-bbch-gm] > .bbch-gm{
  display:block;font-family:var(--ui);font-size:13px;font-weight:600;line-height:1.25;color:var(--ink);
  white-space:normal;overflow-wrap:normal;word-break:normal;
  overflow:hidden;text-overflow:clip;max-height:2.6em;text-transform:none;letter-spacing:0}
/* the faint line WRAPS rather than ellipsises: a clipped line is what the vet counts, and the rail is 207px
   wide at 1150 - "in play, apps disagree" does not fit on one. Two lines is the ceiling. */
.obt-page .obt-app.bbch-game .obt-deck #obtRows .obt-row[data-bbch-gm] > .bbch-gs{
  display:block;margin-top:2px;font-family:var(--ui);font-size:12px;font-weight:400;line-height:1.3;
  color:var(--ink-faint,#6f7a8c);white-space:normal;overflow:hidden;text-overflow:clip;
  max-height:2.6em;text-transform:none;letter-spacing:0}
/* the open game, in the club's own colour - the one colour the mockup uses here. --tc is the scene engine's
   single measurement (BBCol.pick against the real ground); when a club's hex fails contrast it returns '' and
   the mark falls back to ink, exactly as every other --tc surface does. */
.obt-page .obt-app.bbch-game .obt-deck #obtRows .obt-row[data-bbch-gm].sel{
  border-left-color:var(--tc,var(--ink)) !important;background:var(--bbch-selbg,rgba(255,255,255,.05))}
html[data-theme="light"] .obt-page .obt-app.bbch-game .obt-deck #obtRows .obt-row[data-bbch-gm].sel{
  --bbch-selbg:rgba(0,0,0,.045)}
/* the heading rows 103_rail injects keep their own hairline above this one. */
.obt-page .obt-app.bbch-game .obt-deck #obtRows .obt-row[data-bbch-gm]:last-child{border-bottom:0}

/* ============================================================================================================
   6. THE PRICE RADAR'S AXIS IS OVER THE FLOOR   (package item 6; gate.sh phone F4, 20 failures)
   The 9px is written into the host's own chartSvg() as a font-size ATTRIBUTE, so no stylesheet can clear the
   gate (tools/phone_metrics.py:305 reads getAttribute('font-size') before the computed size). The fix is in
   109_frame2.py, on the two string literals. This block is the second half: the label is a NUMBER, so it reads
   in the console's one typeface with tabular figures rather than the browser's monospace fallback.
   ============================================================================================================ */
.obt-page .obt-app .gf-radar svg text{font-family:var(--ui) !important;font-variant-numeric:tabular-nums}

/* ============================================================================================================
   7. THE FILLED VERB IS READABLE IN THE LIGHT THEME   (package item 9: "capture and LOOK; W16A never reported
   light theme or 320")
   MEASURED (tools/_w17a_p9.js, nfl at 1150, both themes): `--page` IS NOT DEFINED at :root in EITHER theme, so
   95_chrome.css's "color:var(--page,#0f1118)" always resolves to the fallback, #0f1118.
       dark   background #E8EDF5  text #0f1118   - about 16:1, right
       light  background #111827  text #0f1118   - about 1.05:1, INVISIBLE
   shots/w17a/after12/nfl_call_1150_light.png shows it: a dark slab where the console's one verb should be, on
   every stop and at every width. The ground in the light theme is white, so the filled button's words are
   white; nothing else about the button moves.
   The SAME arithmetic hits src/08_cta.css's .r9cta (measured in the same probe: background #111827, text
   #0f1118) - that file is W17B's and the one-line edit is in this package's asks, not written here, because a
   host sheet reaching into a scene sheet is the fight this lane keeps losing.
   ============================================================================================================ */
html[data-theme="light"] .obt-page .obt-app.bbch-game #obtStage .r9-tabs.r9-stops .bbch-act.solid,
html[data-theme="light"] .obt-page .obt-app.bbch-game .bbch-ptrack{color:#fff !important}

/* 98_w19b.css - [W19B 2026-09-19, marker BB_W19B_CSS_V115] the rail's per-league game count and the band's
   city + last-ten line, plus the Conditions row of four icon-over-label columns.

   HEADER COMMENT WARNING, LEARNED THE HARD WAY (103_rail.py's long note): this comment closes ONCE, at the end
   of this paragraph, and no prose sits outside it. A second close-comment anywhere in a host css file makes the
   parser swallow every rule after it, to the end of the CHAIN - which is how 92_stops2 and 93_hostfield were
   dead on prod for a day without a single gate seeing it.

   WHAT IS HERE
   1  .bbwb-n     the rail's "4 games" - the faint ink, beside the league name, never a pill.
   2  .bbwb-sub   the band's "Pittsburgh - won 6 of the last 10" under the club name, at the 12 px desktop /
                  13 px phone floor, the club's own colour only on the club name the host already colours.
   Conditions' four icon-over-label columns are NOT here: that is an ORGAN, so its rules live with the organ in
   src/01j_stop.css and ride the scene bundle. Host chrome in the host chain, organ styling in the organ sheet -
   the same rule in two sheets is the drift that made the console disagree with itself.
   Every rule is scoped to .obt-app.bbch-game, so a board screen with no game open is untouched. */

/* ---- 1. the rail count ------------------------------------------------------------------------------------- */
.obt-app.bbch-game .obt-lgs .obt-lg .bbwb-n {
    display: block;
    font: 400 12px/1.25 var(--ui, inherit);
    color: var(--ink-faint, #8a93a3);
    letter-spacing: 0;
    margin-top: 2px;
    white-space: nowrap;
}
.obt-app.bbch-game .obt-lgs .obt-lg.on .bbwb-n { color: var(--ink-dim, #b7bfcc); }

/* ---- 2. the band's city + record ---------------------------------------------------------------------------- */
.obt-app.bbch-game .bbch-side .bbwb-sub,
.obt-app.bbch-game .hr1 > .tm .bbwb-sub {
    display: block;
    font: 400 12px/1.3 var(--ui, inherit);
    color: var(--ink-faint, #8a93a3);
    margin-top: 3px;
    max-width: 22ch;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
@media (max-width: 820px) {
    .obt-app.bbch-game .bbch-side .bbwb-sub,
    .obt-app.bbch-game .hr1 > .tm .bbwb-sub { font-size: 13px; max-width: 16ch; }
}

/* 99_w20a.css - [W20A 2026-09-19, marker BB_W20A_CSS_V121] the perfection pass's own sheet: a visible focus ring on
   everything, the off-screen live region the console speaks through, and the phone's 44 px tap floor on the two
   control rows that were measured under it.

   HEADER COMMENT WARNING (98_w19b's note, and it is real): this comment closes ONCE, here, and no prose sits outside
   it. A second close-comment anywhere in a host css file makes the parser swallow every rule to the end of the CHAIN.

   WHAT IS HERE, AND WHY EACH RULE EXISTS - every one measured by a tool in this package, none of it decoration.
   1  :focus-visible   tools/keys_test.py K6. The keyboard reader could not see where they were: the Ask box paints
                       `outline: none` with nothing in its place, and it is not the only one. A ring in the reading
                       ink, two px, offset two - a hairline, not a glow, and never a colour that carries meaning.
                       :focus-visible (not :focus) so a MOUSE press never paints a ring, which is why the rings were
                       turned off in the first place.
   3  .r9-say         tools/keys_test.py K7. Outside a live game the app held no live region at all, so every stop
                       tap rewrote the middle of the page and told a screen reader nothing. src/04_engine.js E.say()
                       writes one short sentence into this element; it must be READ but never SEEN, so it is the
                       standard off-screen clip - not display:none and not visibility:hidden, either of which takes
                       it out of the accessibility tree and back to silence.
   3  the 44 px floor tools/every_control_test.py TAP at 390. Raising a control's own min-height is the honest fix;
                       nothing here changes a font size, a colour or a layout at desktop widths.
   Every rule is scoped inside .obt-app so no other page on the site is touched. */

/* ---- 1. THE FOCUS RING ------------------------------------------------------------------------------------- */
.obt-app :focus-visible,
.obt-app .obt-row:focus-visible,
.r9-modal :focus-visible {
    outline: 2px solid var(--ink, #e7ecf5);
    outline-offset: 2px;
    border-radius: 4px;
}

/* the ring must survive the sheets that turn outlines off wholesale */
.obt-app button:focus-visible,
.obt-app a:focus-visible,
.obt-app summary:focus-visible,
.obt-app select:focus-visible,
.obt-app input:focus-visible,
.obt-app textarea:focus-visible,
.obt-app [tabindex]:focus-visible {
    outline: 2px solid var(--ink, #e7ecf5);
    outline-offset: 2px;
}

/* ---- 2. THE LIVE REGION: read, never seen ------------------------------------------------------------------ */
.obt-app .r9-say {
    position: absolute;
    width: 1px;
    height: 1px;
    margin: -1px;
    padding: 0;
    border: 0;
    overflow: hidden;
    clip: rect(0 0 0 0);
    clip-path: inset(50%);
    white-space: nowrap;
}

/* ---- 3. THE PHONE'S 44 px TAP FLOOR ------------------------------------------------------------------------ */
@media (max-width: 800px) {

    .obt-app .r9-stops .r9-stop,
    .obt-app .obt-lgs .obt-lg,
    .obt-app .obt-ico,
    .obt-app .r9-morechip,
    .obt-app .r9-morelink,
    .obt-app .r9d-chip,
    .obt-app .tg {
        min-height: 44px;
    }

    /* a control that is only narrow, not short, gets its width from its own padding - never a fixed width, which
       would break the rows these sit in at 320 px. */
    .obt-app .obt-ico,
    .obt-app .r9c-down {
        min-width: 44px;
    }
}

/* 100_w21a.css - [W21A 2026-09-19, marker BB_W21A_CSS_V128] THE HOST'S LAST OLD-DESIGN SURFACES, AND THE PHONE'S
   PHANTOM SCREENS.
   Mint: python tools/mint_host_css.py tools/host_css/100_w21a.css BB_W21A_CSS_V128   (last in the chain, after 99_w20a.css)

   EVERYTHING HERE WAS MEASURED, NOT GUESSED. The measurements are in round10w/W21A_STATUS.md and came from
   tools/_w21a_probe.py (a computed-style scan of every painted element inside #obtApp, at 390 and 1440, on the
   board screen and on a game screen) and tools/_w21a_hit.py (document.elementsFromPoint over every rail league
   button). Each section below names the number it was written against.

   SECTION 1  the phone's phantom screens - the root cause of W20A's "DEAD x36 on button.obt-lg"
   SECTION 2  one typeface: --mono stops existing on the console
   SECTION 3  the phone market row (Winner / Line / Total / Players) - mono + accent blue + a glow + 28px taps
   SECTION 4  the rail league row - the mockup's plain row, sentence case, 44px on the phone
   SECTION 5  the rest of the computed-style sweep: radii > 12px, the one gradient, the two header glows
   SECTION 6  the site's email capture sheet never covers the console

   ICP LAW: this file writes no words. DESIGN LAW: it exists to keep it. GATING LAW: it shows and hides nothing
   that depends on who is reading - every rule here is true for a guest and a subscriber alike. */

/* ================================================================================================================
   1. THE PHONE'S PHANTOM SCREENS.  (measured 2026-09-19, tools/_w21a_hit.py, nfl 390)

   At 390 the three deck columns are ALL absolutely positioned at top:0 of .obt-deck and the phone shows one at a
   time by sliding the others away:

     screen      .obt-lgs (leagues)   .obt-gamescol (the board)   .obt-stagecol (the game)
     board       x=0   z=2            x=0   z=auto  pt=48px       x=398  z=5     (slid off to the right)
     game        x=0   z=2            x=0   z=auto  pt=48px       x=0    z=6     (opaque, full height, on top)

   So on a GAME screen the league strip and the whole board list are still laid out at x=0, full size, under an
   opaque panel. document.elementsFromPoint on the centre of the first three league buttons returns
   IMG.bbh-cr / SPAN.bbh-tm - the GAME HEAD - and never the button. That is the whole of W20A's finding 3: the
   nineteen rail leagues are not dead, they are BURIED, and every press a reader (or a test, or a screen reader's
   activation) aims at them lands on the game behind. Same for every row of the board list.

   The fix is the honest one: a screen the phone has left is INERT. visibility:hidden takes a subtree out of
   hit-testing, out of the accessibility tree and out of the tab order in one property, and changes not one pixel
   here because an opaque column is already painted over it. Nothing moves, nothing is deleted, and the moment
   data-scr flips back the screen is live again.

   The hook is the HOST'S OWN screen attribute (#obtApp[data-scr], written by setScr() - 'board' | 'game' |
   'module'), not a class this wave invented, so it is true even when the scene engine has not loaded. When the
   attribute is absent nothing matches and the console behaves exactly as it does today.
   ================================================================================================================ */
@media (max-width: 899px) {
  #obtApp[data-scr="game"] .obt-lgs,
  #obtApp[data-scr="game"] .obt-gamescol,
  #obtApp[data-scr="module"] .obt-lgs,
  #obtApp[data-scr="module"] .obt-gamescol { visibility: hidden; pointer-events: none; }

  /* and symmetrically: on the board screen the game column is slid off the right edge (measured x=398 at 390),
     so its controls are equally unreachable and equally focusable. */
  #obtApp[data-scr="board"] .obt-stagecol { visibility: hidden; pointer-events: none; }

  /* a child that must stay alive while its screen is away says so; nothing does today, and this is the seam for
     it when something does. */
  #obtApp .obt-col .bb-keepalive { visibility: visible; }
}

/* ================================================================================================================
   2. ONE TYPEFACE.  (measured: 6 mono surfaces at 390, 0 at 1440 after the stops were rebuilt)

   The v1 host stylesheet sets font-family:var(--mono) on 40+ rules (.obt-lg, .obt-chip, .obt-cell, .obt-day,
   .obt-tile .tl, .obt-mkt2 buttons, .obt-ctl, the drawer's selects ...). Chasing them one at a time is how a
   surface gets missed. --mono is defined once, on :root, by assets/bb-core-rest.css
   (--ui:'Geist','Inter',sans-serif; --mono:'JetBrains Mono',monospace) - so re-pointing it INSIDE the console
   retires every one of them at once, in one line, with no !important and with no effect on any other page of the
   site (the console lives in .obt-page).

   Numerals keep their alignment: font-variant-numeric:tabular-nums is untouched, and Geist has tabular figures. */
.obt-page { --mono: var(--ui); }

/* ================================================================================================================
   3. THE PHONE MARKET ROW.  (owner, 19 Sep: the row at the top of the phone renders in a monospace face with an
   accent blue. Measured at 390: button.on font-family "JetBrains Mono", color rgb(127,220,255),
   text-shadow 0 0 8px rgba(56,199,255,.6) - a GLOW - and the two arrows are 28x28, under the 44px tap floor.)

   The mockup's look: one segmented group behind a single hairline, sentence case, the chosen market inked rather
   than lit.

   THE ROW IS PAINTED BY THREE RULES, NOT ONE. Measured: the strip on screen at 390 is
   `.obt-build .obt-mksel.m2 button`, the one inside the tile row is `.obt-mkt2 .obt-mksel.m2 button`, and the same
   look is repeated by `.obt-seg button.on` (the odds-format pair) and `.obt-focus .obt-fb.on` (the focus chips) -
   all four ending in `color:#7FDCFF; background:#0C1E38; border-color:#38C7FF; text-shadow:0 0 8px rgba(56,199,255,.6)`.
   Fixing only the one the owner pointed at would leave the other three to be found again tomorrow, so the whole
   family is written here: a chosen segment is INKED, never LIT. */
.obt-page .obt-mksel.m2 {
  gap: 0; border: 1px solid var(--line); border-radius: 8px; overflow-x: auto;
}
.obt-page .obt-mksel.m2 button {
  font-family: var(--ui); font-size: 14px; letter-spacing: normal; text-transform: none; font-weight: 500;
  color: var(--ink-dim); background: transparent;
  border: 0; border-right: 1px solid var(--line); border-radius: 0;
  min-height: 44px; padding: 0 14px; text-shadow: none;
}
.obt-page .obt-mksel.m2 button:last-child { border-right: 0; }
.obt-page .obt-mksel.m2 button.on,
.obt-page .obt-seg button.on,
.obt-page .obt-focus .obt-fb.on {
  color: var(--ink); background: var(--panel-2); border-color: var(--line);
  font-weight: 600; text-shadow: none;
}
.obt-page .obt-seg button, .obt-page .obt-focus .obt-fb {
  font-family: var(--ui); letter-spacing: normal; text-transform: none; text-shadow: none;
}
@media (max-width: 899px) { .obt-page .obt-seg button { min-height: 44px; } }
.obt-page .obt-mkt2 .mn {
  width: 44px; height: 44px; min-width: 44px; min-height: 44px; border-radius: 8px;
}
.obt-page .obt-mkt2 .mn:hover { border-color: var(--line-strong, var(--line)); color: var(--ink); }
/* "<- -> walk the markets" is a keyboard hint, at 9.3px, on a phone with no keyboard: it goes away under 900px
   and comes back at the desktop floor. */
.obt-page .obt-mkt2 .mh { font-family: var(--ui); font-size: 12px; }
@media (max-width: 899px) { .obt-page .obt-mkt2 .mh { display: none; } }

/* ---- 3b. THE SAME BLUE, EVERYWHERE ELSE IT IS PAINTED ON THE PHONE'S BOARD SCREEN --------------------------------
   Measured 2026-09-19 at 390 on the board screen, AFTER 3 was in (tools/_w21a_shot.py "blue" pass): the chosen
   state is still drawn in #38C7FF / #7FDCFF / rgb(96,165,250) on six more surfaces. Each is listed with the
   selector that paints it, and each needs .obt-page in front of it only because the host's own rule already
   carries three classes.
     .obt-lg.on                     the open league               border-color #38C7FF
     .obt-seg                       the market group's frame      border #38C7FF
     .obt-day .on / .obt-days .on   the day chips ("All days")    colour rgb(96,165,250) + blue border
     .obt-tabs                      the board's own bottom bar    blue frame and blue words
     .obt-tilescol                  the tile column's left edge   blue rule
     #obtCoach2                     the old tour's button         blue frame
   The law: the chosen thing is INKED (ink on panel-2, a hairline in --line), the club colour is the only colour,
   and colour that means win or loss lives only inside a proof strip. */
.obt-page .obt-lg.on { border-color: var(--line-strong, var(--line)); background: var(--panel-2); color: var(--ink); }
.obt-page .obt-seg { border-color: var(--line); }
.obt-page .obt-tabs { border-color: var(--line); }
.obt-page .obt-tabs button, .obt-page .obt-tabs a { color: var(--ink-dim); font-family: var(--ui); }
.obt-page .obt-tabs button.on, .obt-page .obt-tabs a.on { color: var(--ink); border-color: var(--line); }
.obt-page .obt-day button.on, .obt-page .obt-days button.on, .obt-page .obt-dayrow button.on,
.obt-page .obt-daysel button.on {
  color: var(--ink); background: var(--panel-2); border-color: var(--line); text-shadow: none;
}
.obt-page .obt-tilescol { border-left-color: var(--line); }
/* and the two lens rows that carry the same chosen-market word one more time - traced 2026-09-19 to
   `.obt-lens button.on` (inside .obt-stagehead) and `.obt-glens button.on` (inside .obt-tilescol), both painting
   rgb(11,114,168). Three places say "Winner" on one phone screen; all three now say it the same way. */
.obt-page .obt-lens button.on, .obt-page .obt-glens button.on {
  color: var(--ink); background: var(--panel-2); border-color: var(--line); text-shadow: none;
}
.obt-page .obt-lens button, .obt-page .obt-glens button {
  font-family: var(--ui); letter-spacing: normal; text-transform: none;
}
.obt-page #obtCoach2 { border-color: var(--line); }

/* ================================================================================================================
   4. THE RAIL LEAGUE ROW.  (measured at 390: .obt-lg font-family "JetBrains Mono", text-transform:uppercase,
   letter-spacing .03em, height 44, radius 6. The 44px and the 6px were already right; the face and the caps were
   not, and uppercase turns "Cricket" into "CRICKET", which is not how the mockup or a reader writes it.) */
.obt-page .obt-lg {
  font-family: var(--ui); font-size: 14px; letter-spacing: normal; text-transform: none;
  border-radius: 8px;
}
@media (max-width: 899px) { .obt-page .obt-lg { min-height: 44px; } }
@media (min-width: 900px) { .obt-page .obt-lg { min-height: 36px; } }
/* the count block 113 writes beside a league name stays quieter than the name itself, in the same face */
.obt-page .obt-lg .bbrb-n, .obt-page .obt-lg small { font-family: var(--ui); color: var(--ink-faint); }

/* ================================================================================================================
   5. THE REST OF THE SWEEP.  (every remaining hit of the computed-style scan, 1440 and 390, board + game,
   guest + sub. The scan flags: any border-radius > 12px outside .r9cta, any gradient outside .r9cta, any
   box-shadow with 12px+ of blur outside .r9cta, any accent-blue text that is not a link.)

     button.r9c-down   50%   34x34   - a round icon button reads as a pill; the law is 8px
     button.snd        50%   30x30   - the same, and under the tap floor
     div.box           20px  271x46  - the composer box
     div.obt-tilescol  linear-gradient(rgb(2,6,12), rgb(1,4,9)) - a gradient between two near-blacks: flat it
     .obt-wsid.bbhd / .obt-wsid.phh  box-shadow 0 10px 16px -10px rgba(0,0,0,.65) - the sticky head's soft glow,
                                     replaced by the hairline the rest of the console uses
     button#obtCoach2  rgb(96,165,250) mono - the old first-visit tour's own button (block 110 retires the tour
                                     itself; until it does, it must at least not be the one blue mono word on the
                                     phone)
   ================================================================================================================ */
.obt-page .r9c-down, .obt-page .snd { border-radius: 8px; }
/* the chat send button's 50% is written by round9/src/09_chat.css line 126 as `.r9o-in .box button.snd` and again
   at line 186 behind #obtStage, so the host layer needs the same reach to say 8px. src is not edited from here. */
.obt-page #obtStage .r9o-in .box button.snd,
.obt-page .r9o-in .box button.snd,
.obt-page #obtStage .r9o-ph .r9o-in .box button.snd { border-radius: 8px; }
.obt-page .snd { min-width: 44px; min-height: 44px; }
.obt-page .box { border-radius: 8px; }
.obt-page .obt-tilescol { background-image: none; background-color: #02060C; }
/* the head's shadow is written by round9/src/scenes.css line 141 as `#obtStage .obt-wsid.v39{...}` - an id
   selector, so a host rule needs the id too. src is W21B's tree and is not edited from here; this is the host
   layer doing its own job on top of it, which is what the host layer is for. */
.obt-page #obtStage .obt-wsid.v39,
.obt-page .obt-wsid.bbhd, .obt-page .obt-wsid.phh {
  box-shadow: none; border-bottom: 1px solid var(--line);
}
.obt-page #obtCoach2 { font-family: var(--ui); color: var(--ink-dim); text-transform: none; letter-spacing: normal; }

/* ================================================================================================================
   6. THE SITE'S EMAIL CAPTURE SHEET NEVER COVERS THE CONSOLE.  (W20A finding 5 / owner item 1: on a phone, to a
   guest, in the first viewport, "Tomorrow's pick - free, in your inbox" sits over the pane.)

   The sheet is assets/bb-core.js's .bbcap-sheet (position:fixed; z-index:9500; bottom:12px), raised at 55% scroll
   depth, once a session. On every other page of the site it is right and it stays. On /odds it is a SECOND door
   stacked in front of the reader's first pane, before any value, and it covers the bottom bar - which breaks the
   one-door-per-pane rule outright.

   The master script is never edited (that is the law). Block 122 puts .bb-odds-page on <body> only on this page
   and removes the node if the sheet is ever inserted; this rule is the belt to that brace, so the sheet cannot
   paint for even one frame between insertion and the next scheduler pass. The INLINE capture card
   (<div data-bb-cap-inline>) is deliberately untouched - the console does not use it, and if a page ever does,
   it is a card in the flow, not a layer over it. */
body.bb-odds-page .bbcap-sheet { display: none !important; }

/* 101_emptyframe.css - [integrator 2026-09-19, marker BB_EMPTYFRAME_CSS_V130] THE NEW FRAME WITH NO GAME OPEN.
   Rides block 125 (BB_CHROMEALWAYS_V129): on a desktop .bbch-game is now on before / without a game, and three pieces of
   the version-one frame were still standing in that state (MEASURED on the bench, ncaab = a league with no priced games):
   the mono "start here / find anything / walk the steps" foot of the right column (#obtRailFoot), the previous / next
   view arrows over an empty stage (.obt-tnav), and the operating system's white scrollbar on the league rail. */
.obt-app.bbch-game #obtRailFoot{display:none!important}
.obt-app.bbch-game .obt-stagehead .obt-tnav{display:none!important}
.obt-app.bbch-game #obtStage>.obt-empty{font-family:var(--ui);font-size:15px;line-height:1.5;color:var(--ink-dim);padding:48px 24px;text-align:left;max-width:520px}
.obt-app.bbch-game .obt-lgs,.obt-app.bbch-game #obtRail,.obt-app.bbch-game .obt-rows{scrollbar-width:thin;scrollbar-color:var(--line) transparent}
.obt-app.bbch-game .obt-lgs::-webkit-scrollbar,.obt-app.bbch-game #obtRail::-webkit-scrollbar,.obt-app.bbch-game .obt-rows::-webkit-scrollbar{width:6px;height:6px;background:transparent}
.obt-app.bbch-game .obt-lgs::-webkit-scrollbar-thumb,.obt-app.bbch-game #obtRail::-webkit-scrollbar-thumb,.obt-app.bbch-game .obt-rows::-webkit-scrollbar-thumb{background:var(--line);border-radius:3px}
/* the rail's game count sat against the league name on prod ("NFL29 games") */
.obt-app.bbch-game .bbwb-n{margin-left:8px}

/* 102_w23a.css - [W23A 2026-09-20, marker BB_W23A_CSS_V136] the carried reds, in css: the one focus ring that was
   still missing, the bypass control that lets a keyboard reader reach the five stops without walking the pane, the
   1150 px tile that was cutting its own legend, and the designed empty-league state's own furniture.

   HEADER COMMENT WARNING (98_w19b's note, carried by every sheet since, and it is real): this comment closes ONCE,
   here, and no prose sits outside it. A second close-comment anywhere in a host css file makes the parser swallow
   every rule to the end of the CHAIN.

   WHAT IS HERE, AND WHAT MEASURED IT - nothing decorative, every rule has a gate behind it.
   1  the Ask box's ring   tools/keys_test.py K6, 2 failures, nfl + mlb at 1440. MEASURED with
                           tools/_w23a_probe.py rings: exactly ONE focusable thing on the whole page paints no ring -
                           TEXTAREA in #obtTiles, "Ask about this game", computed `outline: none 3px`, box-shadow
                           none. W20A wrote the ring rule scoped to `.obt-app`; the composer sets `outline:none` on
                           itself from the chat sheet and wins on specificity. Written here against the element
                           itself, with the same two-px reading-ink hairline every other control gets.
   2  .r9-skip             tools/keys_test.py K1. MEASURED at 390 (tools/_w23a_bar.py): 47 focusable things sit
                           between the three bet dropdowns and the five stops, and the stops are the host's own
                           `position:fixed` bottom bar LATER in the document. WCAG 2.4.1's answer to a block like
                           that is a bypass control, so src/04_engine.js renders one as the first thing in the pane.
                           It must be READ but never SEEN until it holds the keyboard - the standard off-screen clip,
                           not display:none (which would take it out of the accessibility tree and make it a lie).
   3  the 1150 legend      tools/vet_fix_test.py item 6, nfl Matchup + Player at 1150. MEASURED: `.bc[data-organ=
                           playcall] .bb` is 224 px of content in a 168 px box inside a 191 px column - the tile is
                           doored (the reader can open the whole reading), but a legend that wraps to five lines in a
                           191 px cell is a cut picture on the way there. Tightened for 1150-1319 only; the 12 px
                           desktop floor is respected - 12 px is the floor, not a suggestion.
   4  the empty league     host block 128. The designed state for a league with no games: what is on next, the three
                           leagues with the most games right now, and the Ask column showing its intro instead of a
                           black void. Inks and hairlines, 8 px radii, 44 px taps, one typeface. */

/* ---- 1. THE ONE RING THAT WAS MISSING ------------------------------------------------------------------------ */
#obtTiles textarea:focus-visible,
.obt-tiles textarea:focus-visible,
.obt-page textarea:focus-visible,
.obt-app textarea:focus-visible,
#obtApp textarea:focus-visible {
    outline: 2px solid var(--ink, #e7ecf5);
    outline-offset: 2px;
    border-radius: 8px;
}

/* ---- 2. THE BYPASS CONTROL ----------------------------------------------------------------------------------- */
/* MEASURED (tools/_w23a_q.py nfl 390): the first cut of this rule was a bare `.r9-skip` (specificity 0-1-0) and the
   button rendered 342 x 44 and fully visible inside the pane - the console's own button rules beat it. A control
   that is meant to be invisible until it holds the keyboard has to out-specify the sheet it sits in, so the id the
   pane is anchored on is in the selector. It is still ONE rule, not an !important. */
/* MEASURED TWICE. (a) a bare `.r9-skip` selector lost to the console's own button rules and the control rendered
   342 x 44 fully visible in the pane (tools/_w23a_q.py), so the id the pane is anchored on is in the selector.
   (b) the one-pixel `clip` hide - the usual visually-hidden recipe - made `tools/desk_law_test.py` count 30 CLIPPED
   TEXTS, one per tab view, and it was right to: a box whose scrollWidth is larger than its clientWidth is a cut
   sentence, and a gate cannot be asked to tell a deliberate one from an accident. The off-screen hide is used
   instead: full size, no overflow, nothing clipped, still read by a screen reader and still focusable. */
#obtStage .r9-skip,
.obt-bento .r9-skip,
.r9-skip {
    position: absolute;
    left: -9999px;
    top: auto;
    width: auto;
    height: auto;
    margin: 0;
    padding: 0;
    border: 0;
    overflow: visible;
    white-space: nowrap;
    font: inherit;
    background: none;
    color: inherit;
}

#obtStage .r9-skip:focus-visible,
#obtStage .r9-skip:focus,
.obt-bento .r9-skip:focus,
.r9-skip:focus-visible,
.r9-skip:focus {
    position: static;
    left: auto;
    width: auto;
    height: auto;
    min-height: 44px;
    margin: 0 0 8px;
    padding: 10px 14px;
    overflow: visible;
    font-family: var(--ui);
    font-size: 14px;
    color: var(--ink, #e7ecf5);
    background: var(--panel-2, #0b1119);
    border: 1px solid var(--line, #1e2836);
    border-radius: 8px;
    outline: 2px solid var(--ink, #e7ecf5);
    outline-offset: 2px;
}

/* ---- 3. THE 1150 px TILE THAT CUT ITS OWN LEGEND ------------------------------------------------------------- */
@media (min-width: 1150px) and (max-width: 1319px) {

    #obtStage .r9-pane .bc .r9-legend,
    #obtStage .r9-pane .bc .r9-legend * {
        font-size: 12px;
        line-height: 1.25;
    }

    #obtStage .r9-pane .bc .r9-legend {
        margin-top: 4px;
        gap: 4px;
    }

    /* the drawing above it gives the legend the room, rather than the legend being cut: a shorter picture in a
       narrow column is still the whole picture. */
    #obtStage .r9-pane .bc[data-organ="playcall"] svg,
    #obtStage .r9-pane .bc[data-organ="gstyle"] svg,
    #obtStage .r9-pane .bc[data-organ="drives"] svg {
        max-height: 92px;
    }
}

/* ---- 4. THE DESIGNED EMPTY LEAGUE ---------------------------------------------------------------------------- */
.obt-empty2 {
    display: block;
    padding: 20px 18px 24px;
    font-family: var(--ui);
    color: var(--ink, #e7ecf5);
}

.obt-empty2 h2 {
    margin: 0 0 6px;
    font-size: 19px;
    font-weight: 600;
    letter-spacing: 0;
    text-transform: none;
}

.obt-empty2 p {
    margin: 0 0 14px;
    font-size: 14px;
    line-height: 1.45;
    color: var(--ink-2, #9fb0c4);
}

.obt-empty2 .obt-e2next {
    margin: 0 0 18px;
    padding: 12px 14px;
    border: 1px solid var(--line, #1e2836);
    border-radius: 8px;
    background: var(--panel-2, #0b1119);
    font-size: 14px;
    line-height: 1.45;
}

.obt-empty2 .obt-e2next b {
    font-weight: 600;
}

.obt-empty2 .obt-e2lab {
    margin: 0 0 8px;
    font-size: 13px;
    color: var(--ink-2, #9fb0c4);
}

.obt-empty2 .obt-e2row {
    display: flex;
    flex-wrap: wrap;
    gap: 8px;
}

.obt-empty2 .obt-e2go {
    min-height: 44px;
    padding: 10px 14px;
    font-family: var(--ui);
    font-size: 14px;
    color: var(--ink, #e7ecf5);
    background: var(--panel-2, #0b1119);
    border: 1px solid var(--line, #1e2836);
    border-radius: 8px;
    cursor: pointer;
    text-transform: none;
    letter-spacing: 0;
}

.obt-empty2 .obt-e2go:hover {
    border-color: var(--ink-2, #9fb0c4);
}

.obt-empty2 .obt-e2go .obt-e2n {
    color: var(--ink-2, #9fb0c4);
}

/* BB_W23B_CSS_V137 - HOST SURFACES IN LIGHT THEME ONLY (package W23B, 2026-09-20).
   =====================================================================================================================
   WHY THIS FILE EXISTS, and why it is a NEW numbered file rather than an edit to 10_topbar.css or 99_w20a.css: the
   host-block law - a change ships as a new numbered file, never as an edit to one that is already minted and live.
   WHAT IT FIXES. PROD, 19 Sep (remaining list item 34, the owner's own screen): "LIGHT THEME BROKEN for a light-OS
   guest: nav words invisible, Track it verbs black blobs, r9pd-blur not blurred." Every light rule on this console -
   including 10_topbar.css:8, the only place the host's own inks are re-stated - is written against
   html[data-theme="light"], the stamp the TOGGLE writes. A reader whose operating system is light and who has never
   touched the toggle carries NO attribute at all, so none of those rules match, and the site's light page tokens sit
   underneath chrome coloured for a dark page. Near-black ink on a near-white ground is fine; near-white ink on it is
   the "invisible nav words", and a var(--ink) button with a var(--bg) label is the "black blob".
   THE THREE-STATE CONTRACT, from here on, everywhere: an explicit stamp wins in BOTH directions, and the system
   preference answers only when there is no stamp. So every rule below is written twice - once for
   html[data-theme="light"], once for @media (prefers-color-scheme:light) on a root with no dark stamp - and
   html[data-theme="dark"] is never touched, which is what keeps the pinned dark default exactly as it is today.
   Measured by tools/light_theme_test.py: contrast >= 4.5:1 for text and >= 3:1 for marks, on every stop, at 1440 and
   390, guest and subscriber, in both light states.
   SCOPE: light only. Not one byte of this file applies to a dark reader.
   ===================================================================================================================== */

/* ---- 1. THE CONSOLE'S OWN CHROME: the rail, the band, the stop tabs, the More row, the You panel -------------------
   These carry their colour from --ink / --ink-faint / --line, which the host restates per component. Where a
   component never restated them, it inherited the dark page's values. They are restated here, once, for the whole
   terminal shell, so a word can never be painted in the colour of the ground it sits on. */
html[data-theme="light"] #obtApp,
html[data-theme="light"] .obt-rail,
html[data-theme="light"] .obt-band,
html[data-theme="light"] .obt-stops,
html[data-theme="light"] .obt-more,
html[data-theme="light"] .obt-you{
  --ink:#10131A;--ink-dim:#3C4657;--ink-faint:#5C6880;--line:#D9DEE8;--panel:#FFFFFF;--page:#F6F7FA;
  color:var(--ink);
}
@media (prefers-color-scheme:light){
  :root:not([data-theme="dark"]) #obtApp,
  :root:not([data-theme="dark"]) .obt-rail,
  :root:not([data-theme="dark"]) .obt-band,
  :root:not([data-theme="dark"]) .obt-stops,
  :root:not([data-theme="dark"]) .obt-more,
  :root:not([data-theme="dark"]) .obt-you{
    --ink:#10131A;--ink-dim:#3C4657;--ink-faint:#5C6880;--line:#D9DEE8;--panel:#FFFFFF;--page:#F6F7FA;
    color:var(--ink);
  }
  /* the topbar rule the host already ships (10_topbar.css:8) only matches the stamp; the system-light reader needs
     the same values and gets them here, with the same !important the original carries so the order cannot decide it. */
  :root:not([data-theme="dark"]) .obt-top{--ink:#0f1118;--ink-faint:#606C80;--page:#ffffff;--line:#e3e7ee;background:#fff!important}
  :root:not([data-theme="dark"]) .tb-menu{--page:#ffffff;--line:#e3e7ee;background:#fff}
}

/* ---- 2. THE NAV WORDS. The rail's league names and the stop tabs are the "invisible nav words": a rail item at rest
   is --ink-faint and the one in focus is --ink, and on a light ground both were being handed the dark page's pale
   values. Stated, not inherited. The focus ring is stated with them: a keyboard reader on a light page had a white
   ring on white. */
html[data-theme="light"] .obt-rail .obt-lg,
html[data-theme="light"] .obt-stops button{color:#3C4657}
html[data-theme="light"] .obt-rail .obt-lg.on,
html[data-theme="light"] .obt-stops button.on,
html[data-theme="light"] .obt-stops button[aria-selected="true"]{color:#10131A}
html[data-theme="light"] .obt-rail .obt-lg:focus-visible,
html[data-theme="light"] .obt-stops button:focus-visible{outline:2px solid #1D4FD8;outline-offset:1px}
@media (prefers-color-scheme:light){
  :root:not([data-theme="dark"]) .obt-rail .obt-lg,
  :root:not([data-theme="dark"]) .obt-stops button{color:#3C4657}
  :root:not([data-theme="dark"]) .obt-rail .obt-lg.on,
  :root:not([data-theme="dark"]) .obt-stops button.on,
  :root:not([data-theme="dark"]) .obt-stops button[aria-selected="true"]{color:#10131A}
  :root:not([data-theme="dark"]) .obt-rail .obt-lg:focus-visible,
  :root:not([data-theme="dark"]) .obt-stops button:focus-visible{outline:2px solid #1D4FD8;outline-offset:1px}
}

/* ---- 3. "TRACK IT" AND EVERY OTHER FILLED VERB. The pattern that made the blobs is background:var(--ink) with
   color:var(--bg) - correct on dark, where --ink is near-white and --bg near-black, and near-black on near-black the
   moment the tokens swap. The fill stays the ink (that is the design: one solid, no gradient outside .r9cta) and the
   LABEL becomes white, which is the only value that reads on it in either theme. */
html[data-theme="light"] .obt-verb,
html[data-theme="light"] .ub.u-slip,
html[data-theme="light"] .obt-band .obt-track{background:#10131A;color:#FFFFFF;border-color:#10131A}
@media (prefers-color-scheme:light){
  :root:not([data-theme="dark"]) .obt-verb,
  :root:not([data-theme="dark"]) .ub.u-slip,
  :root:not([data-theme="dark"]) .obt-band .obt-track{background:#10131A;color:#FFFFFF;border-color:#10131A}
}

/* ---- 4. THE CREST FALLBACK'S GROUND. K.crest now swaps a 404 crest for the club-colour shield (src/00b_kit2.js,
   this package) - the two new leagues, EFL Championship and Brazil Serie A, have no logo file and were printing the
   browser's own broken-image glyph. On a light page a pale club colour needs a hairline under it or the shield
   disappears into the panel; on dark it never did. */
html[data-theme="light"] .r9-shd,
html[data-theme="light"] .r9-sw{filter:drop-shadow(0 0 0 #D9DEE8)}
html[data-theme="light"] .r9-sw{box-shadow:inset 0 0 0 1px rgba(16,19,26,.18)}
@media (prefers-color-scheme:light){
  :root:not([data-theme="dark"]) .r9-sw{box-shadow:inset 0 0 0 1px rgba(16,19,26,.18)}
}

/* ---- 5. THE HOST'S OWN SCRIMS AND FILMS. Anything built as a white film over a dark panel is invisible over a white
   one; anything built as a black scrim over a dark page punches a hole in a light one. Both are restated. */
html[data-theme="light"] .obt-scrim,
html[data-theme="light"] .bb-scrim{background:rgba(24,28,36,.48)}
html[data-theme="light"] .obt-card,
html[data-theme="light"] .obt-drawer{background:#FFFFFF;border-color:#D9DEE8;color:#10131A}
@media (prefers-color-scheme:light){
  :root:not([data-theme="dark"]) .obt-scrim,
  :root:not([data-theme="dark"]) .bb-scrim{background:rgba(24,28,36,.48)}
  :root:not([data-theme="dark"]) .obt-card,
  :root:not([data-theme="dark"]) .obt-drawer{background:#FFFFFF;border-color:#D9DEE8;color:#10131A}
}

/* ---- 6. THE SECOND-RANK WORDS IN THE CHROME. tools/light_theme_test.py, first run, nfl at 1440, SYSTEM light:
   "switches" in the rail head read 3.5:1 on white and the topbar's own date and initials read 1.06:1 - dark ink on
   the dark ground the topbar was still painting, because 10_topbar.css:8 only matches the stamp. --ink-faint is a
   dark-page value: it is the right RELATIVE weight and the wrong absolute one the moment the ground turns white.
   Every faint word in the chrome is stated at a value that clears 4.5:1 on #FFF, and keeps its rank by being
   lighter than --ink, not by being close to the ground. */
html[data-theme="light"] .obt-rail .obt-sw,
html[data-theme="light"] .obt-rail .obt-hd,
html[data-theme="light"] .obt-rail small,
html[data-theme="light"] .obt-top .tb-date,
html[data-theme="light"] .obt-top .tb-me,
html[data-theme="light"] .obt-band small{color:#4A566B}
@media (prefers-color-scheme:light){
  :root:not([data-theme="dark"]) .obt-rail .obt-sw,
  :root:not([data-theme="dark"]) .obt-rail .obt-hd,
  :root:not([data-theme="dark"]) .obt-rail small,
  :root:not([data-theme="dark"]) .obt-top .tb-date,
  :root:not([data-theme="dark"]) .obt-top .tb-me,
  :root:not([data-theme="dark"]) .obt-band small{color:#4A566B}
  /* the topbar's own words: the stamp rule paints the ground white and the ink near-black; without the stamp the
     ground stayed dark and the ink went near-black with it. Both halves, together, or neither. */
  :root:not([data-theme="dark"]) .obt-top,
  :root:not([data-theme="dark"]) .obt-top *{color:#0f1118}
  :root:not([data-theme="dark"]) .obt-top a,
  :root:not([data-theme="dark"]) .obt-top button{color:#0f1118}
}

/* 104_w25a.css - [W25A 2026-09-20] BB_W25A_CSS_V144
   TWO THINGS THE FRAME OWED, BOTH MEASURED, NEITHER OF THEM A NEW LOOK.

   1. THE REPAINT DOES NOT RE-FADE.  W24A landed `r9-re` on a pane that is the SAME game and the SAME stop rendered
      again (src/04_engine.js, "A REPAINT IS NOT AN ARRIVAL") and its comment ends "css 104 turns the animation off
      for it" - css 104 was never written, so the class has been inert on prod. It is written here, with the
      redrawn-tile class E.redrawCell puts on a tile it replaces in place. What it cures was measured by
      tools/_w24a_focuswalk.py: with a live tick running, 37 of 45 controls in the pane could not take the keyboard,
      because `.bc{animation:obtIn .26s ease both}` was restarting on every tile on every rebuild and a tile in the
      opacity-0 phase of that animation is not a rendered box. It is also half of what the owner calls the refresh.
      The fade is right the first time a reading appears and wrong every time after.

   2. THE 13 px TEXT FLOOR, BELT AND BRACES.  Each organ's own stylesheet has been lifted (07_you.css, 09_chat.css,
      01m_livestate.css, 01u_livecon.css), but the shared card rules in scenes.css set `.r9o-body .src` and
      `.r9o-foot` to 11 px for any context the phone scope does not cover, and scenes.css is appended to the head
      by the scene loader, so it is LATER in the cascade than this file. These selectors are id-anchored and so win
      on specificity rather than on order, which is the only way a floor can be a floor. Sizes only - no colour, no
      weight, no family, no spacing: nothing here changes the look of a single line, only whether it can be read.

   LAWS: one typeface, inks and hairlines untouched, no pill / glow / gradient, no new colour, no markup. */

#obtStage .r9-five.r9-re .bc,
#obtStage .r9-five .bc.r9-re,
#obtStage .obt-bento.r9-re .bc { animation: none !important; }

#obtStage .r9o-body .src,
#obtStage .r9o-body .dim,
#obtStage .r9o-body .src.cites .srch,
#obtStage .r9o-foot,
#obtTiles .r9o-body .src,
#obtTiles .r9o-body .dim,
#obtTiles .r9o-body .src.cites .srch,
#obtTiles .r9o-foot { font-size: 13px; }

#obtStage .r9-livestrip .r9lv-c,
#obtStage .r9-livestrip .r9lv-mark,
#obtStage .r9lc-rests,
#obtStage .r9lc-why { font-size: 13px; }

/* ------------------------------------------------------------------------------------------------------------------
   3. THE GAMES RAIL'S STICKY DAY HEADER.

   SEEN BY THE INTEGRATOR on list #20 at 1440: the rail's sticky day header ("Monday, Sep 14") and the game row under
   it paint over each other - the row's second line shows through and above the header as the list scrolls.

   MEASURED ON THE BENCH FIRST (tools/_w25a_probe3.py nfl 1440), because a fix for a cause that is not there is worse
   than no fix:
       .obt-day   background rgb(21, 23, 31)   position sticky   z-index 3
       .obt-row   position static              z-index auto      height 52
   The header already HAS an opaque ground, so the ground is not the hole. What is left is the layer: z-index 3 is
   beaten by anything in the list that makes its own stacking context (a transform, a filter, an opacity under 1, a
   positioned crest), and a row that wins the layer paints straight over a sticky header whatever its background is.
   So the header is lifted clear of the rows rather than given a ground it already has, and the list is told to stop
   a keyboard-scrolled row underneath it. No colour, no token, no markup: if the cause on prod is the layer this
   closes it, and if it is not, nothing about the look has changed and the bench says so either way. */

#obtRows .obt-day { z-index: 6; }
#obtRows { scroll-padding-top: 2.4em; }

/* ------------------------------------------------------------------------------------------------------------------
   4. THE BAND'S CITY / VENUE + RECORD LINE SITS UNDER THE CLUB NAME, NOT BESIDE IT.

   LOOKED AT (shots/w22a/w25a_after_nfl_call_1440_sub.png, the first capture after block 132 seated the line):
   `.bbch-side` is a flex ROW of [crest][name], so a third child lands BESIDE the name and steals its width - the
   band read "Falco  won 3 of the l..." with the away club's own name clipped to five letters and the home club's
   clipped to "S". 98_w19b.css already gives this line its type and its ellipsis and says `display:block`, which a
   flex row ignores; what it needs is a line of its own. One declaration on the side, one on the line:
   the side is allowed to wrap and the line takes a whole row of it. Nothing else about the band moves. */

#obtStage .bbch-side { flex-wrap: wrap; }
#obtStage .bbch-side .bbwb-sub,
#obtStage .hr1 > .tm .bbwb-sub { flex: 0 0 100%; width: 100%; display: block; }

/* LOOKED AT again (w25a_after2): the home side reads "Acrisure Stadium - won 3 of th..." - 98_w19b.css caps this
   line at 22ch, which was written when it carried a CITY ("Detroit") and not a ground name. The venue plus the
   record needs more room on a desktop; the phone keeps its own 16ch cap, where a shorter line is the right one. */
@media (min-width: 821px) {
    #obtStage .bbch-side .bbwb-sub,
    #obtStage .hr1 > .tm .bbwb-sub { max-width: 34ch; }
}

/* BB_W25B_CSS_V145 [2026-09-20, W25B ask 3, integrator] LIGHT THEME, the host hero band: a club name sat in faint ink ON the club's own
   colour ('Sydney Swans' on #ED171F measured 1.55:1 in the stamped light state; even full ink on that red is 4.26:1, under the 4.5
   floor). In light the club colour stays on the 3 px tick beside the name and never behind it (the pattern .bbcv-tm i already uses);
   the name takes full ink on the page ground. Dark is untouched. */
html[data-theme="light"] .obt-stage .bbh .bbch-side{background:none}
html[data-theme="light"] .obt-stage .bbh-tm b{color:var(--ink)}
