Skip to content

Segment ​

Сегментированный контрол для переключения между небольшим набором опций. Современная альтернатива радиокнопкам или вкладкам.

Basic ​

Передайте простой массив строк или чисел. Компонент обрабатывает это автоматически.

Выбрано: weekly

vue
<script setup>
import { ref } from 'vue'
import { VxSegment } from 'veloxui'

const selected = ref('weekly')
</script>

<template>
  <VxSegment v-model="selected" :options="['daily', 'weekly', 'monthly']" />
</template>

Object Options ​

Используйте объекты для большего контроля — label, value, icon и disabled.

vue
<script setup>
import { ref } from 'vue'
const selected = ref('center')
</script>

<template>
  <VxSegment v-model="selected" :options="[
    { label: 'Left', value: 'left' },
    { label: 'Center', value: 'center' },
    { label: 'Right', value: 'right' },
    { label: 'Justify', value: 'justify', disabled: true },
  ]" />
</template>

With Icons ​

Добавьте поле icon к каждой опции.

vue
<VxSegment v-model="view" :options="[
  { label: 'Grid', value: 'grid', icon: '▦' },
  { label: 'List', value: 'list', icon: '☰' },
  { label: 'Board', value: 'board', icon: '▣' },
]" />

Sizes ​

Три размера: sm, default и lg.

vue
<VxSegment :options="options" size="sm" />
<VxSegment :options="options" />
<VxSegment :options="options" size="lg" />

Block ​

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

vue
<VxSegment v-model="tab" :options="['all', 'active', 'completed', 'archived']" block />

Disabled ​

Отключите компонент целиком или отдельные опции.

vue
<!-- Entire component disabled -->
<VxSegment :options="['one', 'two', 'three']" disabled />

<!-- Individual option disabled -->
<VxSegment :options="[
  { label: 'Light', value: 'light' },
  { label: 'Dark', value: 'dark' },
  { label: 'System', value: 'system', disabled: true },
]" />

Custom Content ​

Используйте default-слот для полного контроля над отрисовкой каждой опции. Получает option и active.

vue
<VxSegment v-model="plan" :options="[
  { label: 'Monthly', value: 'monthly' },
  { label: 'Yearly', value: 'yearly' },
]">
  <template #default="{ option, active }">
    <div style="text-align: center;">
      <div style="font-weight: 600;">{{ option.label }}</div>
      <div v-if="option.value === 'yearly'" :style="{ color: active ? 'var(--primary)' : 'var(--muted-foreground)' }">
        Save 20%
      </div>
    </div>
  </template>
</VxSegment>

Custom Classes ​

Переопределите любую часть сегмента с помощью root-class, item-class, active-class и indicator-class. Принимает строки, массивы или объекты — так же, как :class во Vue.

vue
<template>
  <VxSegment
    v-model="tab"
    :options="['Overview', 'Details', 'Activity']"
    root-class="my-segment"
    item-class="my-item"
    active-class="my-active"
    indicator-class="my-indicator"
  />
</template>

<style>
.my-segment { background: color-mix(in srgb, var(--primary) 8%, transparent); border-radius: 14px; }
.my-indicator { background: var(--primary); border-radius: 12px; }
.my-active { color: var(--primary-foreground); }
.my-item { border-radius: 12px; }
</style>

Use Cases ​

Типичные паттерны, где сегменты работают отлично:

Переключатель вида
Интервал оплаты

API ​

VxSegment Props ​

PropTypeDefaultDescription
v-modelstring | number—Выбранное значение
options(string | number | SegmentOption)[][]Массив опций
size'sm' | 'default' | 'lg''default'Размер компонента
blockbooleanfalseВо всю ширину с одинаковыми опциями
disabledbooleanfalseОтключить весь компонент
root-classstring | string[] | object—Привязка класса к корневому контейнеру
item-classstring | string[] | object—Привязка класса к каждому элементу
active-classstring | string[] | object—Привязка класса к активному элементу
indicator-classstring | string[] | object—Привязка класса к скользящему индикатору

SegmentOption ​

PropertyTypeRequiredDescription
labelstringДаОтображаемый текст
valuestring | numberДаЗначение опции
iconstringНетТекст иконки (эмодзи или символ)
disabledbooleanНетОтключить эту опцию

Events ​

EventPayloadDescription
update:modelValuestring | numberВыбранное значение изменилось
changestring | numberВыбранное значение изменилось

Slots ​

SlotPropsDescription
default{ option: SegmentOption, active: boolean }Пользовательское содержимое опции