ComponentsNavigation

Stepper

Shows position and status in an ordered process — import wizards, onboarding, approvals, checkout. Horizontal or vertical, four variants, error / skipped / loading states and clickable completed steps.

components/stepper.tsxtheme · material · accent · density · font
  1. Step 1 of 4, Uploadcontacts-nov.csv, Completed
  2. Step 2 of 4, Map columns12 of 14 matched, Current
  3. Step 3 of 4, ReviewDuplicates and errors
  4. Step 4 of 4, Import

Step 2 of 4Map columns

Installation

$ pnpm add @vamos-ui/react

The whole kit as one package — get updates by bumping the version. Add the styles to globals.css: @import "@vamos-ui/react/styles.css";

Usage

import { Stepper } from "@vamos-ui/react";

<Stepper value={1} steps={[
  { title: "Upload" }, { title: "Map columns" }, { title: "Review" }, { title: "Import" },
]} />

Each step's name includes its position and status: "Step 2 of 4, Map columns, Current"; the current step has aria-current="step".

Examples

Vertical with content (HR onboarding)

<Step> children render under the current step. Moving between steps doesn't move focus — focus your step's heading.

  1. Step 2 of 4, Bank accountWhere your salary is paid, Current
  2. Step 3 of 4, EquipmentOptionalLaptop and accessories
  3. Step 4 of 4, Sign contractElectronic signature

Clickable steps (CRM wizard)

With onValueChange, completed steps become buttons (navigable="completed"). Use "all" or a predicate for free navigation.

  1. Step 4 of 5, Terms, Current
  2. Step 5 of 5, Summary

Step 4 of 5Terms

Editing Terms

States (PRM approval)

Per-step status overrides the derived one: error, skipped (with optional). loading shows a spinner on the current step.

  1. Step 1 of 5, SubmittedNov 2 by Selin Arslan, Completed
  2. Step 2 of 5, Legal reviewClause 7.2 needs changes, Needs attention
  3. Step 3 of 5, FinanceOptional, Skipped
  4. Step 4 of 5, Partner signatureWaiting for DocuSign, Current
  5. Step 5 of 5, Active

Step 4 of 5Partner signature

Variants (checkout)

dots, bar and compact ("Step 3 of 4 · Payment" + bar). Horizontal steppers switch to compact below 640px unless responsive={false}.

  1. Step 1 of 4, Cart, Completed
  2. Step 2 of 4, Shipping, Completed
  3. Step 3 of 4, Payment, Current
  4. Step 4 of 4, Confirmation
  1. Step 1 of 4, Cart, Completed
  2. Step 2 of 4, Shipping, Completed
  3. Step 3 of 4, Payment, Current
  4. Step 4 of 4, Confirmation
  1. Step 1 of 4, Cart, Completed
  2. Step 2 of 4, Shipping, Completed
  3. Step 3 of 4, Payment, Current
  4. Step 4 of 4, Confirmation

API

Stepper

PropTypeDefault
value
Required. Current step, 0-based.
number—
onValueChange
Makes navigable steps clickable.
(index: number) => void—
navigable
Which steps may be clicked.
"completed" | "all" | (index) => boolean"completed"
orientation
Vertical shows step content under the current step.
"horizontal" | "vertical""horizontal"
variant
Indicator style (bar is horizontal only).
"numbered" | "dots" | "bar" | "compact""numbered"
size
Indicator and text size.
"sm" | "md""md"
steps
Data-driven steps. Or pass <Step> children.
StepItem[]—
loading
Spinner in the current step's indicator.
booleanfalse
responsive
Horizontal steppers show as compact below 640px.
booleantrue
aria-label
Name of the ordered list.
string"Progress"
labels
Overrides: label, step ("Step {current} of {total}"), optional, complete, current, error, skipped.
Partial<StepperLabels>—

Step / StepItem

PropTypeDefault
title
Required. Step name.
ReactNode—
description
Secondary line.
ReactNode—
status
Overrides the status derived from value.
"upcoming" | "current" | "complete" | "error" | "skipped"—
optional
Shows "Optional" under the title.
booleanfalse
icon
Replaces the number for upcoming / current steps.
ReactNode—
disabled
Never clickable.
booleanfalse
children / content
Vertical only: content shown while the step is current.
ReactNode—

StepIndicator

PropTypeDefault
status
Required. Drives the look.
StepStatus—
number · icon · loading · size
Content of the decorative circle (aria-hidden).
——