WIP: fix(a11y): complete tab keyboard semantics #20

Closed
clawlter wants to merge 1 commit from audit/tab-keyboard-semantics into main
Owner

Scope

  • add ARIA tab/tabpanel IDs and relationships for backend and mobile workspace navigation
  • implement roving tab stops with automatic activation for ArrowLeft/ArrowRight (including wraparound), Home, and End
  • keep inactive panels mounted as hidden semantic targets without rendering inactive pane content
  • add focused interaction coverage for both tablists

Non-goals

  • no visual redesign or broader navigation changes
  • no changes to record, graph, or filter behavior

Before / after evidence

Before: tab controls exposed role="tab" and aria-selected, but every tab remained in the sequential tab order, controls lacked aria-controls/matching tabpanels, and arrow/Home/End keys had no behavior. The focused test was added first and failed against that baseline.

After: one selected tab per list is tabbable; tabs and panels are programmatically associated; horizontal arrows wrap and activate; Home/End select boundaries. Existing styling is preserved by lightweight panel wrappers.

Verification

  • npm run test — 24 files, 52 tests passed
  • npm run lint — passed
  • npm run typecheck — passed
  • npm run build — passed
  • focused semantics test — 2 passed
  • dev server returned HTTP 200; browser screenshot tooling itself returned an internal Camofox 500, so no screenshot is attached

Readiness

Ready for opener review. Draft is intentional pending approval; no known code/test blockers.

## Scope - add ARIA tab/tabpanel IDs and relationships for backend and mobile workspace navigation - implement roving tab stops with automatic activation for ArrowLeft/ArrowRight (including wraparound), Home, and End - keep inactive panels mounted as hidden semantic targets without rendering inactive pane content - add focused interaction coverage for both tablists ## Non-goals - no visual redesign or broader navigation changes - no changes to record, graph, or filter behavior ## Before / after evidence Before: tab controls exposed `role="tab"` and `aria-selected`, but every tab remained in the sequential tab order, controls lacked `aria-controls`/matching tabpanels, and arrow/Home/End keys had no behavior. The focused test was added first and failed against that baseline. After: one selected tab per list is tabbable; tabs and panels are programmatically associated; horizontal arrows wrap and activate; Home/End select boundaries. Existing styling is preserved by lightweight panel wrappers. ## Verification - `npm run test` — 24 files, 52 tests passed - `npm run lint` — passed - `npm run typecheck` — passed - `npm run build` — passed - focused semantics test — 2 passed - dev server returned HTTP 200; browser screenshot tooling itself returned an internal Camofox 500, so no screenshot is attached ## Readiness Ready for opener review. Draft is intentional pending approval; no known code/test blockers.
fix(a11y): complete tab keyboard semantics
Some checks failed
Build and publish container image / Build Docker image and publish package tags (pull_request) Successful in 1m27s
CI / Validate lint, types, tests, and production build (pull_request) Failing after 10m2s
952dff150f
clawlter changed title from fix(a11y): complete tab keyboard semantics to WIP: fix(a11y): complete tab keyboard semantics 2026-07-11 23:34:08 -04:00
clawlter force-pushed audit/tab-keyboard-semantics from 952dff150f
Some checks failed
Build and publish container image / Build Docker image and publish package tags (pull_request) Successful in 1m27s
CI / Validate lint, types, tests, and production build (pull_request) Failing after 10m2s
to 142138ea81
All checks were successful
Build and publish container image / Build Docker image and publish package tags (pull_request) Successful in 1m20s
CI / Validate lint, types, tests, and production build (pull_request) Successful in 2m35s
2026-07-12 10:18:46 -04:00
Compare
Author
Owner

Integration staging update (unmerged): reviewed head 952dff150f7d296120b430f28e41c78446df6ded → staged head 142138ea81fb0ffb0f10d4b4af9f97b7b988b1c0. Signed ancestry-only rebase onto main 383b526; stable patch-id confirms the reviewed aggregate delta is unchanged. Local npm ci, lint, typecheck, full Vitest, and production build all pass. Required exact-head Forgejo checks are running; this changed head remains for fresh independent review.

Integration staging update (unmerged): reviewed head `952dff150f7d296120b430f28e41c78446df6ded` → staged head `142138ea81fb0ffb0f10d4b4af9f97b7b988b1c0`. Signed ancestry-only rebase onto main 383b526; stable patch-id confirms the reviewed aggregate delta is unchanged. Local `npm ci`, lint, typecheck, full Vitest, and production build all pass. Required exact-head Forgejo checks are running; this changed head remains for fresh independent review.
Author
Owner

Exact-head staging checks are green for 142138ea81fb0ffb0f10d4b4af9f97b7b988b1c0: both protected pull-request contexts succeeded. Current main is an ancestor and every staged post-main commit has a good signature. This PR remains unmerged and awaits independent staged-head review.

Exact-head staging checks are green for `142138ea81fb0ffb0f10d4b4af9f97b7b988b1c0`: both protected pull-request contexts succeeded. Current main is an ancestor and every staged post-main commit has a good signature. This PR remains unmerged and awaits independent staged-head review.
Author
Owner

Closing without merge because the owner cancelled the code-security-audit-2026-07 campaign. This does not revert previously merged work.

Closing without merge because the owner cancelled the `code-security-audit-2026-07` campaign. This does not revert previously merged work.
clawlter closed this pull request 2026-07-14 08:16:04 -04:00
All checks were successful
Build and publish container image / Build Docker image and publish package tags (pull_request) Successful in 1m20s
Required
Details
CI / Validate lint, types, tests, and production build (pull_request) Successful in 2m35s
Required
Details

Pull request closed

Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
clawlter/hermes-brain-web!20
No description provided.