Vize

Stepper

Accessible, unstyled Stepper primitive for multi-step flows.

Package @vizejs/ui/stepper
Maturity stable
Own the source vize lib pull stepper
Requires collection, composite-navigation, context, controllable-state, id, typeahead
Aliases stepper, wizard, multi-step flow, checkout steps
Covers WAI-ARIA aria-current step, MUI Stepper, Vuetify Stepper, Reka UI Stepper

Usage

import { Stepper, StepperRoot, StepperContent, StepperItem, StepperList, StepperTrigger } from "@vizejs/ui/stepper";

Or copy the source into your project with vize lib pull stepper (see Source Distribution).

API

Stepper

Source: src/families/navigation/stepper/stepper-root.vue

Props

Prop Type Default Description
id string | null undefined Consumer-owned Stepper base id. null and undefined select a deterministic fallback.
modelValue StepperValue undefined Controlled current step value. undefined selects uncontrolled behavior; null clears it.
defaultValue StepperValue undefined Initial current step for uncontrolled use. undefined selects the first enabled step.
disabled boolean false Disable every step trigger while preserving the current content panel.
navigationMode StepperNavigationMode "linear" Whether future steps require every previous enabled step to be completed.
orientation StepperOrientation "horizontal" Directional layout hint used by arrow-key navigation.
dir StepperDirection "ltr" Reading direction used for horizontal arrow-key navigation.
loop boolean false Whether arrow-key navigation wraps at the first and last enabled trigger.

Events

Event Payload Description
update:modelValue [value: StepperValue] Fired when the current step requests a new controlled value.
change [value: StepperValue, previous: StepperValue, nativeEvent: Event | null] Fired after any distinct current-step request.

Slots

Slot Slot props Description
default StepperSlotState Compound Stepper children. Receives current value, completion, and navigation state.

Exposed

Member Type Description
completedValues —
currentIndex —
dir —
disabled —
element Readonly<ShallowRef<HTMLElement | null>> Template ref to the rendered root element.
focus —
id —
isSelectable —
listId —
navigationMode —
next —
orientation —
previous —
reset —
selectValue —
setValue —
state —
value —

StepperRoot

Source: src/families/navigation/stepper/stepper-root.vue

Props

Prop Type Default Description
id string | null undefined Consumer-owned Stepper base id. null and undefined select a deterministic fallback.
modelValue StepperValue undefined Controlled current step value. undefined selects uncontrolled behavior; null clears it.
defaultValue StepperValue undefined Initial current step for uncontrolled use. undefined selects the first enabled step.
disabled boolean false Disable every step trigger while preserving the current content panel.
navigationMode StepperNavigationMode "linear" Whether future steps require every previous enabled step to be completed.
orientation StepperOrientation "horizontal" Directional layout hint used by arrow-key navigation.
dir StepperDirection "ltr" Reading direction used for horizontal arrow-key navigation.
loop boolean false Whether arrow-key navigation wraps at the first and last enabled trigger.

Events

Event Payload Description
update:modelValue [value: StepperValue] Fired when the current step requests a new controlled value.
change [value: StepperValue, previous: StepperValue, nativeEvent: Event | null] Fired after any distinct current-step request.

Slots

Slot Slot props Description
default StepperSlotState Compound Stepper children. Receives current value, completion, and navigation state.

Exposed

Member Type Description
completedValues —
currentIndex —
dir —
disabled —
element Readonly<ShallowRef<HTMLElement | null>> Template ref to the rendered root element.
focus —
id —
isSelectable —
listId —
navigationMode —
next —
orientation —
previous —
reset —
selectValue —
setValue —
state —
value —

StepperContent

Source: src/families/navigation/stepper/stepper-content.vue

Props

