Command Palette

Search for a command...

Sheet

Extends the Dialog component to display content that complements the main content of the screen.

import { styled } from "styled-system/jsx";
import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input";
import { Label } from "@/components/ui/label";
import {
  Sheet,
  SheetClose,
  SheetContent,
  SheetDescription,
  SheetFooter,
  SheetHeader,
  SheetTitle,
  SheetTrigger,
} from "@/components/ui/sheet";

export default function SheetDemo() {
  return (
    <Sheet>
      <SheetTrigger asChild>
        <Button variant="outline">Open</Button>
      </SheetTrigger>
      <SheetContent>
        <SheetHeader>
          <SheetTitle>Edit profile</SheetTitle>
          <SheetDescription>
            Make changes to your profile here. Click save when you&apos;re done.
          </SheetDescription>
        </SheetHeader>
        <styled.div css={{ display: "grid", flex: "1", gridAutoRows: "min", gap: "6", px: "4" }}>
          <styled.div css={{ display: "grid", gap: "3" }}>
            <Label htmlFor="drawer-demo-name">Name</Label>
            <Input id="drawer-demo-name" defaultValue="Ahmad Miftachul Hidayat" />
          </styled.div>
          <styled.div css={{ display: "grid", gap: "3" }}>
            <Label htmlFor="drawer-demo-username">Username</Label>
            <Input id="drawer-demo-username" defaultValue="amiftachulh" />
          </styled.div>
        </styled.div>
        <SheetFooter>
          <Button type="submit">Save changes</Button>
          <SheetClose asChild>
            <Button variant="outline">Close</Button>
          </SheetClose>
        </SheetFooter>
      </SheetContent>
    </Sheet>
  );
}

Installation

npx nore-ui-cli@latest add sheet

Usage

import { Sheet } from "@/components/ui/sheet";
<Sheet>
  <SheetTrigger>Open</SheetTrigger>
  <SheetContent>
    <SheetHeader>
      <SheetTitle>Are you absolutely sure?</SheetTitle>
      <SheetDescription>
        This action cannot be undone. This will permanently delete your account and remove your data
        from our servers.
      </SheetDescription>
    </SheetHeader>
  </SheetContent>
</Sheet>

Examples

Side

import { styled } from "styled-system/jsx";
import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input";
import { Label } from "@/components/ui/label";
import {
  Sheet,
  SheetClose,
  SheetContent,
  SheetDescription,
  SheetFooter,
  SheetHeader,
  SheetTitle,
  SheetTrigger,
} from "@/components/ui/sheet";

const SIDE = ["top", "bottom", "left", "right"] as const;

export default function SheetSide() {
  return (
    <styled.div css={{ display: "flex", alignItems: "center", gap: "4" }}>
      {SIDE.map((side) => (
        <Sheet key={side} side={side}>
          <SheetTrigger asChild>
            <Button variant="outline">{side}</Button>
          </SheetTrigger>
          <SheetContent>
            <SheetHeader>
              <SheetTitle>Edit profile</SheetTitle>
              <SheetDescription>
                Make changes to your profile here. Click save when you&apos;re done.
              </SheetDescription>
            </SheetHeader>
            <styled.div
              css={{ display: "grid", flex: "1", gridAutoRows: "min", gap: "6", px: "4" }}
            >
              <styled.div css={{ display: "grid", gap: "3" }}>
                <Label htmlFor="drawer-demo-name">Name</Label>
                <Input id="drawer-demo-name" defaultValue="Ahmad Miftachul Hidayat" />
              </styled.div>
              <styled.div css={{ display: "grid", gap: "3" }}>
                <Label htmlFor="drawer-demo-username">Username</Label>
                <Input id="drawer-demo-username" defaultValue="amiftachulh" />
              </styled.div>
            </styled.div>
            <SheetFooter>
              <Button type="submit">Save changes</Button>
              <SheetClose asChild>
                <Button variant="outline">Close</Button>
              </SheetClose>
            </SheetFooter>
          </SheetContent>
        </Sheet>
      ))}
    </styled.div>
  );
}

Size

You can adjust the size of the drawer using css prop on the SheetContent component.

<Sheet>
  <SheetTrigger>Open</SheetTrigger>
  <SheetContent css={{ w: "400px", sm: { w: "540px" } }}>
    <SheetHeader>
      <SheetTitle>Are you absolutely sure?</SheetTitle>
      <SheetDescription>
        This action cannot be undone. This will permanently delete your account and remove your data
        from our servers.
      </SheetDescription>
    </SheetHeader>
  </SheetContent>
</Sheet>