Skip to content

CdsTabs

Табы делят экран на равнозначные разделы и переключают их на месте, без перехода на другую страницу. Панель собирается из компонентов CdsTab или массива items, а контент разделов переключают CdsTabsView и CdsTabsViewItem.

Storybook GitLab Figma
Покрытие тестами: 0% — низкое покрытие
API в спеках
0 / 107 пропсы, события, слоты и exposed, у которых есть тест
Тест-кейсы
5 юнит · 0 браузерных
Покрытие кода
68.3% строк · 54.5% ветвей замер v4.0.0-alpha.13
A11y (axe)
8 рекомендаций в 19 историях замер v4.0.0-alpha.11

Для последовательного процесса с шагами и прогрессом подойдёт CdsSteps, а для выбора одного значения в форме — CdsButtonToggle.

Анатомия ​

Табы состоят из панели и контентной части: при табах из items контентная часть рендерится автоматически, при ручной разметке CdsTabsView компонуется рядом. Панель — это контейнер с табами-кнопками; выбранный таб подсвечивает подвижная подложка-слайдер.

Вариации ​

Табы и контент ​

Разделы объявляются компонентами CdsTab в слоте по умолчанию, контент — компонентами CdsTabsViewItem внутри CdsTabsView. Пропы value связывают таб с его контентом, а общий v-model синхронизирует панель и контентную часть.

Sandbox Storybook

Табы из массива ​

Передайте в items массив строк или объектов { text, value } — табы и контентная часть отрендерятся автоматически. Контент раздела задают слоты item.{value}, подпись таба — слоты tab.{value}.

Sandbox Storybook

Выравнивание ​

Проп align прижимает табы к началу панели (по умолчанию), центру или концу.

Sandbox Storybook

Компоновка ​

Проп grow растягивает табы на всю ширину панели — каждый забирает равную долю свободного места.

Sandbox Storybook

Проп fixed-tabs тоже выравнивает ширину табов, но ограничивает её 300px и центрирует группу.

Sandbox Storybook

Проп direction="vertical" разворачивает панель в столбец — удобно для настроек и разделов с длинным списком. Контентная часть ставится рядом обычным flex-рядом.

Sandbox Storybook

Иконки ​

Таб принимает те же пропы контента, что и кнопка: prepend-icon и append-icon добавляют иконку рядом с текстом, icon оставляет только её. У таба-иконки не забудьте aria-label — без текста он остаётся единственным названием раздела.

Sandbox Storybook

Проп stacked ставит иконку над текстом — таб становится выше и заметнее. Такая компоновка хорошо работает с align="center" в мобильных сценариях.

Sandbox Storybook

Состояния ​

Проп disabled выключает таб, loading показывает индикатор загрузки вместо контента.

Sandbox Storybook

Цвета ​

Табы принимают цветовые алиасы палитры (neutral, red, green, cyan, purple…) или любой CSS-цвет. Проп color красит текст табов, active-color — подложку выбранного таба, bg-color — фон всей панели, base-color — фон невыбранных табов.

Sandbox Storybook

Прокрутка ​

Когда табы не помещаются в панель, она прокручивается. Проп show-arrows добавляет стрелки прокрутки, center-active держит выбранный таб по центру панели.

Sandbox Storybook

Слайдер ​

Проп slider-transition выбирает анимацию подложки под выбранным табом: shift (по умолчанию) сдвигает её к новому табу, grow выращивает на месте, fade плавно проявляет. Длительность настраивается через slider-transition-duration, а hide-slider убирает подложку совсем.

Sandbox Storybook

Слоты ​

Слоты заменяют автоматический рендер из items, когда нужна своя разметка:

СлотОписание
defaultСвои CdsTab, когда items не задан
tab, tab.{value}Таб для элемента items: общий и для конкретного значения
item, item.{value}Контент раздела: общий и для конкретного значения
viewДополнительный контент внутри CdsTabsView
prev, nextСвои стрелки прокрутки

Слоты tab и item получают элемент массива и заменяют компонент целиком — верните из них CdsTab и CdsTabsViewItem со своим value. Слоты tab.{value} и item.{value} заменяют только контент.

