vael-ui v0.3.10

Overlays

Tour

A guided walkthrough that spotlights one element at a time behind a positioned callout, for onboarding and product tours.

Install

import { Tour } from 'vael-ui'

Playground

import { Tour } from 'vael-ui'

<Tour id="" modal closeOnEsc :closeOnOverlay="false" keyboardNav :spotlightPadding="4" :spotlightRadius="8" scrollIntoView :forceMount="false" :step="0">Tour</Tour>

Props

NameTypeDefaultDescription
stepsreadonly T[]
idstring | undefinedIdentifies this tour instance — see `useTour`'s `id` option.
modalboolean | undefinedtrueScroll-locks the page and makes everything but the target and callout inert while open.
closeOnEscboolean | undefinedtrueEscape key closes the tour.
closeOnOverlayboolean | undefinedfalseClicking the dimmed area closes the tour.
keyboardNavboolean | undefinedtrueArrowLeft/ArrowRight step back/forward.
spotlightPaddingnumber | undefined4Space between the target and the spotlight cutout, in pixels. Per-step `spotlightPadding` wins.
spotlightRadiusnumber | undefined8Spotlight cutout corner radius, in pixels. Per-step `spotlightRadius` wins.
scrollIntoViewboolean | undefinedtrueScrolls the target into view on every step change.
teleportTostring | HTMLElement | undefinedCSS selector or an actual DOM element — same contract as Vue's own Teleport `to`. Wins over `container` either way.
containerDOMTarget | undefinedScopes the tour to one element: the spotlight dims only its own box, the callout teleports there instead of `body`, and scroll-lock/inert apply only inside it — the rest of the page stays interactive. Omit for a page-level tour.
scrollTargetDOMTarget | undefinedElement whose scrolling is locked while open. Defaults to `container`, then `document.body`.
forceMountboolean | undefinedfalse
beforeClose((done: () => void) => void) | undefined
uiPartial<{ spotlight: UiPartValue; positioner: UiPartValue; panel: UiPartValue; }> | undefined
openboolean | undefinedfalse
stepnumber | undefined0

Slots

NameTypeDescription
default{ id: string | undefined; step: T | undefined; index: number; total: number; group: string | undefined; groups: TourGroup<T>[]; isFirst: boolean; isLast: boolean; isTransitioning: boolean; next: () => Promise<void>; prev: () => Promise<void>; skip: () => void; close: () => void; panelEl: HTMLElement | null; }

Events

NameTypeDescription
open-change[value: boolean, details: PopoverOpenChangeDetails]
step-change[details: TourStepChangeDetails<T>]
skip[details: TourEndDetails<T>]
finish[details: TourEndDetails<T>]
update:open[value: boolean]
update:step[value: number]

Exposed

NameTypeDescription
idunknownType inference unavailable — vue-component-meta cannot resolve defineExpose on this generic component.
targetElunknownType inference unavailable — vue-component-meta cannot resolve defineExpose on this generic component.
panelElunknownType inference unavailable — vue-component-meta cannot resolve defineExpose on this generic component.
isClosingunknownType inference unavailable — vue-component-meta cannot resolve defineExpose on this generic component.
closeunknownType inference unavailable — vue-component-meta cannot resolve defineExpose on this generic component.
cancelCloseunknownType inference unavailable — vue-component-meta cannot resolve defineExpose on this generic component.
currentIndexunknownType inference unavailable — vue-component-meta cannot resolve defineExpose on this generic component.
isTransitioningunknownType inference unavailable — vue-component-meta cannot resolve defineExpose on this generic component.
nextunknownType inference unavailable — vue-component-meta cannot resolve defineExpose on this generic component.
prevunknownType inference unavailable — vue-component-meta cannot resolve defineExpose on this generic component.
skipunknownType inference unavailable — vue-component-meta cannot resolve defineExpose on this generic component.