> For the complete documentation index, see [llms.txt](https://docs.nickarce.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.nickarce.com/etch-drawer/customization/accessibility.md).

# Accessibility

## What's built in

* Drawers receive `role="dialog"` (modal) or `role="region"` (passive) with `aria-modal="true"`
* The first heading inside the drawer is linked via `aria-labelledby`
* A live region announces "Dialog opened" / "Dialog closed" (or "Notification" for passive drawers) to screen readers
* Focus moves to the first focusable element inside the drawer on open — passive drawers skip focus management
* Tab and Shift+Tab are trapped within the drawer to prevent focus from escaping behind the overlay
* Focus returns to the trigger element when the drawer is dismissed
* All drawer content is hidden from screen readers when `data-state` is `closed`
* Overlays are marked `aria-hidden="true"` — they are decorative
* Drag handles receive a descriptive `aria-label`
* Snap navigation buttons (`data-snap-to`) get `aria-disabled="true"` when there's no further snap point in that direction, so the dead end is announced rather than silently doing nothing — see [Core Behavior — Snap navigation buttons](broken://pages/51fd42123935a066b3efafd4ce76da2d7a72e6a0#snap-navigation-buttons)

## Passive mode differences

Passive drawers use `role="region"` instead of `role="dialog"` and do not trap focus or lock body scroll, since they are non-modal notifications. See [Core Behavior — Passive mode](broken://pages/51fd42123935a066b3efafd4ce76da2d7a72e6a0#passive-mode) for more detail.
