Для перехода, оформленного как текст в абзаце, подойдёт CdsLink, а для выбора одного из вариантов — CdsButtonToggle.
Анатомия
Кнопка состоит из контейнера и трёх зон контента. Иконки задаются пропсами prepend-icon / append-icon или одноимёнными слотами, при loading контент замещается индикатором из слота loader.
Вариации
Вид
Свойство variant задаёт, как нарисована кнопка. По умолчанию — solid.
| Вид | Как выглядит | Когда |
|---|---|---|
solid | заливка цветом | главное действие экрана |
soft | полупрозрачный фон цвета | второстепенное действие |
outline | рамка, фон прозрачный | второстепенное действие на плотном фоне |
surface | рамка на подложке поверхности | действие поверх изображения или графика |
ghost | ни фона, ни рамки | действие внутри панели, таблицы, тоста |
Цвет
Свойство color задаёт цвет в любом виде. По умолчанию — brand. Принимает:
- роль:
brand— цвет бренда,accent— акцентная кнопка (в ДС совпадает сbrand, тема может её перекрасить),neutral— нейтральная,danger— необратимое действие,inverse— для тёмных подложек; - алиас палитры:
red,green,cyan, …black,white; - имя токена темы:
status-success-surface,other-lime-fill; - любой CSS-цвет:
#7c3aed,oklch(…).
Ховер, нажатие и недоступность для любого цвета строит плёнка состояний — отдельные токены на цвет не нужны.
Устаревшее свойство appearance
appearance продолжает работать и выводит пару variant + color, а в консоль разработки один раз на значение пишет [CDS UPGRADE]. Явно заданные variant и color важнее appearance.
appearance | variant | color |
|---|---|---|
primary | solid | brand |
secondary | soft | brand |
tertiary | soft | neutral |
inverse | solid | inverse |
transparent | ghost | brand |
Размеры
Свойство size меняет высоту и отступы кнопки. Размер по умолчанию — md.
Иконки
Свойства prepend-icon и append-icon добавляют иконку до и после текста из text.
Свойство icon превращает кнопку в кнопку-иконку: текст скрывается, остаётся квадратная кнопка с одной иконкой.
Компоновка
Свойство block растягивает кнопку на всю ширину родительского контейнера.
Свойство stacked ставит иконку над текстом. Такая кнопка вдвое выше обычной того же размера, а её минимальная ширина равна высоте.
Свойство spaced разводит слоты prepend и append к краям кнопки. Значение задаёт, с какой стороны от контента появляется свободное место: start — контент прижимается к append, end — к prepend, both — остаётся по центру. Эффект виден, только когда кнопка шире контента, поэтому обычно spaced работает в паре с block или заданной шириной.
Слоты
Слоты заменяют контент из пропсов, когда нужна полная свобода разметки.
| Слот | Описание |
|---|---|
prepend | Контент перед текстом. Замещает иконку из prepend-icon |
default | Контент внутри кнопки. Замещает текст из text |
append | Контент после текста. Замещает иконку из append-icon |
loader | Загрузочный индикатор. Отображается вместо контента при loading |
Кнопка-ссылка
Передайте href (или to с объектом RouteLocationRaw из vue-router) — и кнопка отрендерится тегом a со всеми атрибутами ссылки, сохранив внешний вид и свойства кнопки.
Рекомендации
Сценарии использования
Отправка формы
Залитая кнопка запускает главное действие формы. Свойство loading показывает ход запроса и защищает от повторной отправки, а соседняя soft-кнопка цвета neutral даёт способ отказаться от действия.
Панель действий
Повторяющиеся действия над записью — редактировать, дублировать, удалить — удобно собрать в компактную панель из кнопок-иконок. Свойство icon убирает текст, size="sm" экономит место. Не забудьте aria-label: без текста он остаётся единственным названием действия.
Навигация по шагам
В мастерах и многошаговых формах залитая кнопка ведёт вперёд, soft — назад. Иконки-шевроны в prepend-icon и append-icon подчёркивают направление, а disabled закрывает движение за границы шагов.
API
Пропсы
| Имя | Тип | По умолчанию | Описание |
|---|---|---|---|
active | boolean | undefined | — | Управление активным состоянием компонента |
activeColor | string | undefined | — | Цвет компонента, когда он находится в активном состоянии |
appearancedeprecated | "inverse" | "primary" | "secondary" | "tertiary" | "transparent" | undefined | — | Внешний вид компонента. Устарел: используйте variant и color |
appendIcon | IconValue | undefined | — | Иконка в слоте append после контента |
baseColor | string | undefined | — | Цвет неактивного компонента |
block | boolean | undefined | — | Растягивает кнопку на всю доступную ширину контейнера |
color | (string & {}) | "neutral" | "brand" | "accent" | "danger" | "inverse" | undefined | 'brand' | Цвет компонента: роль, алиас палитры, токен темы или CSS-цвет |
content | string | number | undefined | — | Контент, отображаемый в компоненте. |
disabled | boolean | null | undefined | null | Заблокированное состояние |
exact | boolean | undefined | — | Если true, активное состояние будет применяться только при точном совпадении маршрута |
height | string | number | undefined | — | Высота компонента |
href | string | undefined | — | Атрибут href для ссылки. Если указан, компонент будет вести себя как обычная ссылка |
icon | boolean | IconValue | undefined | — | Иконка, компонент будет отображаться в состоянии только иконки |
loading | string | boolean | undefined | — | Индикатор загрузки для компонента |
maxHeight | string | number | undefined | — | Максимальная высота компонента |
maxWidth | string | number | undefined | — | Максимальная ширина компонента |
minHeight | string | number | undefined | — | Минимальная высота компонента |
minWidth | string | number | undefined | — | Минимальная ширина компонента |
prependIcon | IconValue | undefined | — | Иконка в слоте prepend перед контентом |
readonly | boolean | null | undefined | null | Только для чтения |
replace | boolean | undefined | — | Если true, навигация по маршруту будет заменять текущую запись в истории вместо добавления новой |
selectedClass | string | undefined | — | CSS класс для выбранного состояния |
size | number | "xs" | "sm" | "md" | "lg" | "xl" | undefined | 'md' | Размер компонента |
spaced | "both" | "start" | "end" | undefined | — | Разводит слоты prepend и append к краям кнопки. |
stacked | boolean | undefined | — | Располагает иконки и контент вертикально — иконка над текстом |
tag | string | JSXComponent<any> | undefined | 'button' | Пользовательский HTML-тег для отображения |
text | string | number | undefined | — | Текст, отображаемый в компоненте. |
theme | string | undefined | — | Тема компонента |
to | LinkTo | undefined | — | Маршрут назначения или объект для RouterLink. Если указан, компонент будет вести себя как RouterLink |
value | any | — | Значение компонента в группе |
variant | "solid" | "soft" | "outline" | "surface" | "ghost" | undefined | 'solid' | Вид компонента: solid, soft, outline, surface, ghost |
width | string | number | undefined | — | Ширина компонента |
События
| Имя | Тип | Описание |
|---|---|---|
group:selected | [value: { value: boolean; }] | Событие, возникающее при выборе кнопки в группе. value - булевое значение, указывающее, выбрана ли кнопка (true) или нет (false). |
Слоты
| Имя | Тип | Описание |
|---|---|---|
append | any | Контент после текста |
default | any | Контент внутри кнопки |
loader | any | Загрузочный индикатор |
prepend | any | Контент перед текстом |
Exposed
| Имя | Тип | Описание |
|---|---|---|
group | GroupItemProvide | null | Возвращает текущий контекст группы, если эта кнопка используется в компоненте группы (например, CdsButtonGroup). |