Дизайн-токены
Дизайн-токены — это именованные значения оформления, из которых построены все компоненты и утилиты Framework. Они позволяют менять внешний вид интерфейса целиком, не правя ни одного компонента.
Что такое дизайн-токен
Дизайн-токен — это именованное значение оформления, записанное как
CSS-переменная с префиксом --sf-: --sf-primary, --sf-surface-0,
--sf-space-2, --sf-focus--width.
Токен отвечает на вопрос «какое значение здесь должно стоять» одним словом
вместо числа. Кнопка не знает, что её фон — #005bbe. Она знает, что её фон —
«главный акцент», --sf-primary. Какой это конкретно цвет, решают тема и
палитра проекта.
Токены дают три преимущества:
- Одно изменение — весь интерфейс. Изменённое значение токена меняет всё, что его использует, без правки компонентов.
- Смысл вместо числа. По имени
--sf-on-error-containerпонятно, где цвет применяется, даже без значения. - Темы без дублирования. Одна разметка, один набор имён; меняются только значения за именами.
Два источника значений
Во Framework есть ровно два места, где значение задаётся числом:
- Цветовые примитивы — шаги палитры и их полупрозрачные ступени
(
--sf-neutral-50,--sf-primary-50--alfa-12). - Размерная лестница — ступени шкалы и один физический пиксель (подробно — в Базовая единица и шкала примитивов и Соразмерные ступени).
Все остальные токены — роли, токены компонентов, токены утилит — собственных чисел не содержат. Они ссылаются на эти два источника. Поэтому замена палитры или шкалы меняет интерфейс целиком, а не выборочно.
Литерал допустим только там, где он не является значением:
- внутри запасного значения
var():var(--sf-black, #000)— это имя с запасным значением, а не цвет; - ноль — он одинаков в любой системе;
- радиус-таблетка
1000px— заведомо больше любого блока, то есть приём, а не размер.
Правило проверяет контракт token-derivation: токен с собственным цветом или
длиной вне примитивов не проходит проверку.
Три уровня: примитив → роль → токен компонента
Токены выстроены в цепочку. Каждый следующий уровень ссылается на предыдущий.
| Уровень | Что хранит | Пример | Зависит от темы |
|---|---|---|---|
| Примитив | Конкретный цвет или размер | --sf-primary-40, --sf-neutral-50--alfa-80 |
Нет |
| Роль (семантический токен) | Назначение цвета или размера | --sf-primary, --sf-on-surface, --sf-outline |
Да |
| Токен компонента | Свойство конкретной части компонента | --sf-button--background-color, --sf-icon--color |
Через роль |
Пример ниже показывает цепочку для залитой кнопки акцентного цвета:
/* Примитив: объявлен на :root */
--sf-primary-40: #005bbe;
/* Роль: объявлена на классе темы, обе стороны рядом */
--sf-primary: light-dark(var(--sf-primary-40), var(--sf-primary-80));
/* Токен компонента: стили кнопки */
.sf-button.sf-button--default.sf-button--primary {
--sf-button--background-color: var(--sf-primary);
}
Обратите внимание: компонент ссылается только на роль, роль — только на примитивы. Каждый уровень решает свою задачу:
- примитив отвечает за цвет как таковой — его меняют, когда меняют бренд;
- роль отвечает за смысл и тему — её меняют, когда меняют правило («граница поля должна быть тише»);
- токен компонента — внутренняя проводка компонента: через него варианты и состояния меняют вид одной части. Это не поверхность настройки, и проект его не задаёт.
Правила выбора уровня:
- в интерфейсе и в своих стилях используйте роли;
- примитив напрямую — только для настройки темы или для цвета, который сознательно не должен меняться с темой;
- токены компонента в проекте не задавайте: дизайн меняется общими токенами, а глубокое изменение вида Smart-компонента — его шаблоном (см. Как менять дизайн).
Грамматика имён
Имена токенов строятся по нескольким устойчивым правилам. Зная их, имя можно прочитать, не открывая справочник.
Префикс. Все токены Framework начинаются с --sf-. Свои токены проекта
называйте иначе (например, --project-…), чтобы их нельзя было спутать с
токенами Framework и чтобы обновление Framework их не задело.
Одинарный дефис соединяет слова внутри имени: --sf-surface-container,
--sf-on-primary-container.
Двойной дефис отделяет владельца от его свойства или вариации.
| Имя | Владелец | Свойство |
|---|---|---|
--sf-focus--color |
кольцо фокуса | цвет |
--sf-elevation-2--surface |
ступень высоты 2 | поверхность |
--sf-primary-50--alfa-12 |
тон 50 палитры primary | ступень прозрачности 12 % |
--sf-button--background-color |
кнопка | цвет фона |
--sf-input-field--border-color |
поле ввода, часть «field» | цвет границы |
Числа в имени — ступени, а не пиксели. У цвета число — тон палитры
(-40) или процент непрозрачности (--alfa-12). У размеров — ступень лестницы
(--sf-space-2, --sf-radius-1\/2). Дробные ступени содержат косую черту, и
при чтении её обязательно экранировать: var(--sf-space-1\/2). Без обратной
косой браузер не видит ссылку и молча отбрасывает объявление.
Слова-модификаторы ролей повторяются во всех семействах цвета:
| Часть имени | Значение | Пример |
|---|---|---|
on- |
цвет содержимого (текста, иконки) поверх фона роли | --sf-on-primary |
-container |
спокойная заливка небольшой области в тоне роли | --sf-error-container |
-hover, -active |
та же роль при наведении и нажатии | --sf-primary-hover |
-transparent-… |
полупрозрачный слой состояния поверх поверхности | --sf-primary-transparent-select |
-variant |
менее контрастная версия роли | --sf-on-surface-variant, --sf-outline-variant |
-inverse |
инверсная пара: тёмное на светлом и наоборот | --sf-surface-inverse |
-fixed |
значение, которое не меняется с темой | --sf-on-surface-fixed |
outline- |
граница в тоне роли | --sf-outline-error |
В именах примитивов прозрачности пишется alfa: --sf-primary-50--alfa-12.
Нейтральная половина шкалы прозрачности называется --sf-alpha-* (см. Нейтральная половина шкалы).
Где объявлены токены
Токены ядра поставляются в файле core.css. Цветовые примитивы и роли,
ступени шкал, тени и прозрачность объявлены в каскадном слое sf.base,
служебные переменные области просмотра — в sf.tokens, базовые единицы
размерной шкалы (--sf-px, --sf-a0 … --sf-i9) и ступени z-index — на
:root вне слоя (о слоях — Каскадные слои):
- примитивы цвета — на
:root, один раз, без зависимости от темы; - цветовые роли — на классах темы
.theme-lightи.theme-dark(см. Темы); - токены компонента — в стилях самого компонента, на его корневом селекторе или на части.
Важное следствие: цветовые роли существуют только внутри элемента с классом
темы. В обычной работе этот класс ставит на <html> скрипт ядра (см. Как выбирается тема на странице).
Если скрипт ядра отключён или не подключён, класс темы обязательно поставить в
разметку самостоятельно, иначе роли не объявлены и компоненты остаются без
цвета.
Перечень переменных ядра со значениями по умолчанию — в справочнике
«Все переменные»; примитивы палитры, размерной
лестницы и прозрачности описаны на своих страницах. Справочник собирается из
собранного ядра автоматически. Точное
значение любого токена выбранного выпуска читается и прямо в поставке, в
distr/core/css/core.css; у адаптивных токенов настольное значение стоит там
внутри медиазапроса настольной ширины.
Размеры иконок
У иконок две шкалы, и какая из них работает, зависит от того, где стоит иконка.
Лестница --sf-icon-size-* — для иконки, которая стоит сама по себе:
значок статуса, маркер, декоративный элемент. Значения в ней постоянные и не
зависят от ширины экрана.
| Токен | Размер | Токен | Размер |
|---|---|---|---|
--sf-icon-size-1/4 |
10 px | --sf-icon-size-2 |
20 px |
--sf-icon-size-1/3 |
12 px | --sf-icon-size-3 |
24 px |
--sf-icon-size-1/2 |
14 px | --sf-icon-size-4 |
28 px |
--sf-icon-size-1 |
16 px | --sf-icon-size-5 |
32 px |
--sf-icon-size-6 |
36 px | ||
--sf-icon-size-7 |
40 px |
Иконка внутри контрола — кнопки, поля, тега, пункта списка — берёт размер
не из лестницы, а из строки: и коробка, и сам знак равны высоте строки этого
контрола. Так иконка занимает ровно строку и не меняет её высоту. Пример
показывает это правило у кнопки размера 1:
.sf-button.sf-button--size-1 .sf-icon {
--sf-icon--font-size: var(--sf-text-height-1);
--sf-icon--height: var(--sf-text-height-1);
--sf-icon--width: var(--sf-text-height-1);
}
Разница видна не сразу: на широком экране числа ступени 1 совпадают с
кеглем. Но размеры текста адаптивные
(Адаптивные размеры), а лестница
иконок — нет. На узком экране ступень 1 даёт текст 14 px и строку 20 px,
тогда как --sf-icon-size-1 остаётся 16 px. Поэтому иконка в контроле следует
за строкой: только так она уменьшается вместе с текстом.
Ступень 1 |
Широкий экран | Узкий экран |
|---|---|---|
| Текст | 16 px | 14 px |
| Высота строки, она же иконка в контроле | 24 px | 20 px |
--sf-icon-size-1 для отдельной иконки |
16 px | 16 px |
Цвет иконки — отдельное правило (Цвет иконки: три роли).
Другие токены ядра
Кроме цвета и размеров, ядро объявляет ещё несколько семейств; их значения — в справочнике «Все переменные»:
- ширина контейнера —
--sf-container-1--size-max…--sf-container-8--size-max, от 60 до 112 rem; действуют от контрольной точкиlg; - прозрачность элемента —
--sf-opacity-10…--sf-opacity-90, от 10 до 90 % с шагом 10; - порядок слоёв —
--sf-z-index--1(-1),--sf-z-index-0(0) и--sf-z-index-1…--sf-z-index-9(от10до90с шагом10).
Ступени z-index задают относительный порядок, а не назначение. В проекте
рекомендуется связать их с ролями, например
--project-layer-modal: var(--sf-z-index-8).
Как пользоваться токенами в проекте
Берите роль, а не число и не примитив. Пример показывает блок заметки, оформленный только ролями:
.project-note {
background: var(--sf-surface-container);
color: var(--sf-on-surface);
border: var(--sf-px) solid var(--sf-outline-variant);
}
Такая заметка правильна в обеих темах и на любой подложке без единой дополнительной строки.
Называйте свою роль своим именем, но берите значение у Framework:
:root {
--project-card-radius: var(--sf-radius--surface);
--project-card-gap: var(--sf-space-3);
}
Имя проекта говорит, что это за значение в вашем интерфейсе; значение остаётся согласованным с Framework и меняется вместе с ним при перенастройке.
Не изобретайте ступени. Если нужен цвет, которого нет среди ролей, сначала найдите роль по смыслу. Если нужна прозрачность — возьмите ступень шкалы (см. Прозрачность). Значение, подобранное на глаз, не проходит контракты и не объясняется именем.
Где переопределять:
- примитивы и размерные роли — на
:root; - цветовые роли — на классах темы (см. Своя тема проекта).
Всё это пишется в CSS проекта, подключённом после core.css. Правила каскадных
слоёв (Каскадные слои) гарантируют, что проект сильнее Framework. Какие токены менять,
чтобы изменить дизайн, — см. Как менять дизайн.
Смотрите также
- Каскадные слои — в каком каскадном слое объявлены токены;
- Все переменные — все переменные ядра со значениями по умолчанию;
- Цветовые примитивы и палитры и Цветовые роли — примитивы и роли цвета;
- Базовая единица и шкала примитивов и Соразмерные ступени — размерная лестница;
- Проверки — контракты, проверяющие токены;
- Как менять дизайн — что менять в проекте, чтобы изменить дизайн.