Перейти к содержанию

FISYCO

Публичная бета

Style Dictionary на практике: токены в CSS, SCSS и TypeScript

6 мин чтения

Инженерия

Обновлено 12 октября 2026 г.

A token file branching into three glass cards labelled CSS, SCSS and TS, with a warning badge on the CSS card

Style Dictionary часто берут, чтобы превратить файл с токенами в код. Это открытый инструмент сборки, и основы в нём умещаются на одном экране. Но переживёт ли результат встречу с настоящей дизайн-системой, решают детали: ссылки, режимы, единицы измерения и переименования.

В этом руководстве мы собираем CSS, SCSS и TypeScript из одного файла токенов в формате W3C DTCG с помощью Style Dictionary 5.5.5, текущего релиза. Каждый результат ниже взят из настоящей сборки небольшой светлой и тёмной темы. Есть и эксперимент: что происходит с каждым форматом, когда токен переименовывают.

Коротко

  • Style Dictionary v5 читает DTCG-файлы напрямую, но формат 2025.10 пока поддерживает лишь частично (документация Style Dictionary о DTCG).
  • Включите outputReferences, чтобы --bg-accent: var(--color-blue-500) осталась ссылкой, а не скопированным значением.
  • Собирайте каждый режим из своего файла и дайте каждому селектор: :root для светлой темы, [data-theme="dark"] для тёмной.
  • Переименование токена ломает SCSS и TypeScript на этапе сборки. В CSS оно проходит молча, поэтому оставляйте старое имя ссылкой на один релиз.

Вход: по одному DTCG-файлу на режим

Style Dictionary v5 требует Node 22 или новее (гайд по миграции на v5) и сам распознаёт формат DTCG. На входе у нас светлый и тёмный файлы в формате 2025.10. Так их выгружает из переменных Figma FISYCO, инструмент, который мы делаем. Важная часть выглядит так:

Цвета записаны в структурированной форме, которую ввёл формат 2025.10. Style Dictionary читает её начиная с версии 5.3.0. bg.accent здесь ссылка, а не hex-значение. В тёмном файле она указывает на color.blue.300.

Один конфиг на три формата

Один конфиг, три платформы. В Style Dictionary есть готовые группы трансформаций для CSS, SCSS и JavaScript. Отдельной группы для TypeScript нет, поэтому объявления типов собираются из группы js.

Установите пакет командой npm i -D style-dictionary, сохраните конфиг как build.mjs (в нём ES-модули и await на верхнем уровне) и запустите node build.mjs. В buildPath нужен слэш в конце. На каждый записанный файл сборка печатает одну строку.

Что получается на выходе

Токены в CSS, то есть кастомные свойства, со ссылкой на месте:

Переменные SCSS, ссылка тоже сохранена:

И TypeScript: значения в tokens.js, типы в tokens.d.ts, имена в PascalCase:

Первым делом проверьте опцию outputReferences. Без неё --bg-accent превращается в застывшую копию #2563eb. Тема, которая переопределяет --color-blue-500, до неё не дотянется, а файлы режимов ниже не смогут ссылаться на палитру. С этой опцией связь из макета доходит до стилей. В JavaScript значения разрешаются в любом случае: BgAccent равен "#2563eb".

Числам нужны единицы

Ещё раз посмотрите на --space-200: 8. У числовой переменной в Figma нет единиц, поэтому в файле она хранится как number, и в CSS попадает голое 8. Тогда padding: var(--space-200) становится невалидным. Встроенная трансформация size/px не поможет: она работает только с токенами типов dimension и font-size.

Своя трансформация решает это в несколько строк. Ограничьте её по пути, чтобы числа для прозрачности или z-index остались без единиц:

Добавьте transforms: ["size/px-from-figma"] рядом с transformGroup в CSS-платформе, и сборка запишет --space-200: 8px.

У типографики своя особенность. CSS-трансформации сворачивают типографический токен в сокращённое свойство font: 400 16px/1.5 Inter. А межбуквенного интервала в этом сокращении нет. Style Dictionary предупреждает об этом при каждой сборке («Unknown CSS Font Shorthand properties»). Если межбуквенный интервал важен, выводите типографику отдельными свойствами через свой формат.

