You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Accessibility pass across the JSX UI (a11y warnings 632 -> 32)
Add src/lib/a11y.js `clickable()` (role + tabIndex + onClick + Enter/Space
onKeyDown) + unit test, and spread it onto genuinely-clickable <div>/<span>
elements so they are keyboard-operable and focusable without any visual change
(mouse behavior identical). Across 28 components: `type="button"` on bare
<button>s, `aria-hidden` on decorative icon <svg>s (+ a <title> on the
interactive echoes constellation), and role/semantic fixes.
Done as fan-out -> adversarial review -> correction. The review caught real
regressions, all corrected:
- Restored 7 intentional `autoFocus` inputs (an over-eager noAutofocus "fix"
had deleted them).
- Reverted ~13 <a>->'<button>' conversions that broke anchor-targeted CSS
(.crumb a, .appbar .nav a, .brand) and showed UA button chrome — kept as <a>.
- Restored the wallet sheet-scrim's onMouseDown + e.currentTarget-guard dismiss
and the app modal-content stopPropagation container (biome-ignored as
backdrops/containment, not controls).
- Turned conditional handlers back into conditional spreads
`{...(cond ? clickable(fn) : {})}` so inert elements aren't focusable no-op
buttons.
Promoted back to ERROR (now enforced by the blocking lint gate):
useButtonType, useKeyWithClickEvents, useFocusableInteractive,
useAriaPropsSupportedByRole, noNoninteractiveElementToInteractiveRole,
noSvgWithoutTitle.
Left as warn (tracked backlog, 32): noStaticElementInteractions (11),
useValidAnchor (13 — anchors that need CSS work to become real buttons),
noAutofocus (7 — intentional focus UX), useSemanticElements (1).
biome check exit 0, npm test green (178 + 10 + 73), vite build green.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
0 commit comments