<Dialog.Root>
<Dialog.Trigger render={(p) => <Button {...p}>Open Dialog</Button>} />
<Dialog className="p-8">
<div className="flex items-start justify-between gap-4 mb-4">
<Dialog.Title className="text-2xl font-semibold">
Modal Title
</Dialog.Title>
<Dialog.Close
aria-label="Close"
render={(props) => (
<Button
{...props}
variant="secondary"
shape="square"
icon={<X />}
/>
)}
/>
</div>
<Dialog.Description className="text-kumo-subtle">
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</Dialog.Description>
<div className="mt-8 flex justify-end gap-2">
<Button variant="secondary">Cancel</Button>
<Dialog.Close
render={(props) => (
<Button variant="destructive" {...props}>
Delete
</Button>
)}
/>
</div>
</Dialog>
</Dialog.Root> Installation
Barrel
import { Dialog } from "@cloudflare/kumo"; Granular
import { Dialog } from "@cloudflare/kumo/components/dialog"; Usage
import { Dialog, Button } from "@cloudflare/kumo";
export default function Example() {
return (
<Dialog.Root>
<Dialog.Trigger render={(p) => <Button {...p}>Open</Button>} />
<Dialog>
<Dialog.Title>Dialog Title</Dialog.Title>
<Dialog.Description>
Dialog content goes here.
</Dialog.Description>
<div className="flex justify-end gap-2 mt-4">
<Dialog.Close
render={(p) => (
<Button variant="secondary" {...p}>
Cancel
</Button>
)}
/>
</div>
</Dialog>
</Dialog.Root>
);
} Examples
Basic Dialog
<Dialog.Root>
<Dialog.Trigger render={(p) => <Button {...p}>Click me</Button>} />
<Dialog className="p-8">
<div className="flex items-start justify-between gap-4 mb-4">
<Dialog.Title className="text-2xl font-semibold">
Modal Title
</Dialog.Title>
<Dialog.Close
aria-label="Close"
render={(props) => (
<Button
{...props}
variant="secondary"
shape="square"
icon={<X />}
/>
)}
/>
</div>
<Dialog.Description className="text-kumo-subtle">
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</Dialog.Description>
</Dialog>
</Dialog.Root> Confirmation Dialog (Alert)
For confirmation dialogs that should not be dismissed by clicking outside (similar to an AlertDialog),
use disablePointerDismissal on Dialog.Root.
This ensures the user must explicitly choose an action.
<Dialog.Root disablePointerDismissal>
<Dialog.Trigger
render={(p) => (
<Button {...p} variant="destructive">Delete Project</Button>
)}
/>
<Dialog className="p-8">
<div className="mb-4 flex items-center gap-3">
<div className="flex h-10 w-10 items-center justify-center rounded-full bg-kumo-danger/20">
<Warning size={20} className="text-kumo-danger" />
</div>
<Dialog.Title className="text-xl font-semibold">
Delete Project?
</Dialog.Title>
</div>
<Dialog.Description className="text-kumo-subtle">
This action cannot be undone. This will permanently
delete the project and all associated data.
</Dialog.Description>
<div className="mt-8 flex justify-end gap-2">
<Dialog.Close
render={(props) => (
<Button variant="secondary" {...props}>Cancel</Button>
)}
/>
<Dialog.Close
render={(props) => (
<Button variant="destructive" {...props}>Delete</Button>
)}
/>
</div>
</Dialog>
</Dialog.Root> With Actions
<Dialog.Root>
<Dialog.Trigger render={(p) => <Button {...p}>Delete</Button>} />
<Dialog className="p-8">
<div className="flex items-start justify-between gap-4 mb-4">
<Dialog.Title className="text-2xl font-semibold">
Modal Title
</Dialog.Title>
<Dialog.Close
aria-label="Close"
render={(props) => (
<Button
{...props}
variant="secondary"
shape="square"
icon={<X />}
/>
)}
/>
</div>
<Dialog.Description className="text-kumo-subtle">
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</Dialog.Description>
<div className="mt-8 flex justify-end gap-2">
<Button variant="secondary">Cancel</Button>
<Dialog.Close
render={(props) => (
<Button variant="destructive" {...props}>
Delete
</Button>
)}
/>
</div>
</Dialog>
</Dialog.Root> API Reference
Dialog
The main dialog container that renders the modal overlay and popup.
| Prop | Type | Default | Description |
|---|---|---|---|
| className | string | - | Additional CSS classes merged via `cn()`. |
| children | ReactNode | - | Dialog content (typically Title, Description, Close, and action buttons). |
| size | "base" | "sm" | "lg" | "xl" | "base" | Dialog width. - `"sm"` — Small (min 288px) for simple confirmations - `"base"` — Default (min 384px) - `"lg"` — Large (min 512px) for complex content - `"xl"` — Extra large (min 768px) for detailed views |
Dialog.Root
Controls the open state of the dialog. Doesn't render its own HTML element.
| Prop | Type | Default |
|---|
No component-specific props. Accepts standard HTML attributes.
Dialog.Trigger
A button that opens the dialog when clicked.
| Prop | Type | Default |
|---|
No component-specific props. Accepts standard HTML attributes.
Dialog.Title
A heading that labels the dialog for accessibility.
| Prop | Type | Default |
|---|
No component-specific props. Accepts standard HTML attributes.
Dialog.Description
A paragraph providing additional context about the dialog.
| Prop | Type | Default |
|---|
No component-specific props. Accepts standard HTML attributes.
Dialog.Close
A button that closes the dialog when clicked.
| Prop | Type | Default |
|---|
No component-specific props. Accepts standard HTML attributes.