Folding someone meant opening their editor, finding the Fold box, ticking it, and dismissing the sheet — four interactions for the thing that happens most often in a hand.
Double-tap a seat to fold, and again to put them back.
Press and hold for a quick menu of everything else you do to one player: fold, all-in, sit out / deal in, give them the button, or open the full editor. The menu is contextual — a folded player is offered Un-fold rather than Fold and All-in — and its header shows what they have behind and what they owe.
Both are undoable, the same way the header buttons are. A gesture is easier to fire by accident than a button, so every one of them raises a toast with Undo.
The single tap now waits out the double-tap window (220ms) before opening the editor — a fifth of a second of latency on opening a form, in exchange for a fold that does not also fling a sheet up over the table. A press that moves is a drag, so the hold is cancelled and drag-to-swap still works. The puck shrinks slightly while held, so a press being counted looks different from one being ignored. The table hint now names all four gestures, since an invisible gesture may as well not exist.
Validation (Playwright, headed)
Gestures were driven with real pointer events, and each assertion checks the thing that could plausibly break:
Single tap still opens the editor and does not fold.
Double-tap folds (folded: false → true), raises "Eli folds." with Undo, and does not open the editor — the editor title stayed "Select a seat". Double-tapping a folded player un-folds them. Undo restores the previous state.
Press and hold applies the press styling immediately, opens the menu at the 500ms threshold with the right contextual actions, and suppresses the click that follows the release so the editor does not also open.
A menu action works end to end: Give the button moved the dealer 0 → 3, closed the menu, toasted, and Undo put it back to 0.
A press that moves cancels the hold (past an 8px slop), so dragging a seat to swap it does not pop the menu.
No console errors.
One detour worth recording: the Undo toast looked like it was never appearing. A MutationObserver showed it appearing on the gesture and being removed exactly 6000ms later — i.e. working correctly. My check was wrong, not the code: each Playwright call is a round-trip of several seconds, so a setTimeout(…, 350) inside a later call was really measuring ~8s after the gesture, by which point the toast had expired. Subsequent assertions drive the gesture and check the result inside a single call.
Based on feature/casino-holdem-card-picker (PR #22). Merge order: #21 → #22 → this.
Last item from your list: **gestures**.
Folding someone meant opening their editor, finding the Fold box, ticking it, and dismissing the sheet — four interactions for the thing that happens most often in a hand.
- **Double-tap a seat to fold**, and again to put them back.
- **Press and hold** for a quick menu of everything else you do to one player: fold, all-in, sit out / deal in, give them the button, or open the full editor. The menu is contextual — a folded player is offered Un-fold rather than Fold and All-in — and its header shows what they have behind and what they owe.
- **Both are undoable**, the same way the header buttons are. A gesture is easier to fire by accident than a button, so every one of them raises a toast with Undo.
The single tap now waits out the double-tap window (220ms) before opening the editor — a fifth of a second of latency on opening a form, in exchange for a fold that does not also fling a sheet up over the table. A press that moves is a drag, so the hold is cancelled and drag-to-swap still works. The puck shrinks slightly while held, so a press being counted looks different from one being ignored. The table hint now names all four gestures, since an invisible gesture may as well not exist.
## Validation (Playwright, headed)
Gestures were driven with real pointer events, and each assertion checks the thing that could plausibly break:
- **Single tap still opens the editor and does not fold.**
- **Double-tap folds** (`folded: false → true`), raises "Eli folds." with Undo, **and does not open the editor** — the editor title stayed "Select a seat". Double-tapping a folded player un-folds them. Undo restores the previous state.
- **Press and hold** applies the press styling immediately, opens the menu at the 500ms threshold with the right contextual actions, and **suppresses the click that follows the release** so the editor does not also open.
- **A menu action works end to end**: Give the button moved the dealer 0 → 3, closed the menu, toasted, and Undo put it back to 0.
- **A press that moves cancels the hold** (past an 8px slop), so dragging a seat to swap it does not pop the menu.
- No console errors.
One detour worth recording: the Undo toast looked like it was never appearing. A MutationObserver showed it appearing on the gesture and being removed exactly 6000ms later — i.e. working correctly. My check was wrong, not the code: each Playwright call is a round-trip of several seconds, so a `setTimeout(…, 350)` inside a *later* call was really measuring ~8s after the gesture, by which point the toast had expired. Subsequent assertions drive the gesture and check the result inside a single call.
Based on `feature/casino-holdem-card-picker` (PR #22). Merge order: **#21 → #22 → this**.
Folding someone meant opening their editor, finding the Fold box, ticking it,
and dismissing the sheet — four interactions for the thing that happens most
often in a hand.
Double-tap a seat to fold, and again to put them back. Press and hold for a
quick menu of everything else you do to one player: fold, all-in, sit out or
deal in, hand them the button, or open the full editor. Both are undoable the
same way the header buttons are, because a gesture is easier to fire by
accident than a button.
The single tap now waits out the double-tap window before opening the editor —
a fifth of a second of latency on opening a form, in exchange for a fold that
doesn't also fling a sheet up over the table. A press that moves is a drag, so
the hold is cancelled and swapping seats still works, and the puck shrinks
slightly while held so a press that's being counted looks different from one
that's being ignored.
Co-Authored-By: Claude Sonnet 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_015bnp7xKUPFFSpwkYNFaPgb
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Last item from your list: gestures.
Folding someone meant opening their editor, finding the Fold box, ticking it, and dismissing the sheet — four interactions for the thing that happens most often in a hand.
The single tap now waits out the double-tap window (220ms) before opening the editor — a fifth of a second of latency on opening a form, in exchange for a fold that does not also fling a sheet up over the table. A press that moves is a drag, so the hold is cancelled and drag-to-swap still works. The puck shrinks slightly while held, so a press being counted looks different from one being ignored. The table hint now names all four gestures, since an invisible gesture may as well not exist.
Validation (Playwright, headed)
Gestures were driven with real pointer events, and each assertion checks the thing that could plausibly break:
folded: false → true), raises "Eli folds." with Undo, and does not open the editor — the editor title stayed "Select a seat". Double-tapping a folded player un-folds them. Undo restores the previous state.One detour worth recording: the Undo toast looked like it was never appearing. A MutationObserver showed it appearing on the gesture and being removed exactly 6000ms later — i.e. working correctly. My check was wrong, not the code: each Playwright call is a round-trip of several seconds, so a
setTimeout(…, 350)inside a later call was really measuring ~8s after the gesture, by which point the toast had expired. Subsequent assertions drive the gesture and check the result inside a single call.Based on
feature/casino-holdem-card-picker(PR #22). Merge order: #21 → #22 → this.