Prop Type Default Description
value (required) string required Content value paired with a StepperItem.
role StepperContentRole | null "region" Optional landmark role for the content. null renders a plain div.
ariaLabel string undefined Accessible name when no visible label or aria-labelledby supplies one.
ariaLabelledby string | null undefined Space-separated ids that label the panel. null omits the default trigger id.
ariaDescribedby string undefined Space-separated ids that describe the panel.

Slots

Slot Slot props Description
default StepperContentSlotState Panel contents. Receives current visibility, orientation, and availability state.

Exposed

Member Type Description
value string Content value paired with a StepperItem and StepperTrigger.
current boolean Whether this content panel is paired with the current step.
active boolean Whether this content panel is currently visible.
completed boolean Whether the paired step is marked completed.
disabled boolean Whether the Stepper root or paired item is disabled.
orientation StepperOrientation Directional layout hint inherited from the Stepper root.
state StepperContentState Stable state token for styling and tests.
element HTMLDivElement | null Rendered content panel element.
id string Deterministic id wired from content to trigger.
triggerId string Deterministic id of the controlling trigger.
focusContent (options?: FocusOptions) => void Move focus to the visible content panel.

StepperItem

Source: src/families/navigation/stepper/stepper-item.vue

Props

Prop Type Default Description
id string | null undefined Consumer-owned list item id. null and undefined select a deterministic fallback.
value (required) string required Stable step value used for selection and collection identity.
completed boolean false Mark this step as completed for styling and linear navigation.
disabled boolean false Disable this step while preserving the rest of the Stepper.
textValue string | null undefined Explicit text used by future collection search or virtualized trigger labels.
order number undefined Deterministic order for virtualized, portalled, or server-only steps.
ariaLabel string undefined Accessible name when no list item text supplies one.
ariaLabelledby string undefined Space-separated ids that label this list item.
ariaDescribedby string undefined Space-separated ids that describe this list item.

Slots

Slot Slot props Description
default StepperItemSlotState Step contents. Receives current, completion, and activation state.

Exposed

Member Type Description
value string Step value used for current-step state and collection identity.
index number Index within all registered StepperItem instances.
current boolean Whether this step is the current step.
completed boolean Whether this step is marked completed.
disabled boolean Whether this step or its root is disabled.
selectable boolean Whether this step may be activated under the current navigation mode.
locked boolean Whether a linear Stepper is preventing activation of this otherwise enabled step.
orientation StepperOrientation Directional layout hint inherited from the Stepper root.
navigationMode StepperNavigationMode Whether step activation is linear or free-form.
state StepperItemState Stable state token for styling and tests.
element HTMLDivElement | null Rendered list item element.
id string Deterministic id assigned to the item.
triggerId string Deterministic id wired from trigger to content.
contentId string Deterministic id wired from content to trigger.
focus (options?: FocusOptions) => boolean Move focus to this step's trigger when it can receive focus.
select () => boolean Request this step as the current value.

StepperList

Source: src/families/navigation/stepper/stepper-list.vue

Props

Prop Type Default Description
ariaLabel string undefined Accessible name when no visible label or aria-labelledby supplies one.
ariaLabelledby string undefined Space-separated ids that label the step list.
ariaDescribedby string undefined Space-separated ids that describe the step list.

Slots

Slot Slot props Description
default StepperListSlotState StepperItem children. Receives the current root and list state.

Exposed

Member Type Description
value StepperValue Current step value, or null when no step is current.
completedValues readonly string[] Values whose StepperItem is marked completed.
currentIndex number Current step index within all registered items, or -1 when empty or missing.
disabled boolean Whether every trigger is disabled by the root.
navigationMode StepperNavigationMode Whether step activation is linear or free-form.
orientation StepperOrientation Directional layout hint for ARIA and consumer-owned styles.
dir StepperDirection Reading direction used for horizontal keyboard navigation.
state StepperRootState Stable state token for styling and tests.
listId string Deterministic id assigned to the list.
element HTMLDivElement | null Rendered list element.
focus (options?: FocusOptions) => void Move focus to the current, active, or first enabled trigger.

