470ebf41dc1a4faf556a177ab8e2657b49027626
Panel used onClick, which cannot express a chord at all - so hold mode, which is the persisted default answering mode, was unusable. It now tracks pointers per pointerId and reports onPress per control plus onGestureEnd when the last finger lifts. The split is deliberate: Panel owns pointer bookkeeping because it owns the DOM, and App keeps deciding what a chord means. Hold mode grades on onGestureEnd, tap mode accumulates presses and waits for Check, and Explore still selects on press. Both map onto reducer actions that already existed. Two details carried over from the reference that are easy to delete by accident, and are now written down: - touch-action: none on the panel. Without it the browser claims the second finger as a pinch or a pan and no chord can ever form. - pointerup is heard on the window, not the button, because fingers routinely lift outside the key they went down on. Keyboard still works: Enter or Space presses and ends the gesture. 141 tests, typecheck clean, touch-action confirmed in the built CSS, and the panel renders unchanged. Actual multi-finger behaviour cannot be verified headlessly - that needs the phone. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Description
Releases
1
404 Layers 1.0.0
Latest
Languages
TypeScript
41.6%
HTML
40.3%
CSS
7.3%
JavaScript
6.3%
Shell
3.9%
Other
0.6%