v1v2 — compact columns

GTO HUD — readout + tabs (v1)

Every control below is a CSS transcription of the real DS component it will be built from (DS Tabs with the sliding pill + connector flares, DS Select small, DS Bar, DS text Button rows, Paper elevations). Click a tab or a readout stat.

Hold'emPLO4PLO5 PlayStudyPracticeAnalyze
GTO HUD ?How to use GTO HUD
PLO4 · 6-max · PLO500 · 100bb
GTO values only — solver-simulated hands. Hatched track = no spot at that position.

Implementation spec

Everything below is decided. No new design calls needed to build it.

1. What changes in the app

2. Component map

Mock elementBuild with
Readout containerPaper elevation="3", rounded-md p-2.5, flex items-stretch gap-2
Family boxdiv on bg-action-hover border border-divider rounded-sm + 2px absolute left edge in the family color
Readout stat rowButton color="secondary" variant="text" size="small" with data-tst="gto-hud-stat-{TYPE}"; selected = bg-primary-main/12 + ring-1 ring-primary-main/28
Seat podPaper elevation="4" + rounded-full chip (bg-paper-elevation2 border-paper-elevation6, ring-2 ring-primary-main/12)
Stat tabsThree ToggleButtonGroup size="small" (one per denominator family) in a flex gap-2 overflow-x-auto row — separate groups keep the sliding indicator intact and encode the grouping without captions
Tab label + valueTypography variant="body3" + variant="body4" color="text.ghost"
by-position & matrix rowflex flex-wrap gap-gutter items-start; by-position flex-1 basis-[460px] min-w-0, matrix shrink-0
Panel titlesexisting GtoHudPanel (subtitle2 + optional GTO column header)

3. Tokens (already verified against libs/ui)

UseToken
Page / panel surfacespaper.elevation2 page, elevation3 panels + readout, elevation4 by-position panel & seat pod, elevation5 borders
Family colorshands dealt primary.main · unopened pots betting.range · facing an action betting.fold
Selected statesprimary.states.focus (bg) + primary.main @28% (ring); hover action.hover
Textvalue text.primary, label text.secondary, tab value text.ghost, scale hints text.disabled
F / C / Rbetting.fold / betting.call / betting.raise.default
Radiusxxs family edge · xsm rows/cells · sm panels/boxes · med readout · full chip + bars
Spacingspacing.gutter between blocks, spacing.panel inside panels
Typeh5 page title · subtitle2 panel titles · body3 values/labels · body4/cap keys and captions

4. Geometry

5. States

StateTreatment
Selected statHighlighted in both readout row and tab (single source of truth: selectedStat)
Hoveraction.hover on readout rows and tabs; series card border paper.elevation8
No spotHatched track + - in the value column + tooltip gtoHud.noSpot. Never 0.
Matrix impossible cellEmpty cell (reports convention for the diagonal) — no hatch at grid scale
Chart hoverDS ComposedChart per-card cursor + tooltip. No cross-card sync.

6. Responsive (desktop-first preset: xl≤1561, lg≤1280, md≤1024, sm≤640)

7. Data & i18n

8. Tests to add / update

9. Gates before PR