import {
DesignDialog,
DesignDialogContent,
DesignDialogHeader,
DesignDialogTitle,
DesignDialogDescription,
DesignDialogBody,
DesignDialogFooter,
DesignDialogTrigger,
DesignDialogClose,
} from "@/components/ui/design-dialog";
import { DesignButton } from "@/components/ui/design-button";Main container for dialog content
| Prop | Type | Default | Description |
|---|---|---|---|
size | "sm" | "default" | "lg" | "default" | Dialog width: sm=512px, default=640px, lg=768px |
preventOutsideClose | boolean | false | Prevent closing when clicking outside the dialog |
className | string | - | Additional CSS classes |
Use these components to build dialog content
| Prop | Type | Default | Description |
|---|---|---|---|
DesignDialog | Container | - | Root component, wraps everything. Accepts open/onOpenChange for controlled mode |
DesignDialogTrigger | Trigger | - | Button/element that opens the dialog. Use asChild with DesignButton |
DesignDialogContent | Content | - | The modal content container with size and preventOutsideClose props |
DesignDialogHeader | Section | - | Contains Title and Description, with bottom padding |
DesignDialogTitle | Text | - | Dialog title (required for accessibility) |
DesignDialogDescription | Text | - | Optional description below title |
DesignDialogBody | Section | - | Scrollable content area with max-height |
DesignDialogFooter | Section | - | Action buttons area, right-aligned on desktop |
DesignDialogClose | Action | - | Closes the dialog when clicked. Use asChild with DesignButton |
<DesignDialog>
<DesignDialogTrigger asChild>
<DesignButton variant="primary">Delete</DesignButton>
</DesignDialogTrigger>
<DesignDialogContent size="sm">
<DesignDialogHeader>
<DesignDialogTitle>Are you sure?</DesignDialogTitle>
<DesignDialogDescription>
This action cannot be undone.
</DesignDialogDescription>
</DesignDialogHeader>
<DesignDialogFooter>
<DesignDialogClose asChild>
<DesignButton variant="tertiary" size="large">Cancel</DesignButton>
</DesignDialogClose>
<DesignDialogClose asChild>
<DesignButton variant="primary" size="large">Delete</DesignButton>
</DesignDialogClose>
</DesignDialogFooter>
</DesignDialogContent>
</DesignDialog><DesignDialog>
<DesignDialogTrigger asChild>
<DesignButton variant="secondary">Create</DesignButton>
</DesignDialogTrigger>
<DesignDialogContent>
<DesignDialogHeader>
<DesignDialogTitle>Create New Item</DesignDialogTitle>
<DesignDialogDescription>
Fill in the details below
</DesignDialogDescription>
</DesignDialogHeader>
<DesignDialogBody>
<div className="flex flex-col gap-4">
<DesignInput label="Name" placeholder="Enter name..." />
<DesignInput label="Description" placeholder="Enter description..." />
</div>
</DesignDialogBody>
<DesignDialogFooter>
<DesignDialogClose asChild>
<DesignButton variant="tertiary" size="large">Cancel</DesignButton>
</DesignDialogClose>
<DesignButton variant="primary" size="large">Create</DesignButton>
</DesignDialogFooter>
</DesignDialogContent>
</DesignDialog>const [open, setOpen] = useState(false);
<DesignDialog open={open} onOpenChange={setOpen}>
<DesignDialogContent>
<DesignDialogHeader>
<DesignDialogTitle>Controlled Dialog</DesignDialogTitle>
</DesignDialogHeader>
<DesignDialogBody>
<p>State controlled externally</p>
</DesignDialogBody>
<DesignDialogFooter>
<DesignButton variant="tertiary" size="large" onClick={() => setOpen(false)}>
Close
</DesignButton>
</DesignDialogFooter>
</DesignDialogContent>
</DesignDialog>
<DesignButton onClick={() => setOpen(true)}>Open</DesignButton><DesignDialogContent preventOutsideClose>
<DesignDialogHeader>
<DesignDialogTitle>Important Action</DesignDialogTitle>
<DesignDialogDescription>
Click outside won't close. Must use buttons.
</DesignDialogDescription>
</DesignDialogHeader>
<DesignDialogFooter>
<DesignDialogClose asChild>
<DesignButton variant="tertiary" size="large">Cancel</DesignButton>
</DesignDialogClose>
<DesignDialogClose asChild>
<DesignButton variant="primary" size="large">Confirm</DesignButton>
</DesignDialogClose>
</DesignDialogFooter>
</DesignDialogContent>Use size="sm", no Body needed, just Header + Footer
<DesignDialogContent size="sm">
<DesignDialogHeader>
<DesignDialogTitle>Delete this item?</DesignDialogTitle>
<DesignDialogDescription>This cannot be undone.</DesignDialogDescription>
</DesignDialogHeader>
<DesignDialogFooter>
<DesignDialogClose asChild>
<DesignButton variant="tertiary" size="large">Cancel</DesignButton>
</DesignDialogClose>
<DesignDialogClose asChild>
<DesignButton variant="primary" size="large">Delete</DesignButton>
</DesignDialogClose>
</DesignDialogFooter>
</DesignDialogContent>Use default size, Body for form content
<DesignDialogContent>
<DesignDialogHeader>
<DesignDialogTitle>Settings</DesignDialogTitle>
</DesignDialogHeader>
<DesignDialogBody>
<div className="flex flex-col gap-4">
<DesignInput label="Username" />
<DesignInput label="Email" />
</div>
</DesignDialogBody>
<DesignDialogFooter>...</DesignDialogFooter>
</DesignDialogContent>Use size="lg", Body will scroll automatically
<DesignDialogContent size="lg">
<DesignDialogHeader>
<DesignDialogTitle>Terms of Service</DesignDialogTitle>
</DesignDialogHeader>
<DesignDialogBody>
{/* Long content here - will scroll */}
</DesignDialogBody>
<DesignDialogFooter>
<DesignDialogClose asChild>
<DesignButton variant="tertiary" size="large">Decline</DesignButton>
</DesignDialogClose>
<DesignDialogClose asChild>
<DesignButton variant="primary" size="large">Accept</DesignButton>
</DesignDialogClose>
</DesignDialogFooter>
</DesignDialogContent>Always use size="large" for footer buttons
<DesignDialogFooter>
<DesignButton variant="tertiary" size="large">Cancel</DesignButton>
<DesignButton variant="primary" size="large">Confirm</DesignButton>
</DesignDialogFooter>Use asChild with DesignDialogTrigger and DesignDialogClose
<DesignDialogTrigger asChild>
<DesignButton>Open</DesignButton>
</DesignDialogTrigger>
<DesignDialogClose asChild>
<DesignButton variant="tertiary" size="large">Cancel</DesignButton>
</DesignDialogClose>Place Cancel button first, primary action last
<DesignDialogFooter>
<DesignDialogClose asChild>
<DesignButton variant="tertiary" size="large">Cancel</DesignButton>
</DesignDialogClose>
<DesignDialogClose asChild>
<DesignButton variant="primary" size="large">Save</DesignButton>
</DesignDialogClose>
</DesignDialogFooter>Don't use default/small size buttons in footer
// β Bad - wrong button size
<DesignDialogFooter>
<DesignButton variant="tertiary">Cancel</DesignButton>
</DesignDialogFooter>
// β
Good - use size="large"
<DesignDialogFooter>
<DesignButton variant="tertiary" size="large">Cancel</DesignButton>
</DesignDialogFooter>Don't forget asChild on Trigger and Close
// β Bad - missing asChild, creates nested buttons
<DesignDialogTrigger>
<DesignButton>Open</DesignButton>
</DesignDialogTrigger>
// β
Good - asChild merges props
<DesignDialogTrigger asChild>
<DesignButton>Open</DesignButton>
</DesignDialogTrigger>Don't omit DesignDialogTitle (required for accessibility)
// β Bad - no title
<DesignDialogContent>
<DesignDialogBody>Content</DesignDialogBody>
</DesignDialogContent>
// β
Good - always include title
<DesignDialogContent>
<DesignDialogHeader>
<DesignDialogTitle>Dialog Title</DesignDialogTitle>
</DesignDialogHeader>
<DesignDialogBody>Content</DesignDialogBody>
</DesignDialogContent>Interactive examples showing all variants
For simple confirmations
<DesignDialogContent size="sm">...</DesignDialogContent>For forms and general use
<DesignDialogContent>...</DesignDialogContent>For complex content
<DesignDialogContent size="lg">...</DesignDialogContent>Must use buttons to close
<DesignDialogContent preventOutsideClose>...</DesignDialogContent>Dialog containing form inputs
<DesignDialogBody>
<DesignInput label="Name" />
</DesignDialogBody>Programmatic control
const [open, setOpen] = useState(false);
<DesignDialog open={open} onOpenChange={setOpen}>...