Sheet

A slide-in side panel built on Radix UI Dialog. Identical to Dialog in behavior (focus trap, scroll lock, Escape key) but slides in from a screen edge. Available from all four sides.

Built on Radix UI.

  • ✓Slides from top, right, bottom, or left
  • ✓Same accessibility guarantees as Dialog
  • ✓Focus trap and scroll lock
  • ✓Controlled and uncontrolled
  • ✓Built on Dialog — shares all dialog API

import { Sheet }from "@aetherstack/ui"

sheet.tsx
import {
  Sheet,
  SheetContent,
  SheetDescription,
  SheetHeader,
  SheetTitle,
  SheetTrigger,
} from "@/components/ui/sheet"
import { Button } from "@/components/ui/button"

export function SheetDemo() {
  return (
    <Sheet>
      <SheetTrigger asChild>
        <Button variant="outline">Open Sheet</Button>
      </SheetTrigger>
      <SheetContent>
        <SheetHeader>
          <SheetTitle>Settings</SheetTitle>
          <SheetDescription>
            Make changes to your profile here.
          </SheetDescription>
        </SheetHeader>
        {/* sheet body content */}
      </SheetContent>
    </Sheet>
  )
}

Usage

All four sides

Use the side prop to control where the sheet slides in from.

Navigation drawer

Use a left Sheet as a responsive navigation drawer.

Settings panel

A right-side settings panel is common in SaaS dashboards.

Props

PropTypeDefaultDescription

Sheet (Root)

PropTypeDefaultDescription
openboolean—Controlled open state.
defaultOpenbooleanfalseUncontrolled initial open state.
onOpenChange(open: boolean) => void—Callback when open state changes.

SheetContent

PropTypeDefaultDescription
side"top" | "right" | "bottom" | "left""right"The edge the sheet slides in from.
classNamestring—Use sm:max-w-* to control sheet width.
onInteractOutside(e: Event) => void—Called when user clicks the overlay. Prevent default to disable close-on-click.

* Required props

Accessibility

  • →Same accessibility behavior as Dialog — focus trap, aria-modal, role='dialog'.
  • →SheetTitle provides the accessible name and is required.
  • →Escape key always closes the sheet unless prevented.
  • →For a navigation drawer, add role='navigation' and an aria-label to the nav element inside.