Vue Final Modal
Guide

Types

The exported types in VueFinalModal.

ModalId

export type ModalId = number | string | symbol

Template

The template object accepted by useModal() and defineTemplate() (from vue-use-template):

export interface Template<T extends Component> {
  component: T
  attrs?: MaybeRefOrGetter<ComponentProps<T>>
  emits?: MaybeRefOrGetter<PickComponentEmits<ComponentProps<T>>>
  props?: MaybeRefOrGetter<PickComponentProps<ComponentProps<T>>>
  /** A string slot is rendered as raw HTML, like `v-html`: never pass user-provided content as a string. */
  slots?: {
    [K in keyof ComponentSlots<T>]?: string | Component | Template<Component>
  }
}

ModalTemplate

The template of a modal, accepted by defineModal():

export type ModalTemplate<T extends Component> = Template<T>

UseModalOptions

The options of useModal():

export type UseModalOptions<T extends Component> = Omit<ModalTemplate<T>, 'component'> & {
  defaultModelValue?: boolean
  keepAlive?: boolean
  component?: T
}

UseModalReturnType

The return value of useModal():

export interface UseModalReturnType {
  open: () => Promise<ModalOpenResult>
  close: () => Promise<ModalCloseResult>
  destroy: () => void
  status: Readonly<Ref<ModalStatus>>
}

ModalStatus, ModalOpenResult and ModalCloseResult

export type ModalStatus = 'closed' | 'opening' | 'opened' | 'closing'

export type ModalOpenResult = 'opened' | 'already-opened' | 'stopped' | 'toggled-again' | 'destroyed' | 'skipped-on-server'

export type ModalCloseResult = 'closed' | 'already-closed' | 'stopped' | 'toggled-again' | 'destroyed'

export interface ModalToggle {
  (show: true): Promise<ModalOpenResult>
  (show: false): Promise<ModalCloseResult>
  (show?: boolean): Promise<ModalOpenResult | ModalCloseResult>
}

Vfm

The instance returned by useVfm():

export type Vfm = {
  install: (app: App) => void
  modals: ComputedRef<ModalExposed>[]
  openedModals: ComputedRef<ModalExposed>[]
  openedModalOverlays: ComputedRef<ModalExposed>[]
  get: (modalId: ModalId) => undefined | ComputedRef<ModalExposed>
  toggle: VfmToggle
  open: (modalId: ModalId) => undefined | Promise<ModalOpenResult>
  close: (modalId: ModalId) => undefined | Promise<ModalCloseResult>
  closeAll: () => Promise<PromiseSettledResult<ModalCloseResult>[]>
}

export interface VfmToggle {
  (modalId: ModalId, show: true): undefined | Promise<ModalOpenResult>
  (modalId: ModalId, show: false): undefined | Promise<ModalCloseResult>
  (modalId: ModalId, show?: boolean): undefined | Promise<ModalOpenResult | ModalCloseResult>
}

ModalExposed

export type ModalExposed = {
  modalId: Ref<undefined | ModalId>
  hideOverlay: Ref<undefined | boolean>
  overlayBehavior: Ref<undefined | 'auto' | 'persist'>
  overlayVisible: Ref<boolean>
  status: Readonly<Ref<ModalStatus>>
  toggle: ModalToggle
}
Copyright © 2026