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

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 for more detail.