Scopes и Code Syntax
Настройка scopes переменных Figma и code syntax для Dev Mode через $extensions в SXL Studio — валидные scopes по типам, дефолты, шаблоны и примеры.
Overview
Две настройки $extensions управляют поведением переменной после экспорта:
| Расширение | Управляет |
|---|---|
figma.scopes | Где переменную можно использовать в Figma (scope / видимость) |
figma.codeSyntax | Как переменная выглядит в Dev Mode по платформам (Web, Android, iOS) |
Обе опциональны. Scopes применяются только к типам, которые экспортируются как переменные (color и типы FLOAT / STRING / BOOLEAN); style- и внутренние типы их игнорируют.
{
"color": {
"brand": {
"$type": "color",
"$value": "#635BFF",
"$extensions": {
"figma.scopes": ["ALL_FILLS", "STROKE_COLOR"],
"figma.codeSyntax": { "Web": "var(--color-brand)", "iOS": "Color.brand" }
}
}
}
}
Scopes
Scope ограничивает, в каких полях Figma предлагается переменная. Каждый тип токена резолвится в один вид переменной Figma (COLOR, FLOAT, STRING, BOOLEAN), и у каждого вида — фиксированный набор допустимых scopes.
Вид переменной Figma по типу токена:
| Вид | Типы токенов |
|---|---|
COLOR | color |
FLOAT | opacity, dimension, number, spacing, sizing, borderWidth, borderRadius, fontSize, lineHeight, letterSpacing, paragraphSpacing, paragraphIndent |
STRING | fontFamily, fontWeight, text |
BOOLEAN | boolean |
Валидные scopes по виду
Только эти значения scope принимаются для каждого вида переменной (остальные отбрасываются при экспорте).
| Вид | Валидные figma.scopes |
|---|---|
COLOR | ALL_SCOPES, ALL_FILLS, FRAME_FILL, SHAPE_FILL, TEXT_FILL, STROKE_COLOR, EFFECT_COLOR |
FLOAT | ALL_SCOPES, TEXT_CONTENT, CORNER_RADIUS, WIDTH_HEIGHT, GAP, STROKE_FLOAT, EFFECT_FLOAT, OPACITY, FONT_SIZE, LINE_HEIGHT, LETTER_SPACING, PARAGRAPH_SPACING, PARAGRAPH_INDENT, FONT_WEIGHT |
STRING | ALL_SCOPES, TEXT_CONTENT, FONT_FAMILY, FONT_STYLE, FONT_VARIATIONS |
BOOLEAN | ALL_SCOPES |
Примечание Невалидный для типа scope молча отбрасывается при экспорте. Например, CORNER_RADIUS на токене color игнорируется.
Дефолтные scopes по типу
Если figma.scopes не задан, SXL Studio применяет разумный дефолт по типу. Типы не из списка получают ALL_SCOPES.
$type | Дефолтный scope |
|---|---|
color | ALL_FILLS, STROKE_COLOR, EFFECT_COLOR |
sizing | WIDTH_HEIGHT |
spacing | GAP |
borderRadius | CORNER_RADIUS |
borderWidth | STROKE_FLOAT |
opacity | OPACITY |
fontFamily | FONT_FAMILY |
fontWeight | FONT_STYLE |
fontSize | FONT_SIZE |
lineHeight | LINE_HEIGHT |
letterSpacing | LETTER_SPACING |
paragraphSpacing | PARAGRAPH_SPACING |
paragraphIndent | PARAGRAPH_INDENT |
dimension, number, text, boolean | ALL_SCOPES |
{
"spacing": {
"$type": "spacing",
"md": { "$value": "16px", "$extensions": { "figma.scopes": ["GAP", "WIDTH_HEIGHT"] } }
}
}
Code Syntax
figma.codeSyntax задаёт строку, показываемую для переменной в Dev Mode Figma, по платформам. Все ключи опциональны.
| Ключ | Платформа | Пример |
|---|---|---|
Web | CSS / SCSS / Less | var(--color-brand), $color-brand |
Android | Kotlin / XML | ColorBrand, @color/brand |
iOS | Swift / SwiftUI | Color.brand, UIColor.brand |
{
"$extensions": {
"figma.codeSyntax": { "Web": "var(--color-brand)", "Android": "@color/brand", "iOS": "Color.brand" }
}
}
Шаблоны Code Syntax
Вместо ручного имени на каждый токен используйте шаблон — SXL Studio сгенерирует значение из пути токена.
| Шаблон | Результат для color.brand.primary |
|---|---|
{var(--css-variable)} | var(--color-brand-primary) |
{$sass-variable} | $color-brand-primary |
{@less-variable} | @color-brand-primary |
{UpperCamelCase} | ColorBrandPrimary |
{lowerCamelCase} | colorBrandPrimary |
{UPPER_SNAKE_CASE} | COLOR_BRAND_PRIMARY |
{lower_snake_case} | color_brand_primary |
{
"$extensions": {
"figma.codeSyntax": { "Web": "{var(--css-variable)}", "Android": "{UpperCamelCase}", "iOS": "{lowerCamelCase}" }
}
}
Как конвертируется путь Разделители
/,.,_заменяются на-, путь разбивается на слова, и каждый шаблон форматирует эти слова в своём стиле.
Наследование
Задайте $extensions на уровне группы — и каждый токен внутри его наследует. Ребёнок может переопределить отдельный ключ; непересекающиеся ключи мержатся.
{
"color": {
"$type": "color",
"$extensions": { "figma.scopes": ["ALL_FILLS", "STROKE_COLOR"] },
"brand": { "$value": "#635BFF" },
"brand-strong": {
"$value": "{color.brand}",
"$extensions": { "figma.scopes": ["STROKE_COLOR"] }
}
}
}
Полный пример
{
"color": {
"$type": "color",
"$extensions": { "figma.scopes": ["ALL_FILLS", "STROKE_COLOR"], "figma.codeSyntax": { "Web": "{var(--css-variable)}" } },
"brand": {
"primary": { "$value": "#635BFF" },
"on-primary": { "$value": "#FFFFFF", "$extensions": { "figma.scopes": ["TEXT_FILL"] } }
}
},
"radius": {
"$type": "borderRadius",
"md": { "$value": "8px", "$extensions": { "figma.scopes": ["CORNER_RADIUS"] } }
}
}