UI токены дизайн системы: принципы, паттерны и чек-листы

UI-токены — это атомарные переменные интерфейса (цвет, размер, интерлиньяж, радиус, тень, скорость анимации и т. п.), которые служат единственным источником правды для дизайна и кода. Токены позволяют централизованно управлять темой и брендом, держать доступность в допуске, ускорять разработку и сокращать расхождения между макетами и продуктом. Правильно построенные токены помогают масштабировать продукт, не превращая его в «лоскутное одеяло». Ниже — рабочая методика, как спроектировать токены, провести темизацию, зафиксировать доступность форм/таблиц и обложить всё перфоманс-аудитом. Сроки/стоимость разработки уточняйте по контактам на сайте.

1) Зачем нужны токены: эффекты для бизнеса и команды

  • Скорость изменений. Обновление бренда или сезонной темы делается через пару переменных, а не массовый поиск/замену по проекту.
  • Консистентность. H1, CTA, инпуты и таблицы используют одну шкалу размеров/цветов и ведут себя одинаково в любом продукте.
  • Доступность по умолчанию. Контрасты, размеры кликабельных зон, фокус-стили — задаются на уровне токенов и не «ломаются» локальными правками.
  • Перфоманс. CSS-переменные позволяют переключать темы без пересборки; уменьшение кастомных правил снижает вес стилей и риски CLS/INP.

2) Таксономия: от core до семантических токенов

В основе — core-токены (raw-значения) и семантические токены (значения «с смыслом»). Такой слой позволяет не привязываться к конкретному цвету/размеру, а работать через назначение (primary, success, error, subtle и т. п.). Сверху — alias-токены для компонентов (например, button.primary.bg).

Core-слой (примеры)

  • color.base.gray.50…900 — нейтральная палитра;
  • color.base.blue/green/red — акцентные семена;
  • font.family.sans/mono — семейства;
  • font.size.12…60, line.16…70 — шкалы типографики;
  • space.4/8/12/16/24/32 — шкала отступов;
  • radius.0/4/8/12, shadow.100/200;
  • motion.fast/normal/slow — длительности анимаций.

Семантический слой

  • color.text.primary/secondary/muted/inverse
  • color.bg.canvas/surface/subtle/elevated
  • color.border.default/focus/error/warn
  • color.intent.success/warning/danger/info
  • typography.h1/h2/h3/body/small — связка {font-size, line-height, weight}
  • focus.ring.width/color/offset, hitarea.min

3) Типографика: из токенов — в предсказуемые заголовки

Токены типографики избавляют от «магических» значений в макетах и коде. Мы фиксируем шкалу для заголовков и текста, сразу привязывая межстрочное. Для H1 на материалке — 60/70, для H2 — 28/34, для основного текста — 18/28–30. Все размеры лежат в токенах, а класс компонента лишь «ссылается» на них. Так проще держать консистентность на десятках страниц и в разных продуктах.

  • typography.h1 = {size: 60, line: 70, weight: 600}
  • typography.h2 = {size: 28, line: 34, weight: 600}
  • typography.body = {size: 18, line: 28, weight: 400}
  • typography.small = {size: 14, line: 20, weight: 400}

4) Цвет и контраст: доступность по умолчанию

Палитра проектируется от контрастных пар «текст ↔ фон» и состояний элементов (hover/active/disabled/focus). Контрастные комбинации фиксируются в семантических токенах — и переиспользуются в компонентах. Изменение оттенка в теме не ломает доступность, потому что парные значения пересчитываются вместе.

Паттерны для форм и таблиц (доступность)

  • Инпуты. Размер кликабельной области ≥ 44×44, контраст текста и плейсхолдера ≥ AA, focus-ring видим у клавиатуры и мыши.
  • Ошибки. Цвет ошибки + иконка + текст, статус в aria-live.
  • Таблицы. Чёткий порядок фокуса, гибкая высота строки, токен row.zebra для чередования фона, повышенный контраст у активных ячеек/сортировки.
  • Ховер ≠ единственный сигнал. То, что видно на ховере, должно иметь альтернативу (иконка, подпись, явная кнопка).

5) Пространство, радиусы, тени: материальность интерфейса

Отступы и сетка — это ритм. Мы задаём единую шкалу space, применяем её для вертикальных ритмов карточек, секций и форм. Радиусы и тени формируют «ощущение» продукта: миксовать разные радиусы в одном сценарии нельзя — пользователь читается по контуру компонента.

  • space: 4/8/12/16/24/32/40/60 — «живёт» в токенах и утилитах Tailwind.
  • radius: 8 как базовый, 12 — для крупных карточек/модалок.
  • shadow: 100/200 — мягкие, без «жирных» размытий, чтобы не снижать контраст.

