Dialog
A modal window that appears on top of the main content.
Dialog Title
Anatomy
To use the dialog component correctly, you'll need to understand its anatomy and how we name its parts.
Each part includes a
data-partattribute to help identify them in the DOM.
Examples
Learn how to use the Dialog component in your project. Let's take a look at
the most basic example
import { Dialog, Portal } from '@ark-ui/react'
export const Basic = () => (
  <Dialog.Root>
    <Dialog.Trigger>Open Dialog</Dialog.Trigger>
    <Portal>
      <Dialog.Backdrop />
      <Dialog.Positioner>
        <Dialog.Content>
          <Dialog.Title>Dialog Title</Dialog.Title>
          <Dialog.Description>Dialog Description</Dialog.Description>
          <Dialog.CloseTrigger>Close</Dialog.CloseTrigger>
        </Dialog.Content>
      </Dialog.Positioner>
    </Portal>
  </Dialog.Root>
)
import { Portal } from 'solid-js/web'
import { Dialog } from '@ark-ui/solid'
export const Basic = () => {
  return (
    <Dialog.Root open>
      <Dialog.Trigger>Open Dialog</Dialog.Trigger>
      <Portal>
        <Dialog.Backdrop />
        <Dialog.Positioner>
          <Dialog.Content>
            <Dialog.Title>Dialog Title</Dialog.Title>
            <Dialog.Description>Dialog Description</Dialog.Description>
            <Dialog.CloseTrigger>Close</Dialog.CloseTrigger>
          </Dialog.Content>
        </Dialog.Positioner>
      </Portal>
    </Dialog.Root>
  )
}
<script setup lang="ts">
import { Teleport } from 'vue'
import { Dialog } from '@ark-ui/vue'
</script>
<template>
  <Dialog.Root>
    <Dialog.Trigger>Open Dialog</Dialog.Trigger>
    <Teleport to="body">
      <Dialog.Backdrop />
      <Dialog.Positioner>
        <Dialog.Content>
          <Dialog.Title>Dialog Title</Dialog.Title>
          <Dialog.Description>Dialog Description</Dialog.Description>
          <Dialog.CloseTrigger>Close</Dialog.CloseTrigger>
        </Dialog.Content>
      </Dialog.Positioner>
    </Teleport>
  </Dialog.Root>
</template>
Controlled Dialog
To create a controlled Dialog component, manage the state of the dialog using
the open and onOpenChange props:
import { useState } from 'react'
import { Dialog, Portal } from '@ark-ui/react'
export const Controlled = () => {
  const [isOpen, setIsOpen] = useState(false)
  return (
    <>
      <button type="button" onClick={() => setIsOpen(true)}>
        Open Dialog
      </button>
      <Dialog.Root open={isOpen} onOpenChange={(e) => setIsOpen(e.open)}>
        <Portal>
          <Dialog.Backdrop />
          <Dialog.Positioner>
            <Dialog.Content>
              <Dialog.Title>Dialog Title</Dialog.Title>
              <Dialog.Description>Dialog Description</Dialog.Description>
              <Dialog.CloseTrigger>Close</Dialog.CloseTrigger>
            </Dialog.Content>
          </Dialog.Positioner>
        </Portal>
      </Dialog.Root>
    </>
  )
}
import { createSignal } from 'solid-js'
import { Portal } from 'solid-js/web'
import { Dialog } from '@ark-ui/solid'
export const Controlled = () => {
  const [isOpen, setIsOpen] = createSignal(false)
  return (
    <>
      <button type="button" onClick={() => setIsOpen(true)}>
        Open Dialog
      </button>
      <Dialog.Root open={isOpen()} onOpenChange={() => setIsOpen(false)}>
        <Portal>
          <Dialog.Backdrop />
          <Dialog.Positioner>
            <Dialog.Content>
              <Dialog.Title>Dialog Title</Dialog.Title>
              <Dialog.Description>Dialog Description</Dialog.Description>
              <Dialog.CloseTrigger>Close</Dialog.CloseTrigger>
            </Dialog.Content>
          </Dialog.Positioner>
        </Portal>
      </Dialog.Root>
    </>
  )
}
<script setup lang="ts">
import { Teleport, ref } from 'vue'
import { Dialog } from '@ark-ui/vue'
const open = ref(false)
</script>
<template>
  <button @click="() => (open = true)">Open Dialog</button>
  <Dialog.Root v-model:open="open">
    <Teleport to="body">
      <Dialog.Backdrop />
      <Dialog.Positioner>
        <Dialog.Content>
          <Dialog.Title>Dialog Title</Dialog.Title>
          <Dialog.Description>Dialog Description</Dialog.Description>
          <Dialog.CloseTrigger>Close</Dialog.CloseTrigger>
        </Dialog.Content>
      </Dialog.Positioner>
    </Teleport>
  </Dialog.Root>
