Dialog
A popup that opens on top of the entire page.
API reference
Import the component and place its parts the following way:
import { Dialog } from '@base-ui-components/react/Dialog';
<Dialog.Root>
<Dialog.Trigger />
<Dialog.Backdrop />
<Dialog.Popup>
<Dialog.Title />
<Dialog.Description />
<Dialog.Close />
</Dialog.Popup>
</Dialog.Root>;
Root
Groups all parts of the dialog. Doesn’t render its own HTML element.
Prop | Type | Default | |
---|---|---|---|
animated | boolean | true | |
defaultOpen | boolean | false | |
dismissible | boolean | true | |
modal | boolean | true | |
onOpenChange | (open, event) => void | undefined | |
open | boolean | undefined |
Trigger
A button that opens the dialog. Renders a <button>
element.
Prop | Type | Default | |
---|---|---|---|
className | string | (state) => string | undefined | |
render | | React.ReactElement | undefined |
Attribute | Type | |
---|---|---|
[data-modal] | Empty attribute | |
[data-popup-open] | Empty attribute |
Backdrop
An overlay displayed beneath the popup. Renders a <div>
element.
Prop | Type | Default | |
---|---|---|---|
className | string | (state) => string | undefined | |
keepMounted | boolean | false | |
render | | React.ReactElement | undefined |
Attribute | Type | |
---|---|---|
[data-open] | Empty attribute | |
[data-closed] | Empty attribute | |
[data-entering] | Empty attribute | |
[data-exiting] | Empty attribute |
Popup
A container for the dialog contents. Renders a <div>
element.
Prop | Type | Default | |
---|---|---|---|
className | string | (state) => string | undefined | |
container | React.Ref | HTMLElement | null | undefined | |
finalFocus | React.Ref | undefined | |
initialFocus | | React.Ref | undefined | |
keepMounted | boolean | false | |
render | | React.ReactElement | undefined |
Attribute | Type | |
---|---|---|
[data-open] | Empty attribute | |
[data-closed] | Empty attribute | |
[data-entering] | Empty attribute | |
[data-exiting] | Empty attribute | |
[data-modal] | Empty attribute | |
[data-nested-dialogs] | number |
CSS Variable | Type | |
---|---|---|
--nested-dialogs | number |
Title
A heading that labels the dialog. Renders an <h2>
element.
Prop | Type | Default | |
---|---|---|---|
className | string | (state) => string | undefined | |
render | | React.ReactElement | undefined |
Description
A paragraph with additional information about the dialog. Renders a <p>
element.
Prop | Type | Default | |
---|---|---|---|
className | string | (state) => string | undefined | |
render | | React.ReactElement | undefined |
Examples
State
By default, Dialog is an uncontrolled component that manages its own state.
<Dialog.Root>
<Dialog.Trigger>Open</Dialog.Trigger>
<Dialog.Popup>
<Dialog.Title>Example dialog</Dialog.Title>
<Dialog.Close>Close</Dialog.Close>
</Dialog.Popup>
</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.Popup>
<form
// Close the dialog once the form data is submitted
onSubmit={async () => {
await submitData();
setOpen(false);
}}
>
...
</form>
</Dialog.Popup>
</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);
}}
>