Stepper
Read-only or interactive ordered workflow progress with open, current, done and blocked states.
Purpose
Use Stepper to communicate ordered workflow progress or let users navigate between known steps.
Process steps
Installation
With the Siteplane registry alias configured, add the component and import the installed source from your app.
CLI
pnpm dlx shadcn@4.16.1 add @siteplane/stepperImport
import { Stepper, StepperButtonItem, StepperItem } from "@/components/ui/stepper";Need the machine-readable source metadata? View registry JSON.
Usage
Stepper shows read-only process state by default. Use StepperButtonItem only when steps are navigable.
import { Stepper, StepperItem } from "@/components/ui/stepper";
export function Example() {
const steps = [
{ title: "Plan", status: "done" },
{ title: "Build", status: "done" },
{ title: "Review", status: "current" },
{ title: "Ship", status: "open" },
] as const;
return (
<Stepper>
{steps.map((step, index) => (
<StepperItem
index={index + 1}
key={step.title}
status={step.status}
title={step.title}
/>
))}
</Stepper>
);
}Examples
Read-only progress, all indicator statuses and clickable steps are props of the same primitive.
Read-only progress
StepperItem is the non-interactive variant for fixed status displays.
Statuses
done renders a check, blocked renders a lock with a dashed warning ring.
Clickable steps
current moves only the selection ring; status icons stay fixed, and disabled steps remain unreachable.
API Reference
The reference lists the source-owned exports and props that are easy to miss in visual examples. Inherited Base UI props remain available unless the wrapper narrows them.
Stepperrenders the ordered-list root.StepperItemis read-only;StepperButtonItemrenders an interactive step button. Both acceptstatus="open" | "current" | "done" | "blocked",title,description,indexandchildren.childrenrender below the title and description inside the content slot, so a step can include supporting fields, actions or status details.StepperButtonItemaccepts normal button props includingdisabled;currentsetsaria-current="step".currentcontrols only the selected indicator ring. It does not mutatestatus, so checkmarks, numbers and locks remain stable when users navigate.
Motion
Component motion uses the shared Siteplane motion contract. See the global motion guide for provider setup, tokens and reduced-motion behavior.
- Indicator state uses the shared fast transition for its small focus/status accent.
- Step content does not mount or collapse automatically. The operating-system reduced-motion preference removes the decorative indicator transition; the forced
reducedMotionPresetshortens its shared fast duration from 140ms to 60ms.
Accessibility
- Keep visual and DOM order identical and preserve the ordered-list structure.
- Mark exactly one current step when the workflow has a current position.
- Use
StepperButtonItemonly when clicking a step performs a real navigation or state change; disabled steps must remain clearly unavailable.
Implementation Guidance
- Use Timeline for read-only history and Stepper for ordered workflow progress.
- Put supporting content in the documented
childrenslot instead of creating a parallel item wrapper. - Do not make a read-only
StepperItemappear clickable.