Skip to content

Stepper

Stepper and StepperStep form a compound component for wizard-style multi-step flows. The Stepper manages navigation state and renders the indicator track automatically from the registered steps; StepperStep provides the step content and exposes an actions slot for navigation buttons.

Basic horizontal

Tailwind v4
vue
<script setup>
import { ref } from 'vue'
const step = ref(0)
</script>

<Stepper v-model="step">
  <StepperStep title="Account" description="Login details">
    <p>Set up your account credentials.</p>
    <template #actions="{ next, back, isFirst, isLast }">
      <Button :disabled="isFirst" @click="back">Back</Button>
      <Button @click="next">{{ isLast ? 'Finish' : 'Continue' }}</Button>
    </template>
  </StepperStep>
  <StepperStep title="Profile" description="Your information">
    <p>Tell us a bit about yourself.</p>
    <template #actions="{ next, back, isFirst, isLast }">
      <Button :disabled="isFirst" @click="back">Back</Button>
      <Button @click="next">{{ isLast ? 'Finish' : 'Continue' }}</Button>
    </template>
  </StepperStep>
  <StepperStep title="Review">
    <p>Check everything looks right before submitting.</p>
    <template #actions="{ next, back, isFirst, isLast }">
      <Button :disabled="isFirst" @click="back">Back</Button>
      <Button @click="next">{{ isLast ? 'Finish' : 'Continue' }}</Button>
    </template>
  </StepperStep>
</Stepper>

Vertical orientation

Tailwind v4
vue
<Stepper v-model="step" orientation="vertical">
  <StepperStep title="Shipping" description="Where to send it">
    <p>Enter your shipping address details.</p>
    <template #actions="{ next, back, isFirst, isLast }">
      <Button :disabled="isFirst" @click="back">Back</Button>
      <Button @click="next">{{ isLast ? 'Place Order' : 'Next' }}</Button>
    </template>
  </StepperStep>
  <StepperStep title="Payment" description="How to pay">
    <p>Enter your payment information.</p>
    <template #actions="{ next, back, isFirst, isLast }">
      <Button :disabled="isFirst" @click="back">Back</Button>
      <Button @click="next">{{ isLast ? 'Place Order' : 'Next' }}</Button>
    </template>
  </StepperStep>
  <StepperStep title="Confirm">
    <p>Review your order before placing it.</p>
    <template #actions="{ next, back, isFirst, isLast }">
      <Button :disabled="isFirst" @click="back">Back</Button>
      <Button @click="next">{{ isLast ? 'Place Order' : 'Next' }}</Button>
    </template>
  </StepperStep>
</Stepper>

With form content and sizes

Tailwind v4
vue
<Stepper v-model="step" size="lg">
  <StepperStep title="Personal Info" description="Basic details" icon="👤">
    <!-- form fields -->
    <template #actions="{ next, back, isFirst, isLast }">
      <Button :disabled="isFirst" @click="back">Back</Button>
      <Button @click="next">{{ isLast ? 'Submit' : 'Continue' }}</Button>
    </template>
  </StepperStep>
  <StepperStep title="Choose Plan" icon="📋">
    <!-- plan picker -->
    <template #actions="{ next, back, isFirst, isLast }">
      <Button :disabled="isFirst" @click="back">Back</Button>
      <Button @click="next">{{ isLast ? 'Submit' : 'Continue' }}</Button>
    </template>
  </StepperStep>
</Stepper>

Props

Stepper

PropTypeDefaultDescription
modelValuenumber0Active step index (0-based). Use with v-model
orientation'horizontal' | 'vertical''horizontal'Layout direction of the indicator track
linearbooleantrueWhen true, users cannot skip ahead past uncompleted steps
size'sm' | 'md' | 'lg''md'Size of the step indicator circles

StepperStep

PropTypeDefaultDescription
titlestringRequired. Label shown in the indicator track
descriptionstringOptional subtitle shown beneath the title in the track
iconstringEmoji or character shown inside the circle instead of the step number
disabledbooleanfalsePrevents the step from being navigated to

Emits

Stepper

EventPayloadDescription
update:modelValuenumberEmitted when the active step changes
completeEmitted when next() is called on the final step

Slots

Stepper

SlotDescription
defaultPlace StepperStep components here

StepperStep

SlotSlot propsDescription
defaultStep body content, shown only when this step is active
actions{ next, back, isFirst, isLast, step, canGoNext, isCompleted }Navigation controls area. Use the injected next / back helpers to advance or retreat

Private — Jetpack Labs internal use only