Pro Component — This component requires an Aura UI Pro license.
Overview
The Steps component displays a visual progress indicator for multi-step processes such as checkout flows, onboarding wizards, or registration forms. Each step shows its title, optional description, and current status (pending, current, completed). Steps are connected by visual lines that reflect progress.
Basic Usage
Account
2
Profile
3
Review
<x-aura::steps>
<x-aura::steps.step title="Account" status="completed" />
<x-aura::steps.step title="Profile" status="current" />
<x-aura::steps.step title="Review" status="pending" />
</x-aura::steps>
Props
Steps
| Prop | Type | Default | Description |
|---|---|---|---|
current |
int |
0 |
Index of the currently active step (used with Alpine.js for dynamic navigation). |
variant |
string |
'horizontal' |
Layout direction: horizontal or vertical. |
clickable |
bool |
false |
Allow clicking on steps to navigate. |
size |
string |
'md' |
Size variant: sm, md, lg. |
Steps Step
| Prop | Type | Default | Description |
|---|---|---|---|
title |
string |
'' |
Step heading text (alias: label). |
description |
string |
'' |
Optional description shown below the title. |
step |
int |
0 |
Zero-based step index (determines number displayed and status via parent's current). |
status |
string|null |
null |
Explicit status override: pending, current, or completed. When set, renders server-side without Alpine. |
icon |
string|null |
null |
Custom icon name. Defaults to a checkmark for completed and a number for others. |
Examples
Checkout Wizard
Cart
Review your items
Shipping
Delivery address
Payment
Payment method
Confirmation
Order summary
<x-aura::steps>
<x-aura::steps.step
title="Cart"
description="Review your items"
status="completed"
icon="shopping-cart"
/>
<x-aura::steps.step
title="Shipping"
description="Delivery address"
status="completed"
icon="truck"
/>
<x-aura::steps.step
title="Payment"
description="Payment method"
status="current"
icon="credit-card"
/>
<x-aura::steps.step
title="Confirmation"
description="Order summary"
status="pending"
icon="check-circle"
/>
</x-aura::steps>
Onboarding Flow
Create Account
Email and password
2
Company Details
Business information
3
Invite Team
Add team members
4
Get Started
Explore the platform
<x-aura::steps>
<x-aura::steps.step
title="Create Account"
description="Email and password"
status="completed"
/>
<x-aura::steps.step
title="Company Details"
description="Business information"
status="current"
/>
<x-aura::steps.step
title="Invite Team"
description="Add team members"
status="pending"
/>
<x-aura::steps.step
title="Get Started"
description="Explore the platform"
status="pending"
/>
</x-aura::steps>
Livewire Multi-Step Form
<!-- Blade view -->
<div>
<x-aura::steps>
<x-aura::steps.step
title="Personal Info"
:status="$currentStep > 1 ? 'completed' : ($currentStep === 1 ? 'current' : 'pending')"
/>
<x-aura::steps.step
title="Address"
:status="$currentStep > 2 ? 'completed' : ($currentStep === 2 ? 'current' : 'pending')"
/>
<x-aura::steps.step
title="Preferences"
:status="$currentStep > 3 ? 'completed' : ($currentStep === 3 ? 'current' : 'pending')"
/>
<x-aura::steps.step
title="Confirm"
:status="$currentStep === 4 ? 'current' : 'pending'"
/>
</x-aura::steps>
<div class="mt-8">
@if($currentStep === 1)
{{-- Step 1 form fields --}}
<x-aura::input label="Full Name" name="name" wire:model="name" />
<x-aura::input label="Email" name="email" type="email" wire:model="email" />
@elseif($currentStep === 2)
{{-- Step 2 form fields --}}
<x-aura::input label="Street" name="street" wire:model="street" />
<x-aura::input label="City" name="city" wire:model="city" />
@elseif($currentStep === 3)
{{-- Step 3 form fields --}}
<x-aura::select label="Language" name="language" :options="$languages" wire:model="language" />
@else
{{-- Step 4: review --}}
<p>Review your information before submitting.</p>
@endif
</div>
<div class="mt-6 flex justify-between">
@if($currentStep > 1)
<x-aura::button variant="ghost" wire:click="previousStep">Back</x-aura::button>
@else
<div></div>
@endif
@if($currentStep < 4)
<x-aura::button wire:click="nextStep">Continue</x-aura::button>
@else
<x-aura::button wire:click="submit">Submit</x-aura::button>
@endif
</div>
</div>
// Livewire component
class RegistrationWizard extends Component
{
public int $currentStep = 1;
public string $name = '';
public string $email = '';
public string $street = '';
public string $city = '';
public string $language = '';
public function nextStep(): void
{
$this->validateCurrentStep();
$this->currentStep = min($this->currentStep + 1, 4);
}
public function previousStep(): void
{
$this->currentStep = max($this->currentStep - 1, 1);
}
public function submit(): void
{
// Save registration data
$this->dispatch('toast', type: 'success', message: 'Registration complete!');
}
private function validateCurrentStep(): void
{
match ($this->currentStep) {
1 => $this->validate(['name' => 'required', 'email' => 'required|email']),
2 => $this->validate(['street' => 'required', 'city' => 'required']),
3 => $this->validate(['language' => 'required']),
default => null,
};
}
}
Minimal Without Descriptions
Upload
2
Process
3
Done
<x-aura::steps>
<x-aura::steps.step title="Upload" status="completed" />
<x-aura::steps.step title="Process" status="current" />
<x-aura::steps.step title="Done" status="pending" />
</x-aura::steps>
Slots
| Slot | Component | Description |
|---|---|---|
| default | steps |
Contains steps.step children. |
| default | steps.step |
Not typically used; title and description come from props. |
Accessibility
- The steps container uses
role="navigation"witharia-label="Progress". - Each step uses
aria-current="step"when its status iscurrent. - Completed steps are indicated with
aria-labelincluding "completed" status. - The connecting lines between steps are decorative and hidden from screen readers with
aria-hidden="true". - Step numbers or icons include meaningful
alt/aria-labeltext. - The component is purely visual and does not handle navigation; keyboard navigation is managed by the surrounding form or wizard controls.