---
path: /legal/accessibility
surface: customer
domain: onboarding-public
auth: anon
source: apps/oshun/web/src/app/legal/accessibility/page.tsx
status: walked
last_walked:
  '2026-05-29 automated runtime walk (Playwright headless) — render, /v1 data
  (2xx), console/page-errors, expected content, screenshot verified; manual
  screen-reader and real telemetry-delivery checks pending. Evidence:
  WALKTHROUGH/results/runtime-sweep-2026-05-29.md; 2026-06-28 public-legal-pages
  Playwright pass covered anonymous routing, exact section inventory, legal nav
  matrix/active states, TOC/back-to-top/print shell controls, 390 px
  no-overflow, 44 px touch targets, offline-after-load stability, no telemetry
  hooks, and axe. Manual AT pass and real telemetry delivery remain pending.'
---

# Legal · Accessibility Statement

## Purpose

OSHUN's WCAG 2.1 AA conformance statement, per-domain accessibility notes, known
limitations, testing methodology, and feedback contact. Rendered through
`LegalPageShell`.

## Entry points

- Footer link "Accessibility" on `/welcome` and `/landing`
- Sidebar nav from other `/legal/*` pages
- Inline references from in-product accessibility panel (e.g., reduced motion /
  high contrast toggles)
- Direct URL / bookmark — yes (anon)

## Layout regions

`page.tsx` defines `SECTIONS`: `commitment`, `conformance`, `features`,
`domain-accessibility`, `limitations`, `testing`, `feedback`.

- **Header (shell)**: minimal brand + back link
- **Sticky sidebar**: cross-legal nav + 7-entry TOC
- **Main article**: h1 "Accessibility Statement", `data-legal-date` "Last
  updated: February 21, 2026", seven sections:
  - Commitment (one paragraph)
  - Conformance Status — names WCAG 2.1 Level AA
  - Accessibility Features — eight-item list (keyboard nav, screen reader,
    reduced motion, high contrast, adjustable text size, focus indicators, color
    independence, touch targets ≥ 44×44)
  - Domain-Specific — per-domain notes for Tara, Veritas, Nyx, Arete, Nisaba,
    Metis
  - Known Limitations
  - Testing methodology
  - Feedback contact: `accessibility@oshun.app`, 5-day response SLA
- **Floating control**: back-to-top button

## States

- [x] **Loading** — N/A; static
- [x] **Default** — all seven sections render
- [x] **TOC click / active section** — clicking a TOC button scrolls to that
      section and marks it `data-active="true"`; passive scroll-spy remains
      `IntersectionObserver`-driven
- [x] **Back-to-top visible** — the shared 44 px control appears after scrolling
      and returns the user near the document start
- [x] **Narrow viewport (≤ 768px)** — sidebar collapses; TOC hidden
- [x] **Print** — shell strips chrome, appends anchor hrefs after links
- [x] **Offline after load** — once loaded, the URL, heading, section inventory,
      and active legal nav state remain stable when the browser context goes
      offline
- [x] **Gated** — N/A; anonymous-readable

## Interactions

### Cross-legal sidebar nav

- [x] **Each `LEGAL_NAV` link** — sibling legal page navigation, active state,
      and at least 44 px mobile target

### On-this-page TOC

- [x] **Each TOC button** (7) — `scrollIntoView` to that section id and
      immediate active state after click

### Back-to-top

- [x] **"↑"** (button) — smooth-scroll to top when visible

### Body content

The Feedback section lists `accessibility@oshun.app` as plain text, not a
`mailto:` link. Verify intent.

## Data & contracts

- **Reads**: none — static text
- **Writes**: none
- **Caching**: SSR static; loaded-route offline stability is asserted. Cold
  offline navigation / per-legal SW path caching is not asserted, and current
  `sw.js` does not path-cache `/legal/*`.
- **Auth**: anon (in middleware `PUBLIC_PREFIXES`)
- **Metadata**: `title: 'Accessibility Statement'`,
  `description: 'Our commitment to making OSHUN accessible to everyone.'`

## Cross-references

- Shell a11y: [`shell/06-keyboard-a11y.md`](../../shell/06-keyboard-a11y.md)
- Sibling legal pages: [`legal-privacy.md`](./legal-privacy.md),
  [`legal-terms.md`](./legal-terms.md),
  [`legal-cookies.md`](./legal-cookies.md), [`legal-ccpa.md`](./legal-ccpa.md),
  [`legal-dpa.md`](./legal-dpa.md)
- Component sources:
  - `apps/oshun/web/src/components/legal/LegalPageShell.tsx`

## E2E coverage

- Backed by
  [`apps/oshun/web/e2e/public-legal-pages.spec.ts`](../../../apps/oshun/web/e2e/public-legal-pages.spec.ts)
  — covers anonymous access, exact seven-section inventory, legal nav
  inventory/active state, shared TOC/back-to-top/print shell behavior, 390 px
  no-overflow, 44 px touch targets, offline-after-load stability, no telemetry
  hooks, and axe.

## Open questions / known gaps

- [ ] Cold offline navigation / per-legal SW cache is not asserted and current
      `sw.js` does not path-cache `/legal/*`; PWA shell cache coverage remains
      in the offline-first / PWA walkthroughs.
- [ ] `accessibility@oshun.app` rendered as plain text — confirm whether it
      should be a mailto link
- [ ] No structured "Report an accessibility issue" form — only an email
      contact; confirm whether a form route should exist
- [ ] Per-domain notes call out Metis "mastery-state changes are announced via a
      live region" — verify against `/metis/*` walkthroughs once they exist
