Multi-step flow indicator for checkout, onboarding, and wizards.
Introduction
Stepper shows progress through an ordered flow—checkout, onboarding, and wizards. Compose with Step. The indicator uses numbered circles and a connector; completed steps show a check. Wizard footer actions (Next / Back) stay in the app.
When to use: Discrete stages the user moves through in sequence. Optional click-to-navigate when steps are completed or linear is off.
Compared to similar components:
- Progress — A labeled bar for continuous work (uploads, determinate percentages). Prefer Progress for a track; use Stepper for named stages.
- Tabs — Peer views on the same level. Prefer Tabs when order does not matter; use Stepper when later steps depend on earlier ones.
- Breadcrumb — Where the user is in a hierarchy. Prefer Breadcrumb for location; use Stepper for process.
Use the framework selector in the site header to switch between React and Vue.
Import
import { Stepper } from "@bridge-ui/vue/Components/Stepper";
import { Step } from "@bridge-ui/vue/Components/Step";import { Stepper } from "@bridge-ui/react/Components/Stepper";
import { Step } from "@bridge-ui/react/Components/Step";Basic usage
Bind the 0-based active index with activeStep and onChange (React) or v-model (Vue). Uncontrolled React usage starts at defaultActiveStep (0). Completed steps (indexes before the active step) render a check in the indicator.
Vertical
Set orientation="vertical" to stack steps. Pass description for secondary text, and children (Vue: default slot) for a body shown under the active step.
Non-linear
By default linear is on: users can select the current step and completed steps, but not incomplete upcoming ones. Set linear to false to allow jumping to any enabled step.
Error and disabled
error forces error styling on the indicator (it wins over completed and active). disabled makes that step non-interactive.
Colors
Use the color prop for the active and completed accent. Available colors: primary, secondary, success, info, warning, error, and dark.
Sizes
Change indicator and label scale with size: sm, md (default), and lg.
Customization
Fine-tune appearance with the classes prop. On Stepper, target root and list. On Step, target root, connector, trigger, indicator, icon, label, description, and content.
Accessibility
- The root renders a nav with aria-label="Progress" by default. Override with your own aria-label when the page has more than one stepper or when a more specific name helps (for example “Checkout”).
- The active step trigger gets aria-current="step". Error steps set aria-invalid.
- Connector lines are aria-hidden. Vertical step bodies are labelled by the matching trigger via aria-labelledby.
- Arrow keys, Home, and End move focus among clickable steps. Linear mode still blocks selecting incomplete upcoming steps.
- Do not rely on color alone for error or completion; the check, error icon, and labels provide the extra signal.
Anatomy
<nav aria-label="Progress"> <!-- Stepper root -->
<ol> <!-- list -->
<li> <!-- Step root -->
<div> <!-- connector -->
<button> <!-- trigger -->
<span> <!-- indicator: number, check, error icon, or slots.icon -->
<span> <!-- text -->
<span> <!-- label -->
<span> <!-- description -->
<div> <!-- content (vertical + active only) -->
</li>
</ol>
</nav>Target Stepper parts with classes: root, list. Target Step parts with root, connector, trigger, indicator, icon, label, description, and content.
Related components
Progress, Tabs, Breadcrumb, Pagination
API
Stepper
| Prop | Type | Default | Description |
|---|---|---|---|
| @change | (step: number) => void | — | Same payload as model updates. |
| @update:model-value | (step: number) => void | — | Emitted when the active index changes. |
| v-model / modelValue | number | 0 | Controlled 0-based active index. |
| Prop | Type | Default | Description |
|---|---|---|---|
| activeStep | number | — | Controlled 0-based active index. |
| defaultActiveStep | number | 0 | Initial index when uncontrolled. |
| onChange | (step: number) => void | — | Called when the active index changes. |
| Prop | Type | Default | Description |
|---|---|---|---|
| children | ReactNode | — | Compound steps (Step). Use the default slot in Vue. |
| classes | StepperClasses | — | Classes for root and list. |
| color | StepperColor | "primary" | Accent for active and completed steps. |
| customProps | StepperCustomProps | — | Extra props for root and list. |
| linear | boolean | true | When true, block jumping ahead of incomplete steps. |
| orientation | StepperOrientation | "horizontal" | Layout direction. |
| size | StepperSize | "md" | Indicator and label scale. |
Step
| Prop | Type | Default | Description |
|---|---|---|---|
| children | body content | — | Shown under the step when orientation="vertical" and the step is active. Vue: default slot. |
| classes | StepClasses | — | Classes for step parts. |
| completed | boolean | derived | Force completed (true) or incomplete (false). Omit to derive from index vs active step. |
| customProps | StepCustomProps | — | Extra props for root, trigger, indicator, icons, and content. |
| description | ReactNode / Vue string | — | Secondary text under the label. Override with the description slot. |
| disabled | boolean | false | Non-interactive step. |
| error | boolean | false | Error styling on the indicator. Wins over completed and active. |
| icon | IconSource | — | Override the default numeric / check / error indicator. |
| label | ReactNode / Vue string | — | Step title. Override with the label slot. |
| slots | { icon?, label?, description? } | — | Custom indicator, title, or description (React). Vue: #icon, #label, #description. |