Scopes и Code Syntax
Где переменная предлагается в Figma и как она называется в Dev Mode: секции Scopes и Code Syntax в форме токена, поле $extensions в JSON, допустимые scopes по видам переменных, шаблоны code syntax и наследование.
Две настройки переменной задаются в форме токена и хранятся в $extensions:
| Настройка | Управляет |
|---|---|
Scopes (figma.scopes) | В каких полях Figma предлагается переменная |
Code Syntax (figma.codeSyntax) | Как переменная называется в Dev Mode для платформ Web, Android и iOS |
Обе необязательны и действуют только на типы, которые экспортируются переменными. У стилей и внутренних типов таких секций нет. В Figma эти настройки записываются, когда в окне Export to Figma включён переключатель Apply codeSyntax & scopes, по умолчанию он включён.
{
"color": {
"brand": {
"$type": "color",
"$value": "#635BFF",
"$extensions": {
"figma.scopes": ["ALL_FILLS", "STROKE_COLOR"],
"figma.codeSyntax": { "Web": "var(--color-brand)", "iOS": "Color.brand" }
}
}
}
}
Где настраивать
- В форме создания или редактирования токена: секции Scopes и Code Syntax.
- Для многих токенов сразу: в таблице коллекции выделите строки и выберите Edit token fields… в контекстном меню, там те же Scopes и поля Code Syntax для Web, iOS и Android. Пункт Inherit from group… возвращает наследование от группы. См. Коллекции.
- В JSON: поле
$extensionsу токена или у группы.
Scopes
Scope ограничивает, в каких полях Figma предлагается переменная. Набор допустимых scopes зависит от вида переменной, в который экспортируется тип токена.
| Вид переменной | Типы токенов |
|---|---|
| Color | color |
| Number | opacity, dimension, number, spacing, sizing, borderWidth, borderRadius, fontSize, lineHeight, letterSpacing, paragraphSpacing, paragraphIndent |
| String | fontFamily, fontWeight, text |
| Boolean | boolean |
| Timing | duration |
| Easing | cubicBezier, easing |
Допустимые scopes по видам
Другие значения редактор считает ошибкой и не записывает в Figma.
| Вид | Допустимые figma.scopes |
|---|---|
| Color | ALL_SCOPES, ALL_FILLS, FRAME_FILL, SHAPE_FILL, TEXT_FILL, STROKE_COLOR, EFFECT_COLOR |
| Number | 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 |
| Boolean, Timing, Easing | Scopes не поддерживаются, поле должно отсутствовать или быть пустым |
ALL_SCOPES означает «везде» и не сочетается с другими значениями. Для fontWeight допустим только FONT_STYLE: Figma хранит начертание строкой, поэтому scope FONT_WEIGHT для него не подходит и вызывает ошибку валидации файла.
Scopes по умолчанию
Если figma.scopes не задан, плагин ставит scope по типу. Типы-переменные, которых нет в таблице, получают 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 | ALL_SCOPES |
{
"spacing": {
"$type": "spacing",
"md": { "$value": "16px", "$extensions": { "figma.scopes": ["GAP", "WIDTH_HEIGHT"] } }
}
}
Code Syntax
figma.codeSyntax задаёт строку, которую Dev Mode показывает рядом с переменной, отдельно для каждой платформы. Все ключи необязательны.
| Ключ | Платформа | Пример |
|---|---|---|
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" }
}
}
Шаблоны
Вместо имени для каждого токена задайте шаблон: плагин соберёт имя из пути токена.
| Шаблон | Результат для 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"] } }
}
}