StepperTrigger

Source: src/families/navigation/stepper/stepper-trigger.vue

Props

Prop Type Default Description
type "button" | "reset" | "submit" "button" Native button submission behavior.
ariaLabel string undefined Accessible name when no visible label or aria-labelledby supplies one.
ariaLabelledby string undefined Space-separated ids that label the trigger.
ariaDescribedby string undefined Space-separated ids that describe the trigger.

Events

Event Payload Description
click [nativeEvent: MouseEvent] Fired before this trigger requests selection. Call preventDefault() to keep state unchanged.

Slots

Slot Slot props Description
default StepperTriggerSlotState Trigger contents. Receives current, completion, and activation state.
indicator StepperTriggerSlotState Optional completion/current indicator controlled by the consumer.

Exposed

Member Type Description
value string Step value used for current-step state and collection identity.
index number Index within all registered StepperItem instances.
current boolean Whether this step is the current step.
completed boolean Whether this step is marked completed.
disabled boolean Whether this step or its root is disabled.
selectable boolean Whether this step may be activated under the current navigation mode.
locked boolean Whether a linear Stepper is preventing activation of this otherwise enabled step.
orientation StepperOrientation Directional layout hint inherited from the Stepper root.
navigationMode StepperNavigationMode Whether step activation is linear or free-form.
state StepperItemState Stable state token for styling and tests.
element HTMLButtonElement | null Rendered native trigger button.
id string Deterministic id wired from trigger to content.
contentId string Deterministic id of the controlled content panel.
focus (options?: FocusOptions) => void Move focus to the native trigger button.
select () => boolean Request this step as the current value.

Behavior

Normative state x input -> outcome table for stepper-root.vue, stepper-list.vue, stepper-item.vue, stepper-trigger.vue, and stepper-content.vue (@vizejs/ui/stepper). Every row in this isolated slice is proven by the named focused tests; registry, package exports, renderer fixtures, and size budgets are intentionally left for the parent integration step.

ID State Input Outcome Evidence
S1 default / current render root, list, item, trigger, and content expose deterministic ids, ARIA wiring, slots, and data renders accessible stepper semantics with deterministic ids, slots, and data
S2 linear / future pending click focusable future triggers advertise aria-disabled and do not emit or change value until prior steps complete linear navigation prevents future activation until prior enabled steps are complete
S3 linear / reset default reset imperative reset restores the configured default even when normal linear activation is currently locked reset restores the configured default value even when linear activation is locked
S4 dynamic item value prop update item registration, trigger ids, content ids, and fallback current value update when a step value changes items reregister when their step value changes
S5 free / disabled item Arrow key, then Enter roving focus skips natively disabled steps and native keyboard activation selects any enabled step free navigation and roving focus can activate any enabled step while skipping disabled
S6 controlled click emits the requested value while rendered current state stays controlled until parent accepts it controlled current value wins until the parent accepts the request
S7 disabled root / item click or Tab disabled triggers leave activation and sequential focus while preserving content state disabled roots and items suppress user activation and sequential focus
S8 exposed instances focus, next, previous public refs expose element state and imperative focus/value methods exposes typed state and imperative focus/value controls
S9 optional content role render content can render without a landmark role or default trigger label content can opt out of the region role and default trigger label
S10 missing provider setup compound parts fail closed with the shared context diagnostic compound parts require matching Stepper providers
S11 SSR and hydration isolated render/mount generated ids are byte-identical per request and hydrate without replacement warnings stepper-ssr.test.ts

navigationMode="linear" allows the current step, previous enabled steps, and future enabled steps only when every prior enabled step is marked completed. Linear-locked future triggers remain roving-focusable with aria-disabled so the flow remains discoverable; true root or item disabled states use native disabled buttons and are skipped by keyboard navigation. Content panels retain stable markup for hydration, use hidden while inactive, and default aria-labelledby to the paired trigger id when a landmark role is present.