Skip to main content
The StepperBase provides a controllable stepper primitive. The caller sets the current step and each step’s outcome. Use Stepper for the linear wizard.StepperBase uses the same visual tokens as Stepper.

Common Examples

Current and complete together

Completeness is the step state, not “this index is behind current.” A step can be current and complete at the same time.

Step outcomes

Set state on each StepperBase.Step to "not started", "started", or "complete". The default is "not started". Outcome does not change when index changes.

Adding panel content

Content can be added with StepperBase.Panel. The step prop on a panel must match the id on its StepperBase.Step. This is the inverse of Stepper, where the step’s controls prop names the panel.A step id is required only when a panel points at that step. Panel id is optional and is generated for aria-controls when omitted.

Interactive navigation

The track is display-only by default. Set interactive to let click and keyboard change the current step. Pair a controlled index with onIndexChange. disabled on a step blocks activation from the track. Step onClick notifies only and does not replace onIndexChange.
Do not mix Stepper and StepperBase children in the same tree.

React Accessibility

  • The list uses role="tablist". Each step is a role="tab". A visible panel uses role="tabpanel"
  • The current step has aria-selected="true"
  • When a panel is present, the step sets aria-controls to the panel id
  • Disabled steps use aria-disabled so onClick still fires
  • Steps are tabIndex={-1} unless interactive is true, the step is current, and the step is not disabled
  • When interactive is true, Arrow Left and Arrow Right move among steps that are not disabled. Enter and Space activate the focused step
Last modified on August 20, 2026