spreadlab/web
Justin Visser d9b3812306 web: accessibility audit fixes, slice 12 of M3
Walked the spec section 8 checklist against the running app. Two gaps
fixed: the menus now close on Tab instead of leaking focus behind the
open menu (the opener restores focus), and the hero's mobile About note
restores focus to its trigger on close.

Audit results, item by item:
- Keyboard: all controls reachable and operable; menus arrow-cycle,
  Esc/Tab close with focus restore; the only trap is the focus modal.
- Focus indicator: global 2 px ink outline with 2 px offset.
- Player keys: Space/arrows/Home/End global except text inputs; the
  scrubber is a native range with aria-valuetext "Round x of y".
- Reduced motion: no autoplay, page settles on the final round,
  discrete swaps, 1000 ms cadence, smooth scrolling and crossfades off.
- Contrast: informative text uses --ink-3 or stronger; --ink-4 appears
  only on text duplicated in the data table or decorative numerals.
- Node state is shape-encoded (disc / donut / small dot / halo ring).
- Network SVGs aria-hidden; each panel is a labelled region whose text
  carries the result; the collapsed ResultsTable is a real table with
  th scope headers behind a keyboard disclosure.
- One polite live region announces runs, pauses, scrub releases, and
  the final state; rounds are not announced during playback.
- FocusModal: dialog semantics, trap, Esc, focus restore. ErrorBanner
  and inline 400 notes use role=alert. lang=en, header/main/footer.
- Touch targets 44 px on mobile; node hit halos 24 px.
- 200% zoom at 1366 px (683 px viewport) reflows to the mobile stack
  with nothing lost (verified by screenshot).
2026-06-10 18:22:11 +02:00
..
.vscode web: scaffold Vue 3 + Vite app (create-vue, lean options) 2026-06-10 12:55:43 +02:00
public web: scaffold Vue 3 + Vite app (create-vue, lean options) 2026-06-10 12:55:43 +02:00
src web: accessibility audit fixes, slice 12 of M3 2026-06-10 18:22:11 +02:00
.editorconfig web: scaffold Vue 3 + Vite app (create-vue, lean options) 2026-06-10 12:55:43 +02:00
.gitattributes web: scaffold Vue 3 + Vite app (create-vue, lean options) 2026-06-10 12:55:43 +02:00
.gitignore web: the dashboard page, slice 3 of M3 2026-06-10 16:55:14 +02:00
.oxlintrc.json web: scaffold Vue 3 + Vite app (create-vue, lean options) 2026-06-10 12:55:43 +02:00
.prettierignore web: sim store, URL state scheme, debounced parallel runs (M3 slice 2) 2026-06-10 16:36:26 +02:00
.prettierrc.json web: scaffold Vue 3 + Vite app (create-vue, lean options) 2026-06-10 12:55:43 +02:00
env.d.ts web: scaffold Vue 3 + Vite app (create-vue, lean options) 2026-06-10 12:55:43 +02:00
eslint.config.ts web: scaffold Vue 3 + Vite app (create-vue, lean options) 2026-06-10 12:55:43 +02:00
index.html web: the dashboard page, slice 3 of M3 2026-06-10 16:55:14 +02:00
package-lock.json web: regenerate package-lock so npm ci sees optional deps 2026-06-10 17:35:50 +02:00
package.json web: the dashboard page, slice 3 of M3 2026-06-10 16:55:14 +02:00
README.md web: scaffold Vue 3 + Vite app (create-vue, lean options) 2026-06-10 12:55:43 +02:00
tsconfig.app.json web: scaffold Vue 3 + Vite app (create-vue, lean options) 2026-06-10 12:55:43 +02:00
tsconfig.json web: scaffold Vue 3 + Vite app (create-vue, lean options) 2026-06-10 12:55:43 +02:00
tsconfig.node.json web: scaffold Vue 3 + Vite app (create-vue, lean options) 2026-06-10 12:55:43 +02:00
tsconfig.vitest.json web: sim store, URL state scheme, debounced parallel runs (M3 slice 2) 2026-06-10 16:36:26 +02:00
vite.config.ts web: parity page renders the three-scenario comparison from live data 2026-06-10 13:47:01 +02:00
vitest.config.ts web: scaffold Vue 3 + Vite app (create-vue, lean options) 2026-06-10 12:55:43 +02:00

web

This template should help get you started developing with Vue 3 in Vite.

VS Code + Vue (Official) (and disable Vetur).

Type Support for .vue Imports in TS

TypeScript cannot handle type information for .vue imports by default, so we replace the tsc CLI with vue-tsc for type checking. In editors, we need Volar to make the TypeScript language service aware of .vue types.

Customize configuration

See Vite Configuration Reference.

Project Setup

npm install

Compile and Hot-Reload for Development

npm run dev

Type-Check, Compile and Minify for Production

npm run build

Run Unit Tests with Vitest

npm run test:unit

Lint with ESLint

npm run lint