Skip to content

Steps ​

Компонент индикатора шагов для многоэтапных процессов. Поддерживает горизонтальный и вертикальный layout, иконки, описания, состояние ошибки, кликабельную навигацию, разные размеры и полную CSS-настройку.

Basic ​

Account
2
Profile
3
Review
4
Done
vue
<script setup>
import { ref } from 'vue'
import { VxSteps } from 'veloxui'

const current = ref(1)

const items = [
  { key: 'account', title: 'Account' },
  { key: 'profile', title: 'Profile' },
  { key: 'review', title: 'Review' },
  { key: 'done', title: 'Done' },
]
</script>

<template>
  <VxSteps :items="items" :current="current" />
</template>

With Descriptions ​

AccountCreate your account credentials
2
ProfileFill in your personal details
3
ReviewVerify all information
4
DoneSetup complete
vue
<VxSteps :items="[
  { key: 'account', title: 'Account', description: 'Create your account credentials' },
  { key: 'profile', title: 'Profile', description: 'Fill in your personal details' },
  { key: 'review', title: 'Review', description: 'Verify all information' },
  { key: 'done', title: 'Done', description: 'Setup complete' },
]" :current="1" />

With Icons ​

Account
Settings
Upload
Complete
vue
<VxSteps :items="[
  { key: 'account', title: 'Account', icon: 'user' },
  { key: 'settings', title: 'Settings', icon: 'settings' },
  { key: 'upload', title: 'Upload', icon: 'upload' },
  { key: 'done', title: 'Complete', icon: 'check' },
]" :current="2" />

Error State ​

Установите error: true у элемента шага, чтобы показать его в состоянии ошибки.

Account
Verification
3
Done
vue
<VxSteps :items="[
  { key: 'account', title: 'Account' },
  { key: 'verify', title: 'Verification', error: true },
  { key: 'done', title: 'Done' },
]" :current="1" />

Clickable ​

Установите clickable, чтобы разрешить клики по любому шагу. Используйте v-model:current для двустороннего связывания.

AccountCreate your account credentials
2
ProfileFill in your personal details
3
ReviewVerify all information
4
DoneSetup complete
Текущий шаг: 1
vue
<VxSteps v-model:current="current" :items="items" clickable />

Vertical ​

Order PlacedYour order has been submitted
2
ProcessingWe are preparing your order
3
ShippedPackage is on its way
4
DeliveredPackage has arrived
vue
<script setup>
import { ref } from 'vue'
import { VxSteps } from 'veloxui'

const current = ref(1)

const items = [
  { key: 'order', title: 'Order Placed', description: 'Your order has been submitted' },
  { key: 'processing', title: 'Processing', description: 'We are preparing your order' },
  { key: 'shipped', title: 'Shipped', description: 'Package is on its way' },
  { key: 'delivered', title: 'Delivered', description: 'Package has arrived' },
]
</script>

<template>
  <VxSteps :items="items" :current="current" direction="vertical" />
</template>

Sizes ​

Три размера: sm, md (по умолчанию) и lg.

Account
Profile
3
Review
4
Done
Account
Profile
3
Review
4
Done
Account
Profile
3
Review
4
Done
vue
<VxSteps :items="items" :current="2" size="sm" />
<VxSteps :items="items" :current="2" size="md" />
<VxSteps :items="items" :current="2" size="lg" />

Square Variant ​

Используйте variant="square" для скруглённо-квадратных индикаторов вместо круглых.

AccountCreate your account credentials
2
ProfileFill in your personal details
3
ReviewVerify all information
4
DoneSetup complete
AccountCreate your account credentials
ProfileFill in your personal details
3
ReviewVerify all information
4
DoneSetup complete
vue
<VxSteps :items="items" :current="1" variant="square" clickable />
<VxSteps :items="items" :current="2" variant="square" direction="vertical" />

Custom Dot Size & Line Width ​

Используйте пропы dot-size и line-width, чтобы переопределить предустановленные значения размеров.

Account
2
Profile
3
Review
4
Done
Account
2
Profile
3
Review
4
Done
vue
<VxSteps :items="items" :current="1" :dot-size="40" :line-width="2" />
<VxSteps :items="items" :current="1" :dot-size="20" :line-width="2" />

Custom Colors (CSS Variables) ​

Переопределите любой визуальный аспект через CSS custom properties на классе-обёртке.

