SXL Resolver (VS Code)
SXL Resolver: расширение SXL Studio для VS Code и Cursor, которое показывает значения токенов при наведении на ссылки в JSON и var(...) в CSS, цепочки alias, автодополнение и переход к определению.
SXL Resolver добавляет IntelliSense для дизайн-токенов в VS Code и Cursor. Расширение читает JSON/JSONC-файлы токенов и CSS custom properties и показывает итоговое значение, визуальное превью и цепочку alias прямо в редакторе. Оно только читает: файлы токенов не изменяются, в репозиторий ничего не записывается.
| Возможность | JSON / JSONC | CSS, SCSS, Less, Sass и файлы компонентов |
|---|---|---|
| Подсказка при наведении | {color.brand.primary}: итоговое значение, превью, цепочка alias | var(--color-brand-primary): итоговое значение и превью |
| Автодополнение | Пути токенов внутри {...} | Имена custom properties внутри var(--...) |
| Переход к определению | От ссылки к определению токена | От переменной к её объявлению |
Текущая версия: 2.3.4. Нужен VS Code 1.85 или новее. Cursor поддерживается через его реестр, совместимый с Open VSX.
Установка
VS Code
- Откройте Extensions (
Cmd+Shift+Xна macOS,Ctrl+Shift+Xна Windows и Linux). - Найдите
SXL Resolverи нажмите Install.
Cursor
- Откройте Extensions в Cursor и найдите
SXL Resolver. - Если свежая версия ещё не предлагается, откройте страницу расширения на Open VSX и скачайте
.vsixнужной версии. Зеркала реестра могут отставать от Open VSX. - Выполните команду и выберите скачанный файл:
Extensions: Install from VSIX...
Где работает
| Файлы | Языки |
|---|---|
| JSON токенов | json, jsonc |
| Стили | css, scss, less, sass |
Файлы компонентов с var(--...) | typescript, typescriptreact, javascript, javascriptreact, vue, svelte, html |
Multi-root workspace поддерживается.
Файлы токенов
- Перечислите папки с токенами в
sxlResolver.tokenPathsв настройках workspace (.vscode/settings.json). - Откройте JSON- или JSONC-файл из этих папок и наведите курсор на ссылку вида
{color.brand.primary}или{spacing.reg.md}.
{
"sxlResolver.tokenPaths": [
"tokens",
"packages/design-system/tokens"
]
}
Пути задаются относительно корня workspace или абсолютно. В командных настройках используйте относительные пути. Несколько папок объединяются в один набор токенов. Файлы, где type, value и extensions записаны без $, тоже распознаются (sxlResolver.allowNoDollar).
Подсказка при наведении
Наведите курсор на ссылку токена. Часть Result показывает итоговое значение, часть Source показывает цепочку alias от ссылки до базового токена с файлом, в котором лежит каждый токен. Имена токенов в Source кликабельны: клик открывает файл на определении.

Цветовой токен в файле композиции: образец цвета, итоговый HEX и цепочка от токена компонента до orange.500 в core.json.
Составные токены раскрываются по свойствам.

Токен типографики: в Result каждое свойство с его значением, в Source цепочка alias для каждого свойства.

Тень из двух слоёв: x, y, blur, spread и цвет каждого слоя.
Глубину цепочки ограничивает sxlResolver.maxChainLength (по умолчанию 5). Иконки типов отключаются через sxlResolver.showIcons.
Поддерживаемые типы токенов: цвета, градиенты и заливки; типографика и её части (семейство, начертание, размер, межстрочный интервал, трекинг, отступ и красная строка абзаца, регистр и оформление текста); тени, размытия, backdrop blur, стекло и эффекты; dimension, sizing и spacing; радиусы, толщины, обводки и стили обводки; прозрачность, числа, строки и булевы значения; grid; переходы, длительности и кривые cubic-bezier; шаблоны и композиции.
Автодополнение

