Dialog

A modal window for displaying content.

dialog-demo.tsx
import { Button } from "@/components/ui/button"
import {
	Dialog,
	DialogContent,
	DialogDescription,
	DialogFooter,
	DialogHeader,
	DialogTitle,
	DialogTrigger,
} from "@/components/ui/dialog"
 
export function DialogDemo() {
	return (
		<Dialog>
			<DialogTrigger
				render={(props) => <Button {...props}>Privacy Policy</Button>}
			/>
			<DialogContent>
				<DialogHeader>
					<DialogTitle>Privacy Policy</DialogTitle>
					<DialogDescription>
						Please read our privacy policy carefully.
					</DialogDescription>
				</DialogHeader>
				<div className="max-h-80 overflow-y-auto text-sm text-foreground">
					Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed
					ultricies, odio quis blandit vestibulum, orci elit suscipit urna, at
					lobortis arcu enim vel purus. Maecenas luctus sem dui, lobortis
					dignissim enim consequat in. Nullam a volutpat purus. Aenean
					pellentesque eros nec rutrum suscipit. Fusce ac lectus volutpat,
					feugiat nulla et, suscipit dui. Pellentesque habitant morbi tristique
					senectus et netus et malesuada fames ac turpis egestas. Ut maximus,
					risus et convallis placerat, risus urna feugiat neque, in vestibulum
					leo arcu vitae justo. Duis magna mi, maximus at neque sed, tempor
					congue ligula. In iaculis metus nec euismod egestas. Donec id
					porttitor nulla. Donec feugiat iaculis lacus, ut elementum dui
					faucibus sed. Sed ut ipsum non tellus dignissim accumsan. Vivamus
					luctus malesuada lacus sed dictum.
					<br />
					<br />
					Sed consectetur nibh mollis, ornare magna et, dictum tellus. Nam
					viverra dui a enim iaculis, sed blandit orci consectetur. Maecenas et
					nisi eleifend velit pretium eleifend sit amet eget nisl. Vestibulum
					eget ipsum semper purus pulvinar iaculis. Sed ut odio eu felis
					porttitor ultrices eu sed odio. Nullam lorem sapien, pellentesque
					convallis libero vel, tempus accumsan nisi. Morbi efficitur ex vitae
					felis luctus cursus. Suspendisse nibh neque, gravida sed elementum
					ullamcorper, gravida in nisi. Donec et luctus metus. Fusce sed est
					dictum, imperdiet nisi eu, suscipit odio. In id enim at tortor
					malesuada vulputate eu eu sem. Mauris blandit faucibus euismod.
					<br />
					<br />
					Curabitur quam tortor, tristique euismod finibus viverra, bibendum sit
					amet nisl. Nulla lobortis pharetra mauris, ac semper urna tempor et.
					Maecenas enim magna, suscipit nec metus id, ornare pulvinar dolor.
					Cras rhoncus ante sit amet tempus luctus. Donec in nisl a dolor auctor
					tincidunt. Cras at arcu tortor. Pellentesque ante felis, convallis sit
					amet erat id, consectetur consequat sapien. Aliquam volutpat velit in
					est bibendum, vestibulum commodo leo interdum. Integer sodales ex eu
					tempus faucibus. Vestibulum ultricies erat vel leo accumsan posuere.
					Cras commodo felis vitae lacus suscipit, in tristique lectus
					venenatis. Sed et nibh urna. Praesent vitae eleifend turpis. Fusce sit
					amet pretium lorem, in tempus elit. Etiam at ornare est. Aenean felis
					arcu, fermentum scelerisque nibh at, lacinia sagittis neque.
				</div>
				<DialogFooter>
					<Button className="w-full">Accept</Button>
				</DialogFooter>
			</DialogContent>
		</Dialog>
	)
}

Installation

npx shadcn@latest add https://9ui.dev/r/dialog

Usage

Imports
import {
	Dialog,
	DialogClose,
	DialogContent,
	DialogDescription,
	DialogFooter,
	DialogHeader,
	DialogTitle,
	DialogTrigger,
} from "@/components/ui/dialog"
Anatomy
<Dialog>
	<DialogTrigger />
	<DialogContent>
		<DialogHeader>
			<DialogTitle />
			<DialogDescription />
		</DialogHeader>
		<DialogFooter>
			<DialogClose />
		</DialogFooter>
	</DialogContent>
</Dialog>

Examples

Nested Dialogs

dialog-nested.tsx
import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"
import { Button } from "@/components/ui/button"
import {
	Dialog,
	DialogClose,
	DialogContent,
	DialogDescription,
	DialogFooter,
	DialogHeader,
	DialogTitle,
	DialogTrigger,
} from "@/components/ui/dialog"
 
export function DialogNested() {
	return (
		<Dialog>
			<DialogTrigger
				render={(props) => <Button {...props}>View Details</Button>}
			/>
			<DialogContent>
				<DialogHeader>
					<DialogTitle>Profile</DialogTitle>
					<DialogDescription>
						View and edit your profile details.
					</DialogDescription>
				</DialogHeader>
				<div>
					<div className="flex items-center gap-4">
						<Avatar>
							<AvatarImage src="/avatars/bora.png" />
							<AvatarFallback>BB</AvatarFallback>
						</Avatar>
						<span className="text-foreground">Bora Baloglu</span>
					</div>
				</div>
				<DialogFooter>
					<Dialog>
						<DialogTrigger
							render={(props) => (
								<Button {...props} variant="outline">
									Edit
								</Button>
							)}
						/>
						<DialogContent>
							<DialogTitle>Edit</DialogTitle>
							<DialogDescription>
								Edit the details of the item
							</DialogDescription>
							<DialogFooter>
								<DialogClose
									render={(props) => (
										<Button {...props} variant="ghost">
											Cancel
										</Button>
									)}
								/>
								<Button>Save</Button>
							</DialogFooter>
						</DialogContent>
					</Dialog>
				</DialogFooter>
			</DialogContent>
		</Dialog>
	)
}