How to build an accessible BottomSheet in React

Renders role="dialog" with aria-modal; the title labels it via aria-labelledby and the description via aria-describedby. FocusScope traps Tab focus and restores it on close; DismissableLayer handles Escape and outside-pointer dismissal. The grab handle is a labelled separator and a Close button gives a non-gesture dismissal path so the sheet stays keyboard-operable.

When to use a BottomSheet

When not to use it

Keyboard interactions

Role dialog, verified at WCAG 2.2-AA.

Common mistakes

Avoid: <BottomSheet title="Delete item?">Are you sure?</BottomSheet>

Prefer: <AlertDialog title="Delete item?" />

A resizable gesture surface is overkill for a focused yes/no decision

Example

<BottomSheet open={isOpen} onOpenChange={setIsOpen} title="Filters">
  <FilterForm />
</BottomSheet>

See the full BottomSheet reference →