Кнопка
Кнопка выполняет одно действие или отправляет форму. У неё всегда есть текст.
<tk-button>Save changes</tk-button> <tk-button variant="primary" type="submit">Place order</tk-button>
Анатомия
| Часть | Что это |
|---|---|
tk-button |
сам элемент; одна остановка Tab |
| слот по умолчанию | текст кнопки, обязателен; он же доступное имя |
слот icon-start |
иконка перед текстом, по желанию |
слот icon-end |
иконка после текста, по желанию |
part button |
нативный <button> внутри |
Варианты
<tk-button variant="primary">Publish</tk-button> <tk-button>Save draft</tk-button> <tk-button variant="outline">Preview</tk-button> <tk-button variant="ghost">Discard</tk-button>
primary: главное действие экрана. Одна на экран.secondary(по умолчанию): большинство кнопок, включая «Отмена» и «Назад».outline: когда кнопке нужна видимая граница, например на пёстром фоне или в соединённойButton group . Рамка у неё светлая, поэтому на утопленной поверхности, например в нейтральномBanner илиSection message , используйтеsecondaryилиghost.ghost: тихие или повторяющиеся действия, например действие в строке таблицы.
Опасное действие
tone="danger" отмечает действие, которое что-то удаляет. Выглядит всегда одинаково,
какой бы variant вы ни задали: красноватая кнопка с красным текстом.
<tk-button>Cancel</tk-button> <tk-button tone="danger">Delete account</tk-button>
Напишите в тексте, что именно будет удалено. Одного цвета мало: его видят не все.
Форма
shape="round" полностью скругляет края кнопки. Работает с любым вариантом и размером.
Соединённая группа кнопок или
<tk-button shape="round">Follow</tk-button> <tk-button variant="primary" shape="round">Subscribe</tk-button>
Размеры
<tk-button size="small">Small</tk-button> <tk-button>Medium</tk-button> <tk-button size="large">Large</tk-button>
size |
Высота | Отступ по бокам | Стиль текста | Иконка |
|---|---|---|---|---|
small |
24px | space-8 |
Label Small (12/16) | icon-size-16 |
medium (по умолчанию) |
32px | space-12 |
Label Medium (14/20) | icon-size-16 |
large |
36px | space-16 |
Label Medium (14/20) | icon-size-16 |
Длинный текст переносится, и кнопка растёт. small ровно 24px, это минимальный размер
цели нажатия, поэтому не уменьшайте и не сжимайте её.
Состояния
<tk-button disabled>Save changes</tk-button> <tk-button variant="primary" loading>Place order</tk-button> <tk-button pressed>Pin to top</tk-button>
Наведение, нажатие и фокус работают без атрибутов. При фокусе с клавиатуры у любой кнопки появляется рамка.
disabled: на кнопку нельзя перейти и нельзя нажать, а опасная кнопка становится серой. Лучше оставить кнопку активной и по нажатию подсказать, что исправить.loading: вместо текста крутится индикатор, размер не меняется, повторные нажатия не срабатывают. Кнопка остаётся в фокусе и сообщает скринридеру, что занята. Если задан ещё иdisabled, кнопка будет отключена.pressed: включённое состояние переключателя. Вместо того чтобы ставить его вручную, оберните кнопку вToggle button . Уprimaryнажатого вида нет.
Во всю ширину
full-width растягивает кнопку на всю ширину контейнера. Подходит для кнопок друг под
другом на узких экранах, но не для форм на десктопе.
<tk-button variant="primary" full-width>Place order</tk-button> <tk-button full-width>Back</tk-button>
Иконки
<tk-button><tk-icon slot="icon-start" name="plus"></tk-icon>Add member</tk-button> <tk-button>Export<tk-icon slot="icon-end" name="chevron-down"></tk-icon></tk-button>
вtk-iconicon-startпоказывает, что делает кнопка, а вicon-end— что будет дальше, например откроется меню. Одна иконка на кнопку.- Кнопка сама задаёт иконке размер 16px и цвет текста и скрывает её от скринридеров.
Когда использовать
- Кнопка — для действия: сохранить, подтвердить, открыть диалог, удалить.
- Чтобы перейти в другое место, нужна
ссылка , даже если она должна быть заметной. - Если подписи нет, берите
Icon button .
Текст
- Начинайте с глагола и называйте объект: «Сохранить изменения», «Добавить участника».
- Называйте действие, а не механизм: «Сохранить и продолжить», а не «Отправить».
- Заглавная буква только в начале, без точки в конце.
- Короткие подписи допустимы сами по себе: «Готово», «Закрыть», «Отмена».
- Длинный текст пусть переносится, не обрезайте его.
Подробнее в
Можно / нельзя
| ✅ Можно | ❌ Нельзя |
|---|---|
Одна primary на экран |
Две главные кнопки рядом |
| «Удалить аккаунт» на опасной кнопке | «ОК» или «Да» на опасной кнопке |
secondary или ghost на утопленной поверхности |
outline там же: рамка пропадает |
loading, пока идёт действие |
Отключать кнопку, чтобы показать загрузку |
| Длинный текст переносится | Обрезать текст или делать кнопку уже текста |
| Ссылка для перехода на другую страницу | Кнопка, которая ведёт на другую страницу |
Связанные
Icon button : та же кнопка с иконкой и без подписи.Toggle button : кнопка, которая остаётся включённой или выключенной.Button group иSplit button : соединённые кнопки.Spinner : индикатор, который показываетloading.Icon : что кладут в слоты иконок.
API
Атрибуты
| Атрибут | Тип | По умолчанию | Что делает |
|---|---|---|---|
variant |
primary | secondary | outline | ghost |
secondary |
насколько кнопка заметна |
tone |
neutral | danger |
neutral |
danger для удаления; один вид при любом variant |
size |
small | medium | large |
medium |
высота 24 / 32 / 36px |
shape |
rect | round |
rect |
скруглённые углы или полностью скруглённые края |
full-width |
boolean | false |
на всю ширину контейнера |
disabled |
boolean | false |
не в фокусе, не нажимается, не попадает в форму |
loading |
boolean | false |
индикатор, тот же размер, повторные нажатия не срабатывают, aria-busy |
pressed |
boolean | не задан | включённый переключатель и aria-pressed; ставит |
type |
button | submit | reset |
button |
submit отправляет форму |
Слоты
| Слот | Содержимое |
|---|---|
| по умолчанию | текст кнопки, обязателен |
icon-start |
один tk-icon перед текстом |
icon-end |
один tk-icon после текста |
События
Своих событий нет. Слушайте click; disabled и loading его блокируют.
CSS
::part(button): нативный<button>.--tk-button-radius: задаёт углы и важнее, чемshape. Нужен компонентам, которые соединяют кнопки, напримерButton group . Не используйте его, чтобы перекрасить одну кнопку.
Токены
| Вариант / тон | Покой | Наведение | Нажатие | Отключена |
|---|---|---|---|---|
| primary | fill/accent + text/accent/on-fill |
fill/accent/hover |
fill/accent/active |
surface/disabled + text/disabled |
| secondary | surface/subtle + text/default |
state/hover |
state/press |
surface/disabled + text/disabled |
| outline | border/subtle + text/default |
state/hover |
state/press |
border/disabled + text/disabled |
| ghost | text/accent |
state/accent/hover + text/accent/hover |
state/accent/hover + text/accent/hover |
text/disabled |
tone="danger" |
surface/error + text/error |
state/error/hover |
state/error/press |
surface/disabled + text/disabled |
Токены state/* — полупрозрачные слои поверх цвета кнопки в покое. Нажатая кнопка берёт
state/on (под курсором state/on-hover), а у outline ещё и border/selected. Рамка
фокуса у всех кнопок border/accent/focus. Значения по темам:
Доступность
Встроено:
- Нативный
<button>: до него доходит Tab, его нажимают Space и Enter, его видят формы. - Рамка фокуса для клавиатуры, которая никогда не прячется.
loadingставитaria-busyи оставляет текст доступным именем.- Иконки скрыты от скринридеров; кнопку называет текст.
- Высота любой кнопки не меньше 24px.
На вашей стороне:
- В тексте опасной кнопки назовите, что удаляется.
- Кнопка для действий, ссылка для переходов.
- Активная кнопка лучше, чем
disabled: отключённая не подскажет, что исправить.
| Клавиша | Действие |
|---|---|
Tab |
переводит фокус на кнопку |
Space / Enter |
нажимает её; с type="submit" отправляет форму |
Пределы контраста
- Рамка
outline: 1.33:1 в светлой теме и 2.00:1 в тёмной, ниже минимума 3:1; в контрастной 4.22:1. На утопленной поверхности в светлой теме рамки не видно. - Текст
primary: 4.02:1 с синим основным цветом, ниже минимума 4.5:1 для текста; не ниже 3:1 с любым основным цветом. - Текст опасной кнопки при наведении и нажатии: 3.94:1 в светлой теме, ниже 4.5:1.
- Нажатый переключатель: в светлой и тёмной теме включённый выглядит так же, как наведённый; в контрастной они различаются. Скринридер всегда сообщает состояние. Если оно должно читаться с первого взгляда, покажите его ещё где-то.