Sheet
A hand-drawn panel that slides in from any edge.
Sides
With footer actions
Without close button
Installation
Add Sheet with the shadcn CLI.
npx shadcn@latest add https://sketchcn.chuwii.com/r/sheet.json
Examples
Sheets holding forms, and sheets you open yourself.
Form in a sheet
import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input";
import { Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger } from "@/components/ui/sheet";
import { Textarea } from "@/components/ui/textarea";

export function EditSketchSheet() {
  return (
    <Sheet>
      <SheetTrigger render={<Button>Edit details</Button>} />
      <SheetContent>
        <SheetHeader>
          <SheetTitle>Edit details</SheetTitle>
          <SheetDescription>Update the sketch without leaving the canvas.</SheetDescription>
        </SheetHeader>
        <div className="flex flex-col gap-3 px-4">
          <Input placeholder="Sketch name" />
          <Textarea placeholder="What is it for?" />
        </div>
        <SheetFooter>
          <SheetClose render={<Button variant="outline" />}>Cancel</SheetClose>
          <Button>Save changes</Button>
        </SheetFooter>
      </SheetContent>
    </Sheet>
  );
}
Controlled open state
import { Button } from "@/components/ui/button";
import { Sheet, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle } from "@/components/ui/sheet";

export function FiltersSheet() {
  const [open, setOpen] = useState(false);

  return (
    <>
      <Button variant="outline" onClick={() => setOpen(true)}>
        Filters
      </Button>
      <Sheet open={open} onOpenChange={setOpen}>
        <SheetContent side="left">
          <SheetHeader>
            <SheetTitle>Filters</SheetTitle>
            <SheetDescription>Narrow the sketches you are looking at.</SheetDescription>
          </SheetHeader>
          <SheetFooter>
            <Button onClick={() => setOpen(false)}>Apply</Button>
          </SheetFooter>
        </SheetContent>
      </Sheet>
    </>
  );
}