6) Состояния и фокус: предсказуемость действий

Для каждого интерактива фиксируем набор: default, hover, active, focus-visible, disabled, loading. Фокус-кольцо — не «убирается», а приводится к бренду через токены focus.ring.color /focus.ring.width. Это и доступность, и предсказуемость.

  • Фокус видим на клавиатуре и мыши (не скрываем outline для мыши).
  • Disabled-состояния не используют только прозрачность — нужен явный цвет и курсор.
  • Loading имеет собственные токены (размер спиннера, цвет, отступы).

7) Темы, режимы, брэнд-оверлеи

Токены живут в CSS-переменных. Тема (light/dark/high-contrast) — это набор переопределений семантических токенов. Брэнд-оверлей (white-label) — слой переопределений поверх темы: логотип, акцент, иллюстрации, но без изменения размеров и ритмов. Переключение происходит на уровне класса или data-атрибута — без пересборки фронта.

8) Пайплайн «Figma → код»

Источник правды — репозиторий токенов. Figma «подписывается» на них через плагины/импорт, а не наоборот. Сборка генерирует CSS vars/TS-константы, публикует пакет, обновляет документацию и playground с примерами.

Шаги

  1. Определяем таксономию токенов, заводим репозиторий (JSON/TS).
  2. Генератор собирает CSS-переменные и экспорты для компонентов.
  3. Компоненты используют только семантические токены (не core напрямую).
  4. CI публикует пакет и прогоняет визуальные/axe-тесты.

9) Перфоманс-аудит интерфейсов: где «течёт» скорость

Токены — инструмент перфоманса: единые размеры/типографика уменьшают число кастомных правил, ускоряют отрисовку и снижают риск CLS. В аудите мы проверяем LCP/CLS/INP на шаблонах и связываем их с токенами: заголовочный шрифт предзагружается, изображения имеют резерв, интерактивы не вешают «тяжёлых» обработчиков.

  • LCP: критичный текст рендерится сразу; hero-изображение оптимизировано.
  • CLS: все медиа с фиксированными размерами/резервами; шрифты с fallback.
  • INP: debounce на вводе, мелкие обработчики, никаких блокирующих тасков.
  • CSS budget: компоненты тянут только свои стили; нет «всё-в-одном» файла.

10) Доступность форм и таблиц: чек-листы

Формы

  • Лейбл связан с полем; плейсхолдер не заменяет лейбл.
  • Хинты и ошибки рядом с полем; статус объявляется в aria-live.
  • Кнопки формы имеют понятные подписи (не «ОК», а «Отправить заявку»).
  • Hit-area ≥ 44 px; фокус-кольцо контрастное и непрерывное.

Таблицы

  • <th scope="col/row">, заголовки описательные, сортировка с aria-sort.
  • Зебра-фон и hover — семантические токены, читаемые в обеих темах.
  • Состояния «нет данных», «ошибка загрузки», «пустой фильтр» — с инструкциями.
  • Массовые действия — видимая панель с подтверждениями опасных операций.

11) Миграция на токены: план на 4–8 недель

  1. Недели 1–2: инвентаризация стилей, карта цветов/размеров, цели по перфомансу/доступности.
  2. Неделя 3: сборка core/semantic-слоёв, подключение в Figma и код.
  3. Неделя 4: миграция типографики, сетки, радиусов, фокусов.
  4. Недели 5–6: формы/таблицы на семантических токенах, axe-сканы и визуальные регрессии.
  5. Недели 7–8: темы (dark/high-contrast), документация, гайд по вкладкам/ролям.

12) Управление и версия: чтобы система жила

  • semver и миграционные гайды для изменений токенов.
  • Changelog с ссылками на PR/issue и пометками breaking.
  • Contribution-модель: кто вносит, кто ревьюит, как тестируются изменения.
  • Playground/Storybook с примерами для каждой темы и состояния.

13) Анти-паттерны токенов

  • Привязка компонентов к «сырым» цветам вместо семантики.
  • Локальные переменные внутри компонента, не согласованные с системой.
  • «Выключенный» фокус ради эстетики — убивает доступность.
  • Единый «толстый» CSS без tree-shaking и модульности.
  • Токены только в Figma, но не в коде — рассинхрон через неделю.

Вывод: ui токены дизайн системы — это практичный способ зафиксировать язык продукта и ускорить развитие без потери качества. Когда цвет, типографика, отступы, состояния и темы живут в токенах, интерфейс предсказуем, доступен и быстрый. Сначала — таксономия и пайплайн, затем — миграция форм/таблиц и перфоманс-аудит. Сроки/стоимость разработки уточняйте по контактам на сайте.