Dialog

A window overlaid on the primary content for focused tasks. Default width is max-w-sm (24rem). For irreversible confirmations, prefer Alert Dialog.

Basic

Edit profile with title, description, fields, and footer actions.

Installation

CLI
npx @sonojs/ui@latest add dialog
Also needsnpx @sonojs/ui@latest add button && npm i lucide-react

Composition

structure
Dialog
├── DialogTrigger
└── DialogContent
    ├── DialogHeader
    │   ├── DialogTitle
    │   └── DialogDescription
    └── DialogFooter

Usage

dialog.tsx
import { Button } from "@/components/ui/button"
import {
  Dialog,
  DialogClose,
  DialogContent,
  DialogDescription,
  DialogFooter,
  DialogHeader,
  DialogTitle,
  DialogTrigger,
} from "@/components/ui/dialog"
import { Input } from "@/components/ui/input"
import { Label } from "@/components/ui/label"

export function Example() {
  return (
    <Dialog>
      <DialogTrigger asChild>
        <Button variant="outline">Edit Profile</Button>
      </DialogTrigger>
      <DialogContent>
        <DialogHeader>
          <DialogTitle>Edit profile</DialogTitle>
          <DialogDescription>
            Make changes to your profile here. Click save when you are done.
          </DialogDescription>
        </DialogHeader>
        <div className="grid gap-4">
          <div className="grid gap-2">
            <Label htmlFor="name">Name</Label>
            <Input id="name" defaultValue="Ava Solstice" />
          </div>
          <div className="grid gap-2">
            <Label htmlFor="username">Username</Label>
            <Input id="username" defaultValue="@avasol" />
          </div>
        </div>
        <DialogFooter>
          <DialogClose asChild>
            <Button variant="outline">Cancel</Button>
          </DialogClose>
          <Button type="submit">Save changes</Button>
        </DialogFooter>
      </DialogContent>
    </Dialog>
  )
}

Props

PropTypeDefaultDescription
showCloseButtonbooleantrueOn DialogContent — corner X. On DialogFooter — optional outline Close.
size"default" · "sm""default"On DialogContent — default 24rem (`max-w-sm`); `sm` → 20rem.
asChildbooleanfalseOn DialogTrigger / DialogClose — merge props into the child.
open / onOpenChangeboolean / (open: boolean) => void—On Dialog — controlled open state.