Ввод {orange. в JSON-файле: подходящие токены с иконками типов и подсказка для выделенного пункта.
- В JSON список открывается после
{и фильтруется по пути токена. - В CSS и файлах компонентов при вводе
var(--предлагаются custom properties из текущего workspace и из настроенных источников. - Размер списка ограничивает
sxlResolver.maxSuggestions(по умолчанию 300).
Переход к определению

Наведение на {w-button.size.sm.height} в файле композиции, клик по первой ссылке в Source, и редактор открывает components/WButton.json на токене height.
Ctrl+Click(Cmd+Clickна macOS) или Go to Definition на{token.path}либоvar(--name)открывает файл с определением.- Ссылки в части Source подсказки делают то же самое через команду
SXL Resolver: Reveal Token in File.
CSS-переменные
По умолчанию Resolver сканирует CSS, SCSS, Less и Sass открытого workspace и пропускает node_modules, .git, dist и build. Наведите курсор на var(--space-md) в padding, чтобы увидеть итоговое значение, например 8px. Наведите на var(--font-title), чтобы получить превью типографики с font-family, font-size, line-height и font-weight. Для цветов, градиентов и эффектов показывается визуальное превью.
Если переменные приходят из опубликованного пакета дизайн-системы или из сгенерированного CSS в другой папке, добавьте их в sxlResolver.cssVariableSources. Resolver проходит по entrypoint-файлам пакета и их относительным @import и индексирует только эти файлы. Не указывайте весь node_modules: это медленно, может проиндексировать несколько версий одного пакета и смешать переменные разных продуктов или тем.
Из опубликованного пакета
Замените имя пакета, entrypoints, manifests и глобы appliesTo на значения своего проекта. Поле manifests необязательно, см. раздел «Манифест» ниже.
{
"sxlResolver.cssVariableSources": [
{
"name": "Commerce app styles",
"package": "@org/design-system-styles",
"entrypoints": ["commerce/index.css", "components/index.css"],
"manifests": ["commerce/tokens-manifest.json"],
"appliesTo": ["apps/storefront/**", "packages/storefront-ui/**"]
},
{
"name": "Operations app styles",
"package": "@org/design-system-styles",
"entrypoints": ["operations/index.css", "components/index.css"],
"manifests": ["operations/tokens-manifest.json"],
"appliesTo": ["apps/operations/**", "packages/operations-ui/**"]
}
]
}
Из текущего workspace
Используйте paths, если CSS-файлы лежат в текущем репозитории или нужен абсолютный локальный путь.
{
"sxlResolver.cssVariableSources": [
{
"name": "Local design-system styles",
"paths": [
"packages/design-system/styles/commerce/index.css",
"packages/design-system/styles/components/index.css"
],
"manifests": [
"packages/design-system/styles/commerce/tokens-manifest.json"
],
"appliesTo": ["apps/storefront/**", "packages/storefront-ui/**"]
}
]
}
Источник можно задать и просто строкой: путь к CSS-файлу или папке относительно workspace либо абсолютный.
Поля источника
| Поле | Назначение |
|---|---|
name | Название источника, которое показывается в деталях автодополнения |
package | Имя пакета из dependencies в package.json. Пакет ищется от ближайшего пакета workspace; поддерживаются раскладки pnpm, npm и yarn |
entrypoints | CSS-файлы или папки внутри пакета для индексации. Относительные @import проходятся по порядку |
paths | Синоним entrypoints. Без package пути считаются относительно workspace или абсолютными |
manifests | Необязательные файлы tokens-manifest.json с метаданными cssVar, type, value и resolvedValue. Resolver их читает и никогда не создаёт |
appliesTo | Глобы относительно workspace для файлов, которые используют эту группу источников. Разделяйте ими приложения, пакеты, темы или бренды |
Приоритет резолва
При наведении или автодополнении var(--token-name) Resolver ищет в таком порядке:
- CSS-переменные, объявленные в текущем файле.
- Подходящие группы из
cssVariableSources. - Остальные просканированные CSS-переменные workspace, сначала ближайшие к текущему файлу.
- JSON-токен, у которого Code Syntax
Webили kebab-case путь совпадает с именем переменной.
Если два продукта объявляют переменную с одним именем, разнесите их по отдельным группам источников и ограничьте каждую через appliesTo. Тогда файл одного приложения не получит значение из другого продукта.
Манифест
tokens-manifest.json необязателен.
Без манифеста Resolver читает CSS-файлы, проходит цепочки var(...) и определяет широкий тип по значению: color, gradient, typography, dimension, duration, number, shadow или text.
С манифестом сохраняются исходные типы токенов. Это важно, когда CSS-значение неоднозначно: 8px может быть spacing, sizing, fontSize, borderRadius или borderWidth, и по одному CSS их не различить. Добавьте файлы манифеста в поле manifests группы источников.
Манифест создаёт Transformer с платформой manifest. Если пакет дизайн-системы уже поставляет манифесты, просто сошлитесь на них: запускать Transformer в репозитории приложения не нужно. Сам Resolver никогда не создаёт манифесты и другие файлы.
Составные токены, экспортированные в CSS, показываются как CSS-значение. Полную раскладку по свойствам смотрите в JSON-файлах токенов.
Настройки
| Настройка | По умолчанию | Назначение |
|---|---|---|
sxlResolver.tokenPaths | ["tokens"] | Папки с токенами, относительно workspace или абсолютные. Несколько папок объединяются |
sxlResolver.showIcons | true | Иконки типов в подсказке и автодополнении |
sxlResolver.maxChainLength | 5 | Максимальная глубина цепочки alias в подсказке |
sxlResolver.maxSuggestions | 300 | Максимальное число вариантов автодополнения |
sxlResolver.allowNoDollar | true | Распознавать type, value и extensions без $ в начале |
sxlResolver.cssVariablePrefix | "--" | Префикс при сопоставлении CSS-переменной с JSON-токеном |
sxlResolver.enableCssHover | true | Подсказка для var(--...) в CSS и файлах компонентов |
sxlResolver.enableCssCompletion | true | Автодополнение имён custom properties внутри var(--...) |
sxlResolver.cssVariableSources | [] | Дополнительные источники CSS: entrypoints пакетов или пути workspace, при необходимости с манифестами |
Где хранить настройки
Настройки Resolver относятся к редактору, а не к конфигурации приложения.
.vscode/settings.jsonв репозитории, если вся команда должна использовать одни и те же источники токенов и CSS. Cursor читает workspace-настройки в формате VS Code.- Файл
.code-workspace, ключ"settings"верхнего уровня, если в одном окне открыто несколько репозиториев. - User Settings JSON для личных абсолютных путей. Открывается командой:
Preferences: Open User Settings (JSON)
Коммитьте относительные пути. Абсолютные пути держите только в личных настройках.
Команды
SXL Resolver: Force Refresh Tokens
SXL Resolver: Reveal Token in File
Force Refresh Tokens перечитывает все файлы токенов и CSS-переменные; кнопка Refresh Tokens в строке состояния делает то же самое. Reveal Token in File открывает файл токена; её используют ссылки в подсказке.
Если что-то не работает
| Что случилось | Что делать |
|---|---|
| Подсказка или автодополнение показывают старые значения | Выполните SXL Resolver: Force Refresh Tokens. Если настройки менялись при открытом редакторе, выполните ещё Developer: Reload Window |
Нет подсказки на ссылке {...} | Проверьте, что папка с файлом указана в sxlResolver.tokenPaths; относительные пути считаются от корня workspace |
var(--name) ничего не показывает | Переменная объявлена вне сканируемого workspace, например в пакете. Добавьте пакет или папку со сгенерированным CSS в sxlResolver.cssVariableSources |
8px показан как dimension, а не spacing | Без манифеста определяются только широкие типы. Добавьте tokens-manifest.json пакета в manifests |
| Переменная получает значение из другого продукта | Разнесите продукты по отдельным группам источников и ограничьте их через appliesTo |
| Cursor не предлагает свежую версию | Проверьте страницу расширения на Open VSX: зеркала реестра могут отставать. Установите .vsix с Open VSX вручную |
| Open VSX показывает предупреждение о неподтверждённом namespace | Файлы расширения в порядке. Предупреждение касается владения namespace на Open VSX и исчезнет после его подтверждения издателем |
Приватность
SXL Resolver работает локально в редакторе. Он читает файлы токенов и CSS из открытого workspace и настроенных источников и не отправляет файлы токенов или значения CSS во внешние сервисы.