Skip to content

feat(web): accessible touch pills — picker, journal browser, confirm - #5

Merged
momentmaker merged 1 commit into
mainfrom
feat/mobile-pills
Jun 17, 2026
Merged

momentmaker merged 1 commit into
mainfrom
feat/mobile-pills

Conversation

@momentmaker

Copy link
Copy Markdown
Member

Mobile couldn't start a session (the picker had no touch surface) and the journal browser was keyboard-only after its redesign. This makes the pill bar a full, state-derived touch control surface mirroring the desktop keys.

Pills per screen

  • picker — reflect · journal · unburden (filled primary pills) · my journal · help
  • journal browser — ↑ ↓ select · export · delete (confirmed) · continue · export all · back
  • delete confirm — yes-delete / keep (touch equivalent of y/n)
  • sessions — unchanged (done · pause · raw⇄clean · …)

Wiring

syncChips() derives the set from state each frame, rebuilding only on change. A pill tap stopPropagations so it doesn't also trigger the terminal's begin/resume/dismiss; a terminal tap closes help, dismisses the closing moment, and resumes a suspended mic. Boot shows "tap to begin" on touch.

Accessibility

44px min tap targets (WCAG 2.5.5), touch-action: manipulation (no 300ms delay), aria-labels on glyph pills, focus-visible rings, distinct danger styling on delete. Desktop unchanged (pills are touch-only).

tsc clean · 225 vitest (new mobile.test.ts locks the pill sets) · canary 2/2 · build ok. Touch interaction needs an on-device pass after deploy.

🤖 Generated with Claude Code

…sessions)

Mobile had no way to start a session (the picker had no touch surface) and the
journal redesign was keyboard-only. Extend the pill bar into a full state-derived
touch control surface that mirrors the desktop keys:

- picker — reflect · journal · unburden (filled 'primary' pills) · my journal · help
- journal browser — ↑ ↓ select · export · delete (confirmed) · continue · export all · back
- delete confirm — a two-pill yes/keep (the touch equivalent of y/n)
- sessions — unchanged (done · pause · raw⇄clean · …)

syncChips() derives the right set from state each frame and rebuilds only on
change. A pill tap stops propagation so it doesn't also fire the terminal's
begin/resume/dismiss; a terminal tap closes help / dismisses the closing moment /
resumes the mic. Boot reads 'tap to begin' on touch.

Accessibility: 44px min tap targets (WCAG 2.5.5), touch-action: manipulation (no
tap delay), aria-labels on glyph pills (↑/↓), focus-visible rings, danger styling
on delete. Desktop is unchanged (pills are touch-only).

tsc clean; 225 vitest pass (new mobile.test.ts locks the pill sets); canary 2/2.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@momentmaker
momentmaker merged commit 1efe3d4 into main Jun 17, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant