# Accessibility notes (Descrybe v2 web) Critical fixes from the a11y pass (keyboard / focus / ARIA). ## Sidebar (`Nav.svelte`) - Mobile drawer uses `inert` + `aria-hidden` when closed so off-canvas links are not in the Tab order. - Open drawer traps focus; **Escape** closes it. - Hamburger `aria-controls="app-sidebar"` matches the aside `id`; label toggles Open/Close. - Nav links expose `aria-current="page"`; **More** uses `aria-expanded` / `aria-controls`. - Primary **Stores** points at `/stores` (`data-tour="nav-stores"`). ## Focus traps Shared helper: `src/lib/a11y/focus-trap.ts`. | Surface | Behavior | |---------|----------| | `Dialog.svelte` | Tab cycle inside panel; focus restored on close; Escape closes | | Tutorial popover | Tab cycle = popover controls **+** highlighted `data-tour` target (so forced steps stay keyboard-reachable); Escape pauses | | Mobile sidebar | Tab cycle while drawer open | ## Store hub (`/stores`) - Landmark `section` with accessible heading (sr-only). - Each connector is an `article` with labelled title + CTA `aria-label`. - Status badges include an accessible name (`Status: …`). ## Remaining (non-blocking) - Individual feature dialogs that bypass `ui/Dialog` should adopt the same trap. - Live axe/browser keyboard audit on every route still recommended before production.