Dialog
A popup that opens on top of the entire page.
API reference
Import the component and assemble its parts:
import { Dialog } from '@base-ui-components/react/dialog';
<Dialog.Root>
<Dialog.Trigger />
<Dialog.Portal>
<Dialog.Backdrop />
<Dialog.Popup>
<Dialog.Title />
<Dialog.Description />
<Dialog.Close />
</Dialog.Popup>
</Dialog.Portal>
</Dialog.Root>
Root
Groups all parts of the dialog. Doesn’t render its own HTML element.
Prop | Type | Default | |
---|---|---|---|
defaultOpen |
|
| |
open |
|
| |
onOpenChange |
|
| |
dismissible |
|
| |
modal |
|
|
Trigger
A button that opens the dialog.
Renders a <button>
element.
Prop | Type | Default | |
---|---|---|---|
className |
|
| |
render |
|
|
Attribute | Description | |
---|---|---|
data-popup-open | Present when the corresponding dialog is open. |
Portal
A portal element that moves the popup to a different part of the DOM.
By default, the portal element is appended to <body>
.
Prop | Type | Default | |
---|---|---|---|
container |
|
| |
keepMounted |
|
|
Backdrop
An overlay displayed beneath the popup.
Renders a <div>
element.
Prop | Type | Default | |
---|---|---|---|
className |
|
| |
keepMounted |
|
| |
render |
|
|
Attribute | Description | |
---|---|---|
data-open | Present when the dialog is open. | |
data-closed | Present when the dialog is closed. | |
data-starting-style | Present when the dialog is animating in. | |
data-ending-style | Present when the dialog is animating out. |
Popup
A container for the dialog contents.
Renders a <div>
element.
Prop | Type | Default | |
---|---|---|---|
initialFocus |
|
| |
finalFocus |
|
| |
className |
|
| |
keepMounted |
|
| |
render |
|
|
Attribute | Description | |
---|---|---|
data-open | Present when the dialog is open. | |
data-closed | Present when the dialog is closed. | |
data-has-nested-dialogs | Present when the dialog has other open dialogs nested within it. | |
data-nested | Present when the dialog is nested within another dialog. | |
data-starting-style | Present when the dialog is animating in. | |
data-ending-style | Present when the dialog is animating out. |
CSS Variable | Description | |
---|---|---|
--nested-dialogs | Indicates how many dialogs are nested within. |
Title
A heading that labels the dialog.
Renders an <h2>
element.
Prop | Type | Default | |
---|---|---|---|
className |
|
| |
render |
|
|
Description
A paragraph with additional information about the dialog.
Renders a <p>
element.
Prop | Type | Default | |
---|---|---|---|
className |
|
| |
render |
|
|
Close
A button that closes the dialog.
Renders a <button>
element.
Prop | Type | Default | |
---|---|---|---|
className |
|
| |
render |
|
|
Examples
State
By default, Dialog is an uncontrolled component that manages its own state.
<Dialog.Root>
<Dialog.Trigger>Open</Dialog.Trigger>
<Dialog.Portal>
<Dialog.Popup>
<Dialog.Title>Example dialog</Dialog.Title>
<Dialog.Close>Close</Dialog.Close>
</Dialog.Popup>
</Dialog.Portal>
</Dialog.Root>
Use open
and onOpenChange
props if you need to access or control the state of the dialog.
const [open, setOpen] = React.useState(false);
return (
<Dialog.Root open={open} onOpenChange={setOpen}>
<Dialog.Trigger>Open</Dialog.Trigger>
<Dialog.Portal>
<Dialog.Popup>
<form
// Close the dialog once the form data is submitted
onSubmit={async () => {
await submitData();
setOpen(false);
}}
>
...
</form>
</Dialog.Popup>
</Dialog.Portal>
</Dialog.Root>
);
It’s also common to use onOpenChange
if your app needs to do something when the dialog is closed or opened. This is recommended over React.useEffect
when reacting to state changes.
<Dialog.Root
open={open}
onOpenChange={(open) => {
// Do stuff when the dialog is closed
if (!open) {
doStuff();
}
// Set the new state
setOpen(open);
}}
>