Sheet

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

Install

npx @beaket/ui add sheet

Import

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

Examples

States

export const AllStates = () => (
  <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="stark">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
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.
triggerReactNodeElement that opens the sheet when clicked. Optional - if not provided, sheet must be controlled via open/onOpenChange props.
childrenReactNodeSheet content including Header, Description, Footer, and custom elements
openboolean | undefinedControlled open state of the sheet
onOpenChange((open: boolean) => void) | undefinedCallback when the open state changes
closeWhenunknownWhen this value becomes truthy, automatically close the sheet.
sideundefined | left | right | top | bottomrightleft | right | top | bottom. Side from which the sheet slides in
fullScreenboolean | undefinedfalseWhen true, the sheet takes up the full width (for left/right sides). Useful for mobile navigation menus.