Sandbox Storybook

Рекомендации ​

Сценарии использования ​

Разделы карточки ​

Классические табы: карточка товара с разделами и общим v-model. Счётчик отзывов — CdsBadge с пропом inline прямо в слоте таба.

Sandbox Storybook

Фильтр списка ​

Табы работают и без контентной части: v-model хранит выбранный статус, а список фильтруется по нему через computed. Контент один — меняется только выборка.

Sandbox Storybook

Ленивая загрузка разделов ​

Тяжёлый раздел загружается при первом открытии: watch по v-model запускает запрос, на время загрузки контент подменяет CdsSkeletonLoader, а уже загруженные разделы открываются мгновенно.

Sandbox Storybook

Разделы в меню «Ещё» ​

Когда разделов больше, чем помещается в панель, редкие прячутся в CdsMenu, а его активатор — обычный таб «Ещё» в той же панели. Клик по «Ещё» сразу показывает первый раздел из меню, выбранный пункт занимает место первого видимого таба (вытесненный уходит в меню), а если закрыть меню без выбора — панель и контент вернутся к текущему разделу.

Sandbox Storybook

API ​

CdsTabs ​

Пропсы

ИмяТипПо умолчаниюОписание
activeColorstring | undefined—Цвет компонента, когда он находится в активном состоянии
align"title" | "start" | "end" | "center" | undefined'start'Выравнивание вкладок внутри полосы
baseColorstring | undefined—Цвет неактивного компонента
bgColorstring | undefined—Цвет фона компонента
centerActiveboolean | undefined—Принудительно выравнивает активный компонент по центру.
colorstring | undefined—Цвет компонента
contentClassany—Добавляет классы к контейнеру slide group
contentStyleany—Добавляет inline-стили к контейнеру slide group
direction"horizontal" | "vertical" | undefined'horizontal'Переключение между горизонтальным или вертикальным отображением.
disabledboolean | null | undefinednullЗаблокированное состояние
fixedTabsboolean | undefined—Делает все вкладки одинаковой ширины независимо от длины заголовка
growboolean | undefined—Растягивает вкладки на всю доступную ширину контейнера
heightstring | number | undefined—Высота полосы вкладок. Число — в пикселях, строка — с любой CSS-единицей
hideSliderboolean | undefined—Скрывает подчёркивающий индикатор активной вкладки
insetboolean | undefined—Вариант оформления с подложкой: активная вкладка выделяется залитой «таблеткой», а не подчёркиванием
insetPaddingstring | number | undefined—Внутренний отступ подложки в режиме inset. Число — в пикселях, строка — с любой CSS-единицей
insetRadiusstring | number | undefined—Радиус скругления подложки в режиме inset. Число — в пикселях, строка — с любой CSS-единицей
itemsreadonly TabItem[] | undefined[]Список вкладок. Строка или число — заголовок, объект — вкладка с произвольными пропсами CdsTab
mandatoryboolean | "force" | undefined'force'Обязательный выбор хотя бы одного элемента
maxnumber | undefined—Максимальное количество выбираемых элементов
mobileboolean | null | undefinednullОпределяет режим отображения компонента: Если значение равно true, компонент будет отображаться в режиме для Mobile. Если значение равно false, компонент будет отображаться в режиме для Desktop. Если значение равно null, режим будет зависеть от текущего Breakpoint.
mobileBreakpointnumber | "xs" | "sm" | "md" | "lg" | "xl" | undefined—Указывает точку преломления, при которой отображение будет переключаться в мобильный режим. Может быть числом (например, 600) или строкой, соответствующей одному из предопределенных Breakpoint (например, 'xs', 'sm', 'md', 'lg', 'xl').
modelValueany—Значение выбранных элементов группы
multipleboolean | undefined—Разрешить множественный выбор
nextIconIconValue | undefined'chevron-right'Иконка для кнопки "следующий".
prevIconIconValue | undefined'chevron-left'Иконка для кнопки "предыдущий".
requiredboolean | "force" | undefined'force'Обязательный выбор хотя бы одного элемента
scrollToActiveboolean | undefinedtrueЕсли true, то при изменении активного компонента, контейнер будет прокручиваться так, чтобы он был виден.
selectedClassstring | undefined'cds-tabs--selected'CSS класс для выбранного состояния
showArrowsstring | boolean | undefined—Изменяет настройки отображения стрелок: По умолчанию стрелки всегда отображаются на Desktop устройствах при переполнении контейнера.<br /> При переполнении контейнера на мобильных устройствах стрелки по умолчанию не отображаются.<br /> Значение «true» для параметра «show-arrows» позволяет отображать эти стрелки на мобильных устройствах при переполнении контейнера.<br /> Значение «desktop» всегда отображает стрелки на настольных устройствах, а значение «mobile» — на мобильных устройствах.<br /> Значение «always» всегда отображает стрелки как на настольных, так и на мобильных устройствах.<br /> Используйте значение «never», чтобы отключить отображение стрелок.
sliderTransition"shift" | "grow" | "fade" | undefined—Анимация подчёркивающего индикатора активной вкладки
sliderTransitionDurationstring | number | undefined—Длительность анимации индикатора в миллисекундах. 0 выключает перелёт; по умолчанию — по шкале движения
spaced"both" | "start" | "end" | undefined—Разводит слоты prepend и append к краям кнопки.
stackedboolean | undefined—Располагает иконку и заголовок вкладки вертикально — иконка над текстом
tagstring | JSXComponent<any> | undefined'div'Пользовательский HTML-тег для отображения
textColorstring | undefined—Цвет текста компонента

