Progress Stepperv1.0.0Ready for Production
A multi-step progress indicator component with orb, linear, and segmented variants for guiding users through sequential workflows.
Prefer AI-assisted development?
Catalyst Progress Stepper is a context-driven compound component with orb, linear, and segmented progress variants for guiding users through sequential workflows. It ships a useStepperNavigation hook for Continue / Back controls, and meets WCAG 2.2 AA out of the box.
Installation
npm install @pmi/catalyst-stepperimport {
StepperRoot,
StepperList,
StepperStep,
StepperLine,
StepperOrb,
useStepperNavigation,
} from '@pmi/catalyst-stepper';Variants
Full Orbs
Numbered orb indicators that display a check icon when complete. Best for 3–6 steps where each step has equal visual weight.
Linear
A single continuous progress bar that fills as steps complete. Ideal for many steps or when individual step identity is less important.
Segmented
Discrete equal-width segments — one per step — that fill independently. Good for checkout-style flows with 3–6 steps of equal weight.
Minimal Orbs
Compact 16 px orbs (size="sm") for space-constrained layouts such as modals or sidebars.
Common Patterns
Full Orbs with Progress Counter
Adds a progress counter header (Application progress — 1/5) above the orbs.
Full Orbs with Segment Labels
Displays a text label beneath each orb. Use when step names add meaningful context.
Minimal Orbs with Progress Counter
Compact orbs combined with the progress counter header.
Linear with Progress Counter
Linear progress bar paired with the progress counter header.
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Segmented with Progress Counter
Segmented progress stepper paired with the progress counter header.
Full Orbs with Labels and Content Panel
Orbs with segment labels and a content panel per step.
Set up your account credentials and basic information.
Clickable Steps
Each orb is an interactive button that navigates directly to that step. Use the asChild prop on StepperStep to merge aria-current and the accessible label onto any child element — no separate Continue/Back navigation needed.
Set up your account credentials and basic information.
API Reference
Progress Stepper is a compound component. The sections below document the Catalyst-specific props for each primitive.
StepperRoot
The root container that manages active-step state and distributes it to child components via React Context. Supports both controlled (value + onValueChange) and uncontrolled (defaultValue) usage. Set variant here once to apply it to StepperList and StepperLine automatically.
Prop
Type
StepperList
Flex row or column container for step indicators. When navProps is provided, wraps the <ol> in a <nav> landmark.
Prop
Type
StepperStep
A single step item rendered as an <li>. Automatically derives its status from StepperRoot context when stepValue is provided. For interactive steps, use the asChild prop to merge aria-current onto a child <a> or <button>.
Prop
Type
StepperLine
Connector element rendered between step orbs, or used as the progress bar for linear and segmented variants. Variant is inherited from StepperRoot context.
Prop
Type
StepperOrb
Circular indicator showing pending (number), current (highlighted), or complete (check icon) state.
Prop
Type
Accessibility
Progress Stepper is designed to meet WCAG 2.2 AA standards.
Keyboard Interactions
| Key | Action |
|---|---|
Tab | Moves focus between Continue and Back buttons |
Enter / Space | Activates the focused Continue or Back button |
ARIA
StepperListrenders an<ol>inside a<nav aria-label="...">landmark whennavLabelis provided. The<ol>carriesrole="list"to preserve list semantics in VoiceOver whenlist-style: noneis applied.- Each
StepperSteprenders an<li role="listitem">witharia-current="step"on the active step. For non-interactive steps a visually hidden<span>inside the<li>carries the full accessible label generated bybuildStepAriaLabel(e.g."Step 2 of 5: Shipping Info, Completed"). For interactive steps (asChild), the span is omitted,aria-currentmoves to the child interactive element, and the same label is applied asaria-labelon that element — ensuring the name is announced exactly once. StepperOrband its children are fullyaria-hidden— all status information is conveyed by the sr-only label or buttonaria-labelinStepperStep.StepperLinedecorative connectors arearia-hidden="true".- In the linear and segmented variants, the progress bar (
StepperList aria-hidden) is hidden from AT. Anaria-live="polite"sr-only region announces step changes after the first user interaction.
Choosing the Right Component
Use Progress Stepper when you need to guide users through a linear sequence of discrete steps with clear progress indication. Reach for a different primitive when:
| If you need… | Use instead |
|---|---|
| Simple tab-based navigation without step progression | Tabs |
| A numeric progress bar without discrete steps | Progress Bar |
Related
Collapsible
An interactive component that expands and collapses content sections with smooth animations, built on Radix UI Collapsible primitives.
ScrollArea
A custom scrollbar component for product interfaces with customizable styling via className overrides. Supports vertical/horizontal scrolling, container queries, and brand theming.