/*
 * filter-drawer_opt.css — TWIN-ONLY styles for the redesigned filter drawer (Phase 1).
 * Loaded only by the optimized twin; classic never sees it. Every rule is scoped under
 * .rd-fdrawer so it cannot affect any existing player/filter styling. Values + tokens
 * mirror the design (player-redesign-panels.html / styles.css). The drawer reuses the shared
 * matching engine via customtagfilter_v2_opt.js; this file is purely presentation.
 */
.rd-fdrawer {
  /* design tokens, scoped */
  --s-shell:#0b0d12; --s-panel:#14171f; --s-panel2:#1a1e28; --s-line:#252a35;
  --s-ink:#f2f4f8; --s-mut:#8b93a8; --s-sel:#f2b632;
  --disp:'Chakra Petch',system-ui,sans-serif;
  --body:'Inter Tight',system-ui,-apple-system,'Segoe UI',Arial,sans-serif;

  width:344px; align-self:stretch; flex-direction:column;
  background:var(--s-panel); border-right:1px solid var(--s-line);
  color:var(--s-ink); font:12px/1.4 var(--body); overflow:hidden; min-height:0;
}
/* Shown state. Base stays hidden via the [hidden] attr (no display on the base rule, so the
   attr wins); .rd-open both reveals AND docks it as a full-height left panel. Real board-grid
   docking is a later refinement — this keeps the board visible to the right meanwhile. */
.rd-fdrawer.rd-open{ display:flex; position:fixed; top:0; left:0; height:100vh; z-index:100000;
  box-shadow:0 0 44px rgba(0,0,0,.6); }
.rd-fdrawer *{ box-sizing:border-box; }

/* sticky header / saved / query / footer; only the dimension stack scrolls */
.rd-fdrawer .rd-head{ display:flex; align-items:center; gap:9px; padding:11px 12px; height:38px;
  background:var(--s-panel2); border-bottom:1px solid var(--s-line); flex:none; }
.rd-fdrawer .rd-head b{ font:600 13px/1 var(--disp); letter-spacing:.02em; }
.rd-fdrawer .rd-head i{ font-style:normal; font:11px/1 var(--body); color:var(--s-mut); }
.rd-fdrawer .rd-head u{ text-decoration:none; margin-left:auto; color:var(--s-mut); font-size:13px; cursor:pointer; }

.rd-fdrawer .dsv{ display:flex; flex-wrap:wrap; gap:4px; padding:9px 12px;
  border-bottom:1px solid var(--s-line); align-items:center; flex:none; }
.rd-fdrawer .dsv em{ font-style:normal; font:600 9px/1 var(--body); letter-spacing:.1em;
  color:var(--s-mut); width:100%; margin-bottom:3px; }
