V1 Web PWA · Surface walkthrough

Mawu Studio — Accessibility (V7)

A per-surface walkthrough of the V1 Web PWA studio surface: layout, states, interactions, data, and cross-references.

walked
8sections3 minread

On this page

Context. surface studio · domain mawu · route /mawu-studio/accessibility · auth signed-in + creator · source apps/oshun/web/src/app/mawu-studio/accessibility/page.tsx

Last walked. 2026-06-03 automated runtime probe (Playwright headless) — prod build + mock BFF; render, HTTP 200, server-rendered <h1>, 0 page errors verified. Evidence: WALKTHROUGH/results/walkthrough-runtime-probe-2026-06-03.md

Purpose#

Reviews the V7 Mawu accessibility floor for the builder, browser, and default-realm surfaces. The page server-runs runV7MawuAccessibilityEval(V7_MAWU_ACCESSIBILITY_EVAL_FIXTURE) and passes the report plus V7_MAWU_ACCESSIBILITY_LINTER_RULES to the workspace, which lints each surface against voice/radio parity, colorblind-safe provenance diffs, keyboard/gamepad input parity, scalable UI, and reduced motion. Out of the V1 feature map — a V7 surface that ships in apps/oshun/web (documented here for an exhaustive route inventory).

Entry points#

  • Direct URL / bookmark/mawu-studio/accessibility (signed-in creator)
  • Studio shell navactive="studio" (shortcut 6)
  • In-page nav links — from the Localization workspace ("Localization" ↔ this page) and the studio Accessibility Governance surface

Layout regions#

  • Header: shell header + workspace header (aria-labelledby="mawu-accessibility-title") — eyebrow "V7 accessibility floor", H1 "Mawu Studio Accessibility", summary
  • Status panel (aria-label="Accessibility eval status") — four metrics: Eval (Passing/Blocked), Surfaces (passedSurfaceIds.length/3), Findings count, Schema (v7)
  • Controls (aria-label="Workspace controls")
    • Surface selector (role="group") — one tab per report.requiredSurfaceIds: Builder (mawu-studio-builder), Browser (abundantia-browser), Default realm (default-realm)
    • Preview preferences — reduced/standard-motion toggle + text-scale range
  • Body gridSurfaceDetail (evidence grid + builder bindings) + RulesPanel (the Mawu Studio linter rule list)
  • Footer nav (aria-label="Mawu Studio links") — Back to Studio, Accessibility Governance, Localization

States#

  • Loading / Error / Offline — N/A: the report is computed server-side from an in-bundle fixture (@v7/contracts); no client network read
  • Eval passingdata-eval-passed="true"; status metric "Passing"; each surface shows a "Passing" pass-pill
  • Eval blockeddata-eval-passed="false"; status "Blocked" (driven by the fixture/report)
  • Active surface = Builder (default = requiredSurfaceIds[0]) — shows builder action bindings (keyboard/gamepad/voice) in the detail pane
  • Active surface = Browser / Default realm — same evidence grid; builder bindings list only renders when builderActions.length > 0
  • Reduced motion (default)data-motion-mode="reduced"; toggling flips to standard
  • Text scaledata-text-scale reflects the range (100–200%, step 25, default 200)
  • Gated — signed-in creator (shell); no V1 BFF policy (out-of-v1)
  • Standalone PWA — renders within the shell

Interactions#

  • Surface tabs (buttons, data-mawu-a11y-surface-tab="<id>", aria-pressed) — set activeSurfaceId; the detail + rules panes recompute for the selected surface (active findings filtered by surfaceId)
  • Reduced-motion toggle (button, data-mawu-a11y-reduced-motion-toggle, aria-pressed) — flips motionMode between reduced/standard; label tracks the mode
  • Text scale (range input, data-mawu-a11y-text-scale, min 100 max 200 step 25) — sets textScale; reflected in the data-text-scale attribute
  • Footer links (Link) — Back to Studio (/studio), Accessibility Governance (/studio/accessibility-governance), Localization (/mawu-studio/localization)

Read-only evidence rendered per surface (no controls): voice/radio parity, provenance diff (palette + contrast ratio + non-color cues), scalable UI (max text scale, hit-target px, 320px reflow), reduced motion, and per-action keyboard/gamepad/voice bindings.

Data & contracts#

  • Reads (server): runV7MawuAccessibilityEval(V7_MAWU_ACCESSIBILITY_EVAL_FIXTURE)V7MawuAccessibilityEvalReport; V7_MAWU_ACCESSIBILITY_LINTER_RULES → linter rule views — both from @v7/contracts
  • Writes: None.
  • Realtime: None.
  • Caching: SSR (server component computes the report); client workspace is interactive over the passed props
  • Auth/role check: session (signed-in creator); no V1 BFF policy (out-of-v1)
  • Contracts: @v7/contractsV7MawuAccessibilityEvalReport, V7MawuAccessibilityLinterRuleId, V7MawuAccessibilitySurfaceId, V7MawuAccessibilitySurfaceSpec, runV7MawuAccessibilityEval, V7_MAWU_ACCESSIBILITY_EVAL_FIXTURE, V7_MAWU_ACCESSIBILITY_LINTER_RULES

Cross-references#

Open questions / known gaps#

  • The report is computed from a fixture, not a live eval over real studio surfaces; confirm the V7 BFF/eval pipeline that will replace V7_MAWU_ACCESSIBILITY_EVAL_FIXTURE.
  • Surface pass-pill is hard-rendered "Passing" in SurfaceDetail; confirm it should reflect the per-surface verdict once blocked surfaces exist.