- Vertical Stepper
- Examples
- Basic Vertical Stepper
- Active State
- With Custom Icons
- Completed Steps with Icons
- Order Processing Workflow
- Without First and Last Markers
- Installation Progress
- Project Onboarding
- Error State
- Dynamic Vertical Stepper
- Compact Vertical Stepper
- Integration Patterns
- Combined with Horizontal Stepper
- With Action Buttons
- Nested Steps
- Importing
- Slots
- Properties
- Parts
Vertical Stepper
<zn-vertical-stepper> | ZnVerticalStepper
Vertical steppers display a sequence of steps in a vertical layout with descriptions and optional icons.
<zn-vertical-stepper caption="Create Account" description="Enter your personal information" first active></zn-vertical-stepper> <zn-vertical-stepper caption="Verify Email" description="Check your inbox for verification link" active></zn-vertical-stepper> <zn-vertical-stepper caption="Complete Profile" description="Add additional details to your profile" last></zn-vertical-stepper>
Examples
Basic Vertical Stepper
Vertical steppers are composed of individual step items arranged vertically. Use the first,
active, and last attributes to control appearance and connection lines.
<zn-vertical-stepper caption="Step One" description="This is the first step" first></zn-vertical-stepper> <zn-vertical-stepper caption="Step Two" description="This is the second step"></zn-vertical-stepper> <zn-vertical-stepper caption="Step Three" description="This is the final step" last></zn-vertical-stepper>
Active State
Use the active attribute to highlight the current step in the process. The active step is
visually distinguished from completed and upcoming steps.
<zn-vertical-stepper caption="Account Created" description="Your account has been created successfully" first></zn-vertical-stepper> <zn-vertical-stepper caption="Email Verification" description="Verify your email address" active></zn-vertical-stepper> <zn-vertical-stepper caption="Profile Setup" description="Complete your profile information" last></zn-vertical-stepper>
With Custom Icons
Use the icon slot to add custom icons or indicators for each step.
<zn-vertical-stepper caption="Personal Details" description="Enter your name and contact information" first active> <zn-icon slot="icon" src="person"></zn-icon> </zn-vertical-stepper> <zn-vertical-stepper caption="Address" description="Provide your shipping address"> <zn-icon slot="icon" src="home"></zn-icon> </zn-vertical-stepper> <zn-vertical-stepper caption="Payment" description="Add payment method" last> <zn-icon slot="icon" src="credit_card"></zn-icon> </zn-vertical-stepper>
Completed Steps with Icons
Show completed steps with check marks or success icons.
<zn-vertical-stepper caption="Registration" description="Account created successfully" first> <zn-icon slot="icon" src="check_circle" style="color: rgb(var(--zn-success))"></zn-icon> </zn-vertical-stepper> <zn-vertical-stepper caption="Verification" description="Email verified" active> <zn-icon slot="icon" src="check_circle" style="color: rgb(var(--zn-success))"></zn-icon> </zn-vertical-stepper> <zn-vertical-stepper caption="Payment Setup" description="Add your payment method"> <zn-icon slot="icon" src="pending" style="color: rgb(var(--zn-text-secondary))"></zn-icon> </zn-vertical-stepper> <zn-vertical-stepper caption="Complete Profile" description="Upload profile picture" last> <zn-icon slot="icon" src="pending" style="color: rgb(var(--zn-text-secondary))"></zn-icon> </zn-vertical-stepper>
Order Processing Workflow
A practical example showing an order fulfillment process with different step states.
<zn-vertical-stepper caption="Order Received" description="Order #12345 received on Jan 20, 2026" first> <zn-icon slot="icon" src="check_circle" style="color: rgb(var(--zn-success))"></zn-icon> </zn-vertical-stepper> <zn-vertical-stepper caption="Processing" description="Your order is being prepared" active> <zn-icon slot="icon" src="shopping_bag" style="color: rgb(var(--zn-primary))"></zn-icon> </zn-vertical-stepper> <zn-vertical-stepper caption="Shipped" description="Estimated delivery: Jan 25, 2026"> <zn-icon slot="icon" src="local_shipping" style="color: rgb(var(--zn-text-secondary))"></zn-icon> </zn-vertical-stepper> <zn-vertical-stepper caption="Delivered" description="Package will arrive at your doorstep" last> <zn-icon slot="icon" src="home" style="color: rgb(var(--zn-text-secondary))"></zn-icon> </zn-vertical-stepper>
Without First and Last Markers
Create continuous step lists by omitting the first and last attributes when steps
are part of a larger scrollable list.
<zn-vertical-stepper caption="Introductory Step" description="Beginning of the process"></zn-vertical-stepper> <zn-vertical-stepper caption="Middle Step" description="Ongoing process" active></zn-vertical-stepper> <zn-vertical-stepper caption="Another Step" description="More to come"></zn-vertical-stepper>
Installation Progress
Show detailed installation or setup progress with descriptive text for each phase.
<zn-vertical-stepper caption="Download" description="Downloading installer files (45 MB)" first> <zn-icon slot="icon" src="check_circle" style="color: rgb(var(--zn-success))"></zn-icon> </zn-vertical-stepper> <zn-vertical-stepper caption="Extract" description="Extracting packages and dependencies" active> <zn-icon slot="icon" src="folder_zip" style="color: rgb(var(--zn-primary))"></zn-icon> </zn-vertical-stepper> <zn-vertical-stepper caption="Install" description="Installing application components"> <zn-icon slot="icon" src="pending" style="color: rgb(var(--zn-text-secondary))"></zn-icon> </zn-vertical-stepper> <zn-vertical-stepper caption="Configure" description="Setting up initial configuration" last> <zn-icon slot="icon" src="pending" style="color: rgb(var(--zn-text-secondary))"></zn-icon> </zn-vertical-stepper>
Project Onboarding
A multi-step onboarding flow with clear descriptions for each phase.
<zn-vertical-stepper caption="Welcome" description="Introduction to the platform and key features" first> <zn-icon slot="icon" src="check_circle" style="color: rgb(var(--zn-success))"></zn-icon> </zn-vertical-stepper> <zn-vertical-stepper caption="Team Setup" description="Invite team members and assign roles" active> <zn-icon slot="icon" src="group_add" style="color: rgb(var(--zn-primary))"></zn-icon> </zn-vertical-stepper> <zn-vertical-stepper caption="Project Configuration" description="Set up your first project and workspace"> <zn-icon slot="icon" src="settings" style="color: rgb(var(--zn-text-secondary))"></zn-icon> </zn-vertical-stepper> <zn-vertical-stepper caption="Integration" description="Connect external tools and services"> <zn-icon slot="icon" src="link" style="color: rgb(var(--zn-text-secondary))"></zn-icon> </zn-vertical-stepper> <zn-vertical-stepper caption="Launch" description="Review settings and go live" last> <zn-icon slot="icon" src="rocket_launch" style="color: rgb(var(--zn-text-secondary))"></zn-icon> </zn-vertical-stepper>
Error State
Show error or warning states in your stepper workflow.
<zn-vertical-stepper caption="Validation" description="Form validation passed" first> <zn-icon slot="icon" src="check_circle" style="color: rgb(var(--zn-success))"></zn-icon> </zn-vertical-stepper> <zn-vertical-stepper caption="Payment Processing" description="Payment failed - card declined" active> <zn-icon slot="icon" src="error" style="color: rgb(var(--zn-error))"></zn-icon> </zn-vertical-stepper> <zn-vertical-stepper caption="Confirmation" description="Order confirmation email" last> <zn-icon slot="icon" src="pending" style="color: rgb(var(--zn-text-secondary))"></zn-icon> </zn-vertical-stepper>
Dynamic Vertical Stepper
Update vertical stepper states dynamically based on user actions.
<div id="dynamic-vertical-steps"> <zn-vertical-stepper id="v-step-1" caption="Step 1" description="Complete this step" first active> <zn-icon slot="icon" src="radio_button_checked"></zn-icon> </zn-vertical-stepper> <zn-vertical-stepper id="v-step-2" caption="Step 2" description="Pending"> <zn-icon slot="icon" src="radio_button_unchecked"></zn-icon> </zn-vertical-stepper> <zn-vertical-stepper id="v-step-3" caption="Step 3" description="Pending" last> <zn-icon slot="icon" src="radio_button_unchecked"></zn-icon> </zn-vertical-stepper> </div> <br /> <zn-button id="v-next-step">Complete Current Step</zn-button> <zn-button id="v-reset" color="secondary">Reset</zn-button> <script type="module"> let currentVStep = 1; const maxVSteps = 3; const nextBtn = document.getElementById('v-next-step'); const resetBtn = document.getElementById('v-reset'); function updateVerticalSteps() { for (let i = 1; i <= maxVSteps; i++) { const step = document.getElementById(`v-step-${i}`); const icon = step.querySelector('zn-icon'); if (i < currentVStep) { // Completed step step.removeAttribute('active'); icon.setAttribute('src', 'check_circle'); icon.style.color = 'rgb(var(--zn-success))'; step.description = 'Completed'; } else if (i === currentVStep) { // Active step step.setAttribute('active', ''); icon.setAttribute('src', 'radio_button_checked'); icon.style.color = 'rgb(var(--zn-primary))'; step.description = 'In Progress'; } else { // Future step step.removeAttribute('active'); icon.setAttribute('src', 'radio_button_unchecked'); icon.style.color = 'rgb(var(--zn-text-secondary))'; step.description = 'Pending'; } } if (currentVStep > maxVSteps) { nextBtn.disabled = true; } else { nextBtn.disabled = false; } } nextBtn.addEventListener('click', () => { if (currentVStep <= maxVSteps) { currentVStep++; updateVerticalSteps(); } }); resetBtn.addEventListener('click', () => { currentVStep = 1; updateVerticalSteps(); }); </script>
Compact Vertical Stepper
Create a more compact layout by adjusting spacing with CSS.
<div class="compact-stepper"> <zn-vertical-stepper caption="Login" description="User authenticated" first> <zn-icon slot="icon" src="check_circle" style="color: rgb(var(--zn-success))"></zn-icon> </zn-vertical-stepper> <zn-vertical-stepper caption="Dashboard" description="Loading user data" active> <zn-icon slot="icon" src="dashboard"></zn-icon> </zn-vertical-stepper> <zn-vertical-stepper caption="Reports" description="View analytics" last> <zn-icon slot="icon" src="bar_chart"></zn-icon> </zn-vertical-stepper> </div> <style> .compact-stepper zn-vertical-stepper { margin: 8px 0; } </style>
Integration Patterns
Combined with Horizontal Stepper
Combine vertical and horizontal steppers for complex workflows where the horizontal stepper shows high-level progress and vertical steppers show detailed sub-steps.
<zn-stepper label="Account Setup Process" caption="Step 2: Profile Configuration" steps="3" value="2" show-progress> </zn-stepper> <br /><br /> <div style="padding-left: 20px;"> <zn-vertical-stepper caption="Basic Info" description="Name, email, and contact details" first> <zn-icon slot="icon" src="check_circle" style="color: rgb(var(--zn-success))"></zn-icon> </zn-vertical-stepper> <zn-vertical-stepper caption="Profile Photo" description="Upload your profile picture" active> <zn-icon slot="icon" src="photo_camera" style="color: rgb(var(--zn-primary))"></zn-icon> </zn-vertical-stepper> <zn-vertical-stepper caption="Preferences" description="Set notification and privacy settings" last> <zn-icon slot="icon" src="tune" style="color: rgb(var(--zn-text-secondary))"></zn-icon> </zn-vertical-stepper> </div>
With Action Buttons
Add interactive elements next to each step for expanded functionality.
<div style="display: flex; align-items: center; gap: 10px;"> <div style="flex: 1;"> <zn-vertical-stepper caption="Review Changes" description="Check all modifications before committing" first active> <zn-icon slot="icon" src="preview"></zn-icon> </zn-vertical-stepper> </div> <zn-button size="small" icon="edit" color="transparent">Edit</zn-button> </div> <div style="display: flex; align-items: center; gap: 10px;"> <div style="flex: 1;"> <zn-vertical-stepper caption="Run Tests" description="Execute test suite"> <zn-icon slot="icon" src="pending"></zn-icon> </zn-vertical-stepper> </div> <zn-button size="small" icon="play_arrow" color="transparent" disabled>Run</zn-button> </div> <div style="display: flex; align-items: center; gap: 10px;"> <div style="flex: 1;"> <zn-vertical-stepper caption="Deploy" description="Push changes to production" last> <zn-icon slot="icon" src="pending"></zn-icon> </zn-vertical-stepper> </div> <zn-button size="small" icon="publish" color="transparent" disabled>Deploy</zn-button> </div>
Nested Steps
Show hierarchical relationships by nesting vertical steppers or indenting them.
<zn-vertical-stepper caption="Phase 1: Planning" description="Define project scope and requirements" first> <zn-icon slot="icon" src="check_circle" style="color: rgb(var(--zn-success))"></zn-icon> </zn-vertical-stepper> <div style="padding-left: 40px;"> <zn-vertical-stepper caption="1.1 Research" description="Market analysis completed"> <zn-icon slot="icon" src="check_circle" style="color: rgb(var(--zn-success))"></zn-icon> </zn-vertical-stepper> <zn-vertical-stepper caption="1.2 Design" description="Wireframes and mockups"> <zn-icon slot="icon" src="check_circle" style="color: rgb(var(--zn-success))"></zn-icon> </zn-vertical-stepper> </div> <zn-vertical-stepper caption="Phase 2: Development" description="Build and test features" active> <zn-icon slot="icon" src="code" style="color: rgb(var(--zn-primary))"></zn-icon> </zn-vertical-stepper> <zn-vertical-stepper caption="Phase 3: Deployment" description="Release to production" last> <zn-icon slot="icon" src="pending"></zn-icon> </zn-vertical-stepper>
Importing
If you’re using the autoloader or the traditional loader, you can ignore this section. Otherwise, feel free to use any of the following snippets to cherry pick this component.
To import this component from the CDN using a script tag:
<script type="module" src="https://cdn.jsdelivr.net/npm/@kubex/zinc@1.0.86/dist/components/vertical-stepper/vertical-stepper.js"></script>
To import this component from the CDN using a JavaScript import:
import 'https://cdn.jsdelivr.net/npm/@kubex/zinc@1.0.86/dist/components/vertical-stepper/vertical-stepper.js';
To import this component using a bundler:
import '@kubex/zinc/dist/components/vertical-stepper/vertical-stepper.js';
Slots
| Name | Description |
|---|---|
icon
|
Optional slot for adding an icon or indicator before the step content. |
Learn more about using slots.
Properties
| Name | Description | Reflects | Type | Default |
|---|---|---|---|---|
last
|
When true, removes the connecting line below this step (use for the final step in a sequence). |
|
boolean
|
false
|
first
|
When true, indicates this is the first step in the sequence (affects visual styling). |
|
boolean
|
false
|
active
|
When true, highlights this step as the current active step in the process. |
|
boolean
|
false
|
description
|
A descriptive text explaining what happens in this step or its current status. |
|
string
|
- |
caption
|
The main label/title for this step. |
|
string
|
- |
updateComplete |
A read-only promise that resolves when the component has finished updating. |
Learn more about attributes and properties.
Parts
| Name | Description |
|---|---|
vs |
The main container for the vertical stepper. |
vs__left |
The left section containing the icon and connecting line. |
vs__icon |
The icon container. |
vs__line |
The vertical connecting line between steps. |
vs__right |
The right section containing caption and description text. |
vs__caption |
The caption/title text element. |
vs__description |
The description text element. |
Learn more about customizing CSS parts.