Skip to content

CdsCard

Карточка собирает связанный контент — заголовок, текст, изображение, действия — в один блок с рамкой. Используйте её, когда объект (товар, тариф, документ) должен читаться как единое целое: карточка умеет быть ссылкой и элементом выбора в группе.

Storybook GitLab Figma
Покрытие тестами: 100% — хорошее покрытие
API в спеках
98 / 98 пропсы, события, слоты и exposed, у которых есть тест
Тест-кейсы
139 юнит · 0 браузерных · 2 в планах
Известные баги
8 зафиксированы тестом it.fails
Покрытие кода
100% строк · 97.9% ветвей замер v4.0.0-alpha.13
A11y (axe)
7 рекомендаций в 14 историях замер v4.0.0-alpha.11

Для однородных перечней строк подойдёт CdsList, для сворачиваемых секций — CdsExpandablePanel, а если нужна только подложка без структуры — CdsSurface.

Анатомия ​

Карточка собирается из готовых блоков. Первая схема — каркас: шапка, разделитель, текст и панель действий. Вторая — устройство шапки CdsCardItem: зоны prepend и append по краям, заголовок и подзаголовок в центре. Каждый блок доступен и как проп, и как слот, и как отдельный компонент.

Вариации ​

Наполнение ​

Заполнить карточку можно тремя способами: пропсами title, subtitle, text — для типовых случаев; одноимёнными слотами — когда вместо строки нужна своя разметка; компонентами CdsCardItem, CdsCardTitle, CdsCardSubtitle, CdsCardText — когда структуру нужно контролировать полностью. Проп divider добавляет разделитель между шапкой и текстом.

Sandbox Storybook
СлотОписание
title / subtitle / textЗамещают одноимённые пропсы
prepend / appendКонтент по краям шапки; замещают *-icon и *-avatar
itemДополнительный контент шапки под заголовком
defaultПроизвольный контент карточки
imageФоновое изображение; замещает image
actionsПанель действий — рендерится внутри CdsCardActions
loaderСвой индикатор загрузки при loading

Шапка ​

Пропсы prepend-icon и append-icon ставят иконку по краям шапки, prepend-avatar и append-avatar — аватар по ссылке на изображение. По умолчанию зоны prepend и append прижаты к верху шапки; item-align="center" центрирует их относительно заголовка с подзаголовком (у CdsCardItem этот проп называется align).

Sandbox Storybook

Внешний вид ​

Кликабельная карточка — со ссылкой, обработчиком клика, в группе или с пропом link — сама подсвечивает рамку при наведении, отдельно включать ничего не нужно. borderless убирает рамку — для карточек на подложке или внутри других контейнеров.

Sandbox Storybook

Ссылка ​

Передайте href (или to с маршрутом vue-router) — карточка отрендерится тегом a и станет кликабельной целиком, сохранив внешний вид.

Sandbox Storybook

Изображения ​

Изображение в верхней части — компонент CdsImage первым элементом карточки. Контент можно наложить поверх, поместив шапку в слот изображения.

Sandbox Storybook

Проп image растягивает изображение фоном всей карточки. Позаботьтесь о контрасте: задайте цвет текста через color и подберите тёмное изображение или градиент.

Sandbox Storybook

Группа с выбором ​

Оберните карточки в CdsCardGroup и задайте каждой value — группа превращается в элемент выбора с v-model, выбранная карточка получает подсвеченную рамку. required запрещает снимать выбор.

Sandbox Storybook

Проп multiple включает множественный выбор — в v-model попадает массив значений.

Sandbox Storybook

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

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

Выбор тарифа ​

Группа карточек заменяет радио-кнопки, когда каждому варианту нужно место под цену и описание. Иконка check-fill в append-icon дублирует выбор в шапке, а кнопка ниже остаётся заблокированной, пока вариант не выбран.

Sandbox Storybook

Карточки товара ​

Витрина собирается из готовых блоков: CdsImage с фото, рейтинг из иконок в CdsCardText, теги CdsTag с характеристиками и пара действий в CdsCardActions — основная кнопка «В корзину» и вторичная кнопка-иконка избранного, которая переключает закладку и подкрашивает её утилити-классом. Пропсы loading и disabled показывают полосу загрузки и защищают карточку от повторных кликов на время запроса — нажмите «В корзину».

Sandbox Storybook

Раскрывающиеся подробности ​

Спрячьте второстепенный контент за разворотом: блок с v-if оборачивается в CdsTransitionExpand для плавной анимации. Разворачивать можно чем угодно — иконкой-шевроном или кнопкой в панели действий.

