Генерація дизайн-токенів з Figma
Що це і навіщо
Дизайнери описують кольори, розміри та інші константи як variables у Figma й експортують їх у JSON-файли (Light.tokens.json / Dark.tokens.json). Скрипт генерації перетворює ці файли на дерево CSS-файлів з :root-змінними, якими вже користується код аплікейшенів.
Скрипт лежить у @webitel/styleguide: packages/styleguide/src/lib/styleguide/token-generation/script/.
Звідки беруться токени і куди вони кладуться
Вхідні файли лежать поряд зі скриптом, у теці token-generation:
apps/<app-name>/Light.tokens.json+Dark.tokens.json– токени конкретного аплікейшену.lib/Light.tokens.json+Dark.tokens.json– спільні токени, якими користуються всі аплікейшени (наразі ця тека порожня – див. нижче).
Кожне джерело (кожен apps/<app-name> і lib/) генерується окремо, і результат лежить поряд із вхідними файлами – у власній теці dist/:
token-generation/
├── apps/
│ ├── agent-workspace-app/
│ │ ├── Light.tokens.json
│ │ ├── Dark.tokens.json
│ │ └── dist/ ← згенеровані CSS-файли саме для цього аплікейшену
│ └── crm/
│ ├── Light.tokens.json
│ ├── Dark.tokens.json
│ └── dist/
└── lib/
├── Light.tokens.json
├── Dark.tokens.json
└── dist/ ← згенеровані CSS-файли для спільних токенівВсередині dist/ структура тек повторює структуру груп токенів у Figma. Групи, що називаються (або лежать всередині групи, що називається) Colors, вважаються залежними від теми – для них генеруються окремі light/index.css і dark/index.css. Усі інші групи – незалежні від теми, для них пишеться один index.css.
Запустити генерацію можна командою з кореня репозиторію:
npm run design-tokens:generateЯк підключити токени в аплікейшені
Згенеровані CSS-змінні не входять до основного . експорту пакета – кожен аплікейшен, якому вони потрібні, підключає свій apps/<app-name>/dist/index.css окремим саб-шляхом @webitel/styleguide/<app-name>:
import '@webitel/styleguide/agent-workspace-app';Саб-шлях описаний у exports у package.json пакета @webitel/styleguide і вказує напряму на token-generation/apps/<app-name>/dist/index.css. Якщо генерація запрацює для нового аплікейшену (див. нижче) – для нього так само треба додати відповідний запис в exports.
Хто генерує токени
Генерація – це відповідальність дизайн-команди. Саме дизайнери запускають скрипт після того, як оновили змінні у Figma та зробили новий експорт.
Якщо під час верстки чи розробки вам бракує потрібного CSS-токена (немає відповідної змінної, або токен ще не потрапив у dist/) – не додавайте його вручну і не "хардкодьте" значення в коді. Натомість зверніться до дизайнера, який робив макет: токена, найімовірніше, ще немає у Figma, і його потрібно спершу завести там, а вже потім – перегенерувати.
Для яких аплікейшенів працює генерація
На поточному етапі генерація токенів налаштована й реально використовується для agent-workspace-app та crm. Тека lib/ (спільні токени для всіх аплікейшенів) поки що порожня – скрипт коректно пропускає джерела без файлів токенів, не завершуючи роботу помилкою.
Це тимчасовий стан: після завершення міграції інших аплікейшенів на дизайн-токени з Figma, генерація запрацює для кожного з них так само, як зараз для agent-workspace-app і crm – достатньо буде додати відповідну теку apps/<app-name> з файлами Light.tokens.json / Dark.tokens.json.
Як формується назва CSS-змінної
Назва CSS custom property будується з шляху токена в дереві Figma: кожен сегмент шляху перетворюється у kebab-case і з'єднується через дефіс з префіксом --wt-.
Наприклад, токен кольору за шляхом:
Avatar → Colors → Unknown user → backgroundперетвориться на:
--wt-avatar-colors-unknown-user-background: #F0F1F5;А токен розміру (число завжди форматується в px) за шляхом:
WS → App header → Sizes → Root → paddingXперетвориться на:
--wt-ws-app-header-sizes-root-padding-x: 16px;Тобто принцип простий: назва змінної = --wt- + весь шлях групи/токена у Figma, переведений у kebab-case. Це означає, що:
- Назва змінної завжди однозначно показує, де саме в Figma шукати відповідний токен.
- Перейменування групи або токена в Figma змінює назву CSS-змінної – відповідно, такі перейменування варто узгоджувати з розробниками, які цю змінну вже використовують.
- Якщо в межах одного дерева два різні шляхи токенів дають однакову назву змінної (наприклад, через різницю лише в регістрі), скрипт зупиниться з помилкою колізії назв ще до запису файлів.