AccountCreate your account credentials
2
ProfileFill in your personal details
3
ReviewVerify all information
4
DoneSetup complete
AccountCreate your account credentials
ProfileFill in your personal details
3
ReviewVerify all information
4
DoneSetup complete
vue
<template>
  <div class="steps-green-theme">
    <VxSteps :items="items" :current="1" clickable />
  </div>
</template>

<style>
.steps-green-theme .vx-steps {
  --vx-steps-active-bg: #16a34a;
  --vx-steps-active-border: #16a34a;
  --vx-steps-active-color: #fff;
  --vx-steps-active-shadow: 0 0 0 3px rgba(22, 163, 74, 0.16);
  --vx-steps-completed-bg: #16a34a;
  --vx-steps-completed-border: #16a34a;
  --vx-steps-completed-color: #fff;
  --vx-steps-line-done-color: #16a34a;
}
</style>

Custom Slots ​

Используйте слоты для полной настройки заголовков, описаний, иконок и добавления дополнительного контента для каждого шага.

Account Create your account credentials
2
Profile CurrentFill in your personal details
3
Review Verify all information
4
Done Setup complete
vue
<VxSteps :items="items" :current="current" clickable direction="vertical">
  <!-- Custom title for all steps -->
  <template #title="{ item, status }">
    <span :style="{ fontWeight: status === 'active' ? 700 : 400 }">
      {{ item.title }}
      <VxTag v-if="status === 'active'" size="sm">Current</VxTag>
    </span>
  </template>

  <!-- Extra content only for the 'review' step -->
  <template #content-review="{ status }">
    <div v-if="status === 'active'" style="padding: 12px; background: var(--muted); border-radius: 8px;">
      Please review all your information before proceeding.
    </div>
  </template>
</VxSteps>

Content Panel ​

Используйте слоты panel-{key} для рендеринга контента конкретного шага под панелью шагов. Панель активного шага показывается автоматически.

1
Account
2
Profile
3
Confirm
Создайте учётную запись
vue
<script setup>
import { ref } from 'vue'
import { VxSteps, VxInput, VxButton } from 'veloxui'

const current = ref(0)

const items = [
  { key: 'account', title: 'Account' },
  { key: 'profile', title: 'Profile' },
  { key: 'confirm', title: 'Confirm' },
]

function next() {
  if (current.value < items.length - 1) current.value++
}
function prev() {
  if (current.value > 0) current.value--
}
</script>

<template>
  <VxSteps :items="items" :current="current" clickable>
    <template #panel-account>
      <div style="padding: 20px; border: 1px solid var(--border); border-radius: 10px;">
        <VxInput placeholder="Email address" />
        <VxInput placeholder="Password" type="password" />
        <VxButton size="sm" @click="next">Next</VxButton>
      </div>
    </template>
    <template #panel-profile>
      <div style="padding: 20px; border: 1px solid var(--border); border-radius: 10px;">
        <VxInput placeholder="Full name" />
        <VxButton variant="outline" size="sm" @click="prev">Back</VxButton>
        <VxButton size="sm" @click="next">Next</VxButton>
      </div>
    </template>
    <template #panel-confirm>
      <div style="text-align: center;">All done!</div>
    </template>
  </VxSteps>
</template>

Vertical Content Panel ​

Панель контента работает и в вертикальном направлении — она отображается рядом с шагами.

1
InformationBasic details
2
AddressShipping address
3
PaymentPayment method
Основная информация
vue
<VxSteps :items="items" :current="current" direction="vertical" clickable>
  <template #panel-info>
    <!-- Your form content here -->
  </template>
  <template #panel-address>
    <!-- Address form -->
  </template>
  <template #panel-payment>
    <!-- Payment form -->
  </template>
</VxSteps>

Simple Wizard ​

Минимальный мастер с кнопками «Далее» / «Назад» (без панели контента).

1
Choose Plan
2
Billing
3
Confirm
vue
<script setup>
import { ref } from 'vue'
import { VxSteps, VxButton } from 'veloxui'

const current = ref(0)

const items = [
  { key: 'plan', title: 'Choose Plan' },
  { key: 'billing', title: 'Billing' },
  { key: 'confirm', title: 'Confirm' },
]

function next() {
  if (current.value < items.length - 1) current.value++
}
function prev() {
  if (current.value > 0) current.value--
}
</script>

<template>
  <VxSteps :items="items" :current="current" />
  <div style="margin-top: 20px; display: flex; gap: 8px; justify-content: flex-end;">
    <VxButton variant="outline" size="sm" :disabled="current === 0" @click="prev">Back</VxButton>
    <VxButton size="sm" @click="next" :disabled="current === items.length - 1">Next</VxButton>
  </div>