Sandbox Storybook

Галерея ​

Карточки вкладываются друг в друга: внешняя — альбом с шапкой и счётчиком, вложенные — плитки фотографий в мозаике на CSS-гриде с фиксированной высотой ряда; col-span / row-span укрупняют отдельные снимки. Режим absolute у CdsImage растягивает фото на всю плитку, borderless убирает рамки, а градиент затемняет последнюю плитку под счётчик оставшихся фото.

Sandbox Storybook

API ​

CdsCard ​

Пропсы

ИмяТипПо умолчаниюОписание
activeColorstring | undefined—Цвет компонента, когда он находится в активном состоянии
appendAvatarstring | undefined—Аватар, отображаемый после (справа от) контента в шапке карточки.
appendIconIconValue | undefined—Иконка, отображаемая после (справа от) контента в шапке карточки.
baseColorstring | undefined—Цвет неактивного компонента
bgColorstring | undefined—Цвет фона компонента
borderlessboolean | undefined—Убрать границы карточки
colorstring | undefined—Цвет компонента
contentstring | number | undefined—Контент, отображаемый в компоненте.
disabledboolean | null | undefinednullЗаблокированное состояние
dividerboolean | undefined—Включить разделить между заголовком и контентом
exactboolean | undefined—Если true, активное состояние будет применяться только при точном совпадении маршрута
heightstring | number | undefined—Высота компонента
hrefstring | undefined—Атрибут href для ссылки. Если указан, компонент будет вести себя как обычная ссылка
imagestring | undefined—Путь к фоновому изображению карточки.
itemAlign"start" | "end" | "center" | undefined—Выравнивание зон prepend / append относительно контента шапки. Передаётся в CdsCardItem как align.
linkboolean | undefined—Назначает карточке стили и поведение ссылки.
loadingstring | boolean | undefined—Индикатор загрузки для компонента
locationAnchor | null | undefined—Позиционирование элемента относительно его контейнера. Например, "top left", "center", "bottom right" и т.д.
maxHeightstring | number | undefined—Максимальная высота компонента
maxWidthstring | number | undefined—Максимальная ширина компонента
minHeightstring | number | undefined—Минимальная высота компонента
minWidthstring | number | undefined—Минимальная ширина компонента
position"absolute" | "static" | "fixed" | "relative" | "sticky" | undefined—CSS-позиционирование компонента — значение свойства position
prependAvatarstring | undefined—Аватар, отображаемый перед (слева от) контентом в шапке карточки.
prependIconIconValue | undefined—Иконка, отображаемая перед (слева от) контентом в шапке карточки.
replaceboolean | undefined—Если true, навигация по маршруту будет заменять текущую запись в истории вместо добавления новой
selectedClassstring | undefined—CSS класс для выбранного состояния
subtitlestring | number | boolean | undefined—Подзаголовок карточки. Отображается в CdsCardItem под заголовком.
tagstring | JSXComponent<any> | undefined'div'Пользовательский HTML-тег для отображения
textstring | number | undefined—Текст, отображаемый в компоненте.
textColorstring | undefined—Цвет текста компонента
themestring | undefined—Тема компонента
titlestring | number | boolean | undefined—Заголовок карточки. Отображается в CdsCardItem над подзаголовком.
toLinkTo | undefined—Маршрут назначения или объект для RouterLink. Если указан, компонент будет вести себя как RouterLink
valueany—Значение компонента в группе
widthstring | number | undefined—Ширина компонента

Слоты

ИмяТипОписание
actionsanyБлок действий карточки
appendanyКонтент после основного содержимого (на месте append-иконки/аватара)
defaultanyКонтент по умолчанию внутри карточки
imageanyФоновое изображение карточки
itemanyКастомный рендеринг элемента карточки (CdsCardItem)
loaderLoaderSlotPropsСлот для пользовательского загрузчика (отображается, если свойство loading имеет значение true).
prependanyКонтент перед основным содержимым (на месте prepend-иконки/аватара)
subtitleanyКонтент подзаголовка
textanyОсновной текстовый контент карточки
titleanyКонтент заголовка

CdsCardActions ​

Пропсы

ИмяТипПо умолчаниюОписание
align"start" | "end" | "center" | undefined'start'Выравнивание кнопок действий по горизонтали
tagstring | JSXComponent<any> | undefined'div'Пользовательский HTML-тег для отображения

Слоты

ИмяТипОписание
defaultanyДействия карточки (обычно кнопки)