</template>
Lazy Mounting
Lazy mounting is a feature that allows the content of a dialog to be rendered
only when the dialog is first opened. This is useful for performance
optimization, especially when dialog content is large or complex. To enable lazy
mounting, use the lazyMount prop on the Dialog.Root component.
In addition, the unmountOnExit prop can be used in conjunction with
lazyMount to unmount the dialog content when the Dialog is closed, freeing up
resources. The next time the dialog is activated, its content will be
re-rendered.
Example not foundExample not foundExample not foundUsing Render Function
The Dialog component supports the use of a render function as a child for more
control. This allows access to dialog states like isOpen:
Example not foundExample not foundExample not foundAPI Reference
Root
| Prop | Default | Type | 
|---|---|---|
aria-label | stringHuman readable label for the dialog, in event the dialog title is not rendered  | |
closeOnEscape | booleanWhether to close the dialog when the escape key is pressed  | |
closeOnInteractOutside | booleanWhether to close the dialog when the outside is clicked  | |
defaultOpen | booleanThe initial open state of the dialog when it is first rendered. Use when you do not need to control its open state.  | |
finalFocusEl | HTMLElement | (() => MaybeElement)Element to receive focus when the dialog is closed  | |
id | stringThe unique identifier of the machine.  | |
ids | Partial<{
  trigger: string
  positioner: string
  backdrop: string
  content: string
  closeTrigger: string
  title: string
  description: string
}>The ids of the elements in the dialog. Useful for composition.  | |
initialFocusEl | HTMLElement | (() => MaybeElement)Element to receive focus when the dialog is opened  | |
lazyMount | false | booleanWhether to enable lazy mounting  | 
modal | booleanWhether to prevent pointer interaction outside the element and hide all content below it  | |
onEscapeKeyDown | (event: KeyboardEvent) => voidCallback to be invoked when the escape key is pressed  | |
onExitComplete | () => voidFunction called when the animation ends in the closed state.  | |
onFocusOutside | (event: FocusOutsideEvent) => voidFunction called when the focus is moved outside the component  | |
onInteractOutside | (event: InteractOutsideEvent) => voidFunction called when an interaction happens outside the component  | |
onOpenChange | (details: OpenChangeDetails) => voidCallback to be invoked when the dialog is opened or closed  | |
onPointerDownOutside | (event: PointerDownOutsideEvent) => voidFunction called when the pointer is pressed down outside the component  | |
open | booleanWhether the dialog is open  | |
present | booleanWhether the node is present (controlled by the user)  | |
preventScroll | booleanWhether to prevent scrolling behind the dialog when it's opened  | |
restoreFocus | booleanWhether to restore focus to the element that had focus before the dialog was opened  | |
role | 'dialog' | 'dialog' | 'alertdialog'The dialog's role  | 
trapFocus | booleanWhether to trap focus inside the dialog when it's opened  | |
unmountOnExit | false | booleanWhether to unmount on exit.  | 
Backdrop
| Prop | Default | Type | 
|---|---|---|
asChild | booleanRender as a different element type.  | 
CloseTrigger
| Prop | Default | Type | 
|---|---|---|
asChild | booleanRender as a different element type.  | 
Content
| Prop | Default | Type | 
|---|---|---|
asChild | booleanRender as a different element type.  | 
Description
| Prop | Default | Type | 
|---|---|---|
asChild | booleanRender as a different element type.  | 
Positioner
| Prop | Default | Type | 
|---|---|---|
asChild | booleanRender as a different element type.  | 
Title
| Prop | Default | Type | 
|---|---|---|
asChild | booleanRender as a different element type.  | 
Trigger
| Prop | Default | Type | 
|---|---|---|
asChild | booleanRender as a different element type.  |