Светлая и тёмная тема

В Format Module 2025.10 нет режимов. Темы вынесены в отдельный Resolver Module, который Style Dictionary 5.5.5 пока не читает, поэтому каждый режим живёт в своём файле. Соберите их в цикле и дайте каждому селектор. Так выглядит тёмная тема на токенах:

В тёмном файле остаётся только то, что меняется:

Фильтр не пускает палитру в файлы режимов, но теперь Style Dictionary предупреждает: «filtered out token references were found». Здесь так и задумано: --color-blue-300 лежит в базовой таблице стилей, которую вы подключаете первой. Если предупреждение появилось, а вы этого не планировали, значит, ссылка ведёт на токен, который вы не выпустили.

Эксперимент: переименовываем один токен

Токены в дизайн-системах переименовывают. Мы переименовали bg/accent в bg/brand и сохранили ID переменной в Figma, как это и происходит при переименовании в Figma. Затем заново выгрузили токены и пересобрали. Style Dictionary сделал ровно то, что ему сказали:

Потом мы подключили новую сборку к трём потребителям, и каждый из них по-прежнему использовал старое имя.

CSS не выдал ни одной ошибки. background: var(--bg-accent) теперь ссылается на несуществующее свойство, поэтому браузер считает объявление равным unset (MDN: invalid values), и фон становится прозрачным. Кнопка уходит в релиз без цвета.

Выходит, что самые шумные форматы как раз безопасные. CSS ломается молча, а запасное значение вроде var(--bg-accent, #2563eb) только прячет поломку.

Переименование становится безопасным благодаря двум привычкам:

  1. Оставляйте старое имя ссылкой на один релиз. Верните в bg строку "accent": { "$type": "color", "$value": "{bg.brand}" }, и сборка запишет --bg-accent: var(--bg-brand). Старый код работает, пока вы переходите на новое имя. Для этого в DTCG 2025.10 есть и поле $deprecated, но прежде чем на него полагаться, проверьте, как с ним обращается ваша версия Style Dictionary.
  2. Распознавайте переименование как переименование. Сравнение одних имён покажет одно удаление и одно добавление. ID переменной в $extensions показывает, что это тот же токен. Инструмент, который сравнивает ID, может сообщить о переименовании, и ревьюерам не придётся гадать (почему для поиска переименований ID токенов надёжнее имён).

Что это значит для вашего конвейера

Style Dictionary хорош как последний шаг: он гибко настраивается и читает стандартный формат. Но он не решает, что попадает в файл токенов и когда изменение можно безопасно выпускать. Именно из этих вопросов вырастает расхождение дизайн-системы, и отвечать на них нужно на ревью, до сборки.

Нужен DTCG-файл, чтобы начать? Рассказываем, как выгрузить переменные Figma на любом тарифе.

Читать статью
#Дизайн-токены#Style Dictionary
KK

Автор статьи

Kirill Karpov

Основатель FISYCO

Кирилл Карпов — основатель FISYCO, инструмента контроля дизайн-системы, который держит Figma и код продакшена в согласии.

Новые статьи на почту

Дизайн-системы, токены и доставка дизайна в код. Без спама, отписка в один клик.

Подписываясь, вы соглашаетесь получать письма блога FISYCO. Подробности — в политике конфиденциальности.

Держите дизайн-систему и код в согласии

FISYCO связывает библиотеки Figma с кодовой базой, находит расхождения и присылает правку пул-реквестом.

Начать бесплатно

Похожие статьи

6 мин чтения

Инженерия

Режимы токенов и тёмная тема без дублирования

Тёмная тема не должна быть копией светлой. Держите один набор имён токенов, меняйте только значения и выдавайте режимы в CSS так, чтобы они не расходились.

4 мин чтения

Инженерия

Как найти зашитые цвета в кодовой базе React

Каждый hex в компоненте выводит его из дизайн-системы. Команды поиска за минуты, ложные срабатывания, которые нужно убрать, и как не пускать новые цвета в код.

5 мин чтения

Инженерия

SVG-спрайт из Figma и когда он лучше компонентов

Один файл символов вместо компонента на каждую иконку: когда SVG-спрайт выгоднее, как подключить его в React и на чём спотыкаются чаще всего.