fix(hub): touch, phones and keyboard — tap to inspect, readable belt views, a drawer and tabs that work - #30
Merged
Merged
Conversation
…views, a drawer and tabs that work Touch: one tap ran over, up and out in a single gesture, so a phone user could never see a tooltip — the only place the map states a body's health — and every tap left the monitor for another site. Now the first tap selects and pins the tooltip beside the body, a second tap opens it, a tap elsewhere clears it. The tooltip is placed from the body's projected point (touch has no clientX, so it used to land at NaN). Selection logic is Phaser-free and tested. Mouse behaviour is unchanged; a still cursor now follows the orbit. Phones: the belt views fit a 800 px world into ~375 px, so their text drew at 3-5 CSS px. The text that exists nowhere else (debates, ideas and scores, signal titles, Bridge trust and outcomes) now also renders in a DOM card for the active belt tab below 768 px, with its own LIVE/OFFLINE state. Labels are clamped to the viewport; ring names sit in gaps between bodies instead of on their labels; labels step clear of the tab bar, legend and footer. Drawer and tabs: the closed drawer is visibility:hidden (28 off-screen links no longer sit in the tab order), opening moves focus in, Escape and the backdrop close it and return focus to the menu button, the page behind is inert while it is open, and rows are 44 px on phones. The zone tabs follow the WAI-ARIA tabs pattern (roving tabindex, arrow/Home/End, aria-controls, a labelled tabpanel); decorative overlay labels are aria-hidden, and a note points keyboard and screen-reader users to the Ecosystem list, whose links now carry each body's status. Reduced motion now also stops belt travel and blinking, and every part follows changes to the preference while the tab is open. Text below WCAG AA contrast or below 10 px (11 px on phones) is raised, keeping each hue. The self star no longer claims to recentre a view that is already centred. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This was referenced Sep 21, 2026
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.
Stacked on #29 (← #28 ← #27 ← #26) — merge in order. This PR's diff is only its own commit.
Touch: a tap could never show a tooltip
Phaser runs over → up → out for a single tap. The tooltip, the only place the map states a body's health, appeared and vanished in the same gesture, and
pointeruphad already calledwindow.open. So a phone user could not find out why Algora is not green, and every exploratory tap left the monitor.clientX, so it used to land atNaN. It keeps above the finger and inside the viewport.src/ui/map-selection.ts) with tests.Phones: belt views drew their text at 3–5 CSS px
The belt zones fit an 800-px-wide world into ~375 px, then filter NEAREST. Following the review's corrected fix, only text that exists nowhere else gets a DOM overlay: debate topics and context, idea titles and scores, Algora signal titles, Bridge trust and outcomes. Below 768 px it appears in a card for the active belt tab (
src/ui/belt-card.ts) with its own LIVE/OFFLINE badge. The card has fixed CSS sizes, scrolls, stays clear of the tab bar, and marks the Korean text withlang="ko". The canvas is unchanged.Labels
ECOSYSTEM,OFFICIAL…) now sit in a gap between their ring's bodies and turn with them. They used to sit on top of body labels.Streamingrow no longer runs intoAlgora (Sense) | ….Keyboard and screen readers
visibility: hidden. Its 28 off-screen links used to be in the tab order, with focus vanishing for 28 presses, and in the accessibility tree.inert. Escape or a backdrop tap closes it and returns focus to ☰. Rows are 44 px tall with 13 px text on phones; they used to be 16 px and 10 px.aria-controls, and#stageas a labelledtabpanel(src/ui/zone-tabs.ts).aria-hidden. An sr-only note points to the Ecosystem list as the keyboard and screen-reader route to every body, and its links now carry each body's status.src/ui/motion.ts). The reduced-motion override for the drawer came before the mobile rules in the stylesheet, so the drawer still slid; that is fixed too.What is verified, and what is not
Input.dispatchTouchEventtaps on every kind of body (service, streaming, link, file, self). The first tap never opens a window (watched withTarget.targetCreated); the second tap does.Accessibility.getFullAXTree) before and after🤖 Generated with Claude Code