feat(input): touch activation — a tap presses any focusable - #212
Merged
Conversation
docs/TOUCH.md §0 promised that a bare <Focusable onPress> is a button on touch hosts; only components with bespoke recognizers (VirtualList rows, the OSK keys) actually delivered it. The pocket-youtube TextField journey caught the hole: tapping the search field resolved a perfect hit fact and then nobody turned it into a press. touch-activation.ts installs ONE whole-screen, lowest-priority tap recognizer per mount (registered first — gesture priority is last-registered-first, so every component recognizer beats it): down holds the active: pressed look on the nearest focusable (input.ts touchFocusable — the hit fact walked through the same cursor-hover filter, one authority for "what can be pressed"), tap fires pressNode, a pan claim anywhere cancels through the standard path, and the OSK's modal block leaves it inert. On hosts without touch it costs nothing. Validated: touch-activation 4 (registered in the chain), canonical chain (the known environmental symbian-runtime failure only), 52 web goldens byte-exact — single-fire tap priority keeps VirtualList/OSK behavior untouched. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
doodlewind
marked this pull request as ready for review
August 3, 2026 08:03
doodlewind
added a commit
that referenced
this pull request
Aug 4, 2026
Most of the fleet needed NOTHING: every Focusable-driven demo (hero, cards, chrome, cursor, gallery, notifications, settings, im, note, library, music) became tappable the moment #212 landed — a tap IS an activation. The new hero sim journey pins that: four taps on the untouched demo cross the count>3 gate through the default recognizer alone. The three raw-button demos get the matching idiom, golden-safely: - motions: a horizontal swipe turns the page (L/R + triggers unchanged) — a whole-screen axis-locked gesture, zero nodes added. - stats: swipe between the two boards, mirroring LEFT/RIGHT. - cafe: the status-bar hint is now the touch twin of START — tapping it places the order (menu rows already add on tap). The only visual is an active: press wash, so untouched frames stay byte-identical. Not adapted here (different interaction classes, tracked as follow-ups): zoomlab wants pinch-zoom (a two-contact recognizer the gesture layer does not offer yet) and ipod-nano IS a click-wheel study. Validated: canonical chain 0 fail, 54 web goldens byte-exact (the cafe wrapper is pixel-neutral), Vita3K motions 5/5 + stats 3/3 byte-exact, hero tap journey. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Phase 2 follow-through (#209/#210/#211): the pocket-youtube TextField journey exposed that "tap = CIRCLE = click" was only true for components with bespoke recognizers. Now it is true for every
Focusable, by construction:active:on the nearest focusable via the hit fact walked through the cursor-hover filter (touchFocusable— one authority for "what can be pressed")🤖 Generated with Claude Code