Skip to content

Sheet

Sheet

<SheetTrigger>
<Button>Filters</Button>
<Sheet side="end" title="Filters">
{/* form */}
</Sheet>
</SheetTrigger>

Install: @helixui/core

import { Sheet, SheetTrigger } from '@helixui/core'

status: stable · since: 0.1.0

Tags: drawer, side-panel, mobile, modal

Anatomy

┌─ overlay ────────────────────┐
│ ┌─ Sheet (side=start) ──┐ │
│ │ content │ │ ← slides in from left/right/top/bottom
│ │ │ │
│ └───────────────────────┘ │
└──────────────────────────────┘

Layout

  • displayportal
  • widthcontent
  • heightfill
  • intrinsicSizefills 1 dimension; size by side“
  • stackablefalse
  • fullBleedtrue

Visual

A panel that slides in from the chosen edge over a dimmed overlay. Common sides are start (drawer), end (right inspector), bottom (mobile filters).

Props

NameTypeDefaultDescription
side'start' | 'end' | 'top' | 'bottom'endEdge the sheet enters from.
titleReactNodeSheet title.
descriptionReactNodeLead paragraph.
isDismissablebooleantrueClose via overlay click and Escape.
isOpenbooleanControlled open state.
defaultOpenbooleanfalseUncontrolled initial open.
onOpenChange(open: boolean) => voidOpen change handler.

Slots

  • SheetTrigger child — the trigger button
  • Sheet children — render-prop receives { close }

Tokens used

color.bg.surface.default, color.text.primary, color.text.secondary, radius.xl, space.4, space.6, font.family.sans, font.size.sm, font.size.xl, font.weight.semibold, shadow.lg

Accessibility

Role: dialog

Notes

  • Same focus trapping and dismiss semantics as Dialog. The visual difference is the slide-in animation from a screen edge.
  • On bottom and top sides, the sheet has rounded corners only on the entering edge.

Composes with

ComponentRelationNote
SidebarchildUsed as the mobile drawer body.
DialogalternativeDialog for centered tasks; Sheet for edge-anchored.
ActionSheetalternativeActionSheet is the iOS-style action menu.
Popoversibling

Prompt examples

These are the AI prompt → JSX mappings used by the helixui prompt DSL and integrations like Cursor / Claude Code.

mobile sidebar drawer

“left drawer with the main nav”

<Sheet side="start" isOpen={open} onOpenChange={setOpen}>
<Sidebar>...</Sidebar>
</Sheet>

filter panel

“right side filter sheet”

<SheetTrigger>
<Button>Filter</Button>
<Sheet side="end"></Sheet>
</SheetTrigger>