Skip to content

Dialog ​

Compose VDialogRoot, VDialogTrigger, VDialogOverlay, VDialogContent, and VDialogClose.

Demo ​

Dialog Cross-platform Example and Preview

H5 LiveInteractive browser runtime
DialogBrowser dialog flow

Basic Usage ​

vue
<script setup lang="ts">
import type { DialogOpenChangeDetails } from '@varo-ui/headless'
import { shallowRef } from 'vue'

const open = shallowRef(false)
const hasUnsavedChanges = shallowRef(true)

function handleOpenChange(nextOpen: boolean, details: DialogOpenChangeDetails) {
  if (!nextOpen && hasUnsavedChanges.value) { details.cancel() }
}
</script>

<template>
  <VDialogRoot v-model:open="open" @open-change="handleOpenChange">
    <VDialogTrigger>Open</VDialogTrigger>
    <VDialogOverlay />
    <VDialogContent>
      Content
      <VDialogClose>Close</VDialogClose>
    </VDialogContent>
  </VDialogRoot>
</template>

Mini-program runtime

Weapp has no DOM focus trap, inert, portal, or Escape key semantics. Close with VDialogClose or an overlay press.

Root Props ​

PropTypeDefaultDescription
openboolean | undefinedundefinedControlled open state
defaultOpenbooleanfalseInitial uncontrolled state
disabledboolean | undefinedundefinedBlocks state changes

Root Events ​

EventPayloadDescription
openChange(open: boolean, details: DialogOpenChangeDetails)Fires before a change; call details.cancel() to cancel
update:openbooleanFires when the request is not cancelled

details.reason is trigger-press, outside-press, escape-key, close-press, or imperative-action.

Parts ​

PartResponsibility
VDialogRootState and context
VDialogTriggerOpen or toggle
VDialogOverlayBackdrop and outside close
VDialogContentDialog content
VDialogCloseExplicit close

Close contract

Controlled mode follows open. Overlay, Escape, Close, and Trigger requests share the same openChange / cancel contract.