fix(web): a11y essentials + restore broken benchmark viewMode#85
Merged
github-actions[bot] merged 1 commit intodevelopfrom May 8, 2026
Merged
fix(web): a11y essentials + restore broken benchmark viewMode#85github-actions[bot] merged 1 commit intodevelopfrom
github-actions[bot] merged 1 commit intodevelopfrom
Conversation
…o-rebase
A11y improvements
- Skip-to-content link in the locale layout: hidden until focused, lands
focus on <main id="main" tabIndex={-1}>. Reachable on the first Tab
press; was the most-flagged item by automated scanners.
- NavLinks dropdown buttons now expose `aria-haspopup="menu"`,
`aria-expanded`, `aria-current="page"` on active groups. Inner items
carry `role="menuitem"`. Mobile menu locks body scroll while open
(restores prior overflow on close).
- StatusBadge gains a redundant leading glyph per state (clock, pulse,
check, ✕, slash-circle). Color-blind users still parse the badge at
a glance. Wrapper carries `role="status"` and a verbose aria-label.
- Benchmark filter chips (Pipeline stage, Neighbours K) gain
`aria-pressed` plus `role="group"` with descriptive `aria-label`.
- Heatmap | Table toggle (#81) already shipped with `role="tablist"`
and `aria-selected`.
Drive-by fix
- Restore the `viewMode` state declaration on /benchmark. PR #81's
toggle UI references `viewMode` / `setViewMode`, but the auto-rebase
ladder against #82 dropped the hook line on develop, leaving the
page broken at build time. Adds the line back; default "heatmap".
(Also re-imports BenchmarkHeatmap, similarly lost.)
CI: next build green; backend untouched.
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.
Why
UX audit flagged: only 3 of 14 pages used aria/role/label htmlFor. Drive-by: when PRs #81 (heatmap) and #82 (URL-sync) auto-rebased onto each other, the
viewModestate on/benchmarkwas dropped — develop currently fails to build that page. Folded the trivial fix into this PR so it can land.What
A11y
<main id="main" tabIndex={-1}>. Reachable on the first Tab press.aria-haspopup="menu",aria-expanded,aria-current="page"on active groups. Inner items carryrole="menuitem". Mobile menu locks body scroll while open and restores prior overflow on close (no more dual-scroll trap).role="status"and a verbosearia-label.aria-pressedplusrole="group"with descriptivearia-label.role="tablist"/aria-selectedfrom feat(web): benchmark heatmap small-multiples — visual ranking per cell #81.Drive-by build fix
viewModestate and theBenchmarkHeatmapimport on/benchmark. PR feat(web): benchmark heatmap small-multiples — visual ranking per cell #81's toggle UI referencesviewMode/setViewMode, but the auto-rebase ladder against feat(web): URL-sync filters + sticky table headers + scroll-shadow indicators #82 dropped the hook line on develop, leaving the page broken at build time. Adds the lines back; default"heatmap".Test plan
next buildgreen; 18 routes; no TS errors (was failing on develop before this PR)<main>/jobs— StatusBadge announces "Status: succeeded" etc.aria-pressedflips on selection