Overlay Manager
Used for programmatically controlling overlay components
Usage
The createOverlay
function creates a new overlay component that can be
programmatically controlled.
import { createOverlay } from "@chakra-ui/react"
const dialog = createOverlay<DialogProps>((props) => {
const { title, description, content, ...rest } = props
return (
<Dialog.Root {...rest}>
<Portal>
<Dialog.Backdrop />
<Dialog.Positioner>
<Dialog.Content>
{title && (
<Dialog.Header>
<Dialog.Title>{title}</Dialog.Title>
</Dialog.Header>
)}
<Dialog.Body spaceY="4">
{description && (
<Dialog.Description>{description}</Dialog.Description>
)}
{content}
</Dialog.Body>
</Dialog.Content>
</Dialog.Positioner>
</Portal>
</Dialog.Root>
)
})
Then render the Viewport
component to see the overlay.
<dialog.Viewport />
Examples
Dialog
Here's an example of a dialog component that can be programmatically controlled.
"use client"
import { Button, Dialog, Portal, createOverlay } from "@chakra-ui/react"
interface DialogProps {
title: string
description?: string
content?: React.ReactNode
}
const dialog = createOverlay<DialogProps>((props) => {
const { title, description, content, ...rest } = props
return (
<Dialog.Root {...rest}>
<Portal>
<Dialog.Backdrop />
<Dialog.Positioner>
<Dialog.Content>
{title && (
<Dialog.Header>
<Dialog.Title>{title}</Dialog.Title>
</Dialog.Header>
)}
<Dialog.Body spaceY="4">
{description && (
<Dialog.Description>{description}</Dialog.Description>
)}
{content}
</Dialog.Body>
</Dialog.Content>
</Dialog.Positioner>
</Portal>
</Dialog.Root>
)
})
const Demo = () => {
return (
<>
<Button
onClick={() => {
dialog.open("a", {
title: "Dialog Title",
description: "Dialog Description",
})
}}
>
Open Modal
</Button>
<dialog.Viewport />
</>
)
}
Drawer
Here's an example of a drawer component that can be programmatically controlled.
"use client"
import { Button, Drawer, Portal, createOverlay } from "@chakra-ui/react"
interface DialogProps {
title: string
description?: string
content?: React.ReactNode
placement?: Drawer.RootProps["placement"]
}
const drawer = createOverlay<DialogProps>((props) => {
const { title, description, content, ...rest } = props
return (
<Drawer.Root {...rest}>
<Portal>
<Drawer.Backdrop />
<Drawer.Positioner>
<Drawer.Content>
{title && (
<Drawer.Header>
<Drawer.Title>{title}</Drawer.Title>
</Drawer.Header>
)}
<Drawer.Body spaceY="4">
{description && (
<Drawer.Description>{description}</Drawer.Description>
)}
{content}
</Drawer.Body>
</Drawer.Content>
</Drawer.Positioner>
</Portal>
</Drawer.Root>
)
})
const Demo = () => {
return (
<>
<Button
onClick={() => {
drawer.open("a", {
title: "Drawer Title",
description: "Drawer Description",
placement: "end",
})
}}
>
Open Drawer
</Button>
<drawer.Viewport />
</>
)
}
Update
Use the .update
method to update the props of an overlay.
"use client"
import { Box, Button, Dialog, Portal } from "@chakra-ui/react"
import { createOverlay } from "@chakra-ui/react"
interface DialogProps {
title: string
description?: string
content?: React.ReactNode
}
const dialog = createOverlay<DialogProps>((props) => {
const { title, description, content, ...rest } = props
return (
<Dialog.Root {...rest}>
<Portal>
<Dialog.Backdrop />
<Dialog.Positioner>
<Dialog.Content>
{title && (
<Dialog.Header>
<Dialog.Title>{title}</Dialog.Title>
</Dialog.Header>
)}
<Dialog.Body spaceY="4">
{description && (
<Dialog.Description>{description}</Dialog.Description>
)}
{content}
</Dialog.Body>
</Dialog.Content>
</Dialog.Positioner>
</Portal>
</Dialog.Root>
)
})
const Demo = () => {
return (
<>
<Button
onClick={async () => {
dialog.open("a", {
title: "Initial Modal Title",
content: (
<Box textStyle="sm">This text will update in 2 seconds.</Box>
),
})
setTimeout(() => {
dialog.update("a", {
title: "Updated Modal Title",
content: (
<Box textStyle="sm" color="fg.muted">
This is the updated content of the modal.
</Box>
),
})
}, 2000)
}}
>
Open Modal
</Button>
<dialog.Viewport />
</>
)
}
Return Value
Awaiting the result of the .open()
method returns the value passed to the
.close()
method.
.waitForExit()
method to wait for the exit
animation to complete before opening a new overlay."use client"
import { Button, Dialog, Portal } from "@chakra-ui/react"
import { createOverlay } from "@chakra-ui/react"
interface DialogProps {
title: string
description: string
content?: React.ReactNode
}
const dialog = createOverlay<DialogProps>((props) => {
const { title, description, content, ...rest } = props
return (
<Dialog.Root {...rest}>
<Portal>
<Dialog.Backdrop />
<Dialog.Positioner>
<Dialog.Content>
{title && (
<Dialog.Header>
<Dialog.Title>{title}</Dialog.Title>
</Dialog.Header>
)}
<Dialog.Body spaceY="4">
{description && (
<Dialog.Description>{description}</Dialog.Description>
)}
{content}
</Dialog.Body>
</Dialog.Content>
</Dialog.Positioner>
</Portal>
</Dialog.Root>
)
})
const Demo = () => {
return (
<>
<Button
onClick={async () => {
const returnValue = await dialog.open("a", {
title: "Dialog Title",
description: "Dialog Description",
content: (
<Button
onClick={() => {
const returnValue = { message: "Welcome" }
dialog.close("a", returnValue)
}}
>
Close
</Button>
),
})
await dialog.waitForExit("a")
dialog.open("b", {
title: returnValue.message,
description: "Next Dialog Description",
})
}}
>
Open Modal
</Button>
<dialog.Viewport />
</>
)
}
API
Props
Props that are injected into the overlay component by the createOverlay
function:
open
: Whether the overlay is currently openonOpenChange
: Callback fired when the overlay's open state changesonExitComplete
: Callback fired when the overlay's exit animation completes
Methods
Viewport
The root component that renders all active overlays.
open(id, props)
Opens a new overlay with the given id and props. Returns a promise that resolves with any value.
close(id, value)
Closes the overlay with the given id and returns a promise that resolves when closed.
update(id, props)
Updates the props of the overlay with the given id.
remove(id)
Removes the overlay with the given id.
removeAll()
Removes all overlays.
get(id)
Gets the props of the overlay with the given id.
getSnapshot()
Gets the current snapshot of the overlays.
waitForExit(id)
Waits for the exit animation to complete for the overlay with the given id.