Tokens

JSON-формат токенов

Как писать валидный token JSON в SXL Studio: структура DTCG, основные поля, полный набор типов, алиасы, математика, модификаторы цвета и валидация — каждая секция начинается с таблицы.

Overview

Эта страница описывает JSON-формат token-файлов на вкладке Tokens. Он следует форме DTCG ($value, $type, $extensions, …). Для файлов компонентов ($type: "composition") см. Composition.

Любая нода — это либо токен, либо группа:

Тип нодыПравилоЧто может содержать
Token nodeЕсть $value$value, $type, $description, $extensions, $id
Group nodeНет $value (контейнер)Дочерние ноды + наследуемые $type / $extensions

Ключевая идея Любой ключ, начинающийся с $, — это метаполе DTCG. Любой другой ключ — это имя группы или токена. Группы передают $type и $extensions вниз своим детям.


Корень файла

Корень должен быть JSON-объектом (массивы, строки и числа отклоняются валидацией).

JSON
{
  "colors": {
    "brand": {
      "primary": {
        "$value": "#635BFF",
        "$type": "color"
      }
    }
  }
}

Основные поля

ПолеОбязательноОписание
$valueДа (для token node)Значение токена (формы ниже)
$typeНетТип токена — явный или унаследованный от родительской группы
$descriptionНетЧеловекочитаемое описание
$extensionsНетМетаданные Figma (figma.scopes, codeSyntax, hide, modify)
$idНетСтабильный ID для внешнего тулинга

Формы $value

ФормаПример
Строка"#635BFF", "16px", "Inter"
Число / Boolean8, true
Чистый алиас"{colors.brand.primary}"
Математическое выражение"{spacing.base} * 2"
Объект (композит)typography, border, grid, …
Массив (композит)effects, слои теней, слои заливок, …

Строка:

JSON
{ "$value": "#635BFF", "$type": "color" }
{ "$value": "16px", "$type": "spacing" }
{ "$value": "Inter", "$type": "fontFamily" }

Число / Boolean:

JSON
{ "$value": 8, "$type": "number" }
{ "$value": true, "$type": "boolean" }

Чистый алиас — один dot-notation путь внутри {...}:

JSON
{ "$value": "{colors.brand.primary}", "$type": "color" }

Математическое выражение (алиас, встроенный в строку):

JSON
{ "$value": "{spacing.base} * 2", "$type": "spacing" }
{ "$value": "clamp(16px, {spacing.base} * 4, 64px)", "$type": "sizing" }

Объект / массив (композитные значения):

JSON
{
  "$value": { "fontFamily": "Inter", "fontSize": "16px", "fontWeight": 500, "lineHeight": "24px" },
  "$type": "typography"
}
JSON
{
  "$value": [{ "type": "DROP_SHADOW", "x": 0, "y": 2, "blur": 8, "spread": 0, "color": "#00000033" }],
  "$type": "shadow"
}

Типы токенов ($type)

SXL Studio поддерживает 38 канонических типов токенов. Понятнее всего группировать их по тому, во что превращается каждый тип при Export Variables & Styles.

Экспортируются как переменные Figma (17) — скалярные токены, которые становятся переменными в коллекции.

Вид переменной FigmaТипы
COLORcolor
FLOAT (число)opacity, dimension, number, spacing, sizing, borderWidth, borderRadius, fontSize, lineHeight, letterSpacing, paragraphIndent, paragraphSpacing
STRINGfontFamily, fontWeight, text
BOOLEANboolean

Экспортируются как стили Figma (10) — композитные токены, которые становятся локальными стилями.

Вид стиляТипы
Paintgradient, img, fill
Effectshadow, backdrop-blur, blur, glass, effects
Texttypography
Gridgrid

Только внутренние / редактируемые (11) — полностью редактируются в SXL Studio и используются логикой плагина или рендером, но напрямую не экспортируются как переменная или стиль: border, strokeStyle, fontStyle, textCase, textDecoration, transition, duration, cubicBezier, template, composition, custom.

