Stepper

Multi-step flows with the finish line always in view.

v1.0.0·Updated Jul 8, 2026 · 10:45
Live Demo — Fully Interactive
Done · current · upcoming, the finish always in view
Account
Profile
3Workspace
4Done
Configuration
Orientation
Current step
Sub-label
Account
2Profile
3Confirm
<Stepper orientation="horizontal" current={1} />
Behavior — The Engineering Contract
Prop / eventTypeNotes
currentnumberZero-based index of the active step
orientationhorizontal · verticalRow of steps, or a stacked column
Step.label / substringName and an optional supporting line
onStepClick(index) => voidNavigate back to a completed step
done stateSteps before current show a warm check

A Stepper maps a flow of discrete steps. For continuous completion of one task use Progress; for switching peer views use Tabs.

Anatomy
Account
2Profile
3Confirm
1Done stepSolid warm dot with a check; a warm connector.
2Current stepRinged warm outline; the active number.
3LabelBrightens from the current step onward.
Do's and Don'ts
✓ Do
Account
Profile
3Confirm

Keep it to a few clear steps, with the current one obvious.

✕ Don't
1
2
3
4
5
6
7

Don't cram seven-plus steps in a row. Group or go vertical.

✓ Do
Account
Profile
Confirm

Mark finished steps with a check so progress is unmistakable.

✕ Don't
1
2
3

Don't light every step as current. Exactly one is active.

In context: Examples
A · Onboarding
Account
2Profile
3Confirm

Multi-step sign-up with the finish line always shown.

B · Checkout
Account
Profile
3Confirm

Cart → shipping → payment, one step at a time.

C · Vertical
Account
2Profile
3Done

Vertical steps for wizards in a narrow panel.

Measurements & Tokens
TokenValueRole
--step-dot30pxStep marker diameter
--step-line2pxConnector thickness
--step-done#FF7A00Done dot and connector
--step-current#FF9D45Active number + warm halo
--step-idle#2A2A30Upcoming border and line
--step-halo3px rgba(255,122,0,.15)Ring on the current step
Code
<div class="o-stepper" role="list">
  <div class="o-step is-done" role="listitem">
    <span class="o-step__line"></span>
    <span class="o-step__dot"><CheckIcon /></span>
    <span class="o-step__label">Account</span>
  </div>
  <div class="o-step is-current" role="listitem">
    <span class="o-step__line"></span>
    <span class="o-step__dot">2</span>
    <span class="o-step__label">Profile</span>
  </div>
  <div class="o-step" role="listitem">
    <span class="o-step__dot">3</span><span class="o-step__label">Confirm</span>
  </div>
</div>