Tokens to Code
Генерация production-ready кода из токенов в SXL Studio: экспорт из плагина (css/scss/swiftui/uikit/kotlin/xml) и YAML-based Transformer CLI (css/scss/swift/uikit/kotlin/xml/manifest).
Overview
Tokens to Code преобразует token JSON в готовые выходные файлы для разработки. Доступны два пути:
| Путь | Платформы | Для чего |
|---|---|---|
| Плагин (Download → Tokens to Code) | css, scss, swiftui, uikit, kotlin, xml | Разовый экспорт, скачивание ZIP |
Transformer CLI (@sxl-studio/token-transformer) | css, scss, swift, uikit, kotlin, xml, manifest | Повторяемые локальные сборки, CI/CD |
Поток в плагине (Download -> Tokens to Code)
Поддерживаемые платформы в плагине
cssscssswiftui(выходной файл.swift)uikit(выходной файл.uikit.swift)kotlin(выходной файл.kt)xml(бандл Android XML ресурсов)
Настройки в плагине
| Настройка | Что делает |
|---|---|
| Platforms | Выбор одной или нескольких целей (css, scss, swiftui, uikit, kotlin, xml). |
| Prefix | Префикс для генерируемых имён. |
| Resolve Aliases | ON = резолвить алиасы в итоговые значения; OFF = сохранять ссылки там, где это поддерживается. |
| Split Effects | CSS-only разбиение effect-пэйлоадов на более гранулярные переменные. |
| Show Descriptions | Добавляет $description в комментарии кода (где поддерживается). |
| Projects | При наличии config.json экспортирует только выбранные project build-ы. |
| Collection grouping | Для каждой коллекции: merge в общий поток проекта или separate-экспорт в отдельную папку/бандл. |
Структура вывода из плагина
| Сценарий | Результат |
|---|---|
config.json есть и успешно анализируется | Файлы группируются по логике project/mode из config collections/modes/refs. |
Валидного config.json нет | Плоский fallback: tokens.css, tokens.scss, tokens.swift, tokens.uikit.swift, tokens.kt, а также XML-бандлы в tokens/values/* + tokens/drawable/* (для выбранных платформ). |
Плагин формирует ZIP-архив: tokens-transformed.zip.
Warning (XML): Android XML вывод намеренно ограничен нативными ресурсами. Эмитятся простые ресурсы и поддерживаемые drawable; сложные runtime-only структуры токенов пропускаются с диагностикой.
Именование и code syntax
Базовое именование
- CSS: custom properties (
--token-path) - SCSS: Sass variables (
$token-path) - Swift: Swift identifiers
- Kotlin: Kotlin identifiers
- Android XML: имена ресурсов (
@color/...,@dimen/...,@string/..., drawable XML-файлы)
Swift, SwiftUI и UIKit output включают Sendable support types для проектов на Swift 6 strict concurrency.
Поддержка $extensions.figma.codeSyntax
Если поле задано, имена могут быть переопределены по платформам:
Webдля CSSiOSдля SwiftAndroidдля Kotlin / XML
Пример:
{
"$extensions": {
"figma.codeSyntax": {
"Web": "var(--color-primary)",
"iOS": "Color.primary",
"Android": "@color/primary"
}
}
}
Поведение алиасов
Resolve Aliases = OFF
- Предпочтительно для CSS-каскада.
- Алиасы сохраняются как ссылки, где возможно (например
var(--other-token)).
Resolve Aliases = ON
- Предпочтительно для mobile-целей, где обычно нужны финальные literal-значения.
- Цепочки алиасов резолвятся до эмита.
Покрытие типов
Кодогенерация поддерживает simple и composite семейства токенов, используемые в token packs SXL Studio, включая:
- colors, dimensions, spacing, radii, widths, opacity, text/string/boolean
- typography
- shadows, blur/backdrop blur, effects, glass
- fills и gradients
- duration и cubic-bezier значения
Важные заметки рантайма:
template,composition,gridиcustomпропускаются в дефолтной конфигурации Transformer.- Неподдерживаемые токены дают diagnostics (warning/error в зависимости от политики конфига).
Разбиение эффектов в CSS
Когда включён Split Effects, effect-like токены могут выводиться как несколько CSS-переменных, а не как одно агрегированное значение.
Это полезно, когда в кодовой базе тени/blur/backdrop обрабатываются раздельно.
Transformer CLI (@sxl-studio/token-transformer)
Используйте CLI для воспроизводимых локальных прогонов и CI/CD.
Установка
npm install --save-dev @sxl-studio/token-transformer
# или
pnpm add -D @sxl-studio/token-transformer
# или
yarn add -D @sxl-studio/token-transformer
Команды
# smart incremental transform (команда по умолчанию)
npx sxl-transform sync --config ./sxl-transform.config.yaml
# или через pnpm
pnpm exec sxl-transform sync --config ./sxl-transform.config.yaml
# full rebuild
npx sxl-transform sync --config ./sxl-transform.config.yaml --force
# только валидация конфига
npx sxl-transform validate-config --config ./sxl-transform.config.yaml
# создать стартовый конфиг
npx sxl-transform init --path ./sxl-transform.config.yaml
Возможности CLI
- Только YAML-конфиг (
.yaml/.yml) - Инкрементальные stateful-сборки (
smartmode) - Режим полного пересбора (
force) - Режимы обработки проблемных токенов (
ask,debug-stop,debug-continue,autofix,skip) - Генерация debug-report для разбора проблем
Платформы в CLI-конфиге
cssscssswiftuikitkotlinxml(Android resources)manifest(JSON metadata для документации, Storybook token viewers, devtools, аудита и миграций)
Формат конфигурации Transformer (YAML)
Обязательные верхнеуровневые секции:
| Секция | Назначение |
|---|---|
version | Версия схемы (сейчас 1). |
source | Корень токенов, путь к config, include/exclude glob. |
options | Глобальные параметры (remBase, стратегия коллизий, политика unsupported types, глубина алиасов). |
tokenSets | Правила выбора токенов (collection/mode selectors или file selectors). |
outputs | Выходы по платформам и правила file mapping. |
Минимальный валидный пример
version: 1
source:
tokenDir: ./tokens
configFile: config.json
include: ["**/*.json"]
exclude: ["config.json", "**/diff-id*.json"]
options:
remBase: 16
collisionStrategy: error
unsupportedTypes:
default: warn
types:
template: skip
composition: skip
grid: skip
tokenSets:
- id: root
selectors:
- collection: Core
mode: Default
outputs:
- id: css-root
platform: css
outputDir: ./design-system/css
resolveAliases: false
splitEffects: true
showDescriptions: true
files:
- tokenSet: root
output: root.css
- id: tokens-manifest
platform: manifest
outputDir: ./design-system/manifest
files:
- tokenSet: root
output: tokens-manifest.json
options:
includeResolvedValue: true
includeReferences: true
Рекомендуемые проверки
В product repository сначала проверьте конфиг, а затем добавляйте transform в CI:
npx sxl-transform validate-config --config ./sxl-transform.config.yaml
npx sxl-transform sync --config ./sxl-transform.config.yaml --mode smart