Design System  /  Components  /  Buttons

Buttons

Один primary на экран. Все остальные кнопки — тише по иерархии. Шесть вариантов, три размера, четыре состояния. Никаких custom-кнопок.

Анатомия

Padding 10/20 (md). Radius 12 (lg). Heading-font 600/15px. Gap 8 между текстом и иконкой. Иконка — Lucide, 16 px, stroke-2, наследует currentColor.

Варианты

Шесть вариантов покрывают все сценарии. Если кажется, что нужен седьмой — это значит, что иерархия неверна.

Primary
CTA, главное действие
Secondary
Альтернативное действие
Ghost
Tertiary, в плотном UI
Destructive
Удаление, необратимое
Link
Inline, в тексте
Inverse
На dark CTA

Размеры

Три размера. md — дефолт. sm — в плотных таблицах ЛК. lg — в hero и CTA-секциях.

sm
8/14 · 13 px · r-10
md (default)
10/20 · 15 px · r-12
lg
14/28 · 16 px · r-12

Состояния

Hover — translateY(-2px) + soft shadow + цвет/90. Active — translateY(1px). Focus — ring 3 px primary/50. Disabled — opacity 0.5, pointer-events none.

Default
resting
Hover
наведи курсор
Focus
tab — увидишь ring
Disabled
opacity 0.5

Иерархия на экране

Один primary на один view. Если действий два — primary + secondary. Три — primary + secondary + ghost. Четыре — это уже toolbar, нужны другие компоненты.

DO

Один primary, один secondary — ясная иерархия.

DON'T

Два primary рядом — взгляду не за что зацепиться.

Правила

ПравилоОбъяснениеНЕ делать
Один primary на экран Главное действие — одно. Остальные — secondary, ghost, link. Два primary в hero, ещё один в toolbar.
Heading-font, 600 Кнопка — Commissioner 600. Не Inter, не 700, не 500. font-family: Inter в кнопке — смазывает голос.
Radius = lg (12) Все кнопки md/lg — 12 px. Sm — 10 px. Без исключений. Pill-кнопки (radius full) — это для chip, не для кнопок.
Глагол в label «Сохранить», «Написать», «Начать проект». Действие, не состояние. «OK», «Готово», «Подтверждение» — безличное.
Иконка справа от label Стрелка/иконка — после текста, gap 8. Lucide, stroke-2, 16 px. Иконка слева для CTA — ломает gaze-path.
Hover = lift, не цвет Главный hover-сигнал — translateY(-2px) + shadow. Цвет — вторичный. Меняем оттенок на 30% и всё — чувствуется как «мёртвая».
Disabled = честно Если кнопка disabled — рядом причина (tooltip, helper text). Молчаливый disabled без объяснения, почему.

Принципы

Tokens reference

PropertyValueSource token
background (primary)#0048B2--primary
color (primary)#FFFFFF--primary-foreground
radius12 px--radius-lg
font-familyCommissioner--font-heading
font-weight600
transition200 ms · ease-standard--duration-base
hover transformtranslateY(-2px)
hover shadowvar(--shadow-hover)--shadow-hover
focus ring3 px primary/50--ring
Источник токенов: colors_and_type.css ·  К хабу: Design System →