‹ components

Sheet

stablev1.0.0·open in canvas

Bottom sheet chrome — backdrop, grab handle, drag-to-dismiss, pinned footer. The base for CommentThread / Onboarding.

Installnpx shadcn add @cids/sheet
Live demo

Motion · tap to replay

honors reduced-motion

Slide-up on open, slide-down on close; drag follows 1:1 then settles. Reduced-motion: the global reset collapses the slide/settle.

Brand chip remounts on tap · highlighted tokens are named in this component's doc · spring is budgeted to human feedback only.

import { Sheet } from "@/design-system";

const [open, setOpen] = useState(false);

<Sheet open={open} onOpenChange={setOpen} title="Details"
  footer={<SubmitRow />}>
  <p>Scrolling body…</p>
</Sheet>

Tokens · live

Resolves in the active theme — flip the toggle above to verify.

States · from doc

Parsed from the doc. Interact with the live demo for hover/active.

**Open / closed** — Radix `data-[state]`slide + fade.

Bottom sheet chrome — backdrop, grab handle, drag-to-dismiss, pinned footer. The base for CommentThread / Onboarding.

Anatomy

      (backdrop: black/50 + blur)
┌ surface, rounded-t-12, max-w-430, max-h-85dvh ┐
│           ▭ grab handle (32×4, outline)         │ ← drag region
│ Title                                      ×   │
├────────────────────────────────────────────────┤
│ children (scrolls, min-h-0 flex-1)             │
├────────────────────────────────────────────────┤
│ footer (pinned, border-t, safe-area pad)       │
└──────────────────────────────────────────────────┘

Props

PropTypeDefaultNotes
openboolean—Controlled visibility.
onOpenChange(open: boolean) => void—Fired by backdrop tap, Escape, close button, and drag-dismiss.
titleReactNode—Header + accessible Dialog.Title.
childrenReactNode—Scrolling body.
footerReactNode—Optional pinned-bottom region.
classNamestring—Extra classes on the panel.

Motion

Slide-up on open, slide-down on close; drag follows 1:1 then settles. Reduced-motion: the global reset collapses the slide/settle.

A11y

Self-contained: copy the folder into any Tailwind+React app, or use the install command above. Docs and this page render the same file on disk — they cannot drift.