01
Overview
Bottom-anchored overlay panel optimised for mobile-style drawer interactions.
Choosing this component
- Action sheets and option pickers on mobile or touch-first layouts where a bottom-up slide feels natural.
- Quick-select panels (share, sort, filter) that need to feel native on small screens.
Choosing something else
- Desktop-first side panels — use
Drawerfor left/right edge placement. - Full-attention blocking dialogs — use
Modalwhen the user must act before continuing.
Related components
Drawer— side-anchored overlay for desktop-first supplementary content.Modal— blocking full-attention overlay.
Usage
02
When to use
Use when
- Presenting a focused task or set of actions that slides up from the bottom of the viewport on touch surfaces.
- Showing a contextual surface that should feel anchored to the screen edge rather than centered like a modal.
Avoid when
- Interrupting the user with a centered task or confirmation — use modal instead.
- Showing supplementary side navigation or filters — use drawer or popover.
03
Examples
Overflowing sheet
A bottom sheet with enough content to scroll.
04
Props
| Name | Type | Default | Required | Bindable | Description |
|---|---|---|---|---|---|
open | boolean | false | bind | Whether the sheet is open. Bindable via bind:open. | |
title | text | req | Accessible name for the sheet. Required for screen-reader labelling.
Rendered as a visible <h2> in the default header. When a custom
header snippet is provided without ariaLabelledBy, this text is
rendered in a visually-hidden <h2> as the accessible name fallback. | ||
triggerRef | HTMLElement | null | null | Optional reference to the element that opened the sheet. When supplied, focus returns to this element on close. When omitted, focus restores to the element that held focus before the sheet opened. | ||
ariaLabelledBy | text | Optional id of an element that names the sheet. When supplied, sheet
wires aria-labelledby to this id and renders no internal heading.
Use this when a custom header snippet has its own visible heading —
supply ariaLabelledBy pointing to that heading's id so the
visible and accessible names stay in sync. | |||
dragHandleVisible | boolean | false | When true, render a decorative drag handle above the header.
Swipe-to-close gesture is a stretch goal not implemented in MVP —
the handle is purely a visual affordance. Default false.
Named dragHandleVisible (not draggable) to avoid colliding with the
native HTML draggable attribute on the underlying <dialog>. | ||
header | snippet | Custom header. Falls back to a default header that renders title. | |||
children | snippet | req | Sheet body content. Required. | ||
footer | snippet | Optional footer (e.g. action buttons). |