.rd-fdrawer .sv{ display:inline-flex; align-items:center; gap:4px; background:#101319;
  border:1px solid var(--s-line); border-radius:99px; padding:4px 8px;
  font:600 9.5px/1.2 var(--body); color:#c3cad9; cursor:pointer; }
.rd-fdrawer .sv.on{ background:var(--s-sel); border-color:var(--s-sel); color:#1a1204; }
.rd-fdrawer .sv u{ text-decoration:none; opacity:.6; }
.rd-fdrawer .dsv .empty{ font-size:10.5px; color:var(--s-mut); }

.rd-fdrawer .qbar{ padding:9px 12px; border-bottom:1px solid var(--s-line); flex:none; }
.rd-fdrawer .qbar em{ display:block; font-style:normal; font:600 9px/1 var(--body);
  letter-spacing:.1em; color:var(--s-mut); margin-bottom:6px; }
.rd-fdrawer .qbar em b{ color:var(--s-sel); }
.rd-fdrawer .qc{ display:flex; flex-wrap:wrap; gap:4px; }
.rd-fdrawer .qc span{ display:inline-flex; align-items:center; gap:4px; background:var(--s-panel2);
  border-radius:3px; padding:4px 6px; font:600 9.5px/1.2 var(--body); color:#dfe4ee; }
.rd-fdrawer .qc span u{ text-decoration:none; color:var(--s-mut); font-size:10px; cursor:pointer; }
.rd-fdrawer .qc .allplays{ color:var(--s-mut); background:none; padding:0; }

/* scrolling dimension stack */
.rd-fdrawer .rd-stack{ flex:1 1 auto; overflow-y:auto; overflow-x:hidden; min-height:0; }

.rd-fdrawer .acc{ display:flex; align-items:center; gap:7px; padding:8px 12px; cursor:pointer;
  background:#101319; border-top:1px solid var(--s-line); border-bottom:1px solid var(--s-line);
  font:600 9.5px/1 var(--body); letter-spacing:.09em; color:#c3cad9; }
.rd-fdrawer .acc i{ font-style:normal; color:var(--s-mut); font-size:9px; }
.rd-fdrawer .acc s{ text-decoration:none; margin-left:auto; display:inline-flex; gap:4px; align-items:center; }
.rd-fdrawer .acc s b{ font:600 9px/1 var(--body); background:var(--s-sel); color:#1a1204;
  border-radius:99px; padding:3px 6px; letter-spacing:.03em; }
.rd-fdrawer .acc s em{ font-style:normal; font-size:9px; color:var(--s-mut); letter-spacing:.05em;
  border:1px solid var(--s-line); border-radius:3px; padding:3px 5px; cursor:pointer; }
.rd-fdrawer .acc s em.on{ color:var(--s-sel); border-color:rgba(242,182,50,.5); }
.rd-fdrawer .new{ font:600 8.5px/1 var(--body); background:#0a7d3c; color:#fff;
  border-radius:99px; padding:3px 5px; letter-spacing:.06em; }

.rd-fdrawer .dsr{ display:grid; grid-template-columns:74px 1fr; gap:9px; align-items:center;
  padding:7px 12px; border-bottom:1px solid #1c202a; }
.rd-fdrawer .dsr.full{ grid-template-columns:1fr; }
.rd-fdrawer .dsr>em{ font-style:normal; font:600 9px/1.25 var(--body); letter-spacing:.06em; color:var(--s-mut); }

/* chip group — the .on state is what the fork toggles on selection */
.rd-fdrawer .tg2{ display:flex; flex-wrap:wrap; gap:4px; }
.rd-fdrawer .tg2 span{ padding:4px 7px; border:1px solid var(--s-line); border-radius:99px;
  font:600 9.5px/1.2 var(--body); color:#c3cad9; display:inline-flex; gap:4px; align-items:center; cursor:pointer; }
.rd-fdrawer .tg2 span.on{ background:var(--s-panel2); border-color:var(--s-sel); color:#fff; }
.rd-fdrawer .tg2 span i{ font-style:normal; color:var(--s-mut); font-size:9px; }
.rd-fdrawer .tg2 span.on i{ color:var(--s-sel); }
.rd-fdrawer .tg2 span.dim{ opacity:.5; cursor:not-allowed; }
.rd-fdrawer .tg2 span.more{ border-style:dashed; color:var(--s-mut); }
.rd-fdrawer .tg2.grp{ opacity:.5; }               /* dimmed category group (with a reason line) */

/* distance range track + value */
.rd-fdrawer .rng{ display:flex; align-items:center; gap:7px; }
.rd-fdrawer .rngt{ position:relative; flex:1; height:4px; border-radius:2px; background:#2a303d; cursor:pointer; }
.rd-fdrawer .rngt i{ position:absolute; top:0; height:4px; border-radius:2px; background:var(--s-sel); }
.rd-fdrawer .rngt b{ position:absolute; top:-5px; width:6px; height:14px; border-radius:2px; background:var(--s-sel); }
.rd-fdrawer .rngv{ font:600 10px/1 var(--disp); color:#fff; min-width:56px; text-align:right; font-variant-numeric:tabular-nums; }

/* inline "Exact…" number-pad builder that expands in place */
.rd-fdrawer .exact-pad{ grid-column:1/-1; margin-top:6px; border:1px solid var(--s-sel);
  border-radius:6px; background:#0f1218; padding:8px; }
.rd-fdrawer .exact-pad .ops{ display:flex; gap:4px; margin-bottom:6px; }
.rd-fdrawer .exact-pad .ops span{ flex:1; text-align:center; padding:5px; border:1px solid var(--s-line);
  border-radius:4px; font:600 10px/1 var(--disp); color:#c3cad9; cursor:pointer; }
.rd-fdrawer .exact-pad .ops span.on{ background:var(--s-sel); border-color:var(--s-sel); color:#1a1204; }
.rd-fdrawer .exact-pad .pad{ display:grid; grid-template-columns:repeat(3,1fr); gap:4px; }
.rd-fdrawer .exact-pad .pad span{ text-align:center; padding:8px; border:1px solid var(--s-line);
  border-radius:4px; font:600 12px/1 var(--disp); color:#fff; cursor:pointer; }
.rd-fdrawer .exact-pad .apply{ margin-top:6px; width:100%; text-align:center; padding:7px;
  background:var(--s-sel); color:#1a1204; border-radius:4px; font:600 10px/1 var(--body); cursor:pointer; }

/* search field */
.rd-fdrawer .msearch{ display:flex; align-items:center; width:100%; background:#101319;
  border:1px solid var(--s-line); border-radius:4px; padding:5px 8px; font-size:10.5px;
  color:var(--s-mut); margin:0; }
.rd-fdrawer .msearch input{ flex:1; background:none; border:0; outline:0; color:#fff; font:inherit; }
.rd-fdrawer .msearch u{ text-decoration:none; margin-left:auto; }

.rd-fdrawer .legend-hint{ font-size:10px; color:var(--s-mut); padding:5px 12px 8px; }
.rd-fdrawer .legend-hint em{ font-style:normal; color:#c3cad9; }

/* custom-tags two-pane (kept — unbounded list needs the drill) */
.rd-fdrawer .twopane{ grid-column:1/-1; display:grid; grid-template-columns:40% 1fr; gap:8px; }
.rd-fdrawer .twopane .cats,.rd-fdrawer .twopane .vals{ max-height:150px; overflow-y:auto; }
.rd-fdrawer .twopane .catrow{ padding:4px 6px; border-radius:4px; font-size:10.5px; color:#c3cad9; cursor:pointer; }
.rd-fdrawer .twopane .catrow.on{ background:var(--s-panel2); color:#fff; }

/* footer */
.rd-fdrawer .ppf{ display:flex; align-items:center; gap:8px; padding:11px 12px; height:44px;
  background:#101319; border-top:1px solid var(--s-line); flex:none; }
.rd-fdrawer .bt{ font:600 11px/1 var(--body); border:1px solid var(--s-line); border-radius:5px;
  padding:9px 12px; color:#c3cad9; cursor:pointer; }
.rd-fdrawer .bt.pri{ background:var(--s-sel); border-color:var(--s-sel); color:#1a1204; margin-left:auto; }
.rd-fdrawer .bt.pri.inert{ background:none; border-color:var(--s-line); color:var(--s-mut); cursor:default; }
.rd-fdrawer .bt.hidden{ display:none; }

/* ============================================================================
 * PHASE 3 · Board — LANES (default) / LIST (compact) + a 32px header toggle.
 * TWIN-ONLY and additive: LIST styling only bites when #statFrame carries
 * .rd-list-mode (the adapter toggles it from the header it injects). The default
 * board (LANES) is visually untouched, so nothing changes until a coach opts in.
 * Minimap + virtualization are later P3 increments.
 * ========================================================================== */
.rd-board-head{ display:flex; align-items:center; gap:12px; padding:0 12px; height:32px; flex:none;
  background:#14171f; border-bottom:1px solid #252a35; color:#f2f4f8;
  font:12px/1 'Inter Tight',system-ui,-apple-system,'Segoe UI',Arial,sans-serif; }
.rd-board-head .rd-seg{ display:inline-flex; border:1px solid #252a35; border-radius:5px; overflow:hidden; }
.rd-board-head .rd-seg span{ padding:6px 12px; font:600 9.5px/1 'Chakra Petch',system-ui,sans-serif;
  letter-spacing:.09em; color:#8b93a8; cursor:pointer; }
.rd-board-head .rd-seg span.on{ background:#f2b632; color:#1a1204; }
.rd-board-head .rd-bcount{ font-size:11px; color:#8b93a8; font-variant-numeric:tabular-nums; }
.rd-board-head .rd-bcount b{ color:#f2f4f8; font-weight:600; }
/* Lite board header — shown on non-STAT tabs for consistency (count + Legend + Filter; no LANES/LIST
   or expand). Aligns its count with the cards (nav-rail clearance) and pushes Legend/Filter right. */
body.rd-has-navrail .rd-board-head.rd-bh-lite{ padding-left:64px; }
.rd-board-head.rd-bh-lite .rd-legend-open{ margin-left:auto; }
/* TEAM tab's simple filter = the classic All/My/Others dropdown, relocated into the lite header (bug 2). */
.rd-board-head.rd-bh-lite .rd-fd-teamwrap{ display:inline-flex; align-items:center; }
.rd-board-head.rd-bh-lite .rd-fd-teamwrap .staff-snip-filter-dropdown{ display:inline-block !important; height:26px;
  padding:0 8px; width:auto; min-width:118px; background:#20242d; color:#e6e9f0; border:1px solid #333a48;
  border-radius:6px; font:600 11px/1 'Inter Tight',sans-serif; cursor:pointer; }
/* Multi-select delete (bug 9): the "Select" trigger in non-stat board headers + skin the classic overlay. */
.rd-board-head .rd-multidel{ margin-left:6px; height:26px; padding:0 12px; border:1px solid #333a48; background:#191d24;
  color:#c9cede; border-radius:6px; font:600 11px/1 'Inter Tight',sans-serif; cursor:pointer; }
.rd-board-head .rd-multidel:hover{ border-color:#e1261c; color:#fff; }
.rd-board-head .rd-multidel.on{ background:#e1261c; border-color:#e1261c; color:#fff; }
/* lift the classic delete-multiple popup above the redesign chrome (navrail 99998 / appbar 99999) */
body.rd-has-navrail #del-multiple-snips-popup{ z-index:100012 !important; }
/* per-card select checkbox — keep it above the card content and clearly tappable while selecting */
body.rd-multidel-on .add-remove-statsnipcollection{ z-index:6; }
body.rd-multidel-on .each-shot .check-movesnip{ box-shadow:0 0 0 2px rgba(0,0,0,.45); }

/* Empty collection — a tab with no snips still shows its board rail (the lite header mounts above),
   and the empty area reads as an intentional, consistent panel instead of bare red "No Data" text.
   Give it the board's grey ground + nav-rail clearance and turn the .no-bkmarks marker into a quiet,
   centred empty-state so the tab stays a legible place to add snips. */
/* The classic frame pins its height to 150px (.shots-flex) and lives in the 1874px content column
   (the camera rail takes the rest of the flex row), so an empty board would float mid-window with a
   dead strip below it and a gap to the right. Break it out to full width (like the STAT board's 100vw)
   and fill it down to the viewport bottom — --rd-coll-top (the frame's top, set by ensureAltHeaders on
   mount + resize) is the only run-time-measured value the CSS needs. */
.rd-empty-frame{ width:100vw !important; height:auto !important; overflow:hidden !important;
  min-height:calc(100vh - var(--rd-coll-top, 900px)) !important; box-sizing:border-box;
  background:#14171f !important; display:flex !important; align-items:center; justify-content:center; }
body.rd-has-navrail .rd-empty-frame{ padding-left:64px !important; }
.rd-empty-frame .no-bkmarks{
  color:#5b6274 !important; margin:0 !important; padding:36px 16px !important; font-size:12px !important;
  font-weight:600 !important; letter-spacing:.02em; text-align:center !important; width:auto !important; }
.rd-empty-frame .no-bkmarks::before{
  content:"\1F4C2"; display:block; font-size:22px; opacity:.5; margin-bottom:8px; }
/* the empty tab's lite header spans full width too, so the rail reads as one panel edge-to-edge */
.rd-board-head.rd-bh-lite.rd-bh-empty{ width:100vw !important; box-sizing:border-box; }

/* Non-STAT collections (populated or empty) break out to full width like the STAT board's .rd-boardwrap,
   so their card row + lite header reach the window's right edge instead of stopping at the 1874px content
   column (which left a black strip down the right side — the STAT board doesn't have it because it's 100vw).
   padding-left:64px (nav-rail clearance) is already applied to these frames, and box-sizing keeps it inside. */
#odkFrame, #chartFrame, #teamFrame, #allFrame, #playerFrame, #assignedFrame{ width:100vw !important; box-sizing:border-box; }
.rd-board-head.rd-bh-lite{ width:100vw !important; box-sizing:border-box; }

/* Transport button tooltips (the classic .player-right-icons a → .tooltip-text) render UNDER the video's
   control-bar scrubber — an ancestor stacking context the transport can't beat with z-index, even fixed +
   max z-index. So hide those and mirror the text into a body-level top-layer tip that's always on top.
   (player-redesign_opt.js positions .rd-tiptop over the hovered control.) */
.player-right-icons .tooltip-text{ display:none !important; }
.rd-tiptop{ position:fixed; z-index:2147483000; transform:translate(-50%, calc(-100% - 9px)); pointer-events:none;
  opacity:0; background:#1a1e28; color:#e6e9f0; padding:5px 9px; border-radius:6px; white-space:nowrap;
  font:600 11px/1.2 'Inter Tight',system-ui,-apple-system,'Segoe UI',Arial,sans-serif; letter-spacing:.01em;
  border:1px solid #2b313c; box-shadow:0 6px 18px rgba(0,0,0,.55); transition:opacity .08s; }
.rd-tiptop.on{ opacity:1; }
.rd-tiptop::after{ content:""; position:absolute; top:100%; left:50%; transform:translateX(-50%);
  border:5px solid transparent; border-top-color:#1a1e28; }

/* POPULATED collections leave a dead black strip below the board too (the board is a fixed-height grid
   and the collections row only grows to its content, ~44-68px short of the viewport). Fill that row to
   the bottom with the board's own ground colour so every collection — stat board, card tabs, empty —
   reaches the browser edge. --rd-row-top (the row's top, published by fillRail on mount/tab/resize) is
   the run-time value; the board's opaque bg covers the top, this fills below it. */
.entire-video-shot-section{ min-height:calc(100vh - var(--rd-row-top, 868px)) !important; background:#14171f; }
/* When the charting panel (.rd-chartwork, fixed right, 404px) is open, cap the bottom board so its right
   edge stops at the panel's left edge — otherwise the board head's filter + legend buttons sit under the
   panel. STAT wraps the board in .rd-boardwrap (which overflows its parent); other tabs use the section
   directly — cap both. */
/* The board only reserves 404px for the panel while it is DOCKED — when detached (floating), the panel no
   longer occupies the right edge, so the board/video reclaim full width (:not(.cw-detached)). */
body.cw-active:not(.cw-detached) .rd-boardwrap,
body.cw-active:not(.cw-detached) .entire-video-shot-section{ width:calc(100vw - 404px) !important; max-width:calc(100vw - 404px) !important; }
body.cw-active .rd-boardwrap{ overflow-x:auto; }
/* Some frames (STAFF/team, MY…) place .rd-board-head directly in the col — no .rd-boardwrap ancestor —
   so the head itself spans the full row and its FILTER/LEGEND buttons hide under the panel. Cap the head
   too, and undo the cap where it sits inside the already-capped wrapper (avoid a padding double-cap). */
body.cw-active:not(.cw-detached) .rd-board-head{ width:calc(100vw - 404px) !important; max-width:calc(100vw - 404px) !important; }
body.cw-active .rd-boardwrap .rd-board-head{ width:auto !important; max-width:none !important; }

/* LIST — narrow the columns and drop the tag-text block; keep the ramp-coloured
   result number (the primary at-a-glance signal). Hover-restore of tags is a refinement. */
/* ══ Board views — LANES (rich 4-row study grid) + LIST (compact strip). Both restyle the existing
   .each-shot IN PLACE; .shot-number stays the clickable .frameshot node so seek/select/filter/
   charting wiring is reused verbatim. rdBuildBoard builds ONE DOM per column (possession .rd-lvt =
   b/i/u · result .rd-cap = rc-n/rc-w + band class · coach .rd-tagcell); these rules reflow it.
   The mode class `rd-list` lives on .rd-boardwrap (not just #statFrame) so it can also style the
   fixed left label column, which is #statFrame's sibling. ══ */

/* board frame: toolbar row on top · [labels | scrolling plays] body · minimap at the bottom.
   width:100vw breaks the board out of its classic column (~1953px, offset for the right sidebar)
   so it spans the full window; its left is already at x0 and the area to the right is empty here. */
.rd-boardwrap{ display:flex; flex-direction:column; align-items:stretch; background:#0b0d12; width:100vw; }
.rd-board-head{ order:0; display:flex; align-items:center; gap:10px; padding:5px 10px; }
.rd-board-body{ order:1; display:flex; align-items:flex-start; width:100%; overflow:hidden; }
.rd-board-body #statFrame{ flex:1 1 auto; min-width:0; }
/* persistent filter tag-summary bar — sits between the board head and body when a filter is active;
   shows the active chips, removes any one (re-runs the found set), or clears all — no drawer needed.
   Scoped to body.rd-has-navrail, not .rd-boardwrap: the lanes wrapper is football-only (built by
   ensureBoardHeader, which returns early unless gameCategory==7), so every other sport rendered the
   bar into a container these rules never matched. .rd-fsum is created only by filterDrawer_opt.js,
   which only the redesigned twin loads, so the body scope is as tight in practice and covers both. */
body.rd-has-navrail .rd-fsum{ order:0; display:flex; align-items:center; gap:9px; padding:6px 12px; margin-top:2px;
  background:#111318; border-top:1px solid #1b2028; border-bottom:1px solid #1b2028; }
body.rd-has-navrail .rd-fsum{ padding-left:64px; }   /* clears the nav rail — the lite STAT header uses the same 64px */
body.rd-has-navrail .rd-fsum-lbl{ flex:none; display:inline-flex; align-items:center; gap:5px; font:800 9.5px/1 'Inter Tight',system-ui,sans-serif;
  letter-spacing:.08em; color:#f2b632; }
body.rd-has-navrail .rd-fsum-chips{ display:flex; gap:6px; flex:1 1 auto; min-width:0; overflow-x:auto; padding:1px 0; }
body.rd-has-navrail .rd-fsum-chip{ flex:none; display:inline-flex; align-items:center; gap:5px; height:24px; padding:0 6px 0 10px;
  background:#20242d; border:1px solid #2b313c; border-radius:12px; font:600 11px/1 'Inter Tight',system-ui,sans-serif; color:#e6e9f0; white-space:nowrap; }
body.rd-has-navrail .rd-fsum-x{ cursor:pointer; color:#8b93a8; font:700 14px/1 sans-serif; }
body.rd-has-navrail .rd-fsum-x:hover{ color:#e1261c; }
body.rd-has-navrail .rd-fsum-clear, body.rd-has-navrail .rd-fsum-edit{ flex:none; height:24px; padding:0 11px; border-radius:6px;
  font:700 10.5px/1 'Inter Tight',system-ui,sans-serif; cursor:pointer; }
body.rd-has-navrail .rd-fsum-clear{ background:#2a2f3a; color:#c9cede; border:1px solid #3a414e; }
body.rd-has-navrail .rd-fsum-clear:hover{ color:#fff; border-color:#e1261c; background:#e1261c; }
body.rd-has-navrail .rd-fsum-edit{ background:transparent; color:#8b93a8; border:1px solid #2b313c; }
body.rd-has-navrail .rd-fsum-edit:hover{ color:#fff; border-color:#3a4256; }
/* tab-switch micro-gate: hide the snip cards while the classic tab swaps in, so the classic snip
   layout never flashes before the redesign re-styles the new tab (cleared by mountBoard via rd-switching) */
body.rd-switching .each-shot{ visibility:hidden !important; }
/* identity tabs (STAFF/MINE/PLAYER/ASSIGN): hide the classic cards until the frame is redesign-built
   (.rd-idcards is added the moment the meta structure is; build() no longer waits for the authors AJAX,
   so this window is tiny). Fixes the classic-cards flash on the initial STAFF load. */
#teamFrame:not(.rd-idcards) .each-shot,
#playerFrame:not(.rd-idcards) .each-shot,
#assignedFrame:not(.rd-idcards) .each-shot{ visibility:hidden !important; }

/* fixed left label column (LANES only)
   height pinned to the card's fixed 166px (see .each-shot below) so the label rows shrink by the
   SAME amount as the card cells — otherwise the labels stay at their 200px content height while the
   card compresses to 166, and the headers drift below their lanes. */
.rd-lanes-labels{ flex:0 0 96px; height:166px; display:flex; flex-direction:column; background:#0f1219; border-right:1px solid #252a35; }
.rd-lanes-labels .rl-r{ display:flex; flex-direction:column; justify-content:center; padding:0 9px;
  font:700 9px/1.15 'Inter Tight',system-ui,-apple-system,'Segoe UI',Arial,sans-serif; letter-spacing:.03em;
  color:#8b93a8; border-bottom:1px solid #1a1e28; }
.rd-lanes-labels .rl-r span{ display:block; font-weight:600; font-size:8px; color:#5b6274; }
.rd-lanes-labels .rl-play{ flex:0 0 20px; height:20px; }   /* no-shrink, mirrors .shot-number min-height:20 */
.rd-lanes-labels .rl-poss{ height:45px; }
.rd-lanes-labels .rl-res{ height:45px; }
.rd-lanes-labels .rl-tags{ height:90px; }
.rd-boardwrap.rd-list .rd-lanes-labels{ display:none; }

#statFrame{ align-items:flex-start !important; }
#statFrame .each-shot{ cursor:pointer; }   /* whole column is clickable (JS forwards to .frameshot) */

/* ── LANES (default): 4 stacked cells per play, aligned to the label rows ── */
.rd-boardwrap:not(.rd-list) #statFrame .each-shot{ display:flex !important; flex-direction:column !important;
  width:96px !important; min-width:96px !important; max-width:96px !important; height:166px !important;
  padding:0 !important; margin:0 1px 0 0 !important; border-right:1px solid #21262f; }
/* PLAY — the reused .shot-number (its clickable label = play no.; the yardage badge is dropped here) */
.rd-boardwrap:not(.rd-list) #statFrame .each-shot .shot-number{ order:1; height:20px !important; min-height:20px;
  display:flex !important; align-items:center; justify-content:center; margin:0 !important;
  background:#191d27 !important; border:0 !important; border-bottom:1px solid #252a35 !important; }
.rd-boardwrap:not(.rd-list) #statFrame .each-shot .shot-number .fball-yard-bk{ display:none !important; }
.rd-boardwrap:not(.rd-list) #statFrame .each-shot .shot-number .position-relative{ font:700 12px/1 'Chakra Petch',system-ui,sans-serif; color:#e6e9f0 !important; }
/* POSSESSION — down (b) · spot (i) · OFF/DEF/SPEC unit (u) */
.rd-boardwrap:not(.rd-list) #statFrame .each-shot .rd-lvt{ order:2; height:45px !important; display:flex !important;
  flex-direction:column; justify-content:center; gap:1px; padding:4px 6px !important; }
.rd-boardwrap:not(.rd-list) #statFrame .each-shot .rd-lvt b{ font:700 11px/1.1 'Inter Tight',system-ui,sans-serif; color:#fff; }
.rd-boardwrap:not(.rd-list) #statFrame .each-shot .rd-lvt i{ font-style:normal; font:600 9px/1.15 'Inter Tight',system-ui,sans-serif; color:rgba(255,255,255,.66); }
.rd-boardwrap:not(.rd-list) #statFrame .each-shot .rd-lvt .rd-unit{ font:700 8px/1 'Inter Tight',system-ui,sans-serif; letter-spacing:.05em; color:rgba(255,255,255,.85); }
/* RESULT — signed yards (rc-n) + band word (rc-w) */
.rd-boardwrap:not(.rd-list) #statFrame .each-shot .rd-cap{ order:3; height:45px !important; display:flex !important;
  flex-direction:column; justify-content:center; align-items:flex-start; gap:1px; padding:4px 7px; color:#fff; }
.rd-boardwrap:not(.rd-list) #statFrame .each-shot .rd-cap .rc-n{ font:800 15px/1 'Chakra Petch',system-ui,sans-serif; }
.rd-boardwrap:not(.rd-list) #statFrame .each-shot .rd-cap .rc-w{ font:700 8px/1 'Inter Tight',system-ui,sans-serif; letter-spacing:.04em; opacity:.85; }
/* COACH TAGS — first 2 play tags + overflow count */
.rd-boardwrap:not(.rd-list) #statFrame .each-shot .rd-tagcell{ order:4; height:90px; display:flex; flex-direction:column;
  gap:2px; padding:5px 6px; background:#0f1219; overflow:hidden; }
.rd-boardwrap:not(.rd-list) #statFrame .each-shot .rd-tagcell .rd-tg{ font:600 8px/1.2 'Inter Tight',system-ui,sans-serif; color:#c3cad9;
  border-left:2px solid #3f7d4f; padding-left:4px; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.rd-boardwrap:not(.rd-list) #statFrame .each-shot .rd-tagcell .rd-tg-more{ font:600 8px/1 'Inter Tight',system-ui,sans-serif; color:#5b6274; }
/* classic inner nodes not used in the LANES grid */
.rd-boardwrap:not(.rd-list) #statFrame .each-shot .shot-username,
.rd-boardwrap:not(.rd-list) #statFrame .each-shot .shot-username-fbinfo,
.rd-boardwrap:not(.rd-list) #statFrame .each-shot .snip-tooltip{ display:none !important; }
/* result-band colours — mirrored 3-band FALLBACK (JS paints the precise 5-band ramp inline, so
   these only show if the ramp hasn't run yet). Tokens: gain / zero / loss. */
#statFrame .each-shot .rd-cap.rc-g{ background:#3ab54a; }
#statFrame .each-shot .rd-cap.rc-z{ background:#565d6d; color:#fff; }
#statFrame .each-shot .rd-cap.rc-r{ background:#e1483c; }

/* possession colours (§#8) — keyed on which TEAM has the ball, NOT the loss-red hue.
   home #293991 (your team has it) · away #0d0f14 (opponent has it) · special #800580 */
#statFrame .each-shot .rd-lvt.h{ background:#293991; }
#statFrame .each-shot .rd-lvt.a{ background:#0d0f14; }
#statFrame .each-shot .rd-lvt.s{ background:#800580; }
#statFrame .each-shot .rd-lvt.n{ background:#2b303c; }

/* ── LIST (compact): 3 narrow rows — PLAY number (top) · possession · result number ──
   Mirrors the LANES top rows (number gets its own small row, not combined with the result). No
   coach-tags row and no left labels. */
.rd-boardwrap.rd-list #statFrame .each-shot{ display:flex !important; flex-direction:column !important;
  width:60px !important; min-width:60px !important; max-width:60px !important; height:88px !important;
  padding:0 !important; margin:0 !important; border-right:1px solid #21262f; }
/* PLAY (number only — hide the yardage badge so it isn't combined with the result) */
.rd-boardwrap.rd-list #statFrame .each-shot .shot-number{ order:1; flex:0 0 auto !important; height:18px !important; min-height:18px;
  display:flex !important; align-items:center; justify-content:center; margin:0 !important;
  background:#191d27 !important; border:0 !important; border-bottom:1px solid #252a35 !important; }
.rd-boardwrap.rd-list #statFrame .each-shot .shot-number .fball-yard-bk{ display:none !important; }
.rd-boardwrap.rd-list #statFrame .each-shot .shot-number .position-relative{ font:700 10px/1 'Chakra Petch',system-ui,sans-serif; color:#e6e9f0 !important; }
/* POSSESSION */
.rd-boardwrap.rd-list #statFrame .each-shot .rd-lvt{ order:2; flex:1 1 auto; display:flex; flex-direction:column; justify-content:center; gap:0; padding:2px 4px; min-height:0; }
.rd-boardwrap.rd-list #statFrame .each-shot .rd-lvt b{ font:700 9px/1.1 'Chakra Petch',system-ui,sans-serif; color:#fff; }
.rd-boardwrap.rd-list #statFrame .each-shot .rd-lvt i{ font-style:normal; font:600 8px/1.1 'Inter Tight',system-ui,sans-serif; color:rgba(255,255,255,.62); }
.rd-boardwrap.rd-list #statFrame .each-shot .rd-lvt .rd-unit{ display:none; }
/* RESULT (colored number) */
.rd-boardwrap.rd-list #statFrame .each-shot .rd-cap{ order:3; flex:0 0 auto; height:26px !important; display:flex !important; align-items:center; justify-content:center; padding:2px; }
.rd-boardwrap.rd-list #statFrame .each-shot .rd-cap .rc-n{ font:800 12px/1 'Chakra Petch',system-ui,sans-serif; color:#fff; }
.rd-boardwrap.rd-list #statFrame .each-shot .rd-cap .rc-w{ display:none; }
.rd-boardwrap.rd-list #statFrame .each-shot .rd-tagcell,
.rd-boardwrap.rd-list #statFrame .each-shot .shot-username,
.rd-boardwrap.rd-list #statFrame .each-shot .shot-username-fbinfo,
.rd-boardwrap.rd-list #statFrame .each-shot .snip-tooltip{ display:none !important; }

/* §7.5 — selection ring is GOLD in EVERY collection tab, retiring active-red-shot's red marker
   (red is the chrome accent now, so it no longer reads as selection). OUTLINE, not inset
   box-shadow: the card tabs' opaque children (thumb + label chips) cover the card face and hid
   the shadow ring entirely — an outline paints OVER descendants, so the ring shows on every
   frame (ODK/CHART/MY/STAFF/PLAYER/ASSIGN), and no ID-scoped border override can beat it.
   The classic red ::before marker stays suppressed across all frames. */
.each-shot.active-red-shot{ outline:2px solid #f2b632 !important; outline-offset:-2px !important; border-radius:6px; }
.each-shot.active-red-shot:before{ display:none !important; }

/* §7 step 3 — AUTHOR COLOUR TOKENS: six stable hues assigned user_id % 6 (never load-order). Published
   now; the initials disc is DEFERRED — the web Staff card has no author name/initial (it renders "N/A";
   only iPad shows it). The proper disc will render on a NEW element via the getGameSnipAuthors endpoint. */
:root{ --a-author-1:#2ec4b6; --a-author-2:#3aa8f0; --a-author-3:#7c6cf5; --a-author-4:#c86ef0; --a-author-5:#f06ea8; --a-author-6:#f09a3e; }

/* §7 — IDENTITY CARD (Staff/Player). Restructure the narrow classic card into the redesign anatomy:
   thumb (number) → author disc(initials+hue)+name → the classic label as a tag. Slots 3-4 collapse
   (identity tabs carry no play data). Author-forward: "who cut this" is the axis. */
.rd-idcards{ align-items:flex-start !important; }
/* clear the fixed 60px collections rail (mirrors body.rd-has-navrail .rd-boardwrap) so the first card
   isn't hidden under it — these identity frames aren't wrapped in .rd-boardwrap */
body.rd-has-navrail .rd-idcards{ padding-left:64px !important; box-sizing:border-box !important; }
.rd-idcards .each-shot{ width:104px !important; min-width:104px !important; max-width:104px !important; height:auto !important;
  display:flex !important; flex-direction:column !important; margin:0 6px 0 0 !important; padding:0 !important;
  background:#111318 !important; border:1px solid #282d37 !important; border-radius:6px !important; overflow:hidden !important; }
/* thumb — the reused number cell */
.rd-idcards .each-shot .shot-number{ order:1 !important; width:100% !important; height:52px !important; min-height:52px !important;
  display:flex !important; align-items:center !important; justify-content:center !important; margin:0 !important;
  background:#0e1116 !important; border:0 !important; border-bottom:1px solid #20242d !important; border-radius:0 !important; }
.rd-idcards .each-shot .shot-number .position-relative{ font:700 15px/1 'Chakra Petch',system-ui,sans-serif !important; color:#e6e9f0 !important; background:transparent !important; }
/* The classic per-snip colour layer (inline bg) used to be flattened to #0e1116 here. It is NOT a
   "result hue" — it is the snip's own custom-tag colour_code, and coaches need to see it (QA
   2026-08-09). The bands are restored at the bottom of this file; see "(2) SNIP TAG COLOUR". */
/* identity slot — author disc + name */
.rd-idcards .each-shot .rd-meta{ order:2; display:flex; align-items:center; gap:6px; padding:6px 7px; background:#0e1116; }
.rd-idcards .each-shot .rd-disc{ flex:none; width:20px; height:20px; border-radius:50%; display:inline-grid; place-items:center;
  font:700 8.5px/1 'Inter Tight',system-ui,sans-serif; color:#0c0e12; letter-spacing:-.02em; }
/* Assigned coach-view group count (many assignees) — neutral, not a player hue */
.rd-idcards .each-shot .rd-disc.rd-disc-grp{ background:#20242d !important; color:#c3cad9 !important; border:1px solid #3a4256; }
.rd-idcards .each-shot .rd-aname{ font:600 9.5px/1.2 'Inter Tight',system-ui,sans-serif; color:#e6e9f0; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; min-width:0; }
/* the classic label → a tag chip at the bottom */
.rd-idcards .each-shot .shot-username{ order:3 !important; display:block !important; width:auto !important; height:auto !important;
  padding:5px 7px !important; margin:0 !important; background:#0d1014 !important; border:0 !important; border-top:1px solid #20242d !important;
  border-radius:0 !important; font:600 8.5px/1.2 'Inter Tight',system-ui,sans-serif !important; color:#c3cad9 !important;
  text-align:left !important; white-space:nowrap !important; overflow:hidden !important; text-overflow:ellipsis !important;
  /* the classic label runs VERTICAL (writing-mode:vertical-rl + rotate(180deg)) — that made the label
     height scale with character count, so cards came out ragged (104/113/131px). Force it horizontal
     so every label is one line and every identity card is the same height. */
  writing-mode:horizontal-tb !important; text-orientation:mixed !important; transform:none !important; line-height:1.3 !important; }
.rd-idcards .each-shot{ min-height:104px !important; }   /* belt-and-suspenders: uniform card height */
.rd-idcards .each-shot .snip-tooltip{ display:none !important; }

/* ===== ODK / CHART / MY tabs — redesign card shell ==========================
   #odkFrame / #chartFrame / #allFrame ship the same classic thumb+label card the
   identity tabs started from (colored number + vertical label + red scrollbar).
   Bring them up to the redesign card (thumb over a horizontal label chip) — no
   author disc (these tabs aren't author-scoped), uniform size, dark theme. */
/* #scriptFrame (GAMEPLAN) was missing from this list, so its cards rendered at x=0 — straight under
   the 60px nav rail. The snips were there and correct; you simply could not see them, which is why
   "Add to GamePlan" reported success and the collection then looked empty (QA #246 bug 34). */
body.rd-has-navrail #odkFrame, body.rd-has-navrail #chartFrame, body.rd-has-navrail #allFrame,
body.rd-has-navrail #scriptFrame{ padding-left:64px !important; box-sizing:border-box !important; }
#odkFrame .each-shot, #chartFrame .each-shot, #allFrame .each-shot{
  width:104px !important; min-width:104px !important; max-width:104px !important; min-height:100px !important; height:auto !important;
  display:flex !important; flex-direction:column !important; margin:0 6px 0 0 !important; padding:0 !important;
  background:#111318 !important; border:1px solid #282d37 !important; border-radius:6px !important; overflow:hidden !important; }
/* block (not flex-centre) so the classic per-snip colour stripes (.bd-highlight, each an inline-coloured
   min-height:% band) stack + fill the thumb as a colour bar; the number floats over them (absolute). */
#odkFrame .each-shot .shot-number, #chartFrame .each-shot .shot-number, #allFrame .each-shot .shot-number{
  order:1 !important; width:100% !important; height:52px !important; min-height:52px !important; flex:none !important;
  display:block !important; position:relative !important; overflow:hidden !important; margin:0 !important;
  background:#0e1116 !important; border:0 !important; border-bottom:1px solid #20242d !important; border-radius:0 !important; }
#odkFrame .each-shot .shot-number .position-relative, #chartFrame .each-shot .shot-number .position-relative, #allFrame .each-shot .shot-number .position-relative{
  position:absolute !important; inset:0 !important; display:flex !important; align-items:center !important; justify-content:center !important; z-index:1 !important;
  font:700 15px/1 'Chakra Petch',system-ui,sans-serif !important; color:#fff !important; text-shadow:0 1px 2px rgba(0,0,0,.7) !important; background:transparent !important; }
/* NOTE: do NOT over-paint .bd-highlight here — that was killing the O/D/K colour coding. Let the classic
   inline colours show (ODK / CHART / MINE). Identity cards (Staff/Player) keep their neutral thumb above. */
#odkFrame .each-shot .shot-number .bd-highlight, #chartFrame .each-shot .shot-number .bd-highlight, #allFrame .each-shot .shot-number .bd-highlight{
  width:100% !important; display:block !important; }
#odkFrame .each-shot .shot-username, #chartFrame .each-shot .shot-username, #allFrame .each-shot .shot-username{
  order:2 !important; flex:1 1 auto !important; width:auto !important; height:auto !important; min-height:0 !important;
  padding:6px 8px !important; margin:0 !important; background:#0d1014 !important; border:0 !important; border-top:1px solid #20242d !important; border-radius:0 !important;
  writing-mode:horizontal-tb !important; text-orientation:mixed !important; transform:none !important;
  font:600 9px/1.3 'Inter Tight',system-ui,sans-serif !important; color:#c3cad9 !important; text-align:left !important;
  display:-webkit-box !important; -webkit-line-clamp:2 !important; -webkit-box-orient:vertical !important; white-space:normal !important; overflow:hidden !important; }
#odkFrame .each-shot .snip-tooltip, #chartFrame .each-shot .snip-tooltip, #allFrame .each-shot .snip-tooltip{ display:none !important; }

/* ===== BOARD/PANEL POLISH ===================================================
   Clock cleared the gold play/pause button (they overlapped ~11px). */
body.rd-has-appbar .video-time{ margin-left:16px !important; }
/* Camera panel: no horizontal scroll (the tiles are a single column), and give the whole
   right rail the same grey panel backdrop as the top bar + left nav (.rd-campanel added by JS). */
.video-shots{ overflow-x:hidden !important; }
.rd-campanel{ background:#14171f !important;
  /* fill the full right side like the left nav rail (was content-height, leaving black above+below):
     start right below the 48px app-bar and stretch to the viewport bottom; padding-top keeps the
     CAMERAS content where the classic layout placed it. */
  top:48px !important; min-height:calc(100vh - 48px) !important; padding-top:48px !important; box-sizing:border-box !important; }
/* Bottom copyright strip → a grey panel so all four sides read as complete panels. */
.copyRight{ background:#14171f !important; }

/* COACH TAGS lane — tag-type view filter control on the lane label + its menu */
.rd-lanes-labels .rl-tags{ position:relative; }
.rd-tagfilter{ position:absolute; top:5px; right:5px; width:17px; height:17px; display:inline-flex; align-items:center;
  justify-content:center; color:#5b6274; cursor:pointer; font-size:14px; border-radius:3px; }
.rd-tagfilter:hover{ color:#c3cad9; background:#20242d; }
.rd-tagfilter.on{ color:#f2b632; }                                   /* gold = a filter is active (data accent) */
.rd-tf-menu{ position:fixed; z-index:100001; width:238px; max-height:62vh; display:flex; flex-direction:column;
  background:#14171f; border:1px solid #2b313c; border-radius:8px; padding:8px; box-shadow:0 10px 28px rgba(0,0,0,.55); }
.rd-tf-menu[hidden]{ display:none; }
.rd-tf-top{ display:flex; align-items:center; gap:6px; margin-bottom:6px; }
.rd-tf-h{ flex:1; font:700 9px/1 'Inter Tight',system-ui,sans-serif; letter-spacing:.1em; color:#6f7789; }
.rd-tf-top s, .rd-tf-gh s{ text-decoration:none; cursor:pointer; font:600 8.5px/1 'Inter Tight',system-ui,sans-serif;
  color:#8b93a8; border:1px solid #2b313c; border-radius:4px; padding:3px 6px; }
.rd-tf-top s:hover, .rd-tf-gh s:hover{ color:#fff; border-color:#3a4256; }
.rd-tf-search{ width:100%; background:#0f1218; border:1px solid #2b313c; border-radius:5px; padding:5px 8px;
  color:#e6e9f0; font-size:11px; margin-bottom:6px; outline:none; }
.rd-tf-search:focus{ border-color:#3a4256; }
.rd-tf-list{ overflow-y:auto; flex:1 1 auto; min-height:0; }
.rd-tf-g{ margin-bottom:5px; }
.rd-tf-gh{ display:flex; align-items:center; gap:4px; margin:5px 0 2px; }
.rd-tf-gh em{ flex:1; font:700 8.5px/1 'Inter Tight',system-ui,sans-serif; letter-spacing:.08em; color:#5b6274; font-style:normal; }
.rd-tf-t{ display:flex; align-items:center; gap:7px; font:600 11px/1.75 'Inter Tight',system-ui,sans-serif; color:#c3cad9; cursor:pointer; padding:1px 3px; border-radius:3px; }
.rd-tf-t:hover{ background:#1a1e28; }
.rd-tf-t span{ flex:1; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.rd-tf-t b{ font:600 9px/1 'Inter Tight',system-ui,sans-serif; color:#5b6274; font-variant-numeric:tabular-nums; }
.rd-tf-t input{ accent-color:#f2b632; margin:0; flex:none; }

/* expand ⤢ — lift the whole board into a tall bottom overlay */
.rd-board-head .rd-expand{ cursor:pointer; color:#8b93a8; font-size:14px; padding:2px 4px; }
.rd-board-head .rd-expand:hover{ color:#f2f4f8; }
.rd-boardwrap.rd-expanded{ position:fixed; bottom:0; z-index:6000; height:340px; display:flex; flex-direction:column;
  background:#0b0d12; border-top:1px solid #252a35; box-shadow:0 -12px 34px rgba(0,0,0,.6); }
.rd-boardwrap.rd-expanded .rd-board-body{ flex:1 1 auto; min-height:0; }
.rd-boardwrap.rd-expanded #statFrame{ height:100%; }

/* P3 · Minimap track — kept for the expanded overview; hidden in the compact strip (costs height) */
.rd-minimap{ display:none; order:2; align-items:center; gap:9px; padding:5px 12px; flex:none;
  background:#0f1218; border-top:1px solid #252a35; }
.rd-boardwrap.rd-expanded .rd-minimap{ display:flex; }
.rd-minimap .mtk{ position:relative; flex:1; height:14px; border-radius:3px; background:#171b23;
  overflow:hidden; display:flex; cursor:pointer; }
.rd-minimap .mtk i{ flex:1 1 0; min-width:0; height:100%; }
.rd-minimap .mvw{ position:absolute; top:-1px; height:16px; border:1px solid #f2b632;
  background:rgba(242,182,50,.16); border-radius:3px; pointer-events:none; }
.rd-minimap .mlb{ font:9.5px/1 'Inter Tight',system-ui,-apple-system,'Segoe UI',Arial,sans-serif;
  color:#8b93a8; font-variant-numeric:tabular-nums; white-space:nowrap; }

/* ═══════════════════════════════════════════════════════════════════════════
 * PLAYER CHROME (redesign) — TWIN-ONLY. The shell re-layout toward the mockup,
 * built additively over the existing player. Increment 1: the app header bar.
 * ═══════════════════════════════════════════════════════════════════════════ */
.rd-appbar{ position:fixed; top:0; left:0; right:0; height:48px; z-index:99999;
  background:#14171f; border-bottom:1px solid #252a35; display:flex; align-items:center; gap:14px; padding:0 16px;
  font-family:'Inter Tight',system-ui,-apple-system,'Segoe UI',Arial,sans-serif; }
.rd-appbar .rd-logo{ font:700 15px/1 'Chakra Petch',system-ui,sans-serif; letter-spacing:.14em; color:#f2f4f8; }
.rd-appbar .rd-gtitle{ font:600 12px/1 'Inter Tight',system-ui,sans-serif; color:#8b93a8; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.rd-appbar .rd-ab-acts{ margin-left:auto; display:flex; align-items:center; gap:8px; }
.rd-appbar .rd-ab-btn{ font:600 11px/1 'Inter Tight',system-ui,sans-serif; color:#c3cad9; border:1px solid #252a35;
  border-radius:5px; padding:7px 11px; cursor:pointer; white-space:nowrap; }
.rd-appbar .rd-ab-btn:hover{ color:#f2f4f8; border-color:#3a4256; }
.rd-appbar .rd-ab-btn.pri{ background:#f2b632; border-color:#f2b632; color:#1a1204; }
.rd-appbar .rd-ab-btn .bx{ font-size:13px; vertical-align:-2px; }
/* whiteboard record button — turns solid red while recording */
.rd-appbar .rd-ab-whiteboard.rd-ab-rec{ background:#e1261c !important; border-color:#e1261c !important; color:#fff !important; }
.rd-appbar .rd-ab-whiteboard.rd-ab-rec .bx{ animation:rd-rec-blink 1s steps(1) infinite; }
@keyframes rd-rec-blink{ 50%{ opacity:.35; } }
/* whiteboard save-options popup → redesign dark theme (classic renders it white) */
body.rd-has-appbar .whiteboard-option-block{ background:#171a21 !important; color:#e6e9f0 !important; border:1px solid #282d37 !important;
  border-radius:12px !important; box-shadow:0 22px 60px rgba(0,0,0,.6) !important; }
body.rd-has-appbar .whiteboard-option-block *{ color:#e6e9f0; }
body.rd-has-appbar .whiteboard-option-block [class*="btn-whitebrd"],
body.rd-has-appbar .whiteboard-option-block .whiteboard-save-option,
body.rd-has-appbar .whiteboard-option-block button{ background:#20242d !important; color:#e6e9f0 !important; border:1px solid #2b313c !important; border-radius:8px !important; }
body.rd-has-appbar .whiteboard-option-block [class*="btn-whitebrd"]:hover,
body.rd-has-appbar .whiteboard-option-block button:hover{ border-color:#3a4256 !important; }
body.rd-has-appbar .whiteboard-option-block .btn-save, body.rd-has-appbar .whiteboard-option-block [class*="save"]{ background:#e1261c !important; border-color:#e1261c !important; color:#fff !important; }
.rd-appbar .rd-ab-av{ width:26px; height:26px; border-radius:50%; background:#293991; color:#fff;
  display:grid; place-items:center; font:700 11px/1 'Inter Tight',system-ui,sans-serif; overflow:hidden; position:relative; }
.rd-appbar .rd-ab-av img{ width:100%; height:100%; object-fit:cover; border-radius:50%; grid-area:1/1; }
.rd-appbar .rd-ab-av .rd-ab-av-txt{ display:none; grid-area:1/1; }
/* the existing beta pill, re-homed into the header so it stops colliding */
.rd-appbar .rd-ab-slot{ display:inline-flex; align-items:center; }
.rd-appbar .rd-homed-pill{ position:static !important; margin:0 !important; }
/* §#4 top-bar actions — Export dropdown · SmartStats external-link · disabled Stats */
.rd-appbar .rd-ab-export{ position:relative; display:inline-flex; }
.rd-appbar .rd-ab-avwrap{ position:relative; display:inline-flex; }
.rd-appbar .rd-ab-avwrap .rd-ab-av{ cursor:pointer; }
.rd-appbar .rd-ab-menu{ position:absolute; top:calc(100% + 6px); right:0; min-width:184px; z-index:100000;
  background:#171a21; border:1px solid #282d37; border-radius:8px; padding:5px; box-shadow:0 14px 34px rgba(0,0,0,.55); }
.rd-appbar .rd-ab-menu[hidden]{ display:none; }
.rd-appbar .rd-ab-menu a{ display:block; padding:8px 10px; border-radius:5px; font:600 11.5px/1.2 'Inter Tight',system-ui,sans-serif;
  color:#e6e9f0; text-decoration:none; white-space:nowrap; }
.rd-appbar .rd-ab-menu a:hover{ background:#20242d; color:#fff; }
.rd-appbar .rd-ab-smartstat{ display:inline-flex; align-items:center; gap:5px; }
.rd-appbar .rd-ab-smartstat i{ font-size:12px; opacity:.85; }
.rd-appbar .rd-ab-btn.rd-ab-off{ opacity:.4; cursor:not-allowed; }
.rd-appbar .rd-ab-btn.rd-ab-off:hover{ color:#c3cad9; border-color:#252a35; }
/* make room for the fixed header */
body.rd-has-appbar #main{ padding-top:48px; }

/* §#3 — retire the persistent red tile strip (.game-btn-wrap). Game actions are in the top bar
   (#662); snip actions in the on-select footer below. Visually hidden but KEPT IN THE RENDER TREE
   (clip, not display:none) so the top-bar + footer proxies still fire the real handlers. */
.game-btn-wrap{ position:absolute !important; width:1px !important; height:1px !important; overflow:hidden !important;
  clip:rect(0 0 0 0) !important; clip-path:inset(50%) !important; opacity:0 !important; pointer-events:none !important; margin:-1px !important; }
/* the snip-panel footer — appears only when a snip is selected */
.rd-snip-footer{ position:fixed; left:64px; bottom:12px; z-index:8000; display:flex; align-items:center; gap:8px;
  background:#111318; border:1px solid #282d37; border-radius:10px; padding:8px 10px; box-shadow:0 16px 40px rgba(0,0,0,.55); }
.rd-snip-footer[hidden]{ display:none; }
.rd-snip-footer .rd-sf-lbl{ font:800 9px/1 'Chakra Petch',system-ui,sans-serif; letter-spacing:.1em; color:#5b6274; padding:0 6px 0 3px; cursor:move; }
.rd-snip-footer .rd-sf-lbl::before{ content:"\2630"; margin-right:4px; opacity:.55; font-size:10px; }   /* grip affordance */
.rd-snip-footer .rd-sf-btn{ font:600 11px/1 'Inter Tight',system-ui,sans-serif; color:#e6e9f0; background:#20242d; border:1px solid #282d37;
  border-radius:6px; padding:8px 11px; cursor:pointer; white-space:nowrap; }
.rd-snip-footer .rd-sf-btn:hover{ background:#272c37; border-color:#3a4256; }
.rd-snip-footer .rd-sf-del{ margin-left:14px; color:#ff8078; border-color:#5a2a2a; background:transparent; }
.rd-snip-footer .rd-sf-del:hover{ background:rgba(225,38,28,.14); border-color:#e1483c; color:#ff8078; }
.rd-snip-footer .rd-sf-addwrap{ position:relative; display:inline-flex; }
.rd-snip-footer .rd-sf-addmenu{ position:absolute; bottom:calc(100% + 6px); left:0; min-width:170px; z-index:8001;
  background:#171a21; border:1px solid #282d37; border-radius:8px; padding:5px; box-shadow:0 14px 34px rgba(0,0,0,.55); }
.rd-snip-footer .rd-sf-addmenu[hidden]{ display:none; }
.rd-snip-footer .rd-sf-addmenu a{ display:block; padding:8px 10px; border-radius:5px; font:600 11.5px/1.2 'Inter Tight',system-ui,sans-serif; color:#e6e9f0; text-decoration:none; white-space:nowrap; }
.rd-snip-footer .rd-sf-addmenu a:hover{ background:#20242d; color:#fff; }

/* Chrome inc-2: left icon rail (fills the empty left gutter; board is at x132 so no shift). */
.rd-navrail{ position:fixed; left:0; top:48px; bottom:0; width:60px; z-index:99998; background:#14171f;
  border-right:1px solid #252a35; display:flex; flex-direction:column; padding:6px 0; gap:2px; overflow-y:auto; }
.rd-navrail .rd-nav-item{ display:flex; flex-direction:column; align-items:center; gap:3px; padding:9px 2px;
  cursor:pointer; color:#8b93a8; border-left:2px solid transparent; }
.rd-navrail .rd-nav-item:hover{ color:#c3cad9; background:#1a1e28; }
.rd-navrail .rd-nav-item.on{ color:#f2f4f8; background:#1a1e28; border-left-color:#f2b632; }
.rd-navrail .rd-nav-item.on i{ color:#f2b632; }
.rd-navrail .rd-nav-item i{ font-size:19px; }
.rd-navrail .rd-nav-item span{ font:600 8px/1 'Inter Tight',system-ui,sans-serif; letter-spacing:.04em; text-transform:uppercase; }
body.rd-has-navrail .snipstabs{ display:none !important; }
/* Hide the classic "Report stat snip" control (red circular R that pops in at the video's far
   left when a snip is selected) — it doesn't belong in the redesigned shell. Twin-only. */
body.rd-has-navrail .reportcoach-statsnip{ display:none !important; }
/* Hide the classic yardline hover tooltip (Down / To Go / Yardline / Gain-Loss box) — the redesign
   surfaces this in the board + play-info bar instead. Twin-only. */
body.rd-has-navrail .bk-yardline-data{ display:none !important; }
/* Hide the classic play-info text ("#Snip N - 3RD Down - 13 to go - Own23 - 10 yard gain") at the
   video's top-left — our .rd-playinfo bar replaces it and the classic text bled out around it. */
body.rd-has-navrail .football-stat-snip-info-container{ display:none !important; }
/* The classic Exit link (→ backFromAdvancedplayer, position:absolute z-index 99999) landed on top of
   the appbar's Export button. Pin it to the far-right corner and shift the appbar actions left to
   make room. It stays functional (exits the player); the appbar pill handles "back to classic". */
body.rd-has-navrail .rd-appbar .rd-ab-acts{ margin-right:44px; }
body.rd-has-navrail .exit-icon-block{ position:fixed !important; top:9px !important; right:14px !important; z-index:100000 !important; }
body.rd-has-navrail .exit-icon-block .icon-exit{ color:#8b93a8; font-size:16px; }
/* The board (.rd-boardwrap → #statFrame) spans full-width from x0, so the fixed rail (60px)
   covers its left edge: the LANES/LIST toggle, collections labels and first snip. Inset the
   board past the rail. box-sizing keeps the wrap at its own width (no right overflow); the inner
   scroll track just starts 64px in. The video is centred at x300 and needs no shift. */
body.rd-has-navrail .rd-boardwrap{ padding-left:64px; box-sizing:border-box; }

/* Single-screen fit. The classic player lays the video/transport/board out with a JS-sized CSS
   grid (.main-video-section-p1, grid-template-rows in fixed px — e.g. "838px 46px 200px 0px", row 1
   = video). Our 48px appbar pushes that viewport-tall grid down, so it overflows and the board falls
   below the fold; scrolling to reach it then slides the video's top under the fixed appbar. Fix:
   cap the grid to 100vh − appbar and make ROW 1 the flex row so it alone absorbs the header height —
   rows 2-4 keep the classic px values so the transport + board reserve their space. Then cap the
   (position:absolute) video box to the row-1 height and drop its top below the appbar so it isn't
   clipped. :not(.vjs-fullscreen) keeps the cap off the native fullscreen player. Twin-only.
   NOTE: the 46px/200px row values mirror the football grid; revisit if a sport ships a different one. */
body.rd-has-navrail .main-video-section-p1{ height:calc(100vh - 48px) !important; grid-template-rows:minmax(0,1fr) 46px 250px 0px !important; }
body.rd-has-navrail .main-video-section-p1 .snip-inner-content,
body.rd-has-navrail .main-video-section-p1 .embed-responsive-item.video-js:not(.vjs-fullscreen),
body.rd-has-navrail .main-video-section-p1 .col-lg-10.col-12{ max-height:calc(100vh - 344px) !important; }
body.rd-has-navrail .main-video-section-p1 .col-lg-10.col-12{ top:50px !important; }

/* Chrome inc-3: play-info bar — the selected play's PLAY N · down&dist·spot · result, over the video top-left. */
.rd-playinfo{ position:fixed; top:58px; z-index:99997; display:flex; align-items:center; gap:7px; pointer-events:none; }
.rd-playinfo .rd-pi-no{ background:#e1261c; color:#fff; font:700 11px/1 'Inter Tight',system-ui,sans-serif; border-radius:4px; padding:5px 9px; letter-spacing:.03em; }
.rd-playinfo .rd-pi-sit{ background:rgba(20,23,31,.9); border:1px solid #252a35; color:#c3cad9; font:600 10px/1 'Inter Tight',system-ui,sans-serif; border-radius:4px; padding:5px 9px; }
.rd-playinfo .rd-pi-res{ background:rgba(20,23,31,.9); border:1px solid #252a35; font:700 10px/1 'Chakra Petch',system-ui,sans-serif; border-radius:4px; padding:5px 9px; }
/* customizable top data bar (retires the snip-data popup). The bar stays pointer-events:none so
   clicks pass to the video; only the interactive bits opt back in. */
.rd-playinfo .rd-pi-gear, .rd-playinfo .rd-pi-menu, .rd-playinfo .rd-pi-thumb{ pointer-events:auto; }
.rd-playinfo .rd-pi-tags{ background:rgba(20,23,31,.9); border:1px solid #252a35; color:#9aa2b4;
  font:600 10px/1.3 'Inter Tight',system-ui,sans-serif; border-radius:4px; padding:5px 9px;
  max-width:46vw; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.rd-playinfo .rd-pi-thumb{ display:inline-flex; width:26px; height:26px; border-radius:4px; overflow:hidden;
  border:1px solid #252a35; background:#0e1116; cursor:pointer; flex:none; }
.rd-playinfo .rd-pi-thumb img{ width:100%; height:100%; object-fit:cover; display:block; }
/* playbook image lightbox (the "tap to expand" target) */
.rd-pi-lightbox{ position:fixed; inset:0; z-index:100001; display:flex; align-items:center; justify-content:center; background:rgba(0,0,0,.82); }
.rd-pi-lightbox[hidden]{ display:none; }
.rd-pi-lb-inner{ position:relative; max-width:92vw; max-height:92vh; }
.rd-pi-lb-img{ max-width:92vw; max-height:92vh; border-radius:8px; box-shadow:0 12px 48px rgba(0,0,0,.6); display:block; }
.rd-pi-lb-x{ position:absolute; top:-14px; right:-14px; width:32px; height:32px; border-radius:50%; border:none;
  background:#e1261c; color:#fff; font-size:20px; line-height:1; cursor:pointer; box-shadow:0 2px 8px rgba(0,0,0,.5); }
.rd-pi-lb-x:hover{ background:#c21f16; }
.rd-playinfo .rd-pi-gear{ cursor:pointer; color:#8b93a8; background:rgba(20,23,31,.9); border:1px solid #252a35;
  border-radius:4px; padding:4px 7px; font-size:12px; line-height:1; }
.rd-playinfo .rd-pi-gear:hover{ color:#fff; }
.rd-playinfo .rd-pi-menu{ position:absolute; top:34px; right:0; background:#14171f; border:1px solid #2b313c;
  border-radius:8px; padding:8px 10px; min-width:172px; box-shadow:0 10px 28px rgba(0,0,0,.55); }
.rd-playinfo .rd-pi-menu[hidden]{ display:none; }
.rd-playinfo .rd-pi-mh{ font:700 9px/1 'Inter Tight',system-ui,sans-serif; letter-spacing:.1em; color:#6f7789; margin-bottom:6px; }
.rd-playinfo .rd-pi-mi{ display:flex; align-items:center; gap:6px; font:600 11px/1.7 'Inter Tight',system-ui,sans-serif; color:#c3cad9; cursor:pointer; }
.rd-playinfo .rd-pi-mi input{ accent-color:#e1261c; margin:0; }
.rd-playinfo .rd-pi-cfs{ margin:2px 0 2px 12px; padding-left:6px; border-left:1px solid #2b313c; }
.rd-playinfo .rd-pi-cfs[hidden]{ display:none; }
.rd-playinfo .rd-pi-mdiv{ height:1px; background:#252a35; margin:6px 0; }
/* retire the classic snip-data accordion popup — the top bar carries the data now; comment editing
   stays reachable via the snip footer's Edit frame (#edit-bk-optiondiv). */
body.rd-has-appbar .snip-palette{ display:none !important; }

/* Chrome inc-4: cameras panel — CAMERAS header (JS), a gold DEFAULT badge on the game-default tile,
   and a "THIS SNIP OPENS IN ★ [cam] Change" footer. Restyles the classic .video-shots tiles in
   place; the JS adds .rd-cams / the badge / the footer, and Change toggles .rd-cam-picking. */
/* Clean tile cards — thumbnail + title, rounded, bordered; the classic clutter (edit/delete/star
   action row, the green .saveFrame + .set-my-preferred-view corner stars) is hidden until hover so
   the wiring stays reachable without looking like the old panel. */
/* §#11 — ONE column, compact horizontal tiles (50px thumb + name row); ends the 2-col overflow */
.video-shots.rd-cams{ display:block !important; }
.video-shots.rd-cams .snip-shot.loadFrames{ position:relative !important; width:100% !important; height:auto !important;
  display:flex !important; align-items:center !important; gap:9px !important; cursor:pointer !important;   /* whole row switches view */
  margin:0 0 6px 0 !important; padding:5px 7px 5px 5px !important; border-radius:7px !important; overflow:visible !important;
  background:#14171f !important; border:1px solid #252a35 !important; box-shadow:none !important; }
.video-shots.rd-cams .snip-shot.loadFrames:hover{ border-color:#3a4256 !important; }
.video-shots.rd-cams .snip-shot.loadFrames:nth-child(odd){ margin-right:0 !important; }
.video-shots.rd-cams .snip-shot.loadFrames img{ width:50px !important; height:38px !important; object-fit:cover !important;
  display:block !important; margin:0 !important; border-radius:4px !important; flex:none !important; }
.video-shots.rd-cams .snip-shot.loadFrames .cam-title{ flex:1 1 auto !important; min-width:0 !important; padding:0 !important; margin:0 !important; background:transparent !important;
  font:600 10px/1.15 'Inter Tight',system-ui,-apple-system,sans-serif !important; color:#c3cad9 !important; text-align:left !important;
  text-transform:uppercase; letter-spacing:.03em; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
/* DEFAULT badge → inline on the name row (no longer floats over a full-width thumb) */
.rd-cam-default{ position:static !important; flex:none; z-index:5; background:#f2b632; color:#1a1204;
  font:800 8px/1 'Inter Tight',system-ui,-apple-system,'Segoe UI',Arial,sans-serif; letter-spacing:.06em; padding:3px 5px; border-radius:3px; }

/* §#12 — per-tile ⋯ opens the classic edit / delete / set-default as a menu */
.video-shots.rd-cams .rd-cam-menu{ flex:none; cursor:pointer; color:#8b93a8; padding:0 4px; font-size:16px; line-height:1; user-select:none; }
.video-shots.rd-cams .rd-cam-menu:hover{ color:#f2f4f8; }
.video-shots.rd-cams .snip-shot.loadFrames .session-actions{ position:absolute !important; top:calc(100% - 2px) !important; right:6px !important;
  left:auto !important; bottom:auto !important; width:auto !important; margin:0 !important; padding:4px !important;
  display:none !important; flex-direction:column !important; gap:1px !important; z-index:80 !important; min-width:130px !important;
  background:#171a21 !important; border:1px solid #282d37 !important; border-radius:7px !important; box-shadow:0 12px 30px rgba(0,0,0,.55) !important; opacity:1 !important; }
.video-shots.rd-cams .snip-shot.loadFrames.rd-menu-open .session-actions{ display:flex !important; }
.video-shots.rd-cams .session-actions .action-item{ display:flex !important; align-items:center !important; gap:9px !important;
  padding:7px 10px !important; border-radius:5px !important; opacity:1 !important; cursor:pointer !important; white-space:nowrap !important; margin:0 !important; }
.video-shots.rd-cams .session-actions .action-item:hover{ background:#20242d !important; }
.video-shots.rd-cams .session-actions .action-item a{ color:inherit !important; display:inline-flex !important; align-items:center !important; gap:9px !important; padding:0 !important; margin:0 !important; }
.video-shots.rd-cams .session-actions .action-item i{ width:13px !important; text-align:center !important; font-size:11px !important; color:#8b93a8 !important; }
.video-shots.rd-cams .session-actions .del-session-wrap:hover i{ color:#e1483c !important; }
.video-shots.rd-cams .session-actions .rd-ca-lbl{ font:600 11px/1 'Inter Tight',system-ui,sans-serif !important; color:#e6e9f0 !important; }
/* the classic ".set-my-preferred-view" corner star is an in-memory-only floater that covered the ⋯ —
   hide it. The real default flow is the footer "Change" → pick a view (fires .saveFrame) + the ⋯ "Set default". */
.video-shots.rd-cams .snip-shot.loadFrames .set-my-preferred-view{ display:none !important; }
/* §2.3 — camera rail header actions (Play all angles / Compare angles) */
.video-shots.rd-cams .rd-cam-actions{ display:flex; gap:6px; margin:0 0 9px; }
.video-shots.rd-cams .rd-cam-act{ flex:1; display:inline-flex; align-items:center; justify-content:center; gap:5px;
  padding:7px 6px; border:1px solid #282d37; background:#171a21; border-radius:6px; cursor:pointer; white-space:nowrap;
  font:700 8.5px/1 'Inter Tight',system-ui,sans-serif; color:#c3cad9; letter-spacing:.04em; text-transform:uppercase; }
.video-shots.rd-cams .rd-cam-act:hover{ border-color:#3a4256; color:#fff; }
.video-shots.rd-cams .rd-cam-act i{ font-size:10px; }
.video-shots.rd-cams .rd-cam-act.rd-off{ opacity:.4; cursor:not-allowed; }
.video-shots.rd-cams .rd-cam-act.rd-off:hover{ border-color:#282d37; color:#c3cad9; }
.rd-cam-footer{ display:block; clear:both; width:100%; margin:8px 0 0; padding:9px 10px; box-sizing:border-box;
  background:#14171f; border:1px solid #252a35; border-radius:7px; }
.rd-cam-footer .rd-cf-lbl{ font:700 8px/1 'Inter Tight',system-ui,-apple-system,sans-serif; letter-spacing:.08em; color:#5b6274; margin-bottom:6px; }
.rd-cam-footer .rd-cf-row{ display:flex; align-items:center; gap:7px; }
.rd-cam-footer .rd-cf-row i{ color:#e1261c; font-size:11px; }
.rd-cam-footer .rd-cf-cam{ font:700 11px/1 'Inter Tight',system-ui,sans-serif; color:#f2f4f8; flex:1; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.rd-cam-footer .rd-cf-change{ font:600 10px/1 'Inter Tight',system-ui,sans-serif; color:#c3cad9; background:transparent; border:1px solid #3a4256; border-radius:5px; padding:5px 9px; cursor:pointer; white-space:nowrap; }
.rd-cam-footer .rd-cf-change:hover{ color:#fff; border-color:#5b6478; }
/* Change → pick mode: every tile is an obvious click target to set the default view */
.video-shots.rd-cam-picking .snip-shot.loadFrames{ box-shadow:inset 0 0 0 2px #e1261c !important; cursor:pointer !important; }
.video-shots.rd-cam-picking .snip-shot.loadFrames:hover{ background:#20242d !important; }
.video-shots.rd-cam-picking .rd-cam-menu{ pointer-events:none !important; opacity:.25 !important; }   /* don't let ⋯ steal the pick click */
.video-shots.rd-cam-picking .rd-cam-footer .rd-cf-change{ background:#e1261c; border-color:#e1261c; color:#fff; }   /* Change is now "click a view…" */

/* §#4 — retire the full-width HIGHLIGHTS & WHITEBOARDS red slab; REELS in the collections rail
   opens the same popup (player-redesign_opt.js wires the rail item to #hightlight-popup-button). */
#hightlight-popup-button{ display:none !important; }
/* Remove the OLD bar row below the transport: the redundant blue "Entire Game Video" bar (the game name
   is in the top bar now) + the red highlight-reel bar (folded into the REELS collections-rail item). The
   board sits directly under the transport instead. */
.entire-game-video{ display:none !important; }
[class*="highlight-reel-div"]{ display:none !important; }

/* TRANSPORT (increment 1) — strip the native vjs skin to a clean thin scrubber TRACK (its seek is reused,
   verified working), and show the real #playpause as the gold play button (it was display:none — the A1.1
   defect). The dup remaining-time clock is gone; the one clock is #video-time. Play verified live. */
.vjs-control-bar .vjs-play-control,
.vjs-control-bar .vjs-volume-panel,
.vjs-control-bar .vjs-remaining-time{ display:none !important; }
/* FULLSCREEN — the redesign uses video.js's OWN fullscreen (the classic $(document).fullScreen reflows
   the classic layout, which fights the redesign chrome). The custom redesign transport isn't inside the
   fullscreened <video> element, so restore video.js's native control bar + its controls while fullscreen. */
.video-js.vjs-fullscreen .vjs-control-bar{ display:flex !important; opacity:1 !important; visibility:visible !important; }
.video-js.vjs-fullscreen .vjs-play-control,
.video-js.vjs-fullscreen .vjs-volume-panel,
.video-js.vjs-fullscreen .vjs-progress-control,
.video-js.vjs-fullscreen .vjs-current-time,
.video-js.vjs-fullscreen .vjs-time-divider,
.video-js.vjs-fullscreen .vjs-duration,
.video-js.vjs-fullscreen .vjs-remaining-time,
.video-js.vjs-fullscreen .vjs-fullscreen-control{ display:flex !important; }
#playpause{ display:inline-flex !important; align-items:center; justify-content:center; width:32px !important; height:32px !important;
  min-width:32px; padding:0 !important; border-radius:50% !important; background:#f2b632 !important; color:#1a1204 !important; margin:0 8px !important; font-size:13px !important;
  position:relative !important; z-index:3 !important; cursor:pointer !important; }   /* above the video-time label so the WHOLE circle takes clicks (its right edge was overlapped) */
#playpause > i{ pointer-events:none; }                                               /* the click always resolves to #playpause, never the icon */
#playpause:hover{ background:#f7c249 !important; }
/* TRANSPORT (increment 2) — one speed pill replacing the two -2X/+2X toggle buttons */
#playback_rate_bottom_minus2, #playback_rate_bottom_plus2{ display:none !important; }
#rd-speed{ display:inline-flex !important; align-items:center; justify-content:center; min-width:32px; height:28px; padding:0 8px;
  border-radius:6px; background:#20242d !important; border:1px solid #282d37 !important; color:#e6e9f0 !important;
  font:700 11px/1 'Inter Tight',system-ui,Arial,sans-serif !important; cursor:pointer; text-align:center; }
#rd-speed:hover{ border-color:#3a4256 !important; color:#fff !important; }

/* TRANSPORT (increment 3) — stage stack. The video-OVERLAY tools (zoom, draw) act ON the frame, so they
   leave the transport row for a vertical stack pinned top-right OVER the video. Handlers survive the move
   (zoom is $(document)-delegated in snipzoom.js; draw is element-bound in draw-tool.js). Host = the video's
   own parent (.snip-inner-content, already position:relative, exactly bounds the video). */
.rd-stage-stack{ position:absolute; top:12px; right:12px; z-index:50; display:flex; flex-direction:column; gap:8px; }
.rd-stage-stack > a{ width:34px; height:34px; min-width:34px; display:flex; align-items:center; justify-content:center;
  background:rgba(9,11,15,.78); border:1px solid #2b313c; border-radius:9px; color:#c3cad9; margin:0; }
.rd-stage-stack > a:hover{ color:#fff; border-color:#3a4256; background:rgba(20,24,31,.92); }
.rd-stage-stack > a img, .rd-stage-stack > a svg{ max-width:18px; max-height:18px; }
/* Retire the row duplicates now relocated to their regions: Game Statistics → top-bar Stats, Edit Snip →
   snip-panel footer, Intercut/Side-by-Side → camera rail. Proxies are separate elements, so hiding the row
   originals is safe (the proxy .click() still fires even on a display:none original). */
.player-right-icons .stat-starticon,
.player-right-icons .edit-bookmark,
.player-right-icons .multiview-btn,
.player-right-icons .dual-view{ display:none !important; }

/* TRANSPORT (increment 4a) — GAME | SNIP segment. Restores "play entire game" (the removed blue
   .entire-game-video bar) as a mode toggle in the transport: GAME plays the whole game, SNIP the
   selected play. Lives at the left of the right cluster (prepended to .player-right-icons). */
.rd-gamesnip{ display:inline-flex; align-items:center; height:24px; border:1px solid #2b313c; border-radius:7px;
  overflow:hidden; margin:0 12px; vertical-align:middle; }
.rd-gamesnip .rd-gs-seg{ display:inline-flex; align-items:center; justify-content:center; height:100%; padding:0 11px;
  font:800 10px/1 'Inter Tight',system-ui,Arial,sans-serif; letter-spacing:.05em; color:#8b93a4; cursor:pointer;
  background:transparent; text-decoration:none; }
.rd-gamesnip .rd-gs-seg + .rd-gs-seg{ border-left:1px solid #2b313c; }
.rd-gamesnip .rd-gs-seg.active{ background:#f2b632; color:#1a1204; }
.rd-gamesnip .rd-gs-seg:not(.active):hover{ color:#e6e9f0; }
/* SNIP has nothing to return to until a play is selected — unclickable + visibly inert until then. */
.rd-gamesnip .rd-gs-snip.rd-gs-disabled{ opacity:.35; cursor:default; pointer-events:none; }

/* TRANSPORT (increment 4b) — outcome marker track. Result-coloured ticks on the scrubber, one per
   stat play, along the whole-game timeline. Inset 10px l/r to match .vjs-progress-holder;
   pointer-events:none so the scrubber underneath still seeks/scrubs. Stacking (cleanup): ticks sit
   ABOVE the buffered fill (so they never get hidden as the video loads) but BELOW the playhead knob
   (so the knob always reads) — the holder isn't a stacking context, so a plain z-index does it. */
.vjs-progress-control{ position:relative; }
.rd-markers{ position:absolute; left:10px; right:10px; top:9px; height:12px; pointer-events:none; z-index:20; }
.rd-markers .rd-mk{ position:absolute; top:0; width:2px; height:12px; margin-left:-1px; border-radius:1.5px; opacity:.85; }
.vjs-progress-control .vjs-load-progress{ z-index:1; }
.vjs-progress-control .vjs-play-progress{ z-index:25; }

/* TRANSPORT (increment 4c) — loop the current play. A LOOP toggle (separate from the existing
   loop-last-N button) loops the selected play on repeat; the in/out region shows on the scrubber
   with draggable handles to extend/trim. */
.rd-loop{ position:absolute; left:10px; right:10px; top:9px; height:12px; z-index:22; pointer-events:none; display:none; }
.rd-loop.on{ display:block; }
.rd-loop-reg{ position:absolute; top:0; height:12px; min-width:3px; background:rgba(242,182,50,.30);
  box-shadow:inset 0 0 0 1px rgba(242,182,50,.75); border-radius:2px; }
.rd-loop-h{ position:absolute; top:-4px; width:7px; height:20px; margin-left:-3.5px; border-radius:2px;
  background:#f2b632; cursor:ew-resize; pointer-events:auto; box-shadow:0 1px 3px rgba(0,0,0,.5); }
.rd-loopbtn{ display:inline-flex; align-items:center; gap:5px; height:24px; padding:0 10px; margin:0 4px;
  border:1px solid #2b313c; border-radius:7px; background:transparent; color:#8b93a4;
  font:800 10px/1 'Inter Tight',system-ui,sans-serif; letter-spacing:.05em; cursor:pointer; text-decoration:none; vertical-align:middle; }
.rd-loopbtn:hover{ color:#e6e9f0; }
.rd-loopbtn.on{ background:#f2b632; color:#1a1204; border-color:#f2b632; }

/* ===== BOARD SCROLLBARS — neutralize the classic red thumbs =================
   The snip board scroll containers ship classic RED webkit-scrollbars
   (.snipstabs #E83D29 · #statFrame/#allFrame #f0212e · #teamFrame/#customBMs
   #330205 · .video-shots #f4676e) that read as a stray red bar bleeding into the
   dark redesign board. Re-skin them to a subtle neutral track+thumb. */
#statFrame::-webkit-scrollbar-thumb, #teamFrame::-webkit-scrollbar-thumb, #allFrame::-webkit-scrollbar-thumb,
#chartFrame::-webkit-scrollbar-thumb, #odkFrame::-webkit-scrollbar-thumb, #playerFrame::-webkit-scrollbar-thumb,
#assignedFrame::-webkit-scrollbar-thumb, #customBMs::-webkit-scrollbar-thumb,
.snipstabs::-webkit-scrollbar-thumb, .snipstabs.tab-height-adjust::-webkit-scrollbar-thumb,
.video-shots::-webkit-scrollbar-thumb{ background:#333a48 !important; box-shadow:none !important; -webkit-box-shadow:none !important; border-radius:4px !important; }
#statFrame::-webkit-scrollbar, #teamFrame::-webkit-scrollbar, #allFrame::-webkit-scrollbar,
#chartFrame::-webkit-scrollbar, #odkFrame::-webkit-scrollbar, #playerFrame::-webkit-scrollbar,
#assignedFrame::-webkit-scrollbar, #customBMs::-webkit-scrollbar,
.snipstabs::-webkit-scrollbar, .snipstabs.tab-height-adjust::-webkit-scrollbar,
.video-shots::-webkit-scrollbar{ height:16px !important; width:10px !important; background:#0f1218 !important; }
#statFrame::-webkit-scrollbar-corner, #teamFrame::-webkit-scrollbar-corner, #allFrame::-webkit-scrollbar-corner,
.snipstabs.tab-height-adjust::-webkit-scrollbar-corner, .video-shots::-webkit-scrollbar-corner{ background:#0f1218 !important; }
/* ===== CHARTING WORKSTATION (phase 7, increment 1) =======================
   A game-level, always-open charting panel docked right. Dark shell + red chrome
   accent (gold stays a data-only colour elsewhere). Native <select> per category
   so ⇥/↑↓ drive the fields; the play-count rides in each option label. */
.rd-chartwork{ position:fixed; top:48px; right:0; bottom:0; width:404px; z-index:100000;   /* above the classic snip-palette (z:99998) */
  background:#111318; border-left:1px solid #282d37; color:#f2f4f8;
  font:13px/1.45 'Inter Tight',system-ui,-apple-system,'Segoe UI',Arial,sans-serif;
  display:flex; flex-direction:column; transform:translateX(100%);
  transition:transform .18s ease; box-shadow:-14px 0 34px rgba(0,0,0,.45); }
.rd-chartwork.on{ transform:none; }
.rd-chartwork[hidden]{ display:none; }
.rd-chartwork *{ box-sizing:border-box; }

.rd-chartwork .cw-head{ position:relative; display:flex; align-items:center; gap:10px;
  padding:12px 14px 13px; border-bottom:1px solid #21262f; }
.rd-chartwork .cw-title{ font:800 12px/1 'Inter Tight',system-ui,sans-serif; letter-spacing:.14em; color:#fff; }
.rd-chartwork .cw-prog{ flex:1; font-size:11.5px; color:#8b93a8; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.rd-chartwork .cw-prog .cw-pos{ color:#e6e9f0; font-weight:600; }
.rd-chartwork .cw-x{ border:0; background:transparent; color:#8b93a8; font-size:15px; line-height:1; cursor:pointer; padding:2px 4px; }
.rd-chartwork .cw-x:hover{ color:#fff; }
.rd-chartwork .cw-bar{ position:absolute; left:0; right:0; bottom:0; height:2px; background:#21262f; }
.rd-chartwork .cw-bar i{ display:block; height:100%; width:0; background:#e1261c; transition:width .2s ease; }
.rd-chartwork .cw-detach{ border:0; background:transparent; color:#8b93a8; font-size:14px; line-height:1; cursor:pointer; padding:2px 4px; }
.rd-chartwork .cw-kbdtoggle{ border:0; background:transparent; color:#8b93a8; font-size:15px; line-height:1; cursor:pointer; padding:2px 4px; }
.rd-chartwork .cw-kbdtoggle:hover{ color:#fff; }
.rd-chartwork.cw-kbd-on .cw-kbdtoggle{ color:#f2b632; }
.rd-chartwork .cw-detach:hover{ color:#fff; }
/* Detached (floating, resizable) palette — coach can move it off the video so the video goes full-width,
   then re-attach to dock it back. JS sets top/left/width/height inline; native resize grip (bottom-right). */
.rd-chartwork.cw-float{ top:auto; right:auto; bottom:auto; left:0; width:404px;
  transform:none !important; border:1px solid #2b313c; border-radius:10px; overflow:hidden;
  resize:both; min-width:320px; min-height:280px; max-width:96vw; max-height:94vh;
  box-shadow:0 20px 54px rgba(0,0,0,.62); transition:none; }
.rd-chartwork.cw-float .cw-head{ cursor:move; user-select:none; }
.rd-chartwork.cw-float .cw-panes{ flex:1 1 auto; min-height:0; }   /* let the panes take the resized height + scroll */

.rd-chartwork .cw-tplrow{ display:flex; align-items:center; gap:8px; padding:10px 14px; border-bottom:1px solid #1b2028; }
.rd-chartwork .cw-tpl-lbl{ font:700 9.5px/1 'Inter Tight',sans-serif; letter-spacing:.1em; color:#6f7789; }
.rd-chartwork .cw-tpl{ flex:1; min-width:90px; height:28px; background:#20242d; color:#e6e9f0; border:1px solid #2b313c; border-radius:6px; padding:0 8px; font-size:12.5px; }
.rd-chartwork .cw-tpl-meta{ flex:0 1 auto; min-width:0; font-size:10px; color:#6f7789; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
/* template-active accent (increment 2): gold border on the select + brighter meta when a template filters the fields */
.rd-chartwork.cw-tpl-on .cw-tpl{ border-color:#f2b632; }
.rd-chartwork.cw-tpl-on .cw-tpl-meta{ color:#f2b632; }

/* Space-efficient header (Masud): the input fields are the star — keep the review/nav/views/legend chrome
   tight so the fields get the room, and don't force scrolling on laptops when there are only a few fields.
   The review + nav share ONE row (snip summary left, prev/next right). */
.rd-chartwork .cw-review{ display:flex; align-items:center; gap:10px; padding:6px 12px; border-bottom:1px solid #1b2028; background:#0d0f14; }
.rd-chartwork .cw-rtext{ flex:1; min-width:0; }
.rd-chartwork .cw-r1{ font:600 13px/1.2 'Inter Tight',sans-serif; color:#fff; letter-spacing:-.01em; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.rd-chartwork .cw-r2{ font-size:10.5px; color:#8b93a8; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.rd-chartwork .cw-r1:empty,.rd-chartwork .cw-r2:empty{ display:none; }
/* nav now rides in the review row, right-aligned + compact */
.rd-chartwork .cw-nav{ display:flex; align-items:center; gap:5px; flex:0 0 auto; }
.rd-chartwork .cw-nav button{ height:22px; padding:0 8px; background:#20242d; color:#c9cede; border:1px solid #2b313c;
  border-radius:5px; font:600 11px/1 'Inter Tight',sans-serif; cursor:pointer; white-space:nowrap; }
.rd-chartwork .cw-nav button:hover{ background:#272c37; color:#fff; }
.rd-chartwork .cw-navpos{ font-size:10.5px; color:#6f7789; white-space:nowrap; min-width:44px; text-align:center; }
/* camera-view pills — one compact scrolling row (was a wrapping 63px block) */
.rd-chartwork .cw-views{ display:flex; flex-wrap:nowrap; overflow-x:auto; align-items:center; gap:5px; padding:4px 12px; border-bottom:1px solid #1b2028; scrollbar-width:none; }
.rd-chartwork .cw-views::-webkit-scrollbar{ display:none; }
.rd-chartwork .cw-views:empty{ display:none; }
.rd-chartwork .cw-view{ height:22px; padding:0 9px; background:#20242d; color:#8b93a8; border:1px solid #2b313c; border-radius:11px;
  font:700 10px/1 'Inter Tight',sans-serif; letter-spacing:.02em; text-transform:uppercase; cursor:pointer; flex:0 0 auto; white-space:nowrap; }
.rd-chartwork .cw-view:hover{ color:#fff; border-color:#3a4256; }
.rd-chartwork .cw-view.on{ background:#312b1a; color:#f2b632; border-color:#f2b632; }

/* tab shell (3b): Ch | C | T */
.rd-chartwork .cw-tabs{ display:flex; gap:2px; padding:4px 12px 0; border-bottom:1px solid #1b2028; }
.rd-chartwork .cw-tab{ flex:1; height:28px; background:transparent; color:#7a8299; border:0; border-bottom:2px solid transparent;
  font:800 12px/1 'Inter Tight',sans-serif; letter-spacing:.06em; cursor:pointer; border-radius:6px 6px 0 0; }
.rd-chartwork .cw-tab:hover{ background:#181c23; color:#c9cede; }
.rd-chartwork .cw-tab.on{ color:#fff; border-bottom-color:#e1261c; }
.rd-chartwork .cw-panes{ flex:1; min-height:0; display:flex; }
/* min-width:0 — .cw-pane is a row-flex item, so its default min-width:auto is its content's intrinsic
   width; the T pane's template <select> (longest option) made that 441px and the pane overflowed the
   404px panel (meta + reorder buttons pushed past the right edge). Let it shrink to the panel. */
.rd-chartwork .cw-pane{ display:none; flex:1; min-width:0; max-width:100%; min-height:0; flex-direction:column; }
.rd-chartwork .cw-pane.on{ display:flex; }
.rd-chartwork .cw-pane[hidden]{ display:none; }
.rd-chartwork .cw-soon{ margin:auto; padding:28px 22px; text-align:center; color:#7a8299; }
.rd-chartwork .cw-soon b{ display:block; font:800 13px/1 'Inter Tight',sans-serif; letter-spacing:.04em; color:#c9cede; margin-bottom:8px; }
.rd-chartwork .cw-soon span{ display:block; max-width:250px; font-size:11.5px; line-height:1.55; }

/* Custom (C) tab (3c-i): tag-lists → tags */
.rd-chartwork .cc-body{ flex:1; min-height:0; display:flex; flex-direction:column; }
.rd-chartwork .cc-applied{ display:flex; flex-wrap:wrap; gap:5px; padding:10px 14px; border-bottom:1px solid #1b2028; min-height:40px; align-content:flex-start; }
.rd-chartwork .cc-empty{ font-size:11.5px; color:#5f6779; font-style:italic; align-self:center; }
.rd-chartwork .cc-chip{ display:inline-flex; align-items:center; gap:4px; height:22px; padding:0 4px 0 9px; background:#2a2f3a;
  color:#e6e9f0; border:1px solid #3a414e; border-radius:11px; font-size:11.5px; }
.rd-chartwork .cc-chip{ cursor:pointer; }
.rd-chartwork .cc-chip.open{ border-color:#f2b632; background:#312b1a; }
.rd-chartwork .cc-chip-pl{ display:inline-flex; align-items:center; justify-content:center; min-width:16px; height:16px; padding:0 4px;
  background:#3aa8f0; color:#0d0f14; border-radius:8px; font-size:10px; font-weight:800; }
.rd-chartwork .cc-chip-x{ border:0; background:transparent; color:#8b93a8; font-size:14px; line-height:1; cursor:pointer; padding:0 2px; }
.rd-chartwork .cc-chip-x:hover{ color:#e1261c; }
/* player-pairing popover (3c-ii) */
.rd-chartwork .cc-pair{ border-bottom:1px solid #1b2028; background:#0d0f14; }
/* universal pairing: the player badge on every applied pill (C + T boxes) + the popover anchored under a box */
.rd-chartwork .cc-mc-pp{ display:inline-flex; align-items:center; gap:1px; margin-left:4px; font:700 10px/1 'Inter Tight',sans-serif;
  color:#7d8494; cursor:pointer; }
.rd-chartwork .cc-mc-pp .bx{ font-size:11px; }
.rd-chartwork .cc-mc-pp.on{ color:#f2b632; }
.rd-chartwork .cc-mc-pp:hover{ color:#e1261c; }
.rd-chartwork .cc-pair-in{ position:absolute; left:0; right:0; top:calc(100% + 3px); z-index:45;
  border:1px solid #2b313c; border-radius:8px; box-shadow:0 10px 28px rgba(0,0,0,.55); overflow:hidden; }
.rd-chartwork .cc-pair-in .cc-pl-list{ max-height:200px; overflow-y:auto; }      /* long rosters scroll inside the popover */
.rd-chartwork .cc-pair-h{ display:flex; align-items:center; gap:8px; padding:9px 14px 5px; }
.rd-chartwork .cc-pair-h b{ font:800 12px/1 'Inter Tight',sans-serif; color:#fff; }
.rd-chartwork .cc-pair-h span{ flex:1; font-size:10px; letter-spacing:.08em; text-transform:uppercase; color:#6f7789; }
.rd-chartwork .cc-pair-x{ border:0; background:transparent; color:#8b93a8; font-size:15px; line-height:1; cursor:pointer; padding:0 2px; }
.rd-chartwork .cc-pair-x:hover{ color:#fff; }
.rd-chartwork .cc-pair-tabs{ display:flex; gap:6px; padding:2px 14px 8px; }
.rd-chartwork .cc-pair-tab{ flex:1; height:26px; background:#20242d; color:#8b93a8; border:1px solid #2b313c; border-radius:6px;
  font:700 11px/1 'Inter Tight',sans-serif; letter-spacing:.03em; cursor:pointer; }
.rd-chartwork .cc-pair-tab.on{ background:#272c37; color:#fff; border-color:#3a414e; }
.rd-chartwork .cc-pl-list{ display:flex; flex-wrap:wrap; gap:6px; padding:0 14px 12px; }
.rd-chartwork .cc-pl{ display:inline-flex; align-items:center; gap:6px; height:28px; padding:0 11px 0 9px; background:#20242d;
  color:#c9cede; border:1px solid #2b313c; border-radius:14px; font-size:12px; cursor:pointer; }
.rd-chartwork .cc-pl:hover{ background:#272c37; color:#fff; }
.rd-chartwork .cc-pl-ck{ width:14px; height:14px; border:1.5px solid #4a5162; border-radius:50%; flex:0 0 auto; position:relative; }
.rd-chartwork .cc-pl.on{ background:#1f3320; color:#fff; border-color:#3ab54a; }
.rd-chartwork .cc-pl.on .cc-pl-ck{ background:#3ab54a; border-color:#3ab54a; }
.rd-chartwork .cc-pl.on .cc-pl-ck::after{ content:"\2713"; position:absolute; inset:0; font-size:9px; color:#0d0f14; text-align:center; line-height:11px; font-weight:800; }
.rd-chartwork .cc-pl-empty{ font-size:11.5px; color:#5f6779; font-style:italic; padding:2px 0 4px; }
.rd-chartwork .cc-search-wrap{ display:flex; gap:6px; padding:8px 14px; border-bottom:1px solid #1b2028; }
.rd-chartwork .cc-newlist-btn{ flex:0 0 auto; height:30px; padding:0 11px; background:#2a2f3a; color:#c9cede; border:1px solid #3a414e;
  border-radius:6px; font:700 11px/1 'Inter Tight',sans-serif; cursor:pointer; }
.rd-chartwork .cc-newlist-btn:hover{ background:#e1261c; color:#fff; border-color:#e1261c; }
.rd-chartwork .cc-newlist{ display:flex; gap:6px; padding:8px 14px; border-bottom:1px solid #1b2028; background:#0d0f14; }
.rd-chartwork .cc-newlist[hidden]{ display:none; }
.rd-chartwork .cc-nl-in{ flex:1; height:30px; background:#20242d; color:#e6e9f0; border:1px solid #2b313c; border-radius:6px; padding:0 10px; font-size:12.5px; }
.rd-chartwork .cc-nl-in:focus{ outline:none; border-color:#e1261c; }
.rd-chartwork .cc-nl-add{ height:30px; padding:0 12px; background:#e1261c; color:#fff; border:0; border-radius:6px; font:700 11px/1 'Inter Tight',sans-serif; cursor:pointer; }
.rd-chartwork .cc-search{ flex:1; height:30px; background:#20242d; color:#e6e9f0; border:1px solid #2b313c; border-radius:6px;
  padding:0 10px; font-size:12.5px; }
.rd-chartwork .cc-search::placeholder{ color:#5b6274; }
.rd-chartwork .cc-search:focus{ outline:none; border-color:#e1261c; box-shadow:0 0 0 2px rgba(225,38,28,.22); }
/* C two-column: left TAG LIST names | right per-list multi-select box (fresh pass, mimics classic select2) */
.rd-chartwork .cc-2col{ flex:1; overflow-y:auto; display:grid; grid-template-columns:118px 1fr; align-items:stretch; align-content:start; padding:2px 14px 14px; }
.rd-chartwork .cc-lrow{ display:contents; }
.rd-chartwork .cc-lname{ display:flex; align-items:center; padding:0 12px 0 0; border-right:1px solid #21262f;
  font:600 11px/1.25 'Inter Tight',sans-serif; color:#9aa2b4; letter-spacing:.01em; min-height:40px; }
.rd-chartwork .cc-mc{ position:relative; margin:5px 0 5px 12px; }
/* applied-tag pills sit above the combobox input; the strip collapses when empty (keeps rows compact) */
.rd-chartwork .cc-mc-tags{ display:flex; flex-wrap:wrap; gap:4px; margin-bottom:5px; }
.rd-chartwork .cc-mc-tags:empty{ display:none; }
.rd-chartwork .cc-cb-wrap{ position:relative; }
.rd-chartwork .cc-cb-in{ width:100%; height:30px; background:#20242d; color:#e6e9f0; border:1px solid #2b313c;
  border-radius:6px; padding:0 26px 0 9px; font:12.5px/1 'Inter Tight',sans-serif; }
.rd-chartwork .cc-cb-in::placeholder{ color:#5b6274; }
.rd-chartwork .cc-cb-in:focus{ outline:none; border-color:#e1261c; box-shadow:0 0 0 2px rgba(225,38,28,.22); }
.rd-chartwork .cc-mc-pill{ display:inline-flex; align-items:center; gap:2px; height:20px; padding:0 3px 0 8px; background:#e1261c; color:#fff; border-radius:10px; font-size:11px; }
.rd-chartwork .cc-mc-px{ cursor:pointer; font-size:13px; line-height:1; padding:0 2px; color:#ffd9d6; }
.rd-chartwork .cc-mc-px:hover{ color:#fff; }
.rd-chartwork .cc-mc-ph{ color:#5b6274; font-size:12.5px; }
.rd-chartwork .cc-mc-caret{ position:absolute; right:10px; top:50%; margin-top:-2px; width:0; height:0;
  border-left:4px solid transparent; border-right:4px solid transparent; border-top:5px solid #6f7789; pointer-events:none; }
.rd-chartwork .cc-mc.open .cc-mc-caret{ transform:rotate(180deg) translateY(3px); }
.rd-chartwork .cc-mc-menu{ position:absolute; left:0; right:0; top:calc(100% + 3px); z-index:40; max-height:240px; overflow-y:auto;
  background:#1c2029; border:1px solid #333a48; border-radius:7px; padding:4px; box-shadow:0 10px 26px rgba(0,0,0,.5); }
.rd-chartwork .cc-mc-opt{ display:flex; align-items:center; gap:7px; padding:6px 8px; border-radius:5px; font-size:12.5px; color:#c9cede; cursor:pointer; }
.rd-chartwork .cc-mc-opt:hover,
.rd-chartwork .cc-mc-opt.hi{ background:#262b36; color:#fff; }
.rd-chartwork .cc-mc-ck{ width:14px; height:14px; border:1.5px solid #4a5162; border-radius:3px; flex:0 0 auto; position:relative; }
.rd-chartwork .cc-mc-opt.on{ color:#fff; }
.rd-chartwork .cc-mc-opt.on .cc-mc-ck{ background:#e1261c; border-color:#e1261c; }
.rd-chartwork .cc-mc-opt.on .cc-mc-ck::after{ content:"\2713"; position:absolute; inset:0; font-size:10px; text-align:center; line-height:11px; color:#fff; font-weight:800; }
.rd-chartwork .cc-mc-nm{ flex:1; min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.rd-chartwork .cc-mc-editbtn{ flex:0 0 auto; font-weight:400; font-style:normal; font-size:12px; color:#7d8494; opacity:0; cursor:pointer; padding:0 2px; }
.rd-chartwork .cc-mc-opt:hover .cc-mc-editbtn{ opacity:.75; }
.rd-chartwork .cc-mc-editbtn:hover{ opacity:1; color:#e1261c; }
.rd-chartwork .cc-mc-opt.edit .cc-mc-nm,
.rd-chartwork .cc-mc-opt.edit .cc-mc-editbtn{ display:none; }
.rd-chartwork .cc-mc-editin{ flex:1; min-width:0; height:24px; background:#20242d; color:#e6e9f0; border:1px solid #e1261c; border-radius:4px; padding:0 7px; font-size:12px; }
.rd-chartwork .cc-mc-editin:focus{ outline:none; }
/* 3c-iii inline add-tag footer in each list's menu */
.rd-chartwork .cc-mc-add{ display:flex; gap:5px; padding:6px 4px 2px; margin-top:3px; border-top:1px solid #2a303d; }
.rd-chartwork .cc-mc-addin{ flex:1; height:26px; background:#20242d; color:#e6e9f0; border:1px solid #2b313c; border-radius:5px; padding:0 8px; font-size:12px; }
.rd-chartwork .cc-mc-addin::placeholder{ color:#5b6274; }
.rd-chartwork .cc-mc-addin:focus{ outline:none; border-color:#e1261c; }
.rd-chartwork .cc-mc-addbtn{ height:26px; padding:0 11px; background:#2a2f3a; color:#c9cede; border:1px solid #3a414e; border-radius:5px; font:600 11px/1 'Inter Tight',sans-serif; cursor:pointer; }
.rd-chartwork .cc-mc-addbtn:hover{ background:#e1261c; color:#fff; border-color:#e1261c; }

.rd-chartwork .cw-fields{ flex:1; overflow-y:auto; padding:6px 14px 14px; }
.rd-chartwork .cw-tfields{ flex:1; overflow-y:auto; padding:6px 14px 14px; }   /* T tab: the selected template's fields */
.rd-chartwork .cw-tfields .cw-2col-hd{ background:#0d0f14; }                     /* T pane bg differs slightly */
.rd-chartwork .cw-tfields .cw-tcustom{ margin-top:10px; }                        /* the template's C tag-lists under its combos */
/* .cc-2col scrolls in the C pane (it IS that pane's scroll container), but the T pane reuses the class
   for a small grid inside the already-scrolling .cw-tfields — there its own overflow-y:auto turned the
   2-row grid into a scroll box that clipped the open .cc-mc-menu at the grid's bottom edge. */
.rd-chartwork .cw-tfields .cc-2col{ overflow:visible; flex:none; }
/* 3d-i template management: manage row + inline builder */
/* template management (new/edit/delete/reorder) — rarely used mid-charting, so collapsed by default behind
   the ⋯ toggle in the TEMPLATE row; expands only when managing. Reclaims a full row from the T tab. */
.rd-chartwork .cw-tm-toggle{ height:28px; padding:0 9px; background:#20242d; color:#9aa2b3; border:1px solid #2b313c;
  border-radius:6px; font-size:15px; line-height:1; cursor:pointer; flex:0 0 auto; }
.rd-chartwork .cw-tm-toggle:hover{ color:#fff; border-color:#3a4256; }
.rd-chartwork.cw-tm-on .cw-tm-toggle{ background:#e1261c; border-color:#e1261c; color:#fff; }
.rd-chartwork .cw-tmanage{ display:none; gap:6px; padding:8px 14px; border-bottom:1px solid #1b2028; }
.rd-chartwork.cw-tm-on .cw-tmanage{ display:flex; }
.rd-chartwork .cw-tmanage button{ height:26px; padding:0 10px; background:#2a2f3a; color:#c9cede; border:1px solid #3a414e;
  border-radius:6px; font:700 10.5px/1 'Inter Tight',sans-serif; cursor:pointer; }
.rd-chartwork .cw-tmanage button:hover:not(:disabled){ background:#e1261c; color:#fff; border-color:#e1261c; }
.rd-chartwork .cw-tmanage button:disabled{ opacity:.35; cursor:default; }
.rd-chartwork .cw-tmanage .tm-up, .rd-chartwork .cw-tmanage .tm-dn{ padding:0 8px; margin-left:auto; }
.rd-chartwork .cw-tmanage .tm-dn{ margin-left:0; }
.rd-chartwork.tb-open .cw-tfields{ display:none; }                               /* builder replaces the fields while open */
.rd-chartwork .cw-tbuilder{ flex:1; overflow-y:auto; padding:10px 14px 14px; }
.rd-chartwork .cw-tbuilder[hidden]{ display:none; }
.rd-chartwork .tb-title{ font:700 9.5px/1 'Inter Tight',sans-serif; letter-spacing:.1em; color:#f2b632; margin-bottom:8px; }
.rd-chartwork .tb-name{ width:100%; height:30px; background:#20242d; color:#e6e9f0; border:1px solid #2b313c; border-radius:6px;
  padding:0 10px; font-size:12.5px; margin-bottom:4px; }
.rd-chartwork .tb-name:focus{ outline:none; border-color:#e1261c; }
.rd-chartwork .tb-sec{ font:700 9.5px/1 'Inter Tight',sans-serif; letter-spacing:.1em; color:#6f7789; padding:10px 0 5px; }
.rd-chartwork .tb-row{ display:flex; align-items:center; gap:7px; padding:5px 6px; border-radius:5px; font-size:12.5px; color:#c9cede; }
.rd-chartwork .tb-row:hover{ background:#181c24; }
.rd-chartwork .tb-ck{ flex:0 0 auto; width:13px; height:13px; border:1.5px solid #3a414e; border-radius:3.5px; position:relative; cursor:pointer; }
.rd-chartwork .tb-row.on .tb-ck{ background:#e1261c; border-color:#e1261c; }
.rd-chartwork .tb-row.on .tb-ck::after{ content:"\2713"; position:absolute; inset:0; font-size:10px; text-align:center; line-height:11px; color:#fff; font-weight:800; }
.rd-chartwork .tb-nm{ flex:1; min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; cursor:pointer; }
.rd-chartwork .tb-row.on .tb-nm{ color:#fff; }
.rd-chartwork .tb-mv{ flex:0 0 auto; color:#7d8494; opacity:0; cursor:pointer; font-size:12px; padding:0 3px; }
.rd-chartwork .tb-row:hover .tb-mv{ opacity:.75; }
.rd-chartwork .tb-mv:hover{ opacity:1; color:#e1261c; }
.rd-chartwork .tb-sec-hint{ font:400 9px/1 'Inter Tight',sans-serif; letter-spacing:.02em; color:#4d5464; text-transform:none; margin-left:4px; }
/* Select ↔ Reorder mode (Masud): Reorder shows ONLY the chosen rows so the coach rearranges them cleanly. */
.rd-chartwork .tb-modes{ display:flex; gap:6px; margin:9px 0 2px; }
.rd-chartwork .tb-modebtn{ flex:1; height:26px; border:1px solid #2b313c; background:#191d24; color:#9aa2b3;
  border-radius:6px; font:600 11px/1 'Inter Tight',sans-serif; cursor:pointer; }
.rd-chartwork .tb-modebtn.on{ background:#e1261c; border-color:#e1261c; color:#fff; }
.rd-chartwork .cw-tbuilder.tb-reordering .tb-row:not(.on){ display:none; }
.rd-chartwork .cw-tbuilder.tb-reordering .tb-ck{ display:none; }
.rd-chartwork .cw-tbuilder.tb-reordering .tb-row{ background:#161a21; margin:2px 0; cursor:default; }
.rd-chartwork .cw-tbuilder.tb-reordering .tb-mv{ opacity:.9; font-size:15px; }
/* in Reorder mode the default-filter block isn\'t relevant — keep the view focused on the row order */
.rd-chartwork .cw-tbuilder.tb-reordering .tb-df, .rd-chartwork .cw-tbuilder.tb-reordering .tb-sec-df{ display:none; }
.rd-chartwork .tb-df{ display:flex; align-items:center; flex-wrap:wrap; gap:8px; padding:4px 6px; }
.rd-chartwork .tb-df-sum{ font-size:11px; color:#f2b632; }
.rd-chartwork .tb-df-attach, .rd-chartwork .tb-df-clear{ height:24px; padding:0 10px; background:#2a2f3a; color:#c9cede;
  border:1px solid #3a414e; border-radius:6px; font:700 10px/1 'Inter Tight',sans-serif; cursor:pointer; }
.rd-chartwork .tb-df-attach:hover{ background:#e1261c; color:#fff; border-color:#e1261c; }
.rd-chartwork .tb-df-clear:hover{ color:#ef6060; border-color:#ef6060; }
.rd-chartwork .tb-df-clear[hidden]{ display:none; }
.rd-chartwork .tb-foot{ display:flex; align-items:center; gap:8px; padding-top:12px; }
.rd-chartwork .tb-save{ height:30px; padding:0 14px; background:#e1261c; color:#fff; border:0; border-radius:6px;
  font:700 11px/1 'Inter Tight',sans-serif; cursor:pointer; }
.rd-chartwork .tb-cancel{ height:30px; padding:0 12px; background:#2a2f3a; color:#c9cede; border:1px solid #3a414e;
  border-radius:6px; font:700 11px/1 'Inter Tight',sans-serif; cursor:pointer; }
.rd-chartwork .tb-msg{ font-size:11px; color:#f2b632; }
.rd-chartwork .cw-sec{ font:800 10px/1 'Inter Tight',sans-serif; letter-spacing:.12em; color:#8b93a8; margin:12px 0 4px; }
.rd-chartwork .cw-sec span{ color:#e1261c; margin-left:4px; }
.rd-chartwork .cw-grp{ font:700 9.5px/1 'Inter Tight',sans-serif; letter-spacing:.1em; color:#5f6779; margin:12px 0 5px; }
.rd-chartwork .cw-field{ display:grid; grid-template-columns:104px 1fr; align-items:center; gap:8px; padding:4px 0 4px 8px;
  margin:0 0 2px -8px; border-left:2px solid transparent; }
.rd-chartwork .cw-field.set{ border-left-color:#f2b632; }
.rd-chartwork .cw-field label{ font-size:11.5px; color:#9aa2b4; text-transform:uppercase; letter-spacing:.02em; }
.rd-chartwork .cw-field.set label{ color:#e6e9f0; }
/* two-column (fresh pass): CATEGORY | VALUE, row-aligned like classic charting_template.blade */
.rd-chartwork .cw-2col{ display:grid; grid-template-columns:118px 1fr; align-items:stretch; }
.rd-chartwork .cw-2col-hd{ position:sticky; top:0; z-index:2; background:#111318; font:800 9px/1 'Inter Tight',sans-serif;
  letter-spacing:.13em; color:#6f7789; padding:2px 0 8px; border-bottom:1px solid #21262f; }
.rd-chartwork .cw-hd-r{ padding-left:12px; }
.rd-chartwork .cw-grp2{ grid-column:1 / -1; font:700 9.5px/1 'Inter Tight',sans-serif; letter-spacing:.1em; color:#5f6779; margin:11px 0 5px; }
.rd-chartwork .cw-field{ display:contents; }                            /* override the old grid — cat + combo become .cw-2col cells */
.rd-chartwork .cw-cat{ display:flex; align-items:center; padding:0 12px 0 0; border-right:1px solid #21262f;
  font-size:11.5px; color:#9aa2b4; text-transform:uppercase; letter-spacing:.02em; min-height:40px; }
.rd-chartwork .cw-field.set .cw-cat{ color:#e6e9f0; border-right-color:#f2b632; }
.rd-chartwork .cw-2col .cw-combo{ margin:5px 0 5px 12px; }
/* combobox (inc-3a) — a typeable charting field replacing the native <select>: focus/Tab in, type to
   filter, ↑↓ to move, Enter/click to pick. */
.rd-chartwork .cw-combo{ position:relative; }
.rd-chartwork .cw-combo-in{ width:100%; height:30px; background:#20242d; color:#e6e9f0; border:1px solid #2b313c;
  border-radius:6px; padding:0 44px 0 9px; font-size:13px; box-sizing:border-box; }
.rd-chartwork .cw-combo-in::placeholder{ color:#5b6274; }
.rd-chartwork .cw-combo-in:focus{ outline:none; border-color:#e1261c; box-shadow:0 0 0 2px rgba(225,38,28,.22); }
.rd-chartwork .cw-field.set .cw-combo-in{ color:#fff; border-color:#3a414e; }
.rd-chartwork .cw-combo-caret{ position:absolute; right:10px; top:50%; margin-top:-2px; width:0; height:0;
  border:4px solid transparent; border-top-color:#8b93a8; pointer-events:none; transition:transform .1s; }
.rd-chartwork .cw-combo.open .cw-combo-caret{ transform:rotate(180deg) translateY(3px); }
.rd-chartwork .cw-combo-clr{ position:absolute; right:26px; top:50%; transform:translateY(-50%); width:18px; height:18px;
  border:0; border-radius:50%; background:#2b313c; color:#c3cad9; font:700 13px/1 sans-serif; cursor:pointer; padding:0; }
.rd-chartwork .cw-combo-clr:hover{ background:#e1261c; color:#fff; }
/* charting field-value pairing badge — sits left of the clear × in a set combo */
.rd-chartwork .cw-fld-pp{ position:absolute; right:48px; top:50%; transform:translateY(-50%); display:inline-flex; align-items:center;
  gap:1px; height:18px; padding:0 5px; border-radius:9px; background:#2b313c; color:#8b93a8; font:700 10px/1 'Inter Tight',sans-serif; cursor:pointer; }
.rd-chartwork .cw-fld-pp .bx{ font-size:12px; }
.rd-chartwork .cw-fld-pp.on{ background:#312b1a; color:#f2b632; }
.rd-chartwork .cw-fld-pp:hover{ color:#fff; background:#e1261c; }
.rd-chartwork .cw-combo-menu{ position:absolute; left:0; right:0; top:calc(100% + 3px); z-index:40; max-height:230px;
  overflow-y:auto; background:#191d27; border:1px solid #2b313c; border-radius:8px; padding:4px; box-shadow:0 10px 26px rgba(0,0,0,.55); }
.rd-chartwork .cw-opt{ display:flex; align-items:center; justify-content:space-between; gap:8px; padding:6px 8px; border-radius:5px;
  font-size:12.5px; color:#c3cad9; cursor:pointer; white-space:nowrap; }
.rd-chartwork .cw-opt.hi{ background:#262b36; color:#fff; }
.rd-chartwork .cw-opt.sel{ color:#f2b632; }
.rd-chartwork .cw-opt.sel::before{ content:"\2713"; margin-right:5px; font-size:10px; }
.rd-chartwork .cw-opt-none{ color:#6f7789; font-style:italic; }
.rd-chartwork .cw-opt-c{ font-size:10px; color:#6f7789; font-variant-numeric:tabular-nums; }

/* keyboard legend: collapsed by default (rarely-needed reference) — the ⌨ header button toggles it, so it
   no longer permanently eats ~83px at the bottom of the panel. */
.rd-chartwork .cw-kbd{ display:none; padding:9px 14px; border-top:1px solid #21262f; background:#0d0f14; color:#6f7789; font-size:10.5px; }
.rd-chartwork.cw-kbd-on .cw-kbd{ display:block; }
.rd-chartwork .cw-kbd div{ display:flex; flex-wrap:wrap; gap:4px 8px; line-height:1.9; }
.rd-chartwork .cw-kbd kbd{ display:inline-block; min-width:15px; text-align:center; padding:1px 4px; background:#20242d;
  border:1px solid #2b313c; border-radius:4px; font:600 10px/1.3 'SF Mono',ui-monospace,Menlo,monospace; color:#c9cede; }

/* current charting target highlighted on the board (any tab). !important + later in the file than
   the gold active-red-shot ring, so when both mark the same tile the charting red wins. */
.each-shot.cw-current{ outline:2px solid #e1261c !important; outline-offset:-2px !important; border-radius:6px; }
/* STAT board card cleanup:
   1. The classic per-snip colour stripes (.bd-highlight) leak into the play-number cell as useless
      transparent divs (color_code renders "#null"); many of them stack into a faint seam ("lines on
      top of some snips"). The STAT card carries its own possession + result colour, so hide them.
   2. overflow:hidden so the card clips to its rounded corners — the coloured top band gets rounded
      top corners and the gold selection ring wraps it cleanly, matching the ODK/identity cards
      (consistent selection highlight across every tab). */
.rd-boardwrap #statFrame .each-shot .shot-number .bd-highlight{ display:none !important; }
.rd-boardwrap #statFrame .each-shot{ overflow:hidden !important; }
/* the classic per-snip data accordion is redundant while the workstation is open — suppress it
   (the vocab lives in the separate .tag-mapping-palette, which is NOT hidden) */
body.cw-active .snip-palette{ display:none !important; }

/* ═══ STATS popup — redesign dark theme (Phase 1) ════════════════════════════════════════════════
   The classic .stat-start-settings-popup is a white, light-themed box that clashes with the dark
   redesign and, being absolutely positioned to a shifting parent, could land off-screen. Re-theme it
   to the redesign + center it as a clean modal. Scoped to the twin (body.rd-has-appbar) so classic is
   untouched. Covers every content state (stat-start / already-statted / scout / practice) since it
   only restyles the shared container + .stat-sett-btn buttons. */
body.rd-has-appbar .stat-start-settings-popup{
  position:fixed !important; left:50% !important; top:50% !important; transform:translate(-50%,-50%) !important;
  width:300px !important; max-width:calc(100vw - 32px) !important; padding:18px 18px 20px !important;
  background:#171a21 !important; color:#e6e9f0 !important; border:1px solid #282d37 !important;
  border-radius:12px !important; box-shadow:0 22px 60px rgba(0,0,0,.6) !important; z-index:100002 !important; }
body.rd-has-appbar .stat-start-settings-popup::after,
body.rd-has-appbar .stat-start-settings-popup::before{ display:none !important; content:none !important; }   /* drop the classic pointer tail (its anchor icon is hidden in the twin) */
body.rd-has-appbar .stat-start-settings-popup .custom-popup-title{
  color:#f2f4f8 !important; font:800 15px/1.2 'Inter Tight',system-ui,sans-serif !important; letter-spacing:.01em; margin:2px 0 10px !important; text-align:center !important; }
body.rd-has-appbar .stat-start-settings-popup .custom-popup-title span{ color:#e1261c !important; }
body.rd-has-appbar .stat-start-settings-popup .title-sublabel{
  color:#8b93a8 !important; font:400 11px/1.4 'Inter Tight',system-ui,sans-serif !important; text-align:center !important; margin-bottom:12px !important; }
/* buttons — redesign pill style; the FIRST option in each state is the primary action (red) */
body.rd-has-appbar .stat-start-settings-popup .stat-sett-btn{
  display:block !important; width:100% !important; margin:0 0 8px !important; padding:11px 14px !important;
  background:#20242d !important; color:#e6e9f0 !important; border:1px solid #2b313c !important;
  border-radius:8px !important; font:700 12.5px/1.1 'Inter Tight',system-ui,sans-serif !important;
  text-align:center !important; cursor:pointer !important; transition:background .12s,border-color .12s; }
body.rd-has-appbar .stat-start-settings-popup .stat-sett-btn:hover{ background:#272c37 !important; border-color:#3a4256 !important; color:#fff !important; }
body.rd-has-appbar .stat-start-settings-popup .stat-sett-btn:first-of-type{
  background:#e1261c !important; border-color:#e1261c !important; color:#fff !important; }
body.rd-has-appbar .stat-start-settings-popup .stat-sett-btn:first-of-type:hover{ background:#c81f16 !important; border-color:#c81f16 !important; }
body.rd-has-appbar .stat-start-settings-popup .popup-close{
  position:absolute !important; top:12px !important; right:13px !important; color:#8b93a8 !important; font-size:15px !important; }
body.rd-has-appbar .stat-start-settings-popup .popup-close:hover{ color:#e1261c !important; }

/* ═══ HIGHLIGHT REEL popup — redesign dark theme ═════════════════════════════════════════════════
   Opened by the REELS rail item (#hightlight-popup-button). Classic renders it as a white panel
   docked to the OLD highlights location (far right → off-screen on narrower viewports). Re-theme to
   the redesign + center it as a fixed modal. Twin-only (body.rd-has-appbar); classic untouched. */
body.rd-has-appbar .highlight-reel-popup{
  position:fixed !important; left:50% !important; top:50% !important; transform:translate(-50%,-50%);   /* NOT !important — the inline drag transform (rdMakeDraggable) must be able to win */
  width:440px !important; max-width:calc(100vw - 32px) !important; max-height:calc(100vh - 90px) !important; overflow-y:auto !important;
  background:#171a21 !important; color:#e6e9f0 !important; border:1px solid #282d37 !important; border-radius:12px !important;
  box-shadow:0 22px 60px rgba(0,0,0,.6) !important; padding:22px 16px 18px !important; z-index:100002 !important; }
body.rd-has-appbar .highlight-reel-popup::after, body.rd-has-appbar .highlight-reel-popup::before{ display:none !important; content:none !important; }
/* top drag grip (via window.rdMakeDraggable) — the popup's tabs/rows are clickable, so drag from here */
body.rd-has-appbar .highlight-reel-popup .rd-pop-drag{ position:absolute; top:0; left:0; right:0; height:18px; cursor:move;
  display:flex; align-items:center; justify-content:center; }
body.rd-has-appbar .highlight-reel-popup .rd-pop-drag::before{ content:""; width:34px; height:4px; border-radius:2px; background:#3a4150; }
body.rd-has-appbar .highlight-reel-popup .rd-pop-drag:hover::before{ background:#4a5265; }
body.rd-has-appbar .highlight-reel-popup .heighlight-title{ color:#8b93a8 !important; background:transparent !important;
  font:800 12px/1 'Inter Tight',system-ui,sans-serif !important; letter-spacing:.04em; border:0 !important; padding:4px 2px !important; }
body.rd-has-appbar .highlight-reel-popup .heighlight-title.active{ color:#f2f4f8 !important; border-bottom:2px solid #e1261c !important; }
body.rd-has-appbar .highlight-reel-popup .highlights-sub{ color:#8b93a8 !important; background:transparent !important;
  font:700 10.5px/1 'Inter Tight',system-ui,sans-serif !important; letter-spacing:.03em; }
body.rd-has-appbar .highlight-reel-popup .highlights-sub.active{ color:#e1261c !important; }
body.rd-has-appbar .highlight-reel-popup .head-section{ background:#20242d !important; color:#e6e9f0 !important; border:1px solid #2b313c !important;
  border-radius:8px !important; font:700 12px/1 'Inter Tight',system-ui,sans-serif !important; padding:9px 11px !important; }
body.rd-has-appbar .highlight-reel-popup .hightlight-reel-listitem{ background:#14171f !important; border:1px solid #252a35 !important;
  border-radius:8px !important; margin:6px 0 !important; color:#e6e9f0 !important; }
body.rd-has-appbar .highlight-reel-popup .hightlight-reel-listitem .title{ color:#e6e9f0 !important; font-family:'Inter Tight',system-ui,sans-serif !important; }
body.rd-has-appbar .highlight-reel-popup .date-sec{ color:#8b93a8 !important; font-family:'Inter Tight',system-ui,sans-serif !important; }
body.rd-has-appbar .highlight-reel-popup .reel-icon{ color:#c9cede !important; }
body.rd-has-appbar .highlight-reel-popup .reel-icon:hover{ color:#e1261c !important; }
body.rd-has-appbar .highlight-reel-popup .popup-close{ color:#8b93a8 !important; }
body.rd-has-appbar .highlight-reel-popup .popup-close:hover{ color:#e1261c !important; }
body.rd-has-appbar .highlight-reel-popup .plusbtn, body.rd-has-appbar .highlight-reel-popup .plusbtn i{ color:#f2f4f8 !important; }
body.rd-has-appbar .highlight-reel-popup .select-download-filetype,
body.rd-has-appbar .highlight-reel-popup .select-reel-edittype{ background:#20242d !important; border:1px solid #2b313c !important; border-radius:10px !important; color:#e6e9f0 !important; }
body.rd-has-appbar .highlight-reel-popup .btn-downloadmusicfile,
body.rd-has-appbar .highlight-reel-popup .btn-downloadNomusicfile{ background:#e1261c !important; color:#fff !important; border:0 !important; border-radius:7px !important; }
body.rd-has-appbar .highlight-reel-popup .sb-non-list li{ color:#e6e9f0 !important; }

/* LOADING GATE — moved to an INLINE critical <style> at the top of homevideojs_opt.blade.php's <head>
   (before the 39 external stylesheets) so the black loader covers the FIRST paint. Keeping it only in
   this file (stylesheet #36) let the classic layout paint before the rule applied → the flash. The
   JS reveal (body.rd-ready) lives in player-redesign_opt.js. */

/* ===== Intercut playback (rework of "Play all angles") ============================ */
.rd-cam-act.rd-cam-intercut.on{ background:#e1261c; border-color:#e1261c; color:#fff; }
.rd-cam-act.rd-cam-intercut.on i{ color:#fff; }

/* status banner — pinned under the app bar, centered over the video */
.rd-icbar{ position:fixed; top:56px; left:50%; transform:translateX(-50%); z-index:9000;
  display:flex; align-items:center; gap:10px; padding:5px 8px 5px 8px;
  background:rgba(18,20,26,.93); border:1px solid #3a414e; border-radius:999px;
  box-shadow:0 8px 26px rgba(0,0,0,.5); font-family:'Inter Tight',sans-serif; color:#e6e9f0; }
.rd-icbar[hidden]{ display:none; }
.rd-ic-btn{ width:26px; height:26px; border-radius:50%; border:1px solid #3a414e; background:#20242d; color:#e6e9f0;
  cursor:pointer; font-size:10px; display:flex; align-items:center; justify-content:center; }
.rd-ic-btn:hover{ background:#e1261c; border-color:#e1261c; color:#fff; }
.rd-ic-info{ display:flex; align-items:center; gap:7px; font-size:12px; letter-spacing:.02em; }
.rd-ic-tag{ font-weight:800; color:#f2b632; font-size:10px; letter-spacing:.08em; }
.rd-ic-snip,.rd-ic-view{ font-variant-numeric:tabular-nums; }
.rd-ic-dot{ color:#5b6274; }
.rd-ic-keys{ font-size:10px; color:#8b93a5; display:flex; align-items:center; gap:3px; }
.rd-ic-keys b{ display:inline-block; min-width:15px; text-align:center; padding:1px 3px; border:1px solid #3a414e; border-radius:3px; color:#c9cede; font-weight:700; }
.rd-ic-stop{ width:22px; height:22px; border-radius:50%; border:none; background:transparent; color:#9aa2b2; cursor:pointer; font-size:16px; line-height:1; }
.rd-ic-stop:hover{ color:#e1261c; }

/* keep the transport + snip rail usable while intercut runs (classic force-greys these inline) */
body.rd-intercut .entire-video-shot-section{ pointer-events:auto !important; opacity:1 !important; }
body.rd-intercut .player-right-icons,
body.rd-intercut .player-right-icons div,
body.rd-intercut .player-right-icons button,
body.rd-intercut .player-right-icons a,
body.rd-intercut .seekbar-section,
body.rd-intercut #playpause,
body.rd-intercut .rd-loopbtn,
body.rd-intercut #rd-speed{ pointer-events:auto !important; opacity:1 !important; }

/* Trim-video mode has its own dedicated play button (right of the trim scrub bar), so disable the MAIN
   player transport while trimming (bug 8b). The trim controls (.play-edited-video, #save_trimmed_video,
   .trim-cancel) live inside #trim-video-wrap, outside these selectors, so they stay usable. */
body.rd-trimming #playpause,
body.rd-trimming .seekbar-section,
body.rd-trimming .player-right-icons,
body.rd-trimming .rd-loopbtn,
body.rd-trimming #rd-speed,
body.rd-trimming .rd-gamesnip{ pointer-events:none !important; opacity:.4 !important; }

/* Reel/whiteboard Share popup (#sharemodal) is z-9999 — BELOW the redesign navrail (99998), appbar (99999),
   and even the reels/highlights popup (10000) — so "Share" opened behind the board. Lift it above the
   redesign chrome in the twin so it's actually usable (bug 5). */
body.rd-has-navrail #sharemodal{ z-index:100012 !important; }

/* entry config popover (which views + order) */
.rd-iccfg{ position:fixed; top:50%; left:50%; transform:translate(-50%,-50%); z-index:9100; width:300px;
  background:#181c24; border:1px solid #333a48; border-radius:12px; box-shadow:0 18px 50px rgba(0,0,0,.6);
  padding:14px; font-family:'Inter Tight',sans-serif; color:#e6e9f0; }
.rd-iccfg[hidden]{ display:none; }
.rd-iccfg-h{ font-weight:800; font-size:14px; margin-bottom:3px; }
.rd-iccfg-sub{ font-size:11px; color:#8b93a5; margin-bottom:11px; line-height:1.45; }
.rd-iccfg-list{ display:flex; flex-direction:column; gap:5px; max-height:260px; overflow-y:auto; }
.rd-icfg-row{ display:flex; align-items:center; gap:8px; padding:6px 8px; background:#20242d; border:1px solid #2b313c; border-radius:7px; }
.rd-icfg-row:not(.inc){ opacity:.5; }
.rd-icfg-ck{ flex:1; display:flex; align-items:center; gap:8px; cursor:pointer; font-size:12.5px; min-width:0; }
.rd-icfg-ck input{ accent-color:#e1261c; }
.rd-icfg-ck span{ overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.rd-icfg-ord{ display:flex; gap:3px; }
.rd-icfg-up,.rd-icfg-dn{ width:22px; height:22px; border-radius:5px; border:1px solid #3a414e; background:#262b36; color:#c9cede; cursor:pointer; font-size:8px; }
.rd-icfg-up:hover,.rd-icfg-dn:hover{ background:#e1261c; border-color:#e1261c; color:#fff; }
.rd-iccfg-actions{ display:flex; justify-content:flex-end; gap:8px; margin-top:12px; }
.rd-iccfg-cancel,.rd-iccfg-start{ height:32px; padding:0 14px; border-radius:7px; font:600 12px/1 'Inter Tight',sans-serif; cursor:pointer; }
.rd-iccfg-cancel{ background:#262b36; border:1px solid #3a414e; color:#c9cede; }
.rd-iccfg-start{ background:#e1261c; border:1px solid #e1261c; color:#fff; }
.rd-iccfg-start:hover{ background:#c21f16; }

/* ===== Top-rail scoreboard (mirrors classic sport scoreboard when data exists) ===== */
.rd-appbar .rd-score{ display:inline-flex; align-items:center; gap:6px; margin-left:12px; padding:3px 10px;
  background:#20242d; border:1px solid #333a48; border-radius:999px; font-family:'Inter Tight',sans-serif;
  font-size:12px; color:#e6e9f0; white-space:nowrap; }
.rd-appbar .rd-score[hidden]{ display:none; }
.rd-appbar .rd-score .rd-sc-side{ display:inline-flex; align-items:center; gap:5px; }
.rd-appbar .rd-score b{ font-weight:700; color:#c9cede; letter-spacing:.02em; max-width:110px; overflow:hidden; text-overflow:ellipsis; }
.rd-appbar .rd-score .rd-sc-logo{ width:16px; height:16px; border-radius:50%; object-fit:cover; background:#2a2f3a; flex:0 0 auto; }
.rd-appbar .rd-score .rd-sc-meta{ font-style:normal; font-size:10px; font-weight:700; color:#8b93a4; letter-spacing:.02em; }
.rd-appbar .rd-score .rd-sc-nums{ display:inline-flex; align-items:center; gap:2px; padding:0 2px; }
.rd-appbar .rd-score .rd-sc-hs,.rd-appbar .rd-score .rd-sc-as{ font-weight:800; color:#fff; font-variant-numeric:tabular-nums; min-width:12px; text-align:center; }
.rd-appbar .rd-score .rd-sc-x{ color:#5b6274; font-style:normal; margin:0 1px; }
/* sport-specific context row (period / outs / count / set) — e.g. baseball "▲ 3rd · 2 OUT · 1-2" */
.rd-appbar .rd-score .rd-sc-ctx{ display:inline-flex; align-items:center; gap:5px; margin-left:6px; padding-left:8px;
  border-left:1px solid #333a48; font-size:11px; font-weight:600; color:#9aa2b3; text-transform:uppercase; letter-spacing:.03em; }
.rd-appbar .rd-score .rd-sc-dot{ color:#4b5262; font-style:normal; }
/* The classic on-video scorecard overlay (the vertical GEN(A)/F:0 widget) is now mirrored in the top-rail
   .rd-score pill — hide the redundant overlay in the twin. Data stays in the DOM (display:none still exposes
   textContent) so the mirror keeps reading it. */
body.rd-has-navrail .basketball-scorecard,
body.rd-has-navrail .football-scorecard,
body.rd-has-navrail .volleyball-scorecard,
body.rd-has-navrail .tennis-scorecard,
body.rd-has-navrail .baseball-scorecard,
body.rd-has-navrail .generic-scorecard{ display:none !important; }

/* ===== Compare Angles / Dual View (Phase 1 synced two-pane) ===== */
.rd-dual{ position:fixed; z-index:8500; background:#0c0e12; border:1px solid #333a48; border-radius:10px;
  display:flex; flex-direction:column; overflow:hidden; box-shadow:0 12px 40px rgba(0,0,0,.6); }
.rd-dual[hidden]{ display:none; }
.rd-dual-head{ display:flex; align-items:center; gap:10px; padding:6px 10px; background:#14171e; border-bottom:1px solid #262b36; }
.rd-dual-title{ font:800 12px/1 'Inter Tight',sans-serif; color:#e6e9f0; letter-spacing:.06em; }
.rd-dual-hint{ font-size:10px; color:#7d8494; flex:1; }
.rd-dual-x{ width:24px; height:24px; border:none; background:transparent; color:#9aa2b2; font-size:18px; line-height:1; cursor:pointer; }
.rd-dual-x:hover{ color:#e1261c; }
.rd-dual-stage{ flex:1; display:flex; gap:2px; min-height:0; background:#000; }
.rd-dual-pane{ flex:1; display:flex; flex-direction:column; min-width:0; position:relative; }
.rd-dual-vwrap{ flex:1; position:relative; min-height:0; background:#000; overflow:hidden; }
.rd-dual-v{ position:absolute; inset:0; width:100% !important; height:100% !important; }
/* full view of each angle (letterbox, no crop); zoom+pan applied as a transform on the video.
   videojs renders the <video> at its intrinsic size, so force it to fill the pane then object-fit
   letterboxes it — otherwise the pane's overflow:hidden just crops the oversized frame. */
.rd-dual-v .vjs-tech, .rd-dual-v video, #rd-dual-a video, #rd-dual-b video, #rd-dual-a .vjs-tech, #rd-dual-b .vjs-tech{
  position:absolute !important; top:0 !important; left:0 !important; width:100% !important; height:100% !important;
  object-fit:contain !important; will-change:transform; }
.rd-dual-pane.zoomed .rd-dual-vwrap{ cursor:grab; }
.rd-dual-pane.zoomed .rd-dual-vwrap:active{ cursor:grabbing; }
.rd-dual-zoomctl{ position:absolute; left:8px; bottom:8px; z-index:20; display:flex; align-items:center; gap:7px;
  padding:4px 9px; background:rgba(18,20,26,.88); border:1px solid #3a414e; border-radius:999px; backdrop-filter:blur(4px); }
/* hide the redesign PLAY-N info bar + the intercut banner while compare is open (they overlapped the header) */
body.rd-dual-on .rd-playinfo, body.rd-dual-on .rd-icbar{ display:none !important; }
/* The classic per-video floating tools (3-dot "more" menu, game-zoom magnifier, draw color-picker) sit at a
   HIGHER z-index than the dual overlay (.expand-more-btn is z-9999 vs the overlay's 8500) and poke through
   onto the compare panes. They don't apply in dual view — hide them while comparing. */
body.rd-dual-on .more-buttons-wrapper,
body.rd-dual-on .expand-more-btn,
body.rd-dual-on .canvas-color-picker,
body.rd-dual-on .toggle-game-zoom{ display:none !important; }
.rd-cam-act[data-rd-cam="dual"].on{ background:#e1261c; border-color:#e1261c; color:#fff; }
.rd-cam-act[data-rd-cam="dual"].on i{ color:#fff; }
/* EXIT button — FIXED to the viewport top-right (immune to header/flex geometry), high z-index */
.rd-dual-head{ min-height:38px; padding-right:170px; }
.rd-dual-exit{ position:fixed; top:54px; right:16px; z-index:9999; display:inline-flex; align-items:center; gap:6px;
  height:28px; padding:0 15px; white-space:nowrap; background:#e1261c; border:1px solid #e1261c; color:#fff;
  border-radius:7px; cursor:pointer; font:700 11px/1 'Inter Tight',sans-serif; letter-spacing:.04em;
  box-shadow:0 3px 12px rgba(0,0,0,.5); }
.rd-dual-exit:hover{ background:#c21f16; }
.rd-dual-zoomctl .fas{ font-size:10px; color:#9aa2b2; }
.rd-dual-zoom{ width:88px; height:3px; accent-color:#e1261c; cursor:pointer; }
.rd-dual-zpct{ font:600 10px/1 'Inter Tight',sans-serif; color:#c9cede; font-variant-numeric:tabular-nums; min-width:30px; text-align:right; }
.rd-dual-load{ position:absolute; inset:0; display:none; align-items:center; justify-content:center; background:rgba(0,0,0,.55); }
.rd-dual-spin{ width:34px; height:34px; border:3px solid rgba(255,255,255,.25); border-top-color:#e1261c; border-radius:50%; animation:rd-dspin .8s linear infinite; }
@keyframes rd-dspin{ to{ transform:rotate(360deg); } }
.rd-dual-pk{ position:relative; z-index:3; padding:5px 8px; background:#14171e; border-top:1px solid #262b36; }
.rd-dual-sel{ width:100%; height:28px; background:#20242d; color:#e6e9f0; border:1px solid #333a48; border-radius:6px; padding:0 8px; font-size:12px; }
.rd-dual-bar{ position:relative; z-index:3; display:flex; align-items:center; gap:10px; padding:8px 12px; background:#14171e; border-top:1px solid #262b36; }
.rd-dual-head{ position:relative; z-index:3; }
.rd-dual-play{ width:34px; height:34px; border-radius:50%; border:1px solid #3a414e; background:#e1261c; color:#fff; cursor:pointer; font-size:12px; }
.rd-dual-play:hover{ background:#c21f16; }
.rd-dual-seek{ flex:1; accent-color:#e1261c; height:4px; }
.rd-dual-time{ font:600 11px/1 'Inter Tight',sans-serif; color:#c9cede; font-variant-numeric:tabular-nums; white-space:nowrap; }
.rd-dual-rate,.rd-dual-loop{ height:28px; padding:0 11px; border-radius:6px; border:1px solid #3a414e; background:#20242d; color:#c9cede; font:600 11px/1 'Inter Tight',sans-serif; cursor:pointer; }
.rd-dual-loop.on{ background:#e1261c; border-color:#e1261c; color:#fff; }
.rd-dual-rate:hover,.rd-dual-loop:hover{ border-color:#e1261c; }
.rd-dual-toast{ position:absolute; left:50%; top:50%; transform:translate(-50%,-50%); z-index:5;
  background:rgba(18,20,26,.96); border:1px solid #3a414e; border-radius:8px; padding:12px 18px;
  color:#e6e9f0; font:600 13px/1.4 'Inter Tight',sans-serif; box-shadow:0 10px 30px rgba(0,0,0,.5); text-align:center; max-width:80%; }
.rd-dual-toast[hidden]{ display:none; }

/* ===== QA BATCH 2026-08-09 =================================================== */

/* (1) DELETE CHOOSER — a tagged snip routes through the classic "Delete Snip / Delete Tag(s)"
   popover (#deleteSnipPopup). It is position:absolute at z-index 9999, anchored off the
   clipped classic tile strip → it landed off-screen and UNDER the navrail (99998) / appbar
   (99999), so Delete looked dead on tagged snips. player-redesign_opt.js re-anchors it to the
   footer button in viewport coords; this makes those coords mean the viewport and lifts it
   above the redesign chrome. Also re-skinned to the redesign card. */
body.rd-has-navrail #deleteSnipPopup.rd-delpop{ position:fixed !important; z-index:100014 !important;
  background:#171a21 !important; border:1px solid #333a48 !important; border-radius:8px !important;
  box-shadow:0 14px 34px rgba(0,0,0,.55) !important; padding:14px 12px 12px !important; width:auto !important;
  min-width:212px !important; }
body.rd-has-navrail #deleteSnipPopup.rd-delpop .snip-popup-arrow{ display:none !important; }
body.rd-has-navrail #deleteSnipPopup.rd-delpop .snip-popup-close{ color:#8b93a8 !important; }
body.rd-has-navrail #deleteSnipPopup.rd-delpop .snip-actions{ display:flex; gap:8px; margin-top:6px !important; text-align:left !important; }
body.rd-has-navrail #deleteSnipPopup.rd-delpop .del-option-btn{ flex:1 1 auto; height:30px; padding:0 12px;
  background:#20242d; color:#e6e9f0; border:1px solid #333a48; border-radius:6px; white-space:nowrap;
  font:600 11px/1 'Inter Tight',sans-serif; cursor:pointer; }
body.rd-has-navrail #deleteSnipPopup.rd-delpop .del-option-btn:hover{ border-color:#e1261c; color:#fff; }
body.rd-has-navrail #deleteSnipPopup.rd-delpop .del-option-btn.deleteBM{ background:#e1261c; border-color:#e1261c; color:#fff; }

/* (2) SNIP TAG COLOUR on the identity cards (STAFF / PLAYER). The classic renders each snip's
   custom-tag colour as inline-coloured .bd-highlight bands inside the number cell; #681 painted
   them flat #0e1116 on identity cards (misread at the time as a stray "result hue" — it is in fact
   the tag's own colour_code). Masud: the snip must carry its tag's colour. Restore the bands using
   the same treatment ODK/CHART/MINE already use — block flow so the bands stack and fill the thumb,
   number floated over them in white so it stays legible on any tag colour. */
.rd-idcards .each-shot .shot-number{ display:block !important; position:relative !important; overflow:hidden !important; }
.rd-idcards .each-shot .shot-number .bd-highlight{ width:100% !important; display:block !important; }
.rd-idcards .each-shot .shot-number .position-relative{ position:absolute !important; inset:0 !important;
  display:flex !important; align-items:center !important; justify-content:center !important; z-index:1 !important;
  color:#fff !important; text-shadow:0 1px 2px rgba(0,0,0,.7) !important; }

/* (3) STAFF "text overlay" — the classic All/My/Others <select> (and its dead filter icon) sit in
   .highlight-reel-div-left at the board's top-left, half under the nav rail and printing over the
   "N plays" count. The select is relocated into the lite header (see rdHomeStaffFilter); belt-and-
   braces, anything left behind in that classic block is hidden so it can never overlay the board. */
body.rd-has-navrail .highlight-reel-div-left .filter-btn-tool-left{ display:none !important; }
body.rd-has-navrail .staff-snip-filter-dropdown{ display:none !important; }
body.rd-has-navrail .rd-fd-teamwrap .staff-snip-filter-dropdown{ display:inline-block !important; }
/* ...and the actual cause of the overlap (found live 2026-08-09): the select was ALREADY parked in
   the header - it just wasn't in the header's flow. Classic pins it with an ID-scoped rule,
   `#bookmark-before-edit .staff-snip-filter-dropdown{ position:absolute; left:39px; top:10px }`
   (custom-style.css:9569), and the header sits inside #bookmark-before-edit, so the select painted
   at x=39 straight over the "N plays" count at x=64 regardless of where it was parented. A class
   selector cannot outrank an id, so these need !important to land. */
body.rd-has-navrail .rd-board-head.rd-bh-lite .rd-fd-teamwrap .staff-snip-filter-dropdown{
  position:static !important; left:auto !important; top:auto !important; max-width:none !important; }

/* (4) ODK SNIPS — create from the ODK tab.
   a. Un-dim the transport "+Snip" button (classic sets opacity inline + a not-allowed cursor on the
      ODK collection); the redesign routes the click to the ODK entry popup instead. */
/* Only un-dim while a snip can actually be cut. .tool-disabled is classic's flag for "the player is
   showing a snip, not the game" — un-dimming through it made the button look live inside a snip. */
body.rd-odk-tab .create-bookmark:not(.tool-disabled){ opacity:1 !important; }
body.rd-odk-tab .player-right-icons .create-bookmark.tool-disabled-btn:not(.tool-disabled){ cursor:pointer !important; }
body.rd-odk-tab .create-bookmark.tool-disabled{ cursor:not-allowed !important; }
/* b. The entry popup is absolute at top:58/left:25/z-999 — i.e. behind the navrail and tucked under
      the app bar. Float it clear, above the redesign chrome, and dark-theme it to match.
      ⚠ NOTHING positional here may be !important. classic dragElement() and the native resize
      handle both work by writing INLINE top/left/width/height, and an !important stylesheet rule
      beats inline — which is exactly what froze the popup in place after #863. This selector
      (element+class+id) already outranks classic's bare #odk-snip-entry-popup, so it wins on its
      own and still lets inline drag/resize through.
      ⚠ Do NOT make this a flex column either: jQuery .show() writes inline display:block, which
      beats a stylesheet display:flex, and the half-applied result made Bootstrap's .col-6 resolve
      its 50% against the popup — the field column came out half width. Plain block + overflow:auto
      is what actually holds up here; shrink-to-fit is handled by the .odk-sm/.odk-xs rules below. */
body.rd-has-navrail #odk-snip-entry-popup{ position:fixed; top:96px; left:104px;
  z-index:100014 !important; width:264px; height:auto; min-width:190px; min-height:160px;
  max-height:calc(100vh - 72px); max-width:calc(100vw - 72px); resize:both; overflow:auto;
  background:#171a21 !important; border:1px solid #333a48 !important;
  border-radius:10px !important; box-shadow:0 18px 44px rgba(0,0,0,.6) !important; padding-bottom:8px !important; }
body.rd-has-navrail #odk-snip-entry-popup .row.h-100{ height:auto !important; }
/* the heading doubles as the drag grip (player-redesign_opt.js binds it and unbinds classic's
   drag-from-anywhere, which would otherwise start a drag from the O/D/K buttons themselves).
   It must span the full width or there is almost nothing to grab. */
body.rd-has-navrail #odk-snip-entry-popup .odk-snip-tab-heading-sections{ width:100% !important; }
body.rd-has-navrail #odk-snip-entry-popup .rd-odk-grip{ cursor:move; user-select:none; }
body.rd-has-navrail #odk-snip-entry-popup .rd-odk-grip .head-odk::after{ content:" ⠿"; opacity:.45; }
/* shrink to fit: below these sizes the chrome tightens so all seven ODK types stay reachable
   instead of scrolling away. The row height has to be set explicitly — classic hard-codes
   height:36px on the block (football.css:1819), so padding/font alone change nothing. */
body.rd-has-navrail #odk-snip-entry-popup.odk-sm .snipback-odk-data-block{ padding:4px 7px !important;
  height:28px !important; margin:2px 0 !important; font-size:11px !important; }
body.rd-has-navrail #odk-snip-entry-popup.odk-sm .snipback-odk-data-block label{ font-size:8.5px !important; }
body.rd-has-navrail #odk-snip-entry-popup.odk-sm .odk-snip-tab-heading-sections{ margin-top:2px !important; padding:6px 0 4px !important; }
body.rd-has-navrail #odk-snip-entry-popup.odk-sm .rd-odk-swap{ height:26px !important; margin-top:8px !important; font-size:9.5px !important; }
body.rd-has-navrail #odk-snip-entry-popup.odk-xs .snipback-odk-data-block{ padding:2px 6px !important;
  height:23px !important; font-size:10px !important; }
/* never collapse the heading — it IS the drag grip; just flatten it */
body.rd-has-navrail #odk-snip-entry-popup.odk-xs .odk-snip-tab-heading-sections{ margin-top:0 !important; padding:3px 0 2px !important; }
body.rd-has-navrail #odk-snip-entry-popup.odk-xs .rd-odk-swap{ height:22px !important; margin-top:5px !important; }
body.rd-has-navrail #odk-snip-entry-popup .popup-close{ color:#8b93a8 !important; z-index:2; }
body.rd-has-navrail #odk-snip-entry-popup .col-left-odk-home,
body.rd-has-navrail #odk-snip-entry-popup .col-right-odk-away{ background:transparent !important; }
body.rd-has-navrail #odk-snip-entry-popup .odk-snip-tab-heading-sections,
body.rd-has-navrail #odk-snip-entry-popup .stat-tab-heading-sections{ background:transparent !important;
  border:0 !important; border-bottom:1px solid #282d37 !important; margin-top:6px !important; padding:10px 0 8px !important; }
body.rd-has-navrail #odk-snip-entry-popup .head-odk{ color:#8b93a8 !important;
  font:700 10px/1 'Chakra Petch',system-ui,sans-serif !important; letter-spacing:.1em !important; }
body.rd-has-navrail #odk-snip-entry-popup .snipback-odk-data-block{ background:#20242d !important; color:#e6e9f0 !important;
  border:1px solid #333a48 !important; border-radius:6px !important; margin:4px 0 !important; padding:7px 9px !important;
  font:600 12px/1.1 'Inter Tight',sans-serif !important; display:flex !important; align-items:center !important;
  justify-content:space-between !important; cursor:pointer; }
body.rd-has-navrail #odk-snip-entry-popup .snipback-odk-data-block:hover{ border-color:#e1261c !important; }
body.rd-has-navrail #odk-snip-entry-popup .snipback-odk-data-block label{ margin:0 !important; color:#e1261c !important;
  font:700 9.5px/1 'Chakra Petch',system-ui,sans-serif !important; letter-spacing:.08em; text-transform:uppercase; cursor:pointer; }
/* Done is absolutely pinned to the popup's bottom by classic (position:absolute; bottom:8px), so it
   landed ON TOP of the swap button once that was added. Put it back in flow — the swap button is
   inserted before it, so they stack: swap, then Done. Also drop the Bootstrap .row negative margins,
   which made the inner row wider than the popup it lives in. */
body.rd-has-navrail #odk-snip-entry-popup .row.h-100{ margin-left:0 !important; margin-right:0 !important; }
/* DONE is gone from the FLOW (Masud: picking a type should create the snip and immediately be ready
   for the next one — no confirm step between snips). The button still exists and is still what
   performs the reset + adds the new card to the board; player-redesign_opt.js just fires it
   automatically once each create lands, so the classic logic is reused rather than reimplemented. */
body.rd-has-navrail #odk-snip-entry-popup .odk-snip-done-btn{ display:none !important; }
/* c. MY TEAM only — the opponent column is redundant (the opposite side is implied), and charting the
      wrong column is exactly how a game ends up reversed. One column, full width. */
body.rd-has-navrail #odk-snip-entry-popup .col-right-odk-away{ display:none !important; }
body.rd-has-navrail #odk-snip-entry-popup .col-left-odk-home{ flex:0 0 100% !important; max-width:100% !important;
  padding:0 12px !important; }
/* d. SWAP TEAM PERSPECTIVE — a game-wide correction, so it reads as a secondary/destructive
      action: outlined, sits above the primary Done button. */
body.rd-has-navrail #odk-snip-entry-popup .rd-odk-swap{ display:block !important; width:calc(100% - 24px) !important;
  margin:14px 12px 0 !important; height:30px !important; background:transparent !important; color:#c9cede !important;
  border:1px solid #4a3033 !important; border-radius:6px !important;
  font:600 10.5px/1 'Inter Tight',sans-serif !important; letter-spacing:.02em !important; }
body.rd-has-navrail #odk-snip-entry-popup .rd-odk-swap:hover{ border-color:#e1261c !important; color:#fff !important; }
body.rd-has-navrail #odk-snip-entry-popup .rd-odk-swap.busy{ opacity:.6 !important; pointer-events:none !important; }
#stat-snipcollection-update{
   top: 44%;
   height: 466px;
}
.stat-snip-cancel-btn, .stat-snip-submit-btn, .stat-snip-copy-cancel-btn, .stat-snip-copy-submit-btn, .odk-snip-submit-btn, .preferred-view-submit-btn, .preferred-view-cancel-btn, .del-snips-submit-btn, .del-snips-cancel-btn, .stat-customtag-submit-btn
{
  width: 56px;
  height: 54px;
}
/* ===== UNIVERSAL SIMPLE FILTER (2026-08-10) ==================================
   Classic already ships ONE simple filter that covers every sport and every collection
   (#draggable-customize-snipreel, trigger `.filter-btn`, customtagscripts.js:2568). Football+STAT
   is the single case that routes to the advanced panel instead. The redesign was only ever
   surfacing the advanced one, so every other sport — and every non-STAT football tab — had no
   reachable filter at all. We now drive classic's own trigger from every lite header; all this
   file does is dress the classic panel to match the redesign.
   ⚠ NOTHING positional may be !important here: classic runs dragElement() on this popup
   (homevideojs_scripts / customtagscripts) and drags by writing INLINE top/left, which an
   !important rule would silently defeat — the exact trap that froze the ODK popup in #863. */
body.rd-has-navrail #draggable-customize-snipreel{ z-index:100014 !important;
  background:#171a21 !important; border:1px solid #333a48 !important; border-radius:10px !important;
  box-shadow:0 18px 44px rgba(0,0,0,.6) !important; color:#e6e9f0 !important; }
/* the full-screen scrim classic prepends on open sits under the popup but over the board */
/*body.rd-has-navrail .snipback-full-overlay{ z-index:100010 !important; background:rgba(4,6,10,.55) !important; }*/
body.rd-has-navrail #draggable-customize-snipreel .bg-body,
body.rd-has-navrail #draggable-customize-snipreel .row,
body.rd-has-navrail #draggable-customize-snipreel .list-wrap,
body.rd-has-navrail #draggable-customize-snipreel .filter-content-block{ background:transparent !important; color:inherit !important; }
/* title — the inline `style="color:#000"` on its refresh link needs !important to beat */
body.rd-has-navrail #draggable-customize-snipreel .customize-snipreel-title{ color:#f2f4f8 !important;
  font:700 13px/1 'Chakra Petch',system-ui,sans-serif !important; letter-spacing:.08em !important; text-transform:uppercase; }
body.rd-has-navrail #draggable-customize-snipreel .customize-snipreel-title .refresh-custom-tagfilter{ color:#8b93a8 !important; }
body.rd-has-navrail #draggable-customize-snipreel .customize-snipreel-subtitle{ color:#8b93a8 !important;
  font:700 10px/1 'Chakra Petch',system-ui,sans-serif !important; letter-spacing:.1em !important; }
body.rd-has-navrail #draggable-customize-snipreel .border-bottom{ border-color:#20242d !important; }
/* tag / player rows */
body.rd-has-navrail #draggable-customize-snipreel li,
body.rd-has-navrail #draggable-customize-snipreel label{ color:#e6e9f0 !important;
  font:600 12px/1.2 'Inter Tight',system-ui,sans-serif !important; }
body.rd-has-navrail #draggable-customize-snipreel li:hover{ background:#1c2029 !important; }
/* TAG | PLAYER segmented head (labels, .active = selected) */
body.rd-has-navrail #draggable-customize-snipreel .tag-filter-pop-head .bookmark-check{ background:#20242d !important; color:#c9cede !important; }
body.rd-has-navrail #draggable-customize-snipreel .tag-filter-pop-head .bookmark-check.active{ background:#e1261c !important; color:#fff !important; }
/* MyTeam|Opponent and Home|Away pairs are Bootstrap .btn-light (white); .active is the chosen side */
body.rd-has-navrail #draggable-customize-snipreel .btn-light{ background:#20242d !important; color:#c9cede !important;
  border:1px solid #333a48 !important; font:600 11px/1 'Inter Tight',sans-serif !important; }
body.rd-has-navrail #draggable-customize-snipreel .btn-light.active{ background:#e1261c !important; border-color:#e1261c !important; color:#fff !important; }
/* footer: SHOW ALL (secondary) + APPLY (classic paints it green — make it the redesign red) */
body.rd-has-navrail #draggable-customize-snipreel .btn-clear-tag-filter{ background:transparent !important; color:#c9cede !important;
  border:1px solid #333a48 !important; border-radius:6px !important;
  font:700 10.5px/1 'Chakra Petch',system-ui,sans-serif !important; letter-spacing:.06em !important; }
body.rd-has-navrail #draggable-customize-snipreel .btn-apply-tag-filter{ background:#e1261c !important; border-color:#e1261c !important;
  color:#fff !important; border-radius:6px !important;
  font:700 10.5px/1 'Chakra Petch',system-ui,sans-serif !important; letter-spacing:.06em !important; }
body.rd-has-navrail #draggable-customize-snipreel .popup-close{ color:#8b93a8 !important; }
body.rd-has-navrail #draggable-customize-snipreel input[type=text],
body.rd-has-navrail #draggable-customize-snipreel select{ background:#20242d !important; color:#e6e9f0 !important;
  border:1px solid #333a48 !important; border-radius:6px !important; }

/* ===== NON-FOOTBALL STAT BOARD ==============================================
   Other sports never build the lanes board (it is football-yardline shaped), so #statFrame keeps
   classic's raw card row — the same starting point ODK/CHART/MINE had. Give it the identical
   redesign card shell so the STAT tab doesn't read as a different product on basketball. */
body.rd-nonfb #statFrame{ width:100vw !important; box-sizing:border-box; }
body.rd-nonfb.rd-has-navrail #statFrame{ padding-left:64px !important; }
body.rd-nonfb #statFrame .each-shot{
  width:104px !important; min-width:104px !important; max-width:104px !important; min-height:100px !important; height:auto !important;
  display:flex !important; flex-direction:column !important; margin:0 6px 0 0 !important; padding:0 !important;
  background:#111318 !important; border:1px solid #282d37 !important; border-radius:6px !important; overflow:hidden !important; }
body.rd-nonfb #statFrame .each-shot .shot-number{
  order:1 !important; width:100% !important; height:52px !important; min-height:52px !important; flex:none !important;
  display:block !important; position:relative !important; overflow:hidden !important; margin:0 !important;
  background:#0e1116 !important; border:0 !important; border-bottom:1px solid #20242d !important; border-radius:0 !important; }
body.rd-nonfb #statFrame .each-shot .shot-number .position-relative{
  position:absolute !important; inset:0 !important; display:flex !important; align-items:center !important; justify-content:center !important;
  z-index:1 !important; font:700 15px/1 'Chakra Petch',system-ui,sans-serif !important; color:#fff !important;
  text-shadow:0 1px 2px rgba(0,0,0,.7) !important; background:transparent !important; }
body.rd-nonfb #statFrame .each-shot .shot-number .bd-highlight{ width:100% !important; display:block !important; }
body.rd-nonfb #statFrame .each-shot .shot-username{
  order:2 !important; flex:1 1 auto !important; width:auto !important; height:auto !important; min-height:0 !important;
  padding:6px 8px !important; margin:0 !important; background:#0d1014 !important; border:0 !important;
  border-top:1px solid #20242d !important; border-radius:0 !important;
  writing-mode:horizontal-tb !important; text-orientation:mixed !important; transform:none !important;
  font:600 9px/1.3 'Inter Tight',system-ui,sans-serif !important; color:#c3cad9 !important; text-align:left !important;
  display:-webkit-box !important; -webkit-line-clamp:2 !important; -webkit-box-orient:vertical !important;
  white-space:normal !important; overflow:hidden !important; }
body.rd-nonfb #statFrame .each-shot .snip-tooltip{ display:none !important; }

/* ⚠ Classic's simple filter hides non-matching cards with `#statFrame .unfiltered{display:none
   !important}` (custom-style.css:3316) and its inverse `#frame.final-filter .filtered{display:none
   !important}`. The redesign card shells declare `display:flex !important` at equal-or-higher
   specificity AND load later, so they were resurrecting cards the filter had hidden — APPLY marked
   the cards correctly (.filtered/.unfiltered) but nothing disappeared, i.e. the filter looked dead.
   Re-assert both hidden states above the shells. Any future card-shell rule that sets `display`
   must stay below these. */
body.rd-has-navrail #statFrame .each-shot.unfiltered,
body.rd-has-navrail #allFrame .each-shot.unfiltered,
body.rd-has-navrail #teamFrame .each-shot.unfiltered,
body.rd-has-navrail #odkFrame .each-shot.unfiltered,
body.rd-has-navrail #chartFrame .each-shot.unfiltered,
body.rd-has-navrail #playerFrame .each-shot.unfiltered,
body.rd-has-navrail #assignedFrame .each-shot.unfiltered,
body.rd-has-navrail #customBMs .each-shot.unfiltered{ display:none !important; }
body.rd-has-navrail #statFrame.final-filter .each-shot.filtered,
body.rd-has-navrail #allFrame.final-filter .each-shot.filtered,
body.rd-has-navrail #teamFrame.final-filter .each-shot.filtered,
body.rd-has-navrail #playerFrame.final-filter .each-shot.filtered,
body.rd-has-navrail #customBMs.final-filter .each-shot.filtered,
/* customtagscripts marks NINE frames .final-filter, but classic only ever styled five — odk,
   charting, assigned and gameplan were never covered by either half of the pair, so on those
   collections the player stage ran and then nothing hid the non-matches: the filter silently did
   nothing. Assigned affects every sport; the other three are football. Both halves below. */
body.rd-has-navrail #odkFrame.final-filter .each-shot.filtered,
body.rd-has-navrail #chartFrame.final-filter .each-shot.filtered,
body.rd-has-navrail #assignedFrame.final-filter .each-shot.filtered,
body.rd-has-navrail #scriptFrame.final-filter .each-shot.filtered{ display:none !important; }

/* ⚠ The pair above is only HALF of classic's rule set. Classic also ships the inverse,
   `#frame.final-filter .final-filtered{display:block !important}`, and a card that SURVIVES the
   advanced filter carries BOTH classes — .filtered AND .final-filtered. Classic gets away with
   mirroring them at equal specificity (its show rule comes later, so it wins), but the hide rule
   above is `body.rd-has-navrail #frame.final-filter .each-shot.filtered` — one id + FOUR classes —
   which outranks classic's show rule and hid the matches too.
   Result: filter by a tag AND a player and every card vanished, while the header still counted the
   survivors. Re-assert the show half above the hide half, at the same weight, using flex to match
   the redesign card shells rather than classic's block. */
body.rd-has-navrail #statFrame.final-filter .each-shot.filtered.final-filtered,
body.rd-has-navrail #allFrame.final-filter .each-shot.filtered.final-filtered,
body.rd-has-navrail #teamFrame.final-filter .each-shot.filtered.final-filtered,
body.rd-has-navrail #playerFrame.final-filter .each-shot.filtered.final-filtered,
body.rd-has-navrail #customBMs.final-filter .each-shot.filtered.final-filtered,
body.rd-has-navrail #odkFrame.final-filter .each-shot.filtered.final-filtered,
body.rd-has-navrail #chartFrame.final-filter .each-shot.filtered.final-filtered,
body.rd-has-navrail #assignedFrame.final-filter .each-shot.filtered.final-filtered,
body.rd-has-navrail #scriptFrame.final-filter .each-shot.filtered.final-filtered{ display:flex !important; }

/* ===== BOARD: plays with no yardline data ====================================
   A stat snip can carry tags but have no football_game_yardline row (~0.4% of football stat snips,
   spread over ~21% of games — hence "only some games"). Those columns used to render nothing at all,
   leaving a full-height gap in the board that reads as broken. Possession and result are genuinely
   unknown, so they say so in the board's own empty tone (--d-empty from the design tokens) rather
   than sitting blank; the coach-tags lane is unaffected and renders normally. */
.rd-lvt.rd-nodata, .rd-cap.rd-nodata{
  background:#171b23 !important; color:#5b6274 !important; border:1px dashed #2a3141 !important;
  box-shadow:none !important; }
.rd-lvt.rd-nodata b{ color:#6b7488 !important; font-weight:600 !important; }
.rd-lvt.rd-nodata i{ color:#565d6d !important; font-style:normal !important;
  font-size:8.5px !important; letter-spacing:.06em; text-transform:uppercase; }
.rd-cap.rd-nodata .rc-w{ color:#565d6d !important; font-size:8.5px !important;
  letter-spacing:.05em; text-transform:uppercase; }
.rd-cap.rd-nodata .rc-n{ display:none !important; }
/* ===== EXPORT ▸ "SELECT SNIPS TO DOWNLOAD" modal ==============================
   A stock white Bootstrap modal in the middle of the dark player. Same treatment as the other
   classic popups we've adopted: dark card, redesign accents, and lifted above the navrail (99998)
   / appbar (99999) along with its backdrop, which otherwise dims the video but not the chrome. */
body.rd-has-navrail #download-multiplesnips{ z-index:100016 !important; }
body.rd-has-navrail + .modal-backdrop, body.rd-has-navrail .modal-backdrop{ z-index:100015 !important; }
body.rd-has-navrail #download-multiplesnips .modal-content{
  background:#171a21 !important; border:1px solid #333a48 !important; border-radius:12px !important;
  box-shadow:0 22px 60px rgba(0,0,0,.6) !important; color:#e6e9f0 !important; }
body.rd-has-navrail #download-multiplesnips .modal-title{
  color:#f2f4f8 !important; font:700 13px/1 'Chakra Petch',system-ui,sans-serif !important;
  letter-spacing:.1em !important; text-transform:uppercase; }
body.rd-has-navrail #download-multiplesnips .btn-close{ filter:invert(1) grayscale(1); opacity:.55; }
body.rd-has-navrail #download-multiplesnips .btn-close:hover{ opacity:.9; }
body.rd-has-navrail #download-multiplesnips .form-check-label,
body.rd-has-navrail #download-multiplesnips label{
  color:#e6e9f0 !important; font:600 13px/1.4 'Inter Tight',system-ui,sans-serif !important; cursor:pointer; }
body.rd-has-navrail #download-multiplesnips .form-check-input{
  background-color:#20242d !important; border-color:#3a4256 !important; }
body.rd-has-navrail #download-multiplesnips .form-check-input:checked{
  background-color:#e1261c !important; border-color:#e1261c !important; }
/* the eligibility note is guidance, not an error — stop it shouting in red */
body.rd-has-navrail #download-multiplesnips .download-views-note{
  color:#8b93a8 !important; font:500 11.5px/1.45 'Inter Tight',system-ui,sans-serif !important; margin-top:6px; }
body.rd-has-navrail #download-multiplesnips #cameraCheckboxes{
  border-top:1px solid #282d37 !important; padding-top:12px !important; }
body.rd-has-navrail #download-multiplesnips #cameraCheckboxes .fw-bold{
  color:#8b93a8 !important; font:700 10px/1 'Chakra Petch',system-ui,sans-serif !important;
  letter-spacing:.1em !important; text-transform:uppercase; display:block; margin-bottom:8px; }
body.rd-has-navrail #download-multiplesnips .modal-footer{ gap:10px; padding-top:4px !important; }
body.rd-has-navrail #download-multiplesnips .snip-multidownld-submit{
  background:#e1261c !important; border:0 !important; color:#fff !important; border-radius:6px !important;
  min-width:112px; height:34px; font:700 11px/1 'Chakra Petch',system-ui,sans-serif !important; letter-spacing:.08em !important; }
body.rd-has-navrail #download-multiplesnips .snip-dwnld-close{
  background:transparent !important; border:1px solid #333a48 !important; color:#c9cede !important;
  border-radius:6px !important; min-width:96px; height:34px;
  font:700 11px/1 'Chakra Petch',system-ui,sans-serif !important; letter-spacing:.08em !important; }
body.rd-has-navrail #download-multiplesnips .snip-dwnld-close:hover{ border-color:#4a5468 !important; color:#fff !important; }

/* ===== CAMERA ⋯ MENU ON THE SELECTED VIEW =====================================
   The ⋯ was unclickable on whichever camera was currently selected. Classic marks the playing
   view with .hover-overlay — position:absolute, z-index:9, pointer-events:auto, stretched across
   the whole tile — and .rd-cam-menu is position:static, so its z-index never applied and the
   overlay won the hit test (elementFromPoint at the ⋯ returned .hover-overlay on the active tile
   and .rd-cam-menu on every other one). Give the trigger its own stacking context above the
   overlay. The opened menu was never the problem: .session-actions already sits at z-index 80. */
.video-shots.rd-cams .rd-cam-menu{ position:relative; z-index:10; }

/* ===== POPUPS: no horizontal scrollbar without a horizontal overflow ==========
   .highlight-reel-popup showed a scrollbar with nothing to scroll to — scrollWidth 448 vs
   clientWidth 438, while its widest child measured 406. The 10px is box-model / scrollbar-gutter
   noise, not content. Keep vertical scrolling, drop the horizontal bar.
   Audited the popup set live: only these two declare overflow-x:auto. The charting panel, the
   download modal body, the simple filter and the ODK/stat/delete popups are overflow:visible and
   cannot produce one. (#odk-snip-entry-popup must stay non-visible for its resize handle, so it
   gets overflow-x:hidden rather than visible.) */
body.rd-has-navrail .highlight-reel-popup{ overflow-x:hidden !important; }
body.rd-has-navrail #odk-snip-entry-popup{ overflow-x:hidden; }

/* ===== TRIM MODE ==============================================================
   The trim bar owns the screen while it is open: the main transport is already dimmed by
   body.rd-trimming (below), and these style the trim bar's own two controls. */
/* play ⇄ pause. The classic markup only ships a play glyph, so the paused state hides it and
   draws a pause mark instead — no icon-font dependency for a state the font doesn't cover. */
#trim-video-wrap .play-edited-video{ display:inline-flex !important; align-items:center; justify-content:center;
  width:36px; height:36px; border-radius:50%; background:#20242d; border:1px solid #333a48; color:#e6e9f0; }
#trim-video-wrap .play-edited-video:hover{ border-color:#e1261c; }
#trim-video-wrap .play-edited-video.rd-trim-playing i{ display:none !important; }
#trim-video-wrap .play-edited-video.rd-trim-playing::before{
  content:""; width:11px; height:12px; border-left:3.5px solid #e6e9f0; border-right:3.5px solid #e6e9f0; }
/* PREVIEW BEGIN|END — sits left of the play button; the bold half is the active end */
#trim-video-wrap .rd-trim-mode{ margin-right:10px; height:28px; padding:0 11px; background:transparent;
  border:1px solid #333a48; border-radius:6px; color:#8b93a8; cursor:pointer; white-space:nowrap;
  font:600 9.5px/1 'Chakra Petch',system-ui,sans-serif; letter-spacing:.09em; }
#trim-video-wrap .rd-trim-mode b{ color:#e1261c; margin-left:5px; font-weight:800; }
#trim-video-wrap .rd-trim-mode:hover{ border-color:#4a5468; color:#c9cede; }
#trim-video-wrap .editPlayDiv{ display:flex !important; align-items:center; gap:0; }

/* Trim: the PREVIEW BEGIN/END toggle must never shrink. It sits in .editPlayDiv, which is a
   flex item that shrinks on narrower windows, and the whole bar is clipped by #shots-section-p1
   (overflow:hidden) — so the bold BEGIN/END half was being cut off and the control just read
   "PREVIEW", i.e. it stopped looking like a toggle at all. */
#trim-video-wrap .editPlayDiv{ flex:0 0 auto !important; }
#trim-video-wrap .rd-trim-mode{ flex:0 0 auto !important; }
/* Trim scrub preview: classic points a second <video> at the same source as the main player and
   seeks it on every input. On HLS it renders as an empty box and makes two elements pull the same
   stream while dragging. The main frame now scrubs live, so the box is redundant. The time
   read-out beside it stays — that part is useful — restyled to match. */
body.rd-has-navrail #preview-video.vid-preview{ display:none !important; }
body.rd-has-navrail #preview-tooltip.vid-preview-tooltip{
  background:#171a21 !important; color:#e6e9f0 !important; border:1px solid #333a48 !important;
  border-radius:5px !important; padding:3px 8px !important;
  font:700 10.5px/1 'Chakra Petch',system-ui,sans-serif !important; letter-spacing:.05em !important; }

/* Trim preview toggle — the real reason BEGIN/END was invisible.
   It was never clipped: .editPlayDiv lives in the Bootstrap column beside Save, and the label's
   extra width pushed its bold half UNDER #save_trimmed_video, which paints on top
   (elementFromPoint on the text returned the Save anchor). Two guarantees now: the label is
   compact (active end + swap glyph, not "PREVIEW <b>…</b>"), and trimMasterLeft keeps a gutter so
   its content can never run beneath the Save column again. */
/* (gutter retired — the toggle and Save moved to their own row, see .rd-trim-row2) */
#trim-video-wrap .rd-trim-mode{ min-width:0; padding:0 10px; }
#trim-video-wrap .rd-trim-mode b{ color:#f2f4f8 !important; margin:0 !important; font-weight:800; letter-spacing:.09em; }
#trim-video-wrap .rd-trim-mode span{ color:#e1261c; margin-left:6px; font-size:11px; line-height:1; }
#trim-video-wrap .rd-trim-mode:hover b{ color:#fff !important; }

/* ===== TRIM: second control row ==============================================
   Row 1 (classic) keeps back / scrub bar / play. The mode toggle and Save now sit in their own
   centred row underneath, so they cannot collide with the absolutely-positioned play button —
   which is what kept happening: the toggle landed under Save, then widening it pushed play under
   Save as well. clear:both because trimMasterLeft/Right are floats. */
#trim-video-wrap .rd-trim-row2{ clear:both; display:flex; justify-content:center; align-items:center;
  gap:14px; width:100%; padding:14px 0 6px; }
#trim-video-wrap .rd-trim-row2 #save_trimmed_video{ position:static !important; margin:0 !important;
  display:inline-flex !important; align-items:center; justify-content:center; height:32px; min-width:88px;
  padding:0 18px !important; background:#e1261c !important; color:#fff !important; border-radius:6px !important;
  font:700 11px/1 'Chakra Petch',system-ui,sans-serif !important; letter-spacing:.08em !important; text-transform:uppercase; }
#trim-video-wrap .rd-trim-row2 #save_trimmed_video:hover{ filter:brightness(1.08); }
#trim-video-wrap .rd-trim-row2 .rd-trim-mode{ position:static !important; margin:0 !important; height:32px; }

/* ===== TRIM: full "PREVIEW BEGIN / PREVIEW END" label ========================
   The label was cut to a bare BEGIN/END only because .editPlayDiv shared a row with Save and the
   extra width pushed the bold half underneath it. Row 2 removed that constraint, so the control can
   say what it does again — "BEGIN" on its own reads like a jump-to button rather than a choice of
   which end Play previews. The word PREVIEW stays muted and the active end stays bright, so the
   state is still what the eye lands on. */
#trim-video-wrap .rd-trim-row2 .rd-trim-mode{ padding:0 13px; color:#8b93a8; }
#trim-video-wrap .rd-trim-row2 .rd-trim-mode b{ margin-left:5px !important; }

/* ===== MODAL STACKING — the backdrop must sit UNDER every modal ===============
   Regression I introduced with the Export ZIP modal. To dim the navrail (99998) and appbar
   (99999) I lifted .modal-backdrop to 100015 for every modal on the twin, but only lifted
   #download-multiplesnips above it. Every other Bootstrap modal keeps its own lower z-index, so
   the backdrop painted ON TOP of the popup: the page dimmed, the popup greyed out, and the
   backdrop swallowed every click — reported as "share snip opens but the whole page is disabled".
   Measured on the live build: 22 of the 23 modals in the player were buried.

   Correct layering is backdrop above the chrome, below any modal. The blanket .modal floor is
   class-level, so the id rules above (#sharemodal, #download-multiplesnips, …) still win and keep
   their explicit order. #usersmodal needs naming because classic pins it with an id + !important,
   which a class selector cannot outrank. */
body.rd-has-navrail + .modal-backdrop,
body.rd-has-navrail .modal-backdrop{ z-index:100005 !important; }
body.rd-has-navrail .modal{ z-index:100011 !important; }
body.rd-has-navrail #usersmodal{ z-index:100011 !important; }

/* Home/Away is meaningless where the sport has no side — keep it off non-football boards. CSS as
   well as JS so there is no window where classic's searchFilter can flash it back on. */
/*body.rd-nonfb #homewaybtns, body.rd-nonfb #odk-snip-filterbtns{ display:none !important; }*/

/* ===== ODK FILTER: primary team perspective only =============================
   ODK is charted from the target team's perspective and has no opponent side, so the filter shows
   the primary team's name and nothing to switch to. Classic's second button is removed rather than
   restyled — leaving it would imply a second set of ODK snips that does not exist. The remaining
   button stops behaving like a tab (it is a caption now) but keeps its .active class, which
   classic's filter reads to build its side comparison. */
body.rd-has-navrail #odk-snip-filterbtns #odk_away_btn{ display:none !important; }
body.rd-has-navrail #odk-snip-filterbtns{ display:block !important; }
body.rd-has-navrail #odk-snip-filterbtns #odk_home_btn{
  display:block !important; width:100% !important; cursor:default; pointer-events:none;
  background:#20242d !important; border:1px solid #333a48 !important; color:#c9cede !important;
  border-radius:6px !important; height:32px; padding:0 12px !important;
  font:700 11px/32px 'Chakra Petch',system-ui,sans-serif !important;
  letter-spacing:.08em !important; text-transform:uppercase;
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }

/* ===== ODK ENTRY POPUP: close button + "no snipping inside a snip" ===========
   #865 removed the DONE step so live charting needs no tap between snips, which left the popup with
   no way to dismiss it. The heading doubles as the drag grip, so the button is pinned to the right
   of it and swallows mousedown in JS. */
#odk-snip-entry-popup .odk-snip-tab-heading-sections{ position:relative; }
#odk-snip-entry-popup .rd-odk-close{
  position:absolute; top:50%; right:6px; transform:translateY(-50%);
  width:22px; height:22px; padding:0; line-height:1; border:0; border-radius:5px;
  background:transparent; color:#8b93a8; font-size:17px; cursor:pointer; }
#odk-snip-entry-popup .rd-odk-close:hover{ background:#2a3141; color:#e6e9f0; }
#odk-snip-entry-popup .head-odk{ padding-right:26px; }

/* A snip is cut from the game timeline, so the types are inert while the player is showing a snip.
   Disabled rather than hidden: the popup keeps its shape and the tooltip says why. */
#odk-snip-entry-popup.rd-nosnip .snipback-odk-data-block{
  opacity:.42 !important; cursor:not-allowed !important; }
#odk-snip-entry-popup.rd-nosnip .snipback-odk-data-block label{ color:#6b7488 !important; }

/* ===== SELECTION POPUPS: scroll inside, never over the snip strip (QA #243 bug 2) ============
   The height cap is applied in JS (it depends on where the strip actually is). These rules say what
   scrolls once the cap bites, so the confirm buttons stay reachable instead of being clipped. */
/* REGRESSION FIX: this was `display:flex !important` on the bare selectors, which beat the inline
   display:none jQuery uses to hide these popups — so BOTH were permanently rendered on screen, the
   collection popup (z 100000) sitting on top of the custom-tag popup (z 9999). Same trap as #865.
   The flex is now gated on .rd-cappable, which cap() adds only while the popup actually has a box
   and removes as soon as it does not, so the !important can never resurrect a hidden popup.
   #stat-snipcollection-update and .customtag-popup-copysnip no longer take .rd-cappable
   (player-redesign_opt.js POPUPS list) — each keeps its own fixed CSS size instead. They stay out
   of this flex/scroll treatment too: forcing overflow-y without overflow-x on a .content-block
   picks up an unwanted horizontal scrollbar the moment any child (e.g. .wrapper) is wider than the
   popup itself. */
body.rd-has-navrail #mapUsersModal .modal-content,
body.rd-has-navrail #copyStatModal .modal-content{ display:flex; flex-direction:column; }
body.rd-has-navrail #mapUsersModal .modal-body,
body.rd-has-navrail #copyStatModal .modal-body{ flex:1 1 auto; min-height:0; overflow-y:auto; }


/* ===== CAMERA RAIL: pin "GAME OPENS IN" below the scrolling list (QA #243 bugs 13, 18) =========
   The footer used to sit inside .rd-cams, which scrolls — so on a game with many cameras it
   scrolled out of reach (17 cameras put it at y=1152 against an 842px viewport). The rail is now a
   flex column: the camera list takes the slack and scrolls, the footer keeps its place at the
   bottom and is always visible. Safe to force display here — this panel is the redesign's own and
   classic never shows or hides it. */
body.rd-has-navrail .rd-campanel{ display:flex !important; flex-direction:column; }
/* The footer is pinned to the BOTTOM of the rail on purpose (confirmed with Masud): it is a
   persistent setting rather than a list item, and pinning is what keeps it reachable on a game with
   many cameras instead of scrolling away with the tiles (QA #243 bug 13).
   Letting the list size to its content instead moved the footer up into the board area, where it
   ended up overlapped — measurably worse: hit-testing its centre returned another element on top.
   Restored. */
body.rd-has-navrail .rd-campanel > .video-shots.rd-cams{ flex:1 1 auto; min-height:0; overflow-y:auto; }
body.rd-has-navrail .rd-campanel > .rd-cam-footer{ flex:0 0 auto; margin-top:auto; }
.customtag-popup-copysnip
{
   height: 474px;
   top: 43%;
   z-index:99999;
}
.customtag-popup-copysnip .tab__content
{
   height: 214px;
}
.customtag-popup-copysnip .sec-left-collection
{
   padding: 8px 5px;
} 
/* ===================================================================================
 * SNIP BUTTON IS ONLY LIVE IN GAME VIEW (QA #246 bug 38)
 *
 * "You can't snip within a snip" - snips are cut from the game timeline, so the button that
 * starts one has to read as unavailable whenever the player is showing a snip rather than the
 * game. The JS sets .rd-nosnip-btn from .entire-game-video.active, which is the same state the
 * GAME/SNIP segmented control syncs from, so the two can never disagree.
 *
 * Keep pointer-events ON: the capture-phase handler wants the click so it can explain why the
 * action is unavailable. Swallowing the event here instead would make the button feel broken.
 * =================================================================================== */
.create-bookmark.rd-nosnip-btn {
  opacity: .38;
  filter: grayscale(1);
  cursor: not-allowed;
}

/* ===================================================================================
 * "DOWNLOAD SNIPS (.ZIP)" READS UNAVAILABLE ON AN EMPTY COLLECTION (QA #246 bug 39)
 *
 * The zip carries every snip in the current collection, so with none there is nothing to
 * produce. The click is refused with an explanation rather than swallowed, so the item keeps
 * its pointer events -- this only signals the state ahead of the click.
 * =================================================================================== */
.rd-ab-menu [data-rd-exp="zip"].rd-exp-empty {
  opacity: .4;
  cursor: not-allowed;
}

/* ===================================================================================
 * APP BAR CARRIES THE GAME NAME AND ORGANISATION (QA #246 bug 10)
 *
 * The bar showed only the matchup, so the game's own name ("Playoff Round 2") and the
 * organisation that owns it appeared nowhere on the player page. Stack them: matchup stays the
 * primary line, game name + org sit under it, quieter. Both truncate rather than push the
 * action buttons off the bar on a narrow window.
 * =================================================================================== */
.rd-appbar .rd-gnames {
  display: flex;
  flex-direction: column;
  justify-content: center;
  min-width: 0;                 /* allow the ellipsis instead of forcing the bar wider */
  line-height: 1.2;
}
.rd-appbar .rd-gtitle,
.rd-appbar .rd-gmeta {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  max-width: 42vw;
}
.rd-appbar .rd-gmeta {
  font-size: 11px;
  letter-spacing: .02em;
  opacity: .62;
}
.rd-appbar .rd-gmeta:empty { display: none; }

/* ===================================================================================
 * ADD-TO-GAMEPLAN CONFIRM BUTTON, AND THE STAT POPUP CLEARING THE NAV RAIL
 * (QA #246 bugs 31 and 15)
 *
 * Bug 31 -- "Add to Game plan UI breaks". #stat-snipcollection-update carries one submit button
 * per section (stat / odk / script) and shows the one matching the collection. Every styling
 * rule that sizes and colours these buttons lists stat, odk, copy, preferred-view, del-snips and
 * customtag -- but never .script-snip-submit-btn. So on GamePlan the confirm falls back to a raw
 * browser button: 32x30, #efefef, square, beside a 56x54 red cancel. Measured live.
 * The popup also carries a fixed 466px height sized for the stat variant, leaving the much
 * shorter GamePlan content sitting above a large empty panel.
 *
 * Bug 15 -- the stat entry popup is hardcoded left:25px. Classic had no left navigation, so that
 * was fine there. The redesign's nav rail occupies 0..60px, so the popup lands on top of it and
 * hides STAT / STAFF / MINE / PLAYER / ASSIGN / REELS entirely -- the rail is unreachable while
 * it is open, which is what reads as "positioned too far to the left".
 *
 * Deliberately NOT !important: classic runs dragElement() on this popup and drags by writing
 * inline left/top. A plain rule sets the default and still lets the user drag it anywhere.
 * =================================================================================== */
.script-snip-submit-btn {
  width: 56px;
  height: 54px;
  font-size: 25px;
  color: #fff;
  border-radius: 15px;
  background: #27b304;
  border: solid 1px #27b304;
}
#stat-snipcollection-update.add-script { height: auto; }

body.rd-has-navrail .stat-entry-popup { left: 84px; }   /* 60px rail + 24px gutter */

/* ===================================================================================
 * PER-SNIP DESELECT (X) IN THE REEL BUILDER (QA #246 bug 27, and #243 bug 21)
 *
 * "the individual Select/Deselect (X) option below each snip is missing. Only Select All and
 * Deselect All are available" -- while the form itself says "Deselect any unwanted snips and
 * tap SAVE", so without it the reel cannot be curated at all.
 *
 * The control is not missing. It is rendered, display:block, opacity 1, and clipped out of
 * existence. custom-style.css declares
 *
 *   .highlight-video-shot-section .each-shot .close-btn { top: ... }
 *
 * FOUR separate times -- 56px, 47px, 109px and finally 108px, and the last one wins. Classic's
 * cards are tall enough that top:108px still lands inside them. The redesign's card is exactly
 * 108px high with overflow:hidden, so the X begins precisely at the card's bottom edge and the
 * card clips all of it. Measured live: card 624..732, X at 733..768, hit-testing the X's own
 * centre returned the board container.
 *
 * Anchor it to the bottom of the card instead of a fixed top, so it cannot depend on the card's
 * height again.
 * =================================================================================== */
/*body.rd-has-navrail .highlight-video-shot-section .each-shot .close-btn.removeBm {
  top: auto;
  bottom: 2px;
  z-index: 12;
}
*/
/* ===================================================================================
 * COMPARE ANGLES: EXIT BUTTON LABEL MUST FIT (QA #246 bug 20)
 *
 * The exit control carries both .rd-dual-exit (an inline-flex pill with a full
 * "× EXIT DUAL VIEW" label) and .rd-dual-x (a 24px square icon button). The square wins on
 * width, so a 121px label is squeezed into a ~30px box and renders clipped as "× EXI".
 * Measured live: clientWidth 30, scrollWidth 121, white-space nowrap.
 * =================================================================================== */
.rd-dual-exit.rd-dual-x {
  width: auto;
  height: auto;
}

/* ===================================================================================
 * REEL POPUP: TAB SPACING AND UNREADABLE FORM LABELS (QA #246 bugs 12, 13, 16)
 *
 * Bug 13 -- "insufficient spacing between the REELS and WHITEBOARDS tabs". Measured live, the
 * gap was exactly 0px: REELS ends at x653 and WHITEBOARDS begins at x653.
 *
 * Bug 12 -- "the Highlight Reels and Player Reels tabs appear too close to the header title".
 * Also 0px: the REELS/WHITEBOARDS row ends at y222 and the sub-tabs start at y222.
 *
 * Bug 16 -- "text in the Highlight Reel popup is displayed in a dark color... poor contrast".
 * The reel popup is themed dark here (#171a21, luminance 26) but the CREATE/EDIT form's labels
 * were never included in that theming, so they kept classic's black. Measured: seven labels at
 * rgb(0,0,0), luminance 0, on luminance 26 -- roughly 1.1:1, effectively invisible. The rest of
 * the popup was already recoloured; this is just the set that only exists once the form opens.
 * =================================================================================== */
body.rd-has-appbar .highlight-reel-popup .heighlight-title { margin-right: 18px !important; }
body.rd-has-appbar .highlight-reel-popup .highlights-sub {
  margin-top: 10px !important;
  display: inline-block;
}
body.rd-has-appbar .highlight-reel-popup .sub-title,
body.rd-has-appbar .highlight-reel-popup .slide-button,
body.rd-has-appbar .highlight-reel-popup .hightlight-italic-label { color: #e6e9f0 !important; }

/* ===================================================================================
 * LEGEND PANEL: THE THREE-DOT MENU MUST NOT PUNCH THROUGH IT (QA #246 bug 14)
 *
 * The legend panel sits at z-index 7200; the player's overflow menu (.expand-more-btn) is 9999,
 * so the icon lands on top of the legend's content. Measured live: 30x39px of overlap, and
 * hit-testing the dot's own centre returned the dot rather than the legend row beneath it.
 *
 * Suppress that chrome while the legend is open (JS sets body.rd-legend-on from
 * #legendWrapper.active) instead of escalating the panel's z-index -- the same approach
 * rd-dual-on already uses for Compare Angles, and it avoids starting a z-index war with the
 * 9999-tier controls.
 * =================================================================================== */
body.rd-legend-on .expand-more-btn,
body.rd-legend-on .more-buttons-wrapper { display: none !important; }

/* ===================================================================================
 * SNIP NOTE — rail panel + editor popup
 *
 * Sits under "THIS SNIP OPENS IN", the rail's other per-snip control. The note text is always
 * rendered when one exists (Masud: it must not take a click to read), with the pencil only for
 * adding or changing it. Long notes scroll inside the panel rather than pushing the rail.
 * =================================================================================== */
.rd-note {
  border-top: 1px solid #2b313c;
  padding: 10px 12px 12px;
  background: #171a21;
}
.rd-note-head { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
.rd-note-lbl {
  font: 700 10px/1 'Inter Tight', system-ui, sans-serif;
  letter-spacing: .09em; color: #8b93a8;
}
.rd-note-edit {
  border: 1px solid #2f3540; background: #20242d; color: #c9cede;
  border-radius: 7px; width: 26px; height: 24px; cursor: pointer;
  display: inline-flex; align-items: center; justify-content: center; font-size: 13px;
}
.rd-note-edit:hover { background: #262b35; color: #fff; border-color: #3a4150; }
.rd-note-body {
  margin-top: 7px; color: #e6e9f0;
  font: 400 12.5px/1.45 'Inter Tight', system-ui, sans-serif;
  white-space: pre-wrap; word-break: break-word;
  max-height: 92px; overflow-y: auto;
}
.rd-note.rd-note-empty .rd-note-body { color: #6c7484; font-style: italic; }

/* editor */
.rd-note-scrim { position: fixed; inset: 0; background: rgba(0,0,0,.55); z-index: 100020; }
.rd-note-pop {
  position: fixed; left: 50%; top: 50%; transform: translate(-50%,-50%);
  width: 420px; max-width: calc(100vw - 32px); z-index: 100021;
  background: #171a21; border: 1px solid #2f3540; border-radius: 12px;
  box-shadow: 0 22px 60px rgba(0,0,0,.6); padding: 16px;
}
.rd-note-pt {
  font: 700 13px/1 'Inter Tight', system-ui, sans-serif; color: #f2f4f8;
  letter-spacing: .01em; margin-bottom: 10px;
}
.rd-note-ta {
  width: 100%; min-height: 108px; resize: vertical;
  background: #12151b; border: 1px solid #2f3540; border-radius: 8px;
  color: #e6e9f0; padding: 9px 10px;
  font: 400 13px/1.5 'Inter Tight', system-ui, sans-serif;
}
.rd-note-ta:focus { outline: none; border-color: #e1261c; }
.rd-note-foot { display: flex; align-items: center; justify-content: space-between; margin-top: 10px; gap: 10px; }
.rd-note-count { font: 600 11px/1 ui-monospace, monospace; color: #8b93a8; font-variant-numeric: tabular-nums; }
.rd-note-btns { display: inline-flex; gap: 8px; }
.rd-note-cancel, .rd-note-save {
  border-radius: 7px; padding: 7px 14px; cursor: pointer;
  font: 700 12px/1 'Inter Tight', system-ui, sans-serif; border: 1px solid #2f3540;
}
.rd-note-cancel { background: #20242d; color: #c9cede; }
.rd-note-cancel:hover { background: #262b35; color: #fff; }
.rd-note-save { background: #e1261c; border-color: #e1261c; color: #fff; }
.rd-note-save:hover { background: #c21f16; }
.rd-note-save.busy { opacity: .6; cursor: default; }

/* exit button UI update */

.rd-dual-exit.rd-dual-x:hover
{
   color:#fff;
   opacity:0.9;
}
.rd-dual-exit.rd-dual-x
{
   padding:5px 7px;
}
/* game name UI update */
.rd-appbar .rd-gmeta
{
   color: #fff;
   font-weight: 500;
   opacity:1;
}
/*  */
.highlight-reel-popup .sub-tab-block
{
   margin: 0px 0px 10px 10px;
   display: flex;
   gap: 7px;
}

body.rd-has-appbar .highlight-reel-popup .heighlight-title
{
   margin-right: 25px !important;
}
.add-hightlightreel-block .container-radiobutton
{
   color: #ffffff;
}
body.rd-has-appbar .highlight-reel-popup .sub-title, body.rd-has-appbar .highlight-reel-popup .slide-button, body.rd-has-appbar .highlight-reel-popup .hightlight-italic-label,.highlight-reel-popup .max-character
{
    color: #010101 !important;
}
.whiteboard .reel-icon
{
    padding: 5px 7px;
}
body.rd-has-appbar .highlight-reel-popup .hightlight-italic-label
{
   color: #fff !important;
}
#football-stat-entry-popup 
{
   left:100px;
   top: 66px;
}
.snipback-success-alert
{
   left: 75px;
}
/*tag player UI updates */
#mapUsersModal .modal-title
{
    line-height: .5;
    color: #000;
    font-size: 17px
}
#mapUsersModal .select2-container--default .select2-results>.select2-results__options
{
   max-height:168px;
}
#mapUsersModal .modal-content
{
   max-height:540px !important;                 /* +50px: room for the Users/Team Groups tab bar */
}
#mapUsersModal .modal-body
{
  overflow-y:unset !important;
  height:auto;
}

/* ===================================================================================
 * NO SHOT/ZONE CHART ON THE PLAYER, AND NO SCOREBOARD TOGGLE
 *
 * Clicking a basketball snip popped a 650x380 zone chart (#zonchart-container, z-index 101) over
 * the top-right of the page, covering the camera rail. It is a STATTING tool -- statistics.js binds
 * .zone-basket handlers to it for tagging shot zones -- and it has no business on the film-room
 * player. Note the toolbar carries TWO adjacent icons in .player-right-icons -- .toggle-scoreboard
 * AND .toggle-zone-chart (a.tool-rounded, title "Show Zonechart"). An earlier pass hid only the
 * scoreboard one, so the zone-chart icon stayed on the toolbar and read as having "come back".
 * Both are hidden here -- and so is VOLLEYBALL's copy, which is the same glyph and the same "Show
 * Zonechart" tooltip under a different class (.toggle-shortchart-volleyball, blade line 1228). It
 * would have been the next report. volleyball.js toggles the panel by CLASS while the rule above
 * matched only the ID, so .courtcanvas-parent-container is covered too.
 *
 * It reaches the player because the player blade pulls in the shared
 * `viewmaping.common.basketballscore` include, which carries the chart markup. That is why an
 * earlier removal came back: anything that re-touches the shared include or the statting scripts
 * resurrects it. Suppressing it HERE, scoped to the redesigned player, is immune to that -- and
 * leaves the statting workflow's own chart completely untouched, because the statting page never
 * carries body.rd-has-navrail.
 *
 * Both surfaces of the same code path are covered: statistics.js shows #zonchart-container when
 * the snip has a zone id and #courtcanvas-parent-container when it does not.
 *
 * .toggle-scoreboard goes too -- no longer used. It toggles the classic #basketball-scorecard,
 * which the redesign already keeps hidden, and the score itself lives in the app bar now, so
 * nothing is lost.
 * =================================================================================== */
body.rd-has-navrail #zonchart-container,
body.rd-has-navrail #courtcanvas-parent-container,
body.rd-has-navrail .courtcanvas-parent-container,
body.rd-has-navrail .toggle-zone-chart,
body.rd-has-navrail .toggle-shortchart-volleyball,
body.rd-has-navrail .toggle-scoreboard { display: none !important; }

/* ===================================================================================
 * EDIT TAGS PALETTE — below the app bar, with a drag grip (see player-redesign_opt.js)
 *
 * palettes.css opens it at top:6px with z-index 99998; the app bar is fixed 0..48 at 99999, so its
 * header was covered and unreachable. Start it clear of the bar. Not !important: the drag writes
 * inline left/top and must be able to win.
 * =================================================================================== */
body.rd-has-navrail .snipdata-panel.tag-mapping-palette {
  /* NOT !important: the drag writes an inline top and must be able to win. Only the transition
     needs the hammer. */
  top: 56px;
  /* palettes.css puts `transition: all .35s` on this panel. A transition in flight outranks even an
     inline !important for the property it is animating, so `top` was silently ignored and the panel
     stayed at 6px under the app bar — inline top:56px !important measured, computed still 6px until
     the transition was suppressed. It also has to go for the drag: animating top/left over 350ms
     makes the panel lag behind the cursor. */
  transition: none !important;
}
/* The grip was a 16px strip with one faint pill in it. The drag worked, but nobody could tell the
   palette was moveable -- it was reported as a fixed popup. So: a real handle bar, with a dotted
   grip glyph, the words "Drag to move", a grab cursor, and a held-down state while dragging. */
body.rd-has-navrail .snipdata-panel.tag-mapping-palette .rd-tagpal-drag {
  height: 26px; cursor: grab; flex: none;
  display: flex; align-items: center; justify-content: center; gap: 7px;
  background: #e8eaf0; border-bottom: 1px solid #d6dae3; border-radius: 6px 6px 0 0;
  padding-right: 30px;                                  /* keep the dots clear of the close x */
  user-select: none;
}
/* 2x3 dot grid — the conventional "grab me" glyph */
body.rd-has-navrail .snipdata-panel.tag-mapping-palette .rd-tagpal-dots {
  width: 10px; height: 7px; flex: none;
  background-image: radial-gradient(circle, #8b93a8 1.1px, transparent 1.2px);
  background-size: 4px 4px; background-position: 0 0;
}
body.rd-has-navrail .snipdata-panel.tag-mapping-palette .rd-tagpal-draglbl {
  font: 700 9.5px/1 'Inter Tight', system-ui, sans-serif;
  letter-spacing: .07em; text-transform: uppercase; color: #6b7280;
}
body.rd-has-navrail .snipdata-panel.tag-mapping-palette .rd-tagpal-drag:hover {
  background: #dde1ea;
}
body.rd-has-navrail .snipdata-panel.tag-mapping-palette .rd-tagpal-drag:hover .rd-tagpal-dots {
  background-image: radial-gradient(circle, #5b6478 1.1px, transparent 1.2px);
}
body.rd-has-navrail .snipdata-panel.tag-mapping-palette .rd-tagpal-drag:hover .rd-tagpal-draglbl {
  color: #3f4655;
}
/* held down: the whole panel gets the grabbing cursor so it does not flicker back to grab when the
   pointer runs ahead of the panel mid-drag */
body.rd-has-navrail .snipdata-panel.tag-mapping-palette.rd-tagpal-dragging,
body.rd-has-navrail .snipdata-panel.tag-mapping-palette.rd-tagpal-dragging .rd-tagpal-drag {
  cursor: grabbing;
}
body.rd-has-navrail .snipdata-panel.tag-mapping-palette.rd-tagpal-dragging .rd-tagpal-drag {
  background: #d3d8e3;
}

/* Close control. The panel's only exit was a chevron tab hanging off its LEFT edge, which reads as
   "collapse", points the wrong way for a panel that opens from the right, and loses its (directly
   bound) handler whenever the panel re-renders. This sits in the panel's own top-right corner where
   a close control belongs; the chevron keeps working and now carries the same x glyph. */
body.rd-has-navrail .snipdata-panel.tag-mapping-palette .rd-tagpal-close {
  position: absolute; top: 4px; right: 6px; z-index: 3;
  width: 26px; height: 26px; padding: 0; border: 0; border-radius: 6px;
  display: flex; align-items: center; justify-content: center;
  background: transparent; color: #6b7280; cursor: pointer;
}
body.rd-has-navrail .snipdata-panel.tag-mapping-palette .rd-tagpal-close:hover {
  background: #e1261c; color: #fff;
}
body.rd-has-navrail .snipdata-panel.tag-mapping-palette .rd-tagpal-close:focus-visible {
  outline: 2px solid #e1261c; outline-offset: 1px;
}
/* (the grip's own rule above already reserves 30px on the right for this x) */

/* ===================================================================================
 * FILTER APPLY MUST DIM THE BOARD ON NON-FOOTBALL BOARDS TOO
 *
 * filter-drawerv2_opt.css hides filtered-out cards with
 *   .rd-boardwrap:not(.rd-fexpanded) #statFrame .each-shot.rd-fout{ display:none !important }
 * but .rd-boardwrap only exists on the football lanes/list board. On basketball there is no such
 * wrapper, so paintDim() added .rd-fout to the right cards and NOTHING happened — the filter
 * computed a correct match set and the board never changed. Measured: 72 cards marked, 0 hidden.
 *
 * Match on the board itself instead, for any sport without the wrapper.
 * =================================================================================== */
body.rd-nonfb #statFrame .each-shot.rd-fout { display: none !important; }

/* Charting column hidden off-football (see filterDrawer_opt.js): .mwcols is a fixed 4-track grid,
   so re-flow it to 3 tracks or Custom sits in slot 3 with an empty track beside it. */
#rdFilter2 .mwcols.rd-nochart { grid-template-columns: 1.5fr 0.85fr 1.15fr; }

#teamsnips.highlight-video-shot-section .each-shot .close-btn,#playerFrame.highlight-video-shot-section .each-shot .close-btn
{
    top: 76px;
}
#teamsnips.highlight-video-shot-section .each-shot.after-elem-enable:after,#playerFrame.highlight-video-shot-section .each-shot.after-elem-enable:after
{
  top: 81px;
}
/*align close button for snips */
.highlight-video-shot-section .each-shot .close-btn
{
   left:50%;
   transform: translate(-50%, 0%);
}
.highlight-video-shot-section .each-shot.after-elem-enable:after
{
    left: 50%;
    transform: translate(-50%, 0%);
}
/* ===================================================================================
 * EDIT TAGS — SAVE/CANCEL HIDDEN WITHOUT TOUCHING `display`
 *
 * Tagging applies on the tap (see the live-tagging module in player-redesign_opt.js), so Save and
 * Cancel are noise. They used to be hidden from JS with .hide() -- which broke the feature: the
 * module's own gate reads .pltte-ctags-save's `display` as classic's signal for "this tab offers
 * Save at all", so hiding it made the gate answer false and auto-apply stopped ~400ms after the
 * palette opened. Tags then marked themselves active and were never posted.
 *
 * So: hide them visually, leave `display` alone. The .rd-autotag class is set on the PANEL only
 * while auto-apply is actually active, so the create-a-snip flow -- where Save is the real commit --
 * still shows its buttons. Do NOT add display:none here.
 * =================================================================================== */
body.rd-has-navrail .tag-mapping-palette.rd-autotag .pltte-ctags-save,
body.rd-has-navrail .tag-mapping-palette.rd-autotag .pltte-ctags-cancel {
  position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; border: 0;
  overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; pointer-events: none;
}

/* ===================================================================================
 * LANES VIEW — football's COACH TAGS lane, on every other sport
 *
 * These declarations are football's, copied from the .rd-boardwrap rules above rather than
 * reinvented: 90px lane, 8px/1.2 type, the green rule down the left of each tag, "+N" overflow, and
 * the 96px label column. Scoped to body.rd-lanes so the toggle is the only way to see any of it.
 *
 * The label column is positioned absolutely rather than laid out as a flex sibling, because the
 * board's header and its frame must stay siblings -- ensureAltHeaders finds an existing header with
 * $f.prevAll(".rd-board-head"), and re-parenting the frame is what caused the duplicate header in
 * PR 947. The frame's left padding opens the gap the column sits in.
 * =================================================================================== */
body.rd-has-navrail .each-shot > .rd-tagcell { display: none; }
body.rd-has-navrail.rd-lanes .each-shot > .rd-tagcell {
  order: 99;                                   /* the card's children carry explicit order values */
  display: flex; flex-direction: column; gap: 2px; height: 90px; padding: 5px 6px;
  background: #0f1219; overflow: hidden;
}
body.rd-has-navrail.rd-lanes .each-shot > .rd-tagcell .rd-tg {
  font: 600 8px/1.2 'Inter Tight', system-ui, sans-serif; color: #c3cad9;
  border-left: 2px solid #3f7d4f; padding-left: 4px;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  text-align: left;                            /* the cards centre their text; the lane reads as a list */
}
body.rd-has-navrail.rd-lanes .each-shot > .rd-tagcell .rd-tg-more {
  font: 600 8px/1 'Inter Tight', system-ui, sans-serif; color: #5b6274;
}
/* the lane label column */
body.rd-has-navrail .rd-lanes-labels.rd-lanes-abs { display: none; }
/* NO z-index here. The tag-filter menu is inserted as a sibling of .rd-tagfilter, i.e. INSIDE this
   column, and it is position:fixed z-index:100001 -- but a positioned ancestor with a z-index makes
   a stacking context, which caps everything inside it. With z-index:2 the menu was trapped below
   the video's play button (.player-icon, z-index 3) and the button drew straight through it.
   position:absolute with z-index:auto creates no stacking context, so the menu escapes to the top
   as it does on football, whose label column is a plain flex child. */
body.rd-has-navrail.rd-lanes .rd-lanes-labels.rd-lanes-abs {
  display: flex; flex-direction: column; position: absolute; left: 64px; width: 96px;
  background: #0f1219; border-right: 1px solid #252a35; pointer-events: auto;
}
body.rd-has-navrail.rd-lanes .rd-lanes-labels.rd-lanes-abs .rl-play { flex: 0 0 66px; height: 66px; }
body.rd-has-navrail.rd-lanes .rd-lanes-labels.rd-lanes-abs .rl-tags { flex: 0 0 90px; height: 90px; }

/* FIXED CELL HEIGHTS — this is the whole reason football's lanes line up.
 *
 * Football pins every cell: .shot-number 20px, .rd-lvt 45px, .rd-cap 45px, .rd-tagcell 90px, and
 * the card itself 166px. Letting content decide the height is what broke ours -- measured on game
 * 62371, cards came out at TWO heights, 169px where the summary fits one line and 180px where it
 * wraps to two (26 cards vs 117), so a label column sized from the first card could only ever match
 * a quarter of the board.
 *
 * 26 + 40 + 90 = 156, which is also shorter than either of the heights it replaces.
 *
 * Addressed by frame id for the same reason the padding rule is: the existing card rules are
 * id-scoped (body.rd-has-navrail #statFrame .each-shot ...), and an id beats a class no matter how
 * many classes are stacked -- the first attempt at this used .each-shot alone and simply lost
 * (measured: .shot-number stayed 52px and the tag cell was squeezed to 79px).
 */
body.rd-has-navrail.rd-lanes #statFrame .each-shot,
body.rd-has-navrail.rd-lanes #allFrame .each-shot,
body.rd-has-navrail.rd-lanes #teamFrame .each-shot,
body.rd-has-navrail.rd-lanes #odkFrame .each-shot,
body.rd-has-navrail.rd-lanes #chartFrame .each-shot,
body.rd-has-navrail.rd-lanes #playerFrame .each-shot,
body.rd-has-navrail.rd-lanes #assignedFrame .each-shot,
body.rd-has-navrail.rd-lanes #scriptFrame .each-shot {
  /* Height comes from the pinned cells below rather than a hardcoded total. STAFF and other
     collections render a fourth base block (.rd-meta) that STAT does not, and a fixed 156px card
     had nowhere to put it -- the tag lane, which cannot shrink, was pushed down the card so only a
     line or two of tags stayed in view. Every base cell is pinned, so cards still agree with each
     other and with the label column, whether or not .rd-meta is there. */
  height: auto !important; padding: 0 !important;
}
body.rd-has-navrail.rd-lanes #statFrame .each-shot > .rd-meta,
body.rd-has-navrail.rd-lanes #allFrame .each-shot > .rd-meta,
body.rd-has-navrail.rd-lanes #teamFrame .each-shot > .rd-meta,
body.rd-has-navrail.rd-lanes #odkFrame .each-shot > .rd-meta,
body.rd-has-navrail.rd-lanes #chartFrame .each-shot > .rd-meta,
body.rd-has-navrail.rd-lanes #playerFrame .each-shot > .rd-meta,
body.rd-has-navrail.rd-lanes #assignedFrame .each-shot > .rd-meta,
body.rd-has-navrail.rd-lanes #scriptFrame .each-shot > .rd-meta {
  order: 2; flex: 0 0 auto !important; max-height: 22px; overflow: hidden;
}
body.rd-has-navrail.rd-lanes #statFrame .each-shot > .shot-number,
body.rd-has-navrail.rd-lanes #allFrame .each-shot > .shot-number,
body.rd-has-navrail.rd-lanes #teamFrame .each-shot > .shot-number,
body.rd-has-navrail.rd-lanes #odkFrame .each-shot > .shot-number,
body.rd-has-navrail.rd-lanes #chartFrame .each-shot > .shot-number,
body.rd-has-navrail.rd-lanes #playerFrame .each-shot > .shot-number,
body.rd-has-navrail.rd-lanes #assignedFrame .each-shot > .shot-number,
body.rd-has-navrail.rd-lanes #scriptFrame .each-shot > .shot-number {
  order: 1; flex: 0 0 26px !important; height: 26px !important; min-height: 26px !important;
  margin: 0 !important; display: flex !important; align-items: center; justify-content: center;
  border-bottom: 1px solid #252a35 !important;
}
body.rd-has-navrail.rd-lanes #statFrame .each-shot > .shot-username,
body.rd-has-navrail.rd-lanes #allFrame .each-shot > .shot-username,
body.rd-has-navrail.rd-lanes #teamFrame .each-shot > .shot-username,
body.rd-has-navrail.rd-lanes #odkFrame .each-shot > .shot-username,
body.rd-has-navrail.rd-lanes #chartFrame .each-shot > .shot-username,
body.rd-has-navrail.rd-lanes #playerFrame .each-shot > .shot-username,
body.rd-has-navrail.rd-lanes #assignedFrame .each-shot > .shot-username,
body.rd-has-navrail.rd-lanes #scriptFrame .each-shot > .shot-username {
  order: 2; flex: 0 0 40px !important; height: 40px !important; overflow: hidden;
  margin: 0 !important; padding: 4px 6px !important;
  font: 600 8.5px/1.25 'Inter Tight', system-ui, sans-serif;
}
body.rd-has-navrail.rd-lanes #statFrame .each-shot > .rd-tagcell,
body.rd-has-navrail.rd-lanes #allFrame .each-shot > .rd-tagcell,
body.rd-has-navrail.rd-lanes #teamFrame .each-shot > .rd-tagcell,
body.rd-has-navrail.rd-lanes #odkFrame .each-shot > .rd-tagcell,
body.rd-has-navrail.rd-lanes #chartFrame .each-shot > .rd-tagcell,
body.rd-has-navrail.rd-lanes #playerFrame .each-shot > .rd-tagcell,
body.rd-has-navrail.rd-lanes #assignedFrame .each-shot > .rd-tagcell,
body.rd-has-navrail.rd-lanes #scriptFrame .each-shot > .rd-tagcell {
  flex: 0 0 90px !important;                 /* no shrinking: the card is fixed, the lane is fixed */
}
/* Open the gap the column sits in. Addressed by id, not [id$="Frame"]: the 64px nav-rail rule these
   override is `body.rd-has-navrail #statFrame`, and an id beats an attribute selector, so the
   attribute form lost even with !important (measured: padding stayed 64px and the cards sat under
   the labels). */
body.rd-has-navrail.rd-lanes #statFrame,
body.rd-has-navrail.rd-lanes #allFrame,
body.rd-has-navrail.rd-lanes #teamFrame,
body.rd-has-navrail.rd-lanes #odkFrame,
body.rd-has-navrail.rd-lanes #chartFrame,
body.rd-has-navrail.rd-lanes #playerFrame,
body.rd-has-navrail.rd-lanes #assignedFrame,
body.rd-has-navrail.rd-lanes #scriptFrame { padding-left: 160px !important; }
body.rd-has-navrail.rd-lanes .tab-pane .rd-board-head { padding-left: 160px; }

/* the LANES/SIMPLE toggle, styled to match LEGEND rather than the gold FILTER pill */
body.rd-has-navrail .rd-board-head .rd-lanes-toggle {
  flex: none; height: 22px; padding: 0 9px; border-radius: 5px; cursor: pointer;
  display: inline-flex; align-items: center; gap: 5px;
  background: transparent; border: 1px solid #2b313c; color: #8b93a8;
  font: 700 9.5px/1 'Inter Tight', system-ui, sans-serif; letter-spacing: .06em;
}
body.rd-has-navrail .rd-board-head .rd-lanes-toggle:hover { color: #fff; border-color: #3a4256; }
body.rd-has-navrail .rd-board-head .rd-lanes-toggle.rd-active {
  background: #232936; border-color: #3a4256; color: #e6e9f0;
}

/* ===================================================================================
 * KEYBOARD SHORTCUTS LEGEND — above the app bar, and sized like a legend
 *
 * The panel is z-index 9999 at top:10px; the redesign's app bar is z-index 99999 at height 48px.
 * So the bar painted over the panel's top edge -- including its own ✕ -- and the only way out was
 * to find the toolbar button again. Raised above the bar and dropped below it, so the ✕ is always
 * reachable.
 *
 * Scaled to 75%: it is a reference card, not a workspace, and at full size it ran the height of the
 * screen. transform rather than a font/padding rewrite so every row keeps its proportions, anchored
 * top-right so it stays tucked into the corner it opens from.
 *
 * Safe to use !important on the offsets here: nothing drags this panel -- player-main-opt.js only
 * ever fades it in and out -- so there are no inline positions to fight.
 * =================================================================================== */
body.rd-has-navrail .keyboard-shortcuts-info {
  top: 56px !important;                     /* 48px app bar + 8px */
  right: 12px !important;
  height: auto !important;
  max-height: calc(100vh - 72px) !important;
  overflow-y: auto !important;
  z-index: 100001 !important;               /* above .rd-appbar (99999) */
  transform: scale(.75);
  transform-origin: top right;
}
body.rd-has-navrail .keyboard-shortcuts-info .popup-close {
  position: sticky; top: 0; float: right; z-index: 1;   /* stays reachable while the legend scrolls */
}
