Sheet

A slide-out panel that can appear from any edge of the screen.

$ npx @beaket/ui add sheet
Source
import { useState } from "react";

import { Button } from "@/components/ui/button";

import { Sheet } from "@/components/ui/sheet";

const args = {
  trigger: <Button>Open Sheet</Button>,
  children: (
    <>
      <Sheet.Header>
        <Sheet.Title>Sheet Title</Sheet.Title>
        <Sheet.Description>
          This is a sheet description that provides additional context.
        </Sheet.Description>
      </Sheet.Header>
      <div className="py-4">
        <p className="text-fg-muted text-sm">Sheet content goes here.</p>
      </div>
      <Sheet.Footer>
        <Sheet.Close>
          <Button variant="outline">Cancel</Button>
        </Sheet.Close>
        <Button>Save</Button>
      </Sheet.Footer>
    </>
  ),
};

export default function Example() {
  return (
    <div className="flex h-full w-full items-center justify-center">
      <Sheet {...args} />
    </div>
  );
}

Examples

All States

Source
import { useState } from "react";

import { Button } from "@/components/ui/button";

import { Sheet } from "@/components/ui/sheet";

export default () => (
  <div className="flex flex-wrap gap-4">
    <Sheet trigger={<Button>Right (Default)</Button>}>
      <Sheet.Header>
        <Sheet.Title>Right Sheet</Sheet.Title>
        <Sheet.Description>Default position.</Sheet.Description>
      </Sheet.Header>
      <Sheet.Footer>
        <Sheet.Close>
          <Button variant="outline">Close</Button>
        </Sheet.Close>
      </Sheet.Footer>
    </Sheet>

    <Sheet side="left" trigger={<Button variant="outline">Left</Button>}>
      <Sheet.Header>
        <Sheet.Title>Left Sheet</Sheet.Title>
        <Sheet.Description>Slides from left.</Sheet.Description>
      </Sheet.Header>
      <Sheet.Footer>
        <Sheet.Close>
          <Button variant="outline">Close</Button>
        </Sheet.Close>
      </Sheet.Footer>
    </Sheet>

    <Sheet side="top" trigger={<Button variant="outline">Top</Button>}>
      <Sheet.Header>
        <Sheet.Title>Top Sheet</Sheet.Title>
        <Sheet.Description>Slides from top.</Sheet.Description>
      </Sheet.Header>
      <Sheet.Footer>
        <Sheet.Close>
          <Button variant="outline">Close</Button>
        </Sheet.Close>
      </Sheet.Footer>
    </Sheet>

    <Sheet side="bottom" trigger={<Button variant="outline">Bottom</Button>}>
      <Sheet.Header>
        <Sheet.Title>Bottom Sheet</Sheet.Title>
        <Sheet.Description>Slides from bottom.</Sheet.Description>
      </Sheet.Header>
      <Sheet.Footer>
        <Sheet.Close>
          <Button variant="outline">Close</Button>
        </Sheet.Close>
      </Sheet.Footer>
    </Sheet>

    <Sheet preventClose trigger={<Button variant="outline">Prevent Close</Button>}>
      <Sheet.Header>
        <Sheet.Title>Cannot Dismiss</Sheet.Title>
        <Sheet.Description>Must use buttons to close.</Sheet.Description>
      </Sheet.Header>
      <Sheet.Footer>
        <Sheet.Close>
          <Button>Got it</Button>
        </Sheet.Close>
      </Sheet.Footer>
    </Sheet>

    <Sheet fullScreen side="left" trigger={<Button variant="success">Full Screen</Button>}>
      <Sheet.Header>
        <Sheet.Title>Full Screen Sheet</Sheet.Title>
        <Sheet.Description>Takes up full width.</Sheet.Description>
      </Sheet.Header>
      <Sheet.Footer>
        <Sheet.Close>
          <Button variant="outline">Close</Button>
        </Sheet.Close>
      </Sheet.Footer>
    </Sheet>
  </div>
);

Props

NameTypeDefaultDescription
sizeundefined | sm | md | lg | xl | fullmdWidth preset for left/right sheets; className can override it. Defaults to md.
closeLabelstring | undefinedClose sheetAccessible name of the built-in close button.
preventCloseboolean | undefinedfalseWhen true, prevents closing the sheet via ESC key or clicking outside.
hideCloseButtonboolean | undefinedfalseWhen true, hides the X close button in the top-right corner. Useful with preventClose when you want users to use only action buttons.
triggerReactNode—Element that opens the sheet when clicked. Optional - if not provided, sheet must be controlled via open/onOpenChange props.
childrenReactNode—Sheet content including Header, Description, Footer, and custom elements
openboolean | undefined—Controlled open state of the sheet
onOpenChange((open: boolean) => void) | undefined—Callback when the open state changes
sideundefined | left | right | top | bottomrightleft | right | top | bottom. Edge the sheet is anchored to
fullScreenboolean | undefinedfalseWhen true, the sheet takes up the full width (for left/right sides). Useful for mobile navigation menus.