Get Started
Components
- Alert
- Avatar
- Badge
- Breadcrumb
- Button
- Button Group
- Calendar
- Card
- Carousel
- Chart
- Checkbox
- Checkbox Group
- ComboBox
- Command
- Data Table
- Date Field
- Date Picker
- Date Range Picker
- Dialog
- Disclosure
- Disclosure Group
- Drawer
- Empty
- Field
- File Trigger
- Form
- Grid List
- Hover Card
- Input
- Input Group
- Input OTP
- Item
- Kbd
- Label
- ListBox
- Menu
- Number Field
- Pagination
- Popover
- Progress Bar
- Radio Group
- Range Calendar
- Resizable
- Search Field
- Select
- Separator
- Sheet
- Sidebar
- Skeleton
- Slider
- Sonner
- Spinner
- Switch
- Table
- Tabs
- Tag Group
- Text Field
- Textarea
- Time Field
- Toast
- Toggle Button
- Toggle Button Group
- Tooltip
- Tree
- Typography
AI Elements
A window overlaid on either the primary window or another dialog window, rendering the content underneath inert.
import { Button } from "@/components/ui/button"
import {
Dialog,
DialogDescription,
DialogHeader,
DialogTitle,
DialogTrigger,
} from "@/components/ui/dialog"
import { Input } from "@/components/ui/input"
import { Label } from "@/components/ui/label"
import { Modal } from "@/components/ui/modal"
export function DialogDemo() {
return (
<DialogTrigger>
<Button variant="outline">Open Dialog</Button>
<Modal>
<Dialog className="sm:max-w-[425px]">
<form method="dialog" className="space-y-4">
<DialogHeader>
<DialogTitle>Edit profile</DialogTitle>
<DialogDescription>
Make changes to your profile here. Click save when you're
done.
</DialogDescription>
</DialogHeader>
<div className="grid gap-4">
<div className="grid gap-3">
<Label htmlFor="name-1">Name</Label>
<Input id="name-1" name="name" defaultValue="Pedro Duarte" />
</div>
<div className="grid gap-3">
<Label htmlFor="username-1">Username</Label>
<Input
id="username-1"
name="username"
defaultValue="@peduarte"
/>
</div>
</div>
<div className="flex justify-end gap-2">
<Button variant="outline" slot="close">
Cancel
</Button>
<Button type="submit">Save changes</Button>
</div>
</form>
</Dialog>
</Modal>
</DialogTrigger>
)
}
Installation
CLI
Manual
pnpmnpmyarnbunpnpm dlx shadcn@latest add dialog
Usage
import {
Dialog,
DialogContent,
DialogDescription,
DialogHeader,
DialogTitle,
DialogTrigger,
} from "@/components/ui/dialog"<Dialog>
<DialogTrigger>Open</DialogTrigger>
<DialogContent>
<DialogHeader>
<DialogTitle>Are you absolutely sure?</DialogTitle>
<DialogDescription>
This action cannot be undone. This will permanently delete your account
and remove your data from our servers.
</DialogDescription>
</DialogHeader>
</DialogContent>
</Dialog>Examples
Custom close button
Use the slot="close" prop to add a custom close button to the dialog.
import { Button } from "@/components/ui/button"
import {
Dialog,
DialogDescription,
DialogHeader,
DialogTitle,
DialogTrigger,
} from "@/components/ui/dialog"
import { Input } from "@/components/ui/input"
import { Label } from "@/components/ui/label"
import { Modal } from "@/components/ui/modal"
export function DialogCloseButton() {
return (
<DialogTrigger>
<Button variant="outline">Share</Button>
<Modal>
<Dialog className="sm:max-w-md">
<DialogHeader>
<DialogTitle>Share link</DialogTitle>
<DialogDescription>
Anyone who has this link will be able to view this.
</DialogDescription>
</DialogHeader>
<div className="flex items-center gap-2">
<div className="grid flex-1 gap-2">
<Label htmlFor="link" className="sr-only">
Link
</Label>
<Input
id="link"
defaultValue="https://ui.shadcn.com/docs/installation"
readOnly
/>
</div>
</div>
<div className="flex justify-start pt-4">
<Button type="button" variant="secondary" slot="close">
Close
</Button>
</div>
</Dialog>
</Modal>
</DialogTrigger>
)
}
Alert Dialog
You can compose an alert dialog using the Dialog component by setting role="alertdialog" on the Dialog and isDismissable={false} on the Modal to prevent dismissing by clicking outside or pressing Escape.
"use client"
import { Button } from "@/components/ui/button"
import {
Dialog,
DialogDescription,
DialogHeader,
DialogTitle,
DialogTrigger,
} from "@/components/ui/dialog"
import { Modal } from "@/components/ui/modal"
export function DialogAlert() {
return (
<DialogTrigger>
<Button variant="outline">Delete Account</Button>
<Modal isDismissable={false}>
<Dialog role="alertdialog" className="w-[450px]">
{({ close }) => (
<>
<DialogHeader>
<DialogTitle>Are you absolutely sure?</DialogTitle>
<DialogDescription>
This action cannot be undone. This will permanently delete
your account and remove your data from our servers.
</DialogDescription>
</DialogHeader>
<div className="mt-6 flex flex-col-reverse gap-2 sm:flex-row sm:justify-end">
<Button variant="outline" onPress={close}>
Cancel
</Button>
<Button variant="destructive" onPress={close}>
Delete Account
</Button>
</div>
</>
)}
</Dialog>
</Modal>
</DialogTrigger>
)
}
import { Button } from "@/components/ui/button"
import {
Dialog,
DialogDescription,
DialogHeader,
DialogTitle,
DialogTrigger,
} from "@/components/ui/dialog"
import { Modal } from "@/components/ui/modal"
export default function DialogAlert() {
return (
<DialogTrigger>
<Button variant="outline">Delete Account</Button>
<Modal isDismissable={false}>
<Dialog role="alertdialog">
{({ close }) => (
<>
<DialogHeader>
<DialogTitle>Are you absolutely sure?</DialogTitle>
<DialogDescription>
This action cannot be undone. This will permanently delete
your account and remove your data from our servers.
</DialogDescription>
</DialogHeader>
<div className="mt-6 flex flex-col-reverse gap-2 sm:flex-row sm:justify-end">
<Button variant="outline" onPress={close}>
Cancel
</Button>
<Button variant="destructive" onPress={close}>
Delete Account
</Button>
</div>
</>
)}
</Dialog>
</Modal>
</DialogTrigger>
)
}