Queue-North-Website/src
Scarlett 9fdc6b6032 fix(a11y): visible focus indicator, aria-expanded, and six Label-in-Name failures
Batch 10, and only three of its six issues were real. The other three are
answered on the tracker with the arithmetic.

#189 — focus indicator. Footer and Home carried zero focus styling across 17
links. Added one global :focus-visible rule rather than sprinkling classes,
because the issue's own scope was "all interactive <a> and <Link> elements".

Not the ring the issue asked for. It suggested ring-primary-cyan; #22D3EE is
6.26:1 on navy and 2.38:1 on white, so on this light-first design that ring
would have failed WCAG 1.4.11 across most of the site. Two rings instead — white
inside, navy outside — so the white carries the dark bands and the navy carries
the light sections. Worst case across every background in the palette is
13.62:1. box-shadow so both rings follow each element's own border-radius, plus
a transparent outline for forced-colors mode.

#192 — aria-expanded={isOpen} and aria-controls on the mobile nav trigger, and
the id on SheetContent it now points at. Confirmed as "false" in the
prerendered HTML.

#193 — INVERTED. The issue asked for aria-labels to be added consistently to
hero CTAs. The aria-labels already there were WCAG 2.5.3 Label in Name failures,
Level A: "Schedule a consultation" is not a superset of the visible "Schedule
Consultation", so a voice-control user saying what they see cannot activate the
link. Doing what the issue asked would have spread a Level A failure. Removed
the six that broke it; kept the eight that genuinely add context and do contain
their visible text, including the icon-only header logo link that needs one.

Audit now reports 0 failures across Home, Services, Footer and Header.

Verified: npm run build; the ring is in the built CSS, aria-expanded="false" and
id="mobile-nav-content" are in the prerendered HTML, all six removed labels are
absent from it, and the visible CTA text still renders.

NOT verified: nothing has been walked keyboard-only in a browser, and no screen
reader has been used. That gap is recorded in docs/qa/ClaudeQACoverage.md.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-18 02:31:13 -05:00
..
components fix(a11y): visible focus indicator, aria-expanded, and six Label-in-Name failures 2026-08-18 02:31:13 -05:00
data feat(seo): publish privacy policy, remove street address, prerender all routes (batch 0.9.3) 2026-08-01 01:45:52 -05:00
hooks fix: close issues #12 #15 #17 #18 — CSP nonce, API retry, input debounce, caching verified (batch 0.6.1) 2026-05-17 16:10:10 -05:00
lib feat(seo): publish privacy policy, remove street address, prerender all routes (batch 0.9.3) 2026-08-01 01:45:52 -05:00
pages fix(a11y): visible focus indicator, aria-expanded, and six Label-in-Name failures 2026-08-18 02:31:13 -05:00
App.jsx fix: header CTA visibility, scroll-to-top, 404 page (#104 #89 #88) (batch 9.1) 2026-05-17 21:37:42 -05:00
entry-server.jsx feat(seo): publish privacy policy, remove street address, prerender all routes (batch 0.9.3) 2026-08-01 01:45:52 -05:00
index.css fix(a11y): visible focus indicator, aria-expanded, and six Label-in-Name failures 2026-08-18 02:31:13 -05:00
main.jsx feat(seo): publish privacy policy, remove street address, prerender all routes (batch 0.9.3) 2026-08-01 01:45:52 -05:00
router.jsx feat(seo): publish privacy policy, remove street address, prerender all routes (batch 0.9.3) 2026-08-01 01:45:52 -05:00
routes.jsx feat(seo): publish privacy policy, remove street address, prerender all routes (batch 0.9.3) 2026-08-01 01:45:52 -05:00