import { Component } from '@angular/core';
import { WrStep, WrStepper } from 'ngwr/stepper';
@Component({ imports: [WrStep, WrStepper] })
export class MyComponent {}Stepper
A multi-step flow with numbered headers.
Installation
Import the class, and @use the entry point in your global styles: without it the component renders unstyled.
Basic
Bind [(active)] to the step index. A header click jumps to its step.
<wr-stepper [(active)]="step">
<wr-step label="Account">Account form…</wr-step>
<wr-step label="Profile" description="Optional">Profile form…</wr-step>
<wr-step label="Confirm">Review and submit…</wr-step>
</wr-stepper>Linear
With linear, steps past the last completed one are locked. Move with next() and prev().
<wr-stepper #stepper [(active)]="step" linear>
<wr-step label="One" [completed]="oneDone()">…</wr-step>
<wr-step label="Two" [completed]="twoDone()">…</wr-step>
<wr-step label="Three">…</wr-step>
</wr-stepper>
<button (click)="stepper.next()">Next</button>Vertical
<wr-stepper [(active)]="step" orientation="vertical">
<wr-step label="Pick a plan">…</wr-step>
<wr-step label="Billing">…</wr-step>
<wr-step label="Done">…</wr-step>
</wr-stepper>Narrow container (container query)
With responsive, a horizontal stepper turns vertical when it is narrow.
<div style="width: 340px"><wr-stepper responsive>…</wr-stepper></div>API
| Name | Description | Type | Default |
|---|---|---|---|
[(active)] | Active step index (two-way bindable). | number | 0 |
orientation | Layout direction. | 'horizontal' | 'vertical' | 'horizontal' |
linear | Lock steps after the latest completed one. | boolean | false |
responsive | Turn vertical when the stepper itself is narrow. | boolean | false |
next() / prev() / goTo(i) | Imperative navigation. | method | — |
<wr-step>.label | Header text. | string | '' |
<wr-step>.description | Secondary header text. | string | '' |
<wr-step>.optional | Marks the step as optional in the header. | boolean | false |
<wr-step>.completed | Override completion. When null, derived from active > index. | boolean | null | null |
<wr-step>.disabled | Blocks header clicks. | boolean | false |
CSS variables
Set these on the component's selector or a wrapper, not on :root: the defaults are declared on ngwr/stepper's own element.
| Variable | Default | Declared on |
|---|---|---|
--wr-stepper-connector | var(--wr-border-base) | .wr-stepper |
--wr-stepper-connector-margin-block | var(--wr-space-xs) | .wr-stepper__connector |
--wr-stepper-connector-margin-inline | var(--wr-space-sm) | .wr-stepper__connector |
--wr-stepper-font-family | var(--wr-font-family-base) | .wr-stepper |
--wr-stepper-gap | var(--wr-space-lg) | .wr-stepper |
--wr-stepper-header-button-gap | var(--wr-space-md) | .wr-stepper__header-button |
--wr-stepper-header-gap | var(--wr-space-md) | .wr-stepper__header |
--wr-stepper-hint-font-size | var(--wr-text-xs) | .wr-stepper__description |
--wr-stepper-hint-font-weight | var(--wr-font-weight-medium) | .wr-stepper__description |
--wr-stepper-hint-letter-spacing | var(--wr-tracking-normal) | .wr-stepper__description +1 variant override |
--wr-stepper-indicator-border | var(--wr-border-base) | .wr-stepper__indicator |
--wr-stepper-indicator-font-size | var(--wr-text-sm) | .wr-stepper__indicator |
--wr-stepper-indicator-font-weight | var(--wr-font-weight-semibold) | .wr-stepper__indicator |
--wr-stepper-indicator-size | 1.75rem | .wr-stepper |
--wr-stepper-label-font-size | var(--wr-text-sm) | .wr-stepper__label |
--wr-stepper-label-font-weight | var(--wr-font-weight-medium) | .wr-stepper__label |
--wr-stepper-label-gap | 0.0625rem | .wr-stepper__label |
--wr-stepper-muted | var(--wr-color-on-surface-muted) | .wr-stepper |
See also
Component TabsSwitch between panels, or between routes.Component ResultA full-size outcome screen, with ready-made 404, 403 and 500 pages.Component TimelineA list of events in order, vertical or horizontal.Service WrTourA guided tour that highlights one element at a time and explains it.Guide Mobile & responsiveMake ngwr layouts work on touch screens and narrow containers.