</template>

API ​

VxSteps Props ​

PropTypeDefaultDescription
itemsStepItem[][]Элементы шагов
currentnumber0Индекс активного шага (с нуля)
direction'horizontal' | 'vertical''horizontal'Направление layout
size'sm' | 'md' | 'lg''md'Размер индикатора шага
variant'circle' | 'square''circle'Форма индикатора
clickablebooleanfalseРазрешить клики по шагам для навигации
dot-sizenumber | string—Переопределить размер индикатора (например, 40 или '40px')
line-widthnumber | string—Переопределить толщину линии (например, 2 или '2px')
root-classstring | string[] | object—Класс на корневом элементе

StepItem ​

PropertyTypeRequiredDescription
keystringДаУникальный идентификатор
titlestringДаЗаголовок шага
descriptionstringНетТекст описания шага
iconstring | ComponentНетПользовательская иконка (заменяет номер)
disabledbooleanНетОтключить этот шаг
errorbooleanНетПоказать состояние ошибки

Slots ​

SlotPropsDescription
icon{ item, status, index }Пользовательский индикатор для всех шагов
icon-{key}{ item, status, index }Пользовательский индикатор для конкретного шага
title{ item, status, index }Пользовательский заголовок для всех шагов
title-{key}{ item, status, index }Пользовательский заголовок для конкретного шага
description{ item, status, index }Пользовательское описание для всех шагов
description-{key}{ item, status, index }Пользовательское описание для конкретного шага
content-{key}{ item, status, index }Дополнительная область контента под текстом конкретного шага
line{ index, status, done }Пользовательская линия-соединитель между шагами
panel{ item, status, index }Панель контента по умолчанию для всех шагов
panel-{key}{ item, status, index }Панель контента для конкретного шага (показывается при активности)

Events ​

EventPayloadDescription
update:current(index: number)Шаг изменён (в кликабельном режиме)
click(index, item)Клик по шагу

CSS Custom Properties ​

Переопределите их на элементе .vx-steps или родительской обёртке для настройки цветов, размеров и отступов.

VariableDefaultDescription
--vx-steps-dot-sizeПредустановка размераШирина/высота индикатора
--vx-steps-dot-radius50% / 8pxСкругление углов индикатора
--vx-steps-dot-font-sizeПредустановка размераРазмер шрифта номера в точке
--vx-steps-dot-font-weight600Насыщенность шрифта номера в точке
--vx-steps-dot-bgvar(--background)Фон предстоящей точки
--vx-steps-dot-bordervar(--border)Граница предстоящей точки
--vx-steps-dot-colorvar(--muted-foreground)Цвет текста предстоящей точки
--vx-steps-active-bgvar(--primary)Фон активной точки
--vx-steps-active-bordervar(--primary)Граница активной точки
--vx-steps-active-colorvar(--primary-foreground)Цвет текста активной точки
--vx-steps-active-shadowсвечение-кольцоbox-shadow активной точки
--vx-steps-completed-bgvar(--primary)Фон завершённой точки
--vx-steps-completed-bordervar(--primary)Граница завершённой точки
--vx-steps-completed-colorvar(--primary-foreground)Цвет текста завершённой точки
--vx-steps-error-bgvar(--background)Фон точки с ошибкой
--vx-steps-error-bordervar(--destructive)Граница точки с ошибкой
--vx-steps-error-colorvar(--destructive)Цвет текста точки с ошибкой
--vx-steps-line-colorvar(--border)Цвет незавершённой линии
--vx-steps-line-done-colorvar(--primary)Цвет завершённой линии
--vx-steps-line-width1pxТолщина линии
--vx-steps-title-sizeПредустановка размераРазмер шрифта заголовка
--vx-steps-title-weight500Насыщенность шрифта заголовка
--vx-steps-title-colorvar(--foreground)Цвет заголовка
--vx-steps-title-upcoming-colorvar(--muted-foreground)Цвет предстоящего заголовка
--vx-steps-title-error-colorvar(--destructive)Цвет заголовка с ошибкой
--vx-steps-desc-sizeПредустановка размераРазмер шрифта описания
--vx-steps-desc-colorvar(--muted-foreground)Цвет описания
--vx-steps-text-gap8pxОтступ между индикатором и текстом (горизонтальный)
--vx-steps-line-gap24pxВертикальное расстояние между шагами
--vx-steps-panel-gap24pxОтступ между панелью шагов и панелью контента
--vx-steps-panel-padding0Отступ панели контента