Skip to content

Stepper

SStepper shows progress through a sequence of steps (checkout, a setup wizard). The active step is highlighted, completed ones are marked with a check. It is controlled with v-model (the step number, starting at 1); the indicators are clickable and support arrow-key navigation — Reka handles focus and ARIA. The orientation is horizontal or vertical, and the step label can sit on any of the four sides of the indicator (label-placement).

Basic usage

Step 2 of 0

Vertical orientation

Step 1 of 0

Label placement

label-placement sets the side of the indicator where the title and description go: top and bottom put them above and below the circle, start and end before and after it (left and right in a left-to-right layout). The prop works in both orientations, and the default depends on the orientation: a horizontal stepper puts the label below, a vertical one to the right. With a side label the step becomes a row, and the connector becomes a link between steps.

Horizontal layout

Step 2 of 0
Step 2 of 0
Step 2 of 0
Step 2 of 0

Vertical: beside the indicator

On the left is end, the default for the vertical layout; on the right is start: the circles move to the right edge and the labels to the left.

Step 2 of 0
Step 2 of 0

Vertical: above and below the indicator

The step becomes a centered column, as in the horizontal layout: the label is centered on the circle, and the circles and connectors stay on one axis even when labels differ in width.

Step 2 of 0
Step 2 of 0

Responsive layout

A horizontal stepper needs room: at a narrow width the labels shrink until they wrap by words, and beyond that the steps no longer fit. stack-at sets a width in pixels below which the stepper switches to vertical — arrow-key navigation and data-orientation change together with the orientation, so this is a real layout change, not a CSS rotation.

The threshold is compared with the width of the stepper itself, not the window: in a side column or a modal it gets cramped even on a wide screen, where a media query would notice nothing. Without the prop the layout never changes.

Step 2 of 0

To check it, narrow the browser window: below 640px this stepper becomes vertical.

narrow-orientation sets the orientation below the threshold (vertical by default). Combined with orientation="vertical" it gives the reverse layout: a column where there is room — for example, in a side column of a form — and a row above the form when space is tight. Below 480px this stepper turns into a row.

Step 2 of 0

Step icons

The icon field of a step replaces the number in the indicator, and done-icon sets the icon of a completed step (both take a registry name or a raw path).

Step 2 of 0

Linear mode

linear requires going through the steps strictly in order — you cannot jump ahead to an unfinished step (the indicators of future steps are not clickable). Unavailable steps are not dimmed, though: the stepper works as a table of contents, and the names of future steps must stay readable. Only a step explicitly disabled with the disabled field is dimmed.

Step 1 of 0

Color

The color prop sets the color of the active/completed step and the connector from the palette. By default the current step gets a pale background with an accent border; active-variant="filled" fills it with the accent, like completed steps.

Step 2 of 0
Step 2 of 0

API

Props

NameTypeDefaultDescription
items*{ title: string; description?: string; icon?: string; disabled?: boolean }[]requiredList of steps. Indicators are numbered automatically, starting from 1.
colorstringundefinedAccent color (active/completed step): a name from the palette (primary/teal/teal-10).
text-colorstringundefinedColor of the content on the completed step fill: a name from the palette. White by default.
orientation"vertical" | "horizontal""horizontal"Layout orientation of the steps. It also sets the direction of arrow key navigation.
label-placement | "start" | "top" | "bottom" | "end"undefinedSide of the indicator where the step label goes: top and bottom are above and below the circle, start and end are before and after it (left and right in a left-to-right layout). Works in both orientations. Without a value the label is below in the horizontal layout and on the right in the vertical one — there is no shared default, otherwise changing the orientation would move the label.
stack-atnumberundefinedWidth in pixels below which a horizontal stepper switches to vertical. It is compared with the width available to the stepper, not the window: in a narrow column or a modal the layout breaks even on a wide screen. Without the prop the layout never changes.
narrow-orientation"vertical" | "horizontal""vertical"Orientation below the stack-at threshold. vertical by default; horizontal together with orientation="vertical" gives the reverse: a column when wide and a row when narrow.
active-variant"tonal" | "filled""tonal"Style of the current step: tonal is a pale background with an accent border, filled is an accent fill, like completed steps.
linearbooleanfalseRequires completing steps strictly in order (no skipping ahead). Unavailable steps are not dimmed: future step titles stay readable.
done-iconstring"check"Icon of a completed step (a registry name or a raw path).
model-valuenumber1Current active step (1-based). Two-way binding via v-model.

Events

NameSignatureDescription
update:modelValue(value: number) => voidEmitted when modelValue changes. Used for two-way binding (v-model).