Дизайн-токены: цвета, отступы и темы в одном источнике
Что такое дизайн-токены, три уровня от палитры до компонентов, как их называть, одна карточка в трёх темах, виды токенов и код — с живыми примерами.
Коротко
Дизайн-токены — это дизайн-решения с именами: цвета, отступы, радиусы, размеры шрифта, тени и длительности, которые хранятся в одном месте и используются и макетом, и кодом. Вместо «#E4FF4E» кнопка берёт «color.accent», вместо «24 px» карточка берёт «space.5». Обычно токены строят в три уровня: базовые — сырые значения палитры и шкал; смысловые — роли вроде фона, текста и акцента; токены компонентов — роли, применённые к конкретной кнопке или карточке. Именно поэтому тёмная тема, второй бренд или редизайн становятся сменой значений в одном файле, а не поиском по сотням стилей.
Три уровня токенов
Базовые токены говорят, что это за цвет, роли — для чего он, токены компонентов — где он используется.
1Базовые
2Роли
3Компоненты
Ключевой уровень — средний. Компоненты ссылаются на роли, а не на сырые цвета: кнопка берёт «color.accent», а не «lime-400». Тогда новая тема просто переназначает роли на другие базовые значения — компоненты ничего не замечают.
Как называть токены
Хорошее имя говорит о роли, а не о внешнем виде. Внешний вид изменится, роль останется.
| Что | Плохое имя | Хорошее имя | Почему |
|---|---|---|---|
| Главный акцент | green | color.accent | акцент может перестать быть зелёным |
| Фон страницы | gray-light | color.bg | в тёмной теме он тёмный |
| Текст ошибки | red-500 | color.danger | роль понятна в любом компоненте |
| Поля карточки | padding-24 | space.5 | число может измениться, ступень останется |
| Размер заголовка | font-39 | font.step-4 | у плавных размеров нет одного числа |
| Цвет кнопки | button-lime | button.bg → color.accent | компонент ссылается на роль |
Одна карточка, три темы
Переключите тему: код карточки остаётся прежним, меняются только значения четырёх ролей.
Стол из массива дуба
Код карточки не меняется — меняются только значения ролей: фон, поверхность, текст, акцент.
- color.bg
- color.surface
- color.text
- color.accent
Тот же механизм даёт тёмную тему, второй бренд на том же коде, сезонную акцию или версию с высоким контрастом. Без уровня ролей каждая из них — отдельная копия стилей.
Виды токенов: не только цвета
Всё, что в дизайне повторяется и имеет значение, становится токеном.
Цвет
color.accentОтступы
space.5 = 24pxРадиусы
radius.sm = 8pxШрифт
font.step-3Тени
shadow.mdДвижение
duration.base = 280msТокены в коде: источник и результат
Токены хранят в JSON — в формате с $value и $type, который читают Style Dictionary и Tokens Studio, — и превращают в CSS-переменные.
Источник
Роли ссылаются на базовые значения в фигурных скобках — меняете базовое, и за ним идут все роли.
{
"color": {
"lime-400": { "$type": "color", "$value": "#E4FF4E" },
"sage-200": { "$type": "color", "$value": "#E1E3DF" },
"graphite-950": { "$type": "color", "$value": "#171817" },
"bg": { "$type": "color", "$value": "{color.sage-200}" },
"text": { "$type": "color", "$value": "{color.graphite-950}" },
"accent": { "$type": "color", "$value": "{color.lime-400}" },
"on-accent": { "$type": "color", "$value": "{color.graphite-950}" }
},
"space": {
"4": { "$type": "dimension", "$value": "16px" },
"5": { "$type": "dimension", "$value": "24px" }
},
"duration": {
"base": { "$type": "duration", "$value": "280ms" }
}
}
CSS-переменные и тема
Тёмная тема переназначает две роли; кнопка не меняется.
/* Собрано из tokens.json: базовые значения один раз, роли — для каждой темы */
:root {
--lime-400: #E4FF4E;
--sage-200: #E1E3DF;
--graphite-950: #171817;
--color-bg: var(--sage-200);
--color-text: var(--graphite-950);
--color-accent: var(--lime-400);
--color-on-accent: var(--graphite-950);
}
[data-theme="dark"] {
--color-bg: var(--graphite-950);
--color-text: #F8F8F8;
}
/* Компоненты используют только роли, никогда базовые значения */
.button {
background: var(--color-accent);
color: var(--color-on-accent);
}
6 правил системы токенов
-
01
Один источник
Токены живут в одном файле, и макет, и код берут их оттуда.
-
02
Компоненты — только через роли
Сырой цвет внутри компонента — будущая ошибка тёмной темы.
-
03
Имена по роли
«accent», «danger», «surface» — а не «green», «red», «white».
-
04
Пара для каждого фона
Для каждой роли фона есть роль текста, которая на нём читается.
-
05
Мало уровней
Трёх уровней достаточно; четвёртый обычно только добавляет путаницы.
-
06
Правки — через источник
Собранный CSS никто не правит руками; его пересобирают из токенов.
Частые ошибки с дизайн-токенами
-
Токены только в макете
В коде свои цвета, и через месяц они уже не совпадают.
-
Сотни токенов
Токен на каждый случай превращает систему в словарь, который никто не читает.
-
Имена по цвету
«blue-button» остаётся синим в имени, когда после редизайна кнопка стала лаймовой.
-
Пропуск ролей
Компоненты ссылаются прямо на палитру, и тёмная тема требует их переписать.
-
Нет ролей для текста
Текст на акценте становится нечитаемым в одной из тем.
-
Ручные правки результата
Следующая сборка их затирает, и ошибка возвращается.
Вопросы о дизайн-токенах
Что такое дизайн-токены простыми словами?
Значения дизайна с именами — цвета, отступы, размеры, — общие для макета и кода.
Чем токены отличаются от CSS-переменных?
Токены — источник; CSS-переменные — один из форматов, в которые их превращают, наравне с iOS, Android и макетом.
Где хранить токены?
В JSON-файле в репозитории; переменные Figma и Tokens Studio связывают его с макетом.
Сколько токенов нужно сайту?
Обычно несколько десятков: палитра, 10–15 ролей, шкалы отступов и шрифтов, радиусы и длительности.
Нужны ли токены небольшому сайту?
Короткий набор CSS-переменных — да, он ничего не стоит; полный конвейер — когда продуктов или тем несколько.
Что такое Style Dictionary?
Инструмент, который превращает один набор токенов в файлы для CSS, JavaScript, iOS и Android.
Форма
Токены
для бренда
Собираю системы токенов, которые связывают макет и код: палитра, роли, темы и значения компонентов в одном источнике. Расскажите о проекте — отвечу в течение рабочего дня.