Installation
Theme
Mode

Forms & input

Status stepper

An inline status pill you advance with a single click — Backlog → Todo → In progress → In review → Done — with a progress track that fills as work moves. Right-click or the caret jumps straight to any status. The fastest way to nudge a task forward without opening a menu.

$npx shadcn@latest add @orbit/status-stepper

Overview

Click a pill to step it forward (it loops past Done), or use the caret / right-click to set any status directly.

Click a status to advance it

Left-click steps forward through the workflow · right-click (or the caret) picks any status

ORB-241Ship onboarding flow v2
ORB-238API rate limiting
ORB-235Marketing site refresh
ORB-230Quarterly roadmap draft
ORB-225Design system audit

States

Disabled mutes the pill and blocks both the advance and the menu. showTrack={false} drops the progress bar for tight layouts.

Statuses

One pill per workflow stage. The dot, label, tint and reached track ticks all take the status colour, and the segmented bar fills as the status advances.

Controlled

Pass value + onValueChange to own the status, or defaultValue for an uncontrolled start. Advancing and jumping both report through onValueChange.

value: "todo" · Todo

Custom workflows

Pass your own ordered statuses — each with a value, label and colour token. The stepper loops through whatever sequence you give it, and WORKFLOW_STATUSES exports the default five-stage set.

Props

PropTypeDefaultDescription
statusesStepperStatus[]WORKFLOW_STATUSESOrdered workflow statuses. Defaults to the spec's five-stage set (exported as WORKFLOW_STATUSES).
valuestringCurrent status value. Use with onValueChange for a controlled stepper.
defaultValuestringstatuses[0].valueInitial status when uncontrolled.
onValueChange(value: string) => voidCalled with the new status value on advance or jump.
showTrackbooleantrueSegmented progress bar beside the pill.
disabledbooleanfalseBlocks the advance click, the caret and the right-click menu.
…restHTMLAttributes<HTMLDivElement>Everything else is forwarded to the wrapper div, including ref and className.
PropTypeDefaultDescription
StepperStatus.valuestringUnique value identifying the status.
StepperStatus.labelstringText shown in the pill and the jump menu.
StepperStatus.colorstringStatus colour — a theme token or a color-mix of tokens (never raw hex).

Usage

Use the stepper where a status moves forward in a known order. For unordered options or multi-select, a plain Combobox or Status menu is the right control.

Do

Order matches the board

Step through the same sequence as your Kanban columns, so advancing here and dragging there mean the same thing.

Don’t

Trap users in the loop

Looping past Done is handy, but always offer the direct picker so no one has to click five times to go back one.

Do

Colour-code consistently

Reuse the status palette everywhere — the same green for Done in the pill, the track, the board and the charts.

Don’t

Use it for unordered sets

Stepping implies a sequence. For labels, assignees or anything without a natural order, use a menu or combobox.

Keyboard & accessibility

The pill is a native button — its accessible name announces the current status and the step it advances to — and the jump menu inherits Base UI Menu semantics: roving focus, typeahead, Escape to close. The dot pulse and track transition freeze under prefers-reduced-motion.

Click / EnterAdvance one step (loops past Done)
Right-clickOpen the jump menu on the pill
CaretOpen the jump menu
↑ ↓Move through the menu
EnterSet the highlighted status
EscClose the menu
Tab to a pill, press Enter to advance, then Tab to the caret