Skip to content

2026-07-27 — Table V3: the geometry-driven felt is the default

The poker felt's position source is now a geometry engine, not a hand-tuned percentage sheet. BratTableV3 measures the box it's given (ResizeObserver) and solves the table into it: a superellipse frame, seats placed by arc-length so the clear gaps between player cards are equal by construction (and re-solve when the card footprint or player count changes), a dealer with its own top slot on odd counts and none on even (parity — every gap still equal), bet chips a constant distance from each card's edge on the seat→pot ray (two-ray bets), and a crowding policy that shrinks cards to protect a minimum gap, floors at a legibility minimum, then overlaps with tilt + z-order. When it's your turn the actions render as a floating card in the felt's foot band — no bottom bar strip, the table stays fully visible while you decide.

The felt now fills any screen — phone portrait to ultrawide — instead of step-scaling a fixed 2.4:1 box. It holds one preferred wide oval at uniform scale across the normal container range (cross-player appearance consistency beats per-pixel fill), flattening only when the box gets really short and morphing to a centered circle only when really narrow — smooth, no breakpoints.

Retired with the flip: the CompactBratTable fork (?ui=compact, its fixed-slot geometry, and the .ct-* stylesheet block) and the classic percentage <PokerTable> (?ui=classic + its position hooks). ?ui=v2 keeps the previous brat felt as a supported escape. The frontpage live table and the agent-training sandbox render the same V3 component the game uses.

The constants shipping as defaults were tuned by hand in the in-app lab (/dev/table-lab — the real felt + every knob + a Copy config button) and committed verbatim; the public explainer with the interactive geometry lab lives at /notebook/table-geometry on the frontpage.

  • Decision: Table V3 — Geometry-Driven Brat Felt
  • Plan: .indusk/planning/table-v3/ (ADR + 19-row trajectory)
  • Registry: packages/game-ui/FELT-REGISTRY.md rows 66–70 (the V3 behaviors, each pinned)