Полное поведение по типам: Token types.

Примечание custom (или чистый проектный $type, например "baseUnit") остаётся редактируемым в SXL Studio. При экспорте SXL выводит безопасную цель из формы $value (#112233 → color, числа → number, булевы → boolean, CSS-градиенты → paint). Значения, которые нельзя вывести безопасно, остаются opaque/внутренними.


Нормализация $type

Легаси- и множественные значения $type автоматически нормализуются к каноническому ключу.

ВводКанонический
stringtext
sizesizing
spacespacing
fontFamiliesfontFamily
fontWeightsfontWeight
fontStylesfontStyle
fontSizesfontSize
lineHeightslineHeight
letterSpacingsletterSpacing
paragraphSpacingsparagraphSpacing
paragraphIndentsparagraphIndent
borderRadiiborderRadius
textCasestextCase
textDecorationstextDecoration
backdropBlur / backgroundBlur / background-blurbackdrop-blur
layerBlurblur
boxShadowshadow

Экспорты Tokens Studio (легаси value / type / extensions) можно сконвертировать через Migrate from Tokens Studio.


Резолв типа и inference

$type резолвится в таком порядке:

ПриоритетИсточник
1$type на уровне токена
2$type ближайшей родительской группы
3$type на уровне корня
4Auto-inference из $value (fallback)

Если ничего не резолвится, валидация выдаёт ошибку. Когда $type не задан и не унаследован, парсер выводит его из формы $value:

Форма $valueВыведенный тип
true / false или "on", "off", "yes", "no", "1", "0"boolean
Числовой литерал (12, 0.5)number
Числовая строка с единицей (16px, 1.5rem, 50%, 200ms)number
Строка-цвет (#…, rgb(…), hsl(…), color(…))color
CSS-градиент (linear-gradient(…), radial-…, conic-…)gradient
Строковый массив из 4 чисел ("[0.4, 0, 0.2, 1]")cubicBezier
Объект с r / g / bcolor
Объект с полями типографики (fontFamily, fontSize, …)typography
Объект/массив с полями тени (offsetX/Y, blur+color)shadow
Объект/массив с полями сетки (pattern, sectionSize, …)grid
Объект/массив с полями заливки/paintfill
Объект только с blurblur
Чистый алиас ("{a.b}")резолвится из цели алиаса

Рекомендация Inference — это удобный fallback. Для надёжного экспорта задавайте $type явно (на уровне токена, группы или корня).


$extensions

КлючЧто делает
figma.scopesПодсказки scope для экспорта переменных Figma
figma.codeSyntaxСниппеты кода для Dev Mode (Web, Android, iOS)
figma.hideСкрыть переменную из публикации
figma.modifyМодификаторы цвета (lighten, darken, alpha, mix)

figma.scopes — подсказки scope для экспорта:

JSON
{ "$extensions": { "figma.scopes": ["ALL_FILLS", "STROKE_COLOR"] } }

Полный список scope и дефолты по типам — на странице Scopes & Code Syntax.

figma.codeSyntax — сниппеты для Dev Mode. Используйте ключи ровно как показано: Web, Android, iOS.

JSON
{
  "$extensions": {
    "figma.codeSyntax": {
      "Web": "var(--color-brand-primary)",
      "Android": "@color/brand_primary",
      "iOS": "Color.brandPrimary"
    }
  }
}

figma.hide — скрыть переменную из публикации:

JSON
{ "$extensions": { "figma.hide": true } }

figma.modify — модификаторы цвета:

ПолеЗначения
typelighten, darken, alpha, mix
valueВеличина (01)
spacesrgb, hsl, lch, oklch, p3 (по умолчанию oklch)
colorЦелевой цвет — обязателен для mix
JSON
{ "$extensions": { "figma.modify": { "type": "lighten", "value": 0.2, "space": "oklch" } } }

figma.modify может быть одним объектом или цепочкой-массивом, применяемой по порядку:

JSON
{
  "$extensions": {
    "figma.modify": [
      { "type": "lighten", "value": 0.12, "space": "oklch" },
      { "type": "alpha", "value": 0.6 }
    ]
  }
}

Если space опущен, SXL Studio использует oklch. space также принимает алиас $space.

Наследование. $extensions группы наследуются детьми и мержатся поверхностно — ключ ребёнка перекрывает такой же ключ родителя, а непересекающиеся ключи комбинируются.

JSON
{
  "brand": {
    "$type": "color",
    "$extensions": { "figma.scopes": ["ALL_FILLS"] },
    "primary": { "$value": "#635BFF" },
    "primary-soft": {
      "$value": "{brand.primary}",
      "$extensions": { "figma.modify": { "type": "alpha", "value": 0.7 } }
    }
  }
}

Алиасы

ФормаСинтаксисПрименение
Чистый"{colors.brand.primary}"Всё значение — один референс на токен
Встроенный"{spacing.base} * 3"Референс внутри math / композитной строки

Правила: один путь в фигурных скобках, dot-notation для сегментов, без циклических ссылок. Чистый алиас ("{a.b}") трактуется как алиас — не как математика — и его тип резолвится из целевого токена.


Математические выражения

Строка $value, содержащая оператор или функцию, вычисляется после резолва алиасов.

Математика применяется только к числовым типам токенов: dimension, number, spacing, sizing, borderWidth, borderRadius, opacity, fontSize, lineHeight, letterSpacing, paragraphSpacing, paragraphIndent, duration, blur, backdrop-blur — и к числовым полям внутри композитов (offsets/blur/spread у теней, размеры в typography, тайминги transition). Строковые значения никогда не вычисляются: text-токен "37-37" остаётся литералом "37-37", а не 0.

КатегорияПоддерживается
Операторы+, -, *, /, %, скобки
Константыpi, e
Округлениеround, floor, ceil, trunc
Клампингmin, max, clamp
Арифметикаabs, sign, mod, pow, sqrt, hypot
Exp / logexp, log, log2, log10
Тригонометрияsin, cos, tan, asin, acos, atan, atan2
JSON
{ "$value": "{spacing.base} * 4", "$type": "spacing" }
{ "$value": "round({spacing.base} * 1.5, 2)", "$type": "spacing" }

Примечания: round(x, n) округляет до n знаков; rem / em и секунды нормализуются при вычислении; нерезолвнутый алиас или неизвестная функция инвалидируют выражение.


Валидация

JSON-редактор проверяет:

  • синтаксис JSON;
  • ошибки парсинга DTCG (нерезолвимый $type; неизвестные значения $type сохраняются как редактируемые opaque-токены custom);
  • некорректные фигурные скобки алиасов;
  • неизвестные ссылки на токены.

Для файлов composition / template строковые ссылки также проверяются по путям токенов воркспейса, включая локальные встроенные namespace'ы composition-токенов.


Полный пример

JSON
{
  "color": {
    "$type": "color",
    "brand": {
      "primary": {
        "$value": "#635BFF",
        "$description": "Primary brand color",
        "$extensions": {
          "figma.codeSyntax": {
            "Web": "var(--color-brand-primary)",
            "Android": "@color/brand_primary",
            "iOS": "Color.brandPrimary"
          }
        }
      },
      "primary-soft": {
        "$value": "{color.brand.primary}",
        "$extensions": {
          "figma.modify": [
            { "type": "lighten", "value": 0.1, "space": "oklch" },
            { "type": "alpha", "value": 0.65 }
          ]
        }
      }
    }
  },
  "spacing": {
    "$type": "spacing",
    "base": { "$value": "4px" },
    "md": { "$value": "{spacing.base} * 4" }
  }
}

Связанные страницы