CdsCardDivider ​

Пропсы

ИмяТипПо умолчаниюОписание
colorstring | undefined—Цвет разделителя.
contentOffsetstring | number | (string | number)[] | undefined—Увеличивает интервал между элементами контента и строками. Если передается в виде массива, второе значение смещает содержимое слота вниз (или вправо если vertical = true).
gradientboolean | undefined—Добавляет эффект затухания с обеих сторон.
insetboolean | undefined—Добавляет отступ для обычных разделителей и уменьшает максимальную высоту для вертикальных разделителей.
lengthstring | number | undefined—Длина разделителя. Единица измерения по умолчанию — пиксели.
opacitystring | number | undefined—Прозрачность разделителя.
tagstring | JSXComponent<any> | undefined'div'Пользовательский HTML-тег для отображения
themestring | undefined—Тема компонента
thicknessstring | number | undefined—Толщина разделителя. Единица измерения по умолчанию — пиксели.
variant"solid" | "dotted" | "dashed" | "double" | undefined'solid'Вариант отображения разделителя
verticalboolean | undefined—Отображает разделитель вертикально

Слоты

ИмяТипОписание
defaultanyКонтент разделителя карточки

CdsCardGroup ​

Пропсы

ИмяТипПо умолчаниюОписание
direction"horizontal" | "vertical" | undefined'horizontal'Переключение между горизонтальным или вертикальным отображением.
disabledboolean | null | undefinednullЗаблокированное состояние
mandatoryboolean | "force" | undefined—Обязательный выбор хотя бы одного элемента
maxnumber | undefined—Максимальное количество выбираемых элементов
modelValueany—Значение выбранных элементов группы
multipleboolean | undefined—Разрешить множественный выбор
requiredboolean | "force" | undefined—Обязательный выбор хотя бы одного элемента
selectedClassstring | undefined'cds-card--selected'CSS класс для выбранного состояния
tagstring | JSXComponent<any> | undefined'div'Пользовательский HTML-тег для отображения
themestring | undefined—Тема компонента

Слоты

ИмяТипОписание
defaultGroupProvideКарточки группы. В аргументах слота доступно состояние группы (выбор, навигация).

Exposed

ИмяТипОписание
isSelected(id: string) => booleanПроверить, выбрана ли карточка по id
next() => voidВыбрать следующую карточку
prev() => voidВыбрать предыдущую карточку
select(id: string, value: boolean) => voidВыбрать карточку по id
selectedreadonly string[]Идентификаторы выбранных карточек

CdsCardItem ​

Пропсы

ИмяТипПо умолчаниюОписание
align"start" | "end" | "center" | undefined—Выравнивание зон prepend / append относительно контента.
appendAvatarstring | undefined—Аватар, отображаемый после (справа от) контента.
appendIconIconValue | undefined—Иконка, отображаемая после (справа от) контента.
prependAvatarstring | undefined—Аватар, отображаемый перед (слева от) контентом.
prependIconIconValue | undefined—Иконка, отображаемая перед (слева от) контентом.
subtitlestring | number | boolean | undefined—Подзаголовок элемента карточки.
tagstring | JSXComponent<any> | undefined'div'Пользовательский HTML-тег для отображения
titlestring | number | boolean | undefined—Заголовок элемента карточки.

Слоты

ИмяТипОписание
appendanyКонтент после основного содержимого (на месте append-иконки/аватара)
defaultanyКонтент по умолчанию внутри тела элемента карточки
prependanyКонтент перед основным содержимым (на месте prepend-иконки/аватара)
subtitleanyКонтент подзаголовка
titleanyКонтент заголовка

CdsCardSubtitle ​

Пропсы

ИмяТипПо умолчаниюОписание
opacitystring | number | undefined—Прозрачность текста подзаголовка.
tagstring | JSXComponent<any> | undefined'div'Пользовательский HTML-тег для отображения

Слоты

ИмяТипОписание
defaultanyКонтент подзаголовка карточки

CdsCardText ​

Пропсы

ИмяТипПо умолчаниюОписание
opacitystring | number | undefined—Прозрачность текста карточки.
tagstring | JSXComponent<any> | undefined'div'Пользовательский HTML-тег для отображения

Слоты

ИмяТипОписание
defaultanyТекстовый контент карточки

CdsCardTitle ​

Пропсы

ИмяТипПо умолчаниюОписание
tagstring | JSXComponent<any> | undefined'div'Пользовательский HTML-тег для отображения

Слоты

ИмяТипОписание
defaultanyКонтент заголовка карточки