События

ИмяТипОписание
update:modelValue[value: unknown]Сработало при переключении вкладки. Передаёт значение новой активной вкладки

Слоты

ИмяТипОписание
defaultanyВкладки и содержимое, если они объявляются вручную вместо пропа items
itemCdsTabsSlot<any>Шаблон содержимого вкладки. В параметрах — элемент из items
nextanyКнопка прокрутки полосы вкладок вперёд
prevanyКнопка прокрутки полосы вкладок назад
tabCdsTabsSlot<any>Шаблон заголовка вкладки. В параметрах — элемент из items
viewanyОбласть содержимого вкладок целиком — заменяет автоматический CdsTabsView

CdsTab ​

Пропсы

ИмяТипПо умолчаниюОписание
activeColorstring | undefined—Цвет компонента, когда он находится в активном состоянии
appearancedeprecated"inverse" | "primary" | "secondary" | "tertiary" | "transparent" | undefined—Внешний вид компонента. Устарел: используйте variant и color
appendIconIconValue | undefined—Иконка в слоте append после контента
baseColorstring | undefined—Цвет неактивного компонента
blockboolean | undefined—Растягивает кнопку на всю доступную ширину контейнера
color(string & {}) | "neutral" | "brand" | "accent" | "danger" | "inverse" | undefined'brand'Цвет компонента: роль, алиас палитры, токен темы или CSS-цвет
contentstring | number | undefined—Контент, отображаемый в компоненте.
direction"horizontal" | "vertical" | undefined'horizontal'Переключение между горизонтальным или вертикальным отображением.
disabledboolean | null | undefinednullЗаблокированное состояние
exactboolean | undefined—Если true, активное состояние будет применяться только при точном совпадении маршрута
fixedboolean | undefined—Фиксирует ширину вкладки, не давая ей растягиваться по длине заголовка
heightstring | number | undefined—Высота компонента
hideSliderboolean | undefined—Скрывает подчёркивающий индикатор активной вкладки
hrefstring | undefined—Атрибут href для ссылки. Если указан, компонент будет вести себя как обычная ссылка
iconboolean | IconValue | undefined—Иконка, компонент будет отображаться в состоянии только иконки
loadingstring | boolean | undefined—Индикатор загрузки для компонента
maxHeightstring | number | undefined—Максимальная высота компонента
maxWidthstring | number | undefined—Максимальная ширина компонента
minHeightstring | number | undefined—Минимальная высота компонента
minWidthstring | number | undefined—Минимальная ширина компонента
prependIconIconValue | undefined—Иконка в слоте prepend перед контентом
readonlyboolean | null | undefinednullТолько для чтения
replaceboolean | undefined—Если true, навигация по маршруту будет заменять текущую запись в истории вместо добавления новой
selectedClassstring | undefined'cds-tab--selected'CSS класс для выбранного состояния
sizenumber | "xs" | "sm" | "md" | "lg" | "xl" | undefined'md'Размер компонента
sliderTransition"shift" | "grow" | "fade" | undefined—Анимация подчёркивающего индикатора активной вкладки
sliderTransitionDurationstring | number | undefined—Длительность анимации индикатора в миллисекундах. 0 выключает перелёт; по умолчанию — по шкале движения
spaced"both" | "start" | "end" | undefined—Разводит слоты prepend и append к краям кнопки.
stackedboolean | undefined—Располагает иконки и контент вертикально — иконка над текстом
tagstring | JSXComponent<any> | undefined'button'Пользовательский HTML-тег для отображения
textstring | number | undefined—Текст, отображаемый в компоненте.
themestring | undefined—Тема компонента
toLinkTo | undefined—Маршрут назначения или объект для RouterLink. Если указан, компонент будет вести себя как RouterLink
valueany—Значение компонента в группе
variant"solid" | "soft" | "outline" | "surface" | "ghost" | undefined'solid'Вид компонента: solid, soft, outline, surface, ghost
widthstring | number | undefined—Ширина компонента

