Status: planned / incremental. Not the current main focus — but tracked, so we capture, measure, and improve deliberately over time rather than bolting it on at the end. Target standard: WCAG 2.2 Level AA (with select AAA where cheap).
This plan is Nova64-specific: our hard problem is that carts render to a
<canvas> (opaque to assistive tech) with on-canvas "buttons" that aren't
real DOM, plus an aesthetic (neon, bloom, glitch, strobe, auto-advance) that
trends away from accessible defaults. See the per-cart guidance in
CINEMATIC_3D_CART_GUIDE.md.
Low-risk changes that move the needle immediately:
prefers-reduced-motion honored: disable glitch bursts / RGB-shift / shake,
soften bloom and flicker when set. (Runtime flag + cart helper.)role="img" + a meaningful aria-label; updates per scene.aria-live="polite" status region that announces scene
changes and narration/caption text.Space/pointer always work; Enter never the sole
confirm (it's the console Restart).Establish what's actually broken and stand up the tooling:
axe-core + Lighthouse a11y runs to CI for the
console shell and a representative cart; record the score as a baseline.the-last-save-file (CTAs + city verbs + live narration).Exit metric: baseline axe/Lighthouse scores recorded; a written gap list with each item mapped to a WCAG 2.2 success criterion.
Prioritized by impact × reuse:
nova64.a11y): register
on-canvas controls; the runtime renders matching focusable DOM
links/buttons (labeled, keyboard-operable, visible focus, ≥44px) overlaid on
the canvas, kept in sync with scene state.nova64.a11y.announce(text) → polite live region;
auto-announce captions/scene changes.Esc/back behaves.The reusable recipe Phase 3 will productize:
<a>/<button> elements:aria-label), keyboard-focusable, visible focus styling, min
44×44px hit area, mapped over the canvas position (or an sr-only group that
becomes visible on focus as a fallback).<a href> (work without JS, SR-friendly by default).role="img" + a scene-appropriate aria-label.North star: a photosensitive, keyboard-only, or screen-reader player can get through the whole story — boot → room → city → invite — and act on the CTAs, with the reduced-motion toggle on. We're not there yet; this is how we get there, one measured step at a time.