BottomSheet

Mobile bottom sheet with drag-to-resize detents, velocity-projected snapping, and drag-to-dismiss

Category: overlay · WCAG 2.2-AA · overlay, sheet, bottom-sheet, mobile, drag, detent, gesture

States

Props

PropTypeDefaultDescription
openbooleanWhether the component is open (controlled).
defaultOpenbooleanWhether the component is open on first render (uncontrolled).
onOpenChange(open: boolean) => voidCalled with the next open state when it changes.
snapPointsnumber[][0.5, 0.92]Detent heights as ascending fractions of the viewport (0–1)
activeSnapnumberThe controlled snap-point index.
defaultSnapnumber0The initial snap-point index when uncontrolled.
onSnapChange(index: number) => voidCalled with the new snap-point index when it changes.
titleReact.ReactNodeTitle text for the component.
descriptionReact.ReactNodeSupporting description text.
childrenReact.ReactNodeContent rendered inside the component.
labels{ close?: string; handle?: string }Overrides for the component’s user-visible strings (i18n).
classNamestringAdditional CSS class names merged onto the root element.

Design tokens

When to use

When not to use

How to build an accessible BottomSheet in React →

Examples

Basic

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

Custom detents

Snaps between three detents by dragging the handle; opens at half height.

<BottomSheet defaultOpen snapPoints={[0.25, 0.5, 0.9]} defaultSnap={1} title="Nearby">
  <PlacesList />
</BottomSheet>

Related components

← Back to docs