Слоты

ИмяТипОписание
appendanyКонтент после текста
defaultanyКонтент внутри кнопки
loaderanyЗагрузочный индикатор
prependanyКонтент перед текстом

CdsTabsView ​

Пропсы

ИмяТипПо умолчаниюОписание
crossfadeboolean | undefined—Слайды сменяются плавным перекрестным затуханием вместо сдвига
direction"horizontal" | "vertical" | undefined'horizontal'Переключение между горизонтальным или вертикальным отображением.
disabledboolean | null | undefinednullЗаблокированное состояние
maxnumber | undefined—Максимальное количество выбираемых элементов
modelValueany—Значение выбранных элементов группы
multipleboolean | undefined—Разрешить множественный выбор
reverseboolean | undefined—Инвертирует направление анимации перехода между слайдами
selectedClassstring | undefined—CSS класс для выбранного состояния
tagstring | JSXComponent<any> | undefined'div'Пользовательский HTML-тег для отображения
themestring | undefined—Тема компонента
transitionDurationnumber | undefined—Длительность анимации перехода между слайдами в миллисекундах
verticalArrowsboolean | "left" | "right" | undefined—Размещает стрелки навигации вертикально: 'left' или 'right' — сторона, true — сторона по умолчанию

События

ИмяТипОписание
update:modelValue[value: any]Сработало при смене показанного содержимого. Передаёт значение новой активной вкладки

Слоты

ИмяТипОписание
additional{ group: GroupProvide; }Дополнительный контент поверх слайдов — например точки-индикаторы или собственная навигация
default{ group: GroupProvide; }Слайды. В параметрах — состояние группы для управления активным слайдом
next{ props: ControlProps; }Кнопка перехода к следующему слайду. В параметрах — готовые пропсы для своей кнопки
prev{ props: ControlProps; }Кнопка перехода к предыдущему слайду. В параметрах — готовые пропсы для своей кнопки

CdsTabsViewItem ​

Пропсы

ИмяТипПо умолчаниюОписание
disabledboolean | null | undefinednullЗаблокированное состояние
eagerboolean | undefined—Принудительно рендерит содержимое компонента при его использовании. Это полезно, если у вас есть контент, который не отображается в DOM, но который необходимо проиндексировать для SEO.
reverseTransitionstring | boolean | undefined—Переход при показе слайда в обратном направлении. Имя transition-компонента или false, чтобы отключить анимацию
selectedClassstring | undefined—CSS класс для выбранного состояния
transitionstring | boolean | undefined—Переход при показе слайда в прямом направлении. Имя transition-компонента или false, чтобы отключить анимацию
valueany—Значение компонента в группе

Слоты

ИмяТипОписание
defaultanyКонтент слайда