Sheet

Bottom sheet overlay — mobile filters and short forms with drag handle.

Preview

Live

<div class="sheet-root is-open" data-open="true">
  <button type="button" class="sheet-backdrop" aria-label="Close sheet"></button>
  <div class="sheet-dialog" role="dialog" aria-modal="true" aria-labelledby="sheet-title" tabindex="-1">
    <div class="sheet-handle sheet-drag" aria-hidden="true"></div>
    <div class="sheet-head sheet-drag">
      <h2 class="sheet-title" id="sheet-title">Quick filters</h2>
      <button type="button" class="sheet-close" aria-label="Close">…</button>
    </div>
    <div class="sheet-body">…</div>
  </div>
</div>

Variants

Handle

Decorative drag affordance — aria-hidden.

Head + close

Title row with icon close control.

Details

Accessibility

  • Dialog needs role="dialog", aria-modal, and a labelled title.
  • Backdrop and close need accessible names (backdropLabel / label).
  • Handle is decorative; do not rely on drag alone for dismissal — provide Close + Escape.
  • Escape closes (React Sheet); restore focus to the opener in the host app.

API

HTML classes

Class Description
.sheet-root / .is-open Fixed overlay root.
.sheet-backdrop Dismiss click target.
.sheet-dialog Bottom sheet panel.
.sheet-handle / .sheet-drag Drag affordance.
.sheet-head / .sheet-title / .sheet-close Header chrome.
.sheet-body Scrollable body.

React props

From src/core/Sheet.tsx — compound Sheet* components.

Prop Type Default Description
open / onOpenChange boolean / fn Sheet controlled state.
backdropLabel string Required accessible name for backdrop.
labelledBy / label string Dialog accessible name.
label string SheetClose aria-label (required).