Manual accessibility checklist

This is the human sign-off arm of the accessibility release gate (AR-19, NFR-1). Its automated counterpart — the axe-core per-route scan in end2end/tests/a11y.spec.ts — is a required, blocking CI gate, but axe cannot see behavioral a11y: where focus goes after a dialog closes, whether a live region announces at the right urgency, whether motion is actually suppressed. Those are verified here, by a person, before a release.

Binding intent: the perf budget and the a11y budget are the same budget (architecture, NFR-1). AA conformance is not the line item quietly cut to make the WASM/FCP budget. A release does not ship with an un-signed-off item below.

Status (v1 / Epic 0)

There are no real UI components or routes yet — the app is the Leptos placeholder (title "Welcome to Leptos", a single "Click Me" counter button on /). Every behavioral item below is therefore N/A until Epic 2 introduces the surfaces it applies to. The checklist exists now so the gate is in place from day one and grows with the surfaces; the four seed items are the canonical un-automatable behaviors named in the architecture (L544).

Checklist

Each item: verify with keyboard + a screen reader (e.g. NVDA/Orca/VoiceOver) on the affected surface, then tick and date it.

  • Modal focus restoration — opening a modal/dialog moves focus into it and traps focus while open; on close, focus returns to the exact element that triggered it (not the document body / top of page). Status: N/A until Epic 2 (no modals yet).

  • Virtual-list set semantics under SSE — as the live activity / last-heard virtual list recycles rows under streaming updates, aria-setsize and aria-posinset stay truthful (reflect the real item count/position, not just the rendered window) so assistive tech announces "item 3 of 120", not "3 of 12". Status: N/A until Epic 2 (no virtual list / SSE surface yet).

  • aria-live politeness split — routine updates (new last-heard entry) use aria-live="polite"; only genuinely urgent state (e.g. connection lost, TX inhibited) uses assertive. Verify announcements are neither spammy nor missed. Status: N/A until Epic 2 (no live regions yet).

  • prefers-reduced-motion — with the OS "reduce motion" setting on, non- essential animation/transition is suppressed (or reduced to a non-vestibular cross- fade); no parallax/auto-scroll/large-motion effects play. Status: N/A until Epic 2 (no animations yet).

How this grows

When Epic 2 (and later) adds a surface, add its concrete behavioral items here and flip the relevant seeds from "N/A" to a real check. The automated route array in a11y.spec.ts grows in lockstep. Final release-gate verification of this checklist is tracked by Stories 2-9 and 6-3.