Horizontal or vertical steps (completed, current, upcoming) with connectors that fill with the accent color, automatic numbers, an animated checkmark and a loading step; optional <mv-stepper value> to drive the states and fit a horizontal list to narrow containers by hiding labels.
On <mv-stepper>: current step (1-based). Previous steps become completed; step count + 1 = all completed.
linear
boolean
On <mv-stepper>: steps after the current one are not clickable.
labels
auto | all | current | none
auto
On <mv-stepper>: which step labels a horizontal list shows. auto picks the first layout that fits the container: every label, every label with tighter spacing, only the current label, no label (measured again on resize, on step change and when steps change). <mv-stepper> then owns data-spacing and data-labels on its list.
data-labels
current | none
On .mv-stepper (horizontal): only the current label, or no label, stays visible, with tight spacing; hidden labels are visually hidden, still read by screen readers. Set by <mv-stepper labels>, or by hand on a CSS-only list.
data-spacing
tight
On .mv-stepper (horizontal): smaller gaps and connectors, steps sized by their content. Set by <mv-stepper labels="auto">, or by hand on a CSS-only list.
data-state
completed | current | upcoming
On .mv-stepper-item (set by <mv-stepper>, or by hand for pure CSS).
Badge: automatic number when empty, icon otherwise, checkmark when completed.
mv-stepper-text / -title / -description
Step labels.
mv-stepper-trigger
<button> wrapping the indicator and text to make the step clickable.
CSS variables
Name
Default
Description
--mv-stepper-accent
var(--mv-accent)
Color of completed/current steps and of the fill.
--mv-stepper-size
2rem
Indicator diameter.
Accessibility
Labeled ordered list; the current step has aria-current="step". Numbers and the checkmark are decorative (the title carries the meaning); add hidden text (.mv-sr-only “completed”) inside .mv-stepper-text if the state must be announced. Clickable steps are real <button>s named by their .mv-stepper-text through aria-labelledby (unless they already have aria-label or aria-labelledby), so the name survives a label hidden by host CSS, even with display: none; disabled past the current one in linear mode. Labels hidden on narrow containers (data-labels) are visually hidden, never removed, so screen readers still read every step. Steps rendered, removed or reordered after connection (framework lists) get their state at once. Reduced motion: no loading spin, instant fills.