Sheet

A panel that slides up from the bottom of the screen for extra actions, details or a short form.
Stable
Web
iOS
Android
@advui/core
Source

Short form

Installation

pnpm
pnpm add @advui/core
npm
npm install @advui/core

Usage

import { Button, Sheet } from '@advui/core'

<Sheet>
  <Sheet.Trigger>
    <Button variant="outline">Edit profile</Button>
  </Sheet.Trigger>
  <Sheet.Content>
    <Sheet.Header>
      <Sheet.Title>Edit profile</Sheet.Title>
      <Sheet.Description>Visible to your team.</Sheet.Description>
    </Sheet.Header>
    …
    <Sheet.Footer>
      <Sheet.Close>
        <Button variant="outline">Cancel</Button>
      </Sheet.Close>
      <Button>Save</Button>
    </Sheet.Footer>
  </Sheet.Content>
</Sheet>

Examples

Snap points and scrolling

Opens at 85% of the screen and snaps to half height when dragged down.

API reference

Sheet

PropTypeDefaultDescription
openboolean—Open state.
defaultOpenboolean—Starting `open` when uncontrolled.
onOpenChange(open: boolean) => void—Called when the sheet opens or closes.

Sheet.Trigger

PropTypeDefaultDescription
children requiredReactElement—One pressable element, usually a Button. It toggles the sheet.

Sheet.Content

PropTypeDefaultDescription
snapPointsnumber[]—Heights in % of the screen, largest first (e.g. `[85, 50]`). Default: fit the content.
dismissiblebooleantrueClose on swipe down and on a press outside. Escape always closes on web.
hideCloseButtonbooleanfalseHide the × button. Keep another way to close.

Sheet.Title

PropTypeDefaultDescription
children requiredReactNode—Heading that names the sheet for screen readers.

Sheet.Description

PropTypeDefaultDescription
childrenReactNode—Supporting text.

Sheet.Close

PropTypeDefaultDescription
children requiredReactElement—One pressable element that closes the sheet.

Sheet.ScrollView

Scrolls long content; use it with `snapPoints`.

Sheet.Header

Stacks the title and description at the top.

Sheet.Footer

A row of actions at the bottom.

Accessibility

  • The panel is a modal dialog named by Sheet.Title and described by Sheet.Description; the trigger exposes aria-haspopup="dialog" and aria-expanded.
  • On web focus moves into the sheet, stays inside while it is open and returns to the trigger when it closes.
  • A labelled × button closes it, so nobody has to swipe. Escape closes it on web.
  • On iOS the sheet is a modal view for VoiceOver, which keeps focus inside it.
Keyboard interactions
KeyAction
Enter / SpaceOpens the sheet from its trigger.
Tab / Shift + TabMoves focus through the sheet.
EscCloses the sheet and returns focus to the trigger.

Responsive behavior

Full width on phones. On wider screens the content is centred and capped at $168 (672px). Footer buttons stack below the sm breakpoint.

Platform notes

Web
Slides up over a dimmed page and locks page scroll.
iOS
Swipe down on the handle or content to close.
Android
Swipe down or use the back gesture to close.
Since v0.2.0Last updated Nov 2, 2026Edit this page on GitHub