Введение

Что нового

Изменения последних версий SXL Studio простыми словами и таблица совместимости плагина с Bridge, Transformer, Resolver и Storybook Addon.

Номер установленной версии плагина виден на вкладке Tokens внизу пустой рабочей области и в первой строке вкладки Diagnostics. Плагин обновляется через Figma Community автоматически.

Совместимость

КомпонентВерсияГде взять
Плагин SXL Studio2.9.6Figma Community
SXL Bridge1.11.0npm i -g @sxl-studio/bridge, см. Утилита Bridge
Transformer3.4.1npm i -g @sxl-studio/token-transformer, см. Transformer
Resolver для VS Code2.3.4Маркетплейс VS Code, см. Resolver
Storybook Addon2.0.2npm, см. Storybook Addon

Плагин 2.9.x работает с Bridge 1.10.0 и новее. Если Bridge старее, обновите его: Local Workspace и Local Storage могут не открыться. Несколько вкладок, управление Figma Desktop и опасные команды, которые включаются сами, требуют Bridge 1.11.

Transformer: сохранение токенов

Начиная с Transformer 3.4.0, команда sync --preserve-existing сохраняет ранее сгенерированные токены после удаления JSON, обновляет совпавшие и добавляет новые во всех форматах. В 3.4.1 дополнительно стабилизированы повторные запуски force и XML preserve, уточнены записи smart и исправлено экранирование текста. Preserve включается только флагом команды; примеры smart, force и preserve приведены в документации Transformer.

Утилиты вместе с 2.9.3

  • Bridge 1.9.0: надёжнее установка через npm, рабочие команды справки/версии и понятная диагностика установленного пакета.
  • Transformer 3.3.1: улучшена обработка объектов DTCG, градиентов, составных ссылок, URL изображений и easing; исправлены повторная генерация SCSS и однократная пересборка после обновления. Ограничения платформ явно отражаются в диагностике; см. Transformer.

2.9.6

  • Компоненты библиотеки по имени из любого места файла: ссылка ref.component без key и library находит опубликованный компонент по его инстансу на любой странице документа — даже под переименованным слоем или внутри другого инстанса. Раньше инстанс должен был лежать на текущей странице и называться как компонент, иначе Generate и Apply завершались ошибкой «Unresolved component». Действует для слоёв INSTANCE и ICON, вложенных ссылок, замены иконок и значений INSTANCE_SWAP по имени; списки preferred и значения по умолчанию свойств по документу не ищутся. Вариант выбирается от опубликованного варианта по умолчанию по properties, его ключ запоминается для следующих запусков; прежний порядок поиска и его стоимость не меняются — поиск по документу срабатывает только там, где раньше ссылка оставалась неразрешённой. Одноимённые компоненты из разных библиотек автоматически не выбираются (сообщение перечисляет их ключи для key), а композицию рабочей области, которую не генерирует другой файл, опубликованный тёзка не подменяет. Подробнее: Composition.
  • Иконка по имени без ручного индекса (необязательно): если Bridge запущен с токеном Figma, достаточно одной любой иконки библиотеки в файле — остальные находятся по имени автоматически; токен остаётся в Bridge.
  • Файл diff-id стал меньше: ledger пишется по одной записи на строку без отступов — данные те же, файл меньше примерно на треть (5,7 МБ → 3,6 МБ на реальной дизайн-системе), а изменение переменной или режима — одна строка в Git. Первое сохранение один раз перезапишет файл целиком. Если репозиторий форматирует JSON, держите diff-id.*.json в .prettierignore. Старые версии плагина читают новый файл как обычно и могут записать его обратно с отступами — это безвредно. Clean up Diff-ID переводит файл в новую форму без экспорта.
  • Clean up Diff-ID забывает удалённые компоненты без JSON: прежнее действие Compact Diff-ID теперь называется Clean up Diff-ID (команда агентов compact_diff_id не переименована, в её результате появилось поле removedRoots[]). Если сгенерированного компонента больше нет в файле и его JSON-композиции нет в рабочей области, его запись убирается из diff-id. Компонент, чей JSON остался, по-прежнему помнится: после восстановления из истории версий Apply снова найдёт его. То же самое происходит при экспорте с включённым Delete или Force: в списке удаляемого такие записи показаны информационными строками с пометкой «Diff-ID», в число удаляемых объектов не входят, сами по себе подтверждения не вызывают и забываются только после успешного экспорта. Generate и Apply записи не забывают. Для агентов preview_export_variables отдаёт их в deletionPlan.forgottenCompositionRecords[]. Подробнее: Экспорт переменных и стилей.
  • Действия над Diff-ID разложены по местам: внизу дерева Tokens остались три действия, они видны всегда: Export variables & styles, Import variables & styles и Collection Settings. Clean up Diff-ID, Reset Diff-ID for one collection… и Reset Diff-ID… находятся в окне Export, подблок Diff-ID в Export settings; сброс одной коллекции переехал туда из Collection Settings. Index library components и Clean up Diff-ID находятся в окне Local Workspace, секция Workspace tools; там же осталось единственное предупреждение о размере Diff-ID больше 28 MiB. Подтверждения показываются окном плагина. Reset Diff-ID для одного файла по-прежнему в контекстном меню файла в дереве, а кнопка Compact Diff-ID в ошибке слишком большого файла не изменилась.
  • Единые сворачиваемые блоки во всех окнах: Import, Collection Settings, форма Git-подключения, Local Workspace и Cross-file собраны из тех же сворачиваемых блоков, что и окно Export. Состояние «открыт/свёрнут» запоминается для каждого окна; блок, в котором появилась ошибка или предупреждение, раскрывается сам, а признак проблемы виден в его заголовке.
  • Удаление опубликованного варианта больше не блокирует Apply: если значение оси убрано из JSON, опубликованные варианты удаляются с предупреждением вместо отказа с требованием вставить блок variantMigration. Экземпляры в этом файле переводятся на сохраняемый вариант; экземпляры в других файлах теряют связь с библиотекой только после вашей следующей публикации — диалог публикации Figma показывает удалённые варианты.
  • Слот с инстансом удалённого компонента чинится Apply: если инстанс по умолчанию в слоте ссылается на удалённый компонент (Figma показывает «Missing variant»), Apply переключает тот же слой на компонент из JSON и сообщает, какой удалённый компонент заменён. Раньше такой инстанс считался ручным содержимым и оставался мёртвым. Инстанс живого компонента, выбранного вручную, по-прежнему сохраняется.
  • Вариант, удалённый вручную, пересоздаётся в том же наборе: удаление варианта по умолчанию больше не приводит к созданию второго набора с новыми идентификаторами, а удаление любого другого варианта — к ошибке «binding target … is missing» на первом Apply.
  • Delete удаляет то, что обещал план: коллекция, убранная из конфига, и её стили удаляются при любом выборе коллекций. Раньше одна замороженная переменная в посторонней коллекции (например, путь токена, заданный в двух коллекциях) молча отменяла удаление всех коллекций целиком. Если экспорт всё же оставляет объект из подтверждённого плана, он называет его и причину.
  • Apply выбранного компонента больше не пересобирает все варианты: Apply из бейджа композиции (и с anchorNodeId через Bridge) теперь, как обычный Smart Apply, пропускает варианты, которые не изменились, и пересобирает только изменённые. Раньше при каждом таком Apply пересобирался весь набор: у набора на 120 вариантов это около двух минут даже без изменений в JSON.
  • Правка ref.styles и refStyles больше не пересобирает варианты: если в JSON изменились только стили корня вставленного инстанса — ref.styles в structure, refStyles в стилях или styles внутри ref варианта, — Smart Apply заново записывает эти стили на инстансы изменённых вариантов и повторяет то, что полный Apply записывает на тот же инстанс после них: стили самого слоя, корневой и dot-блоки. Варианты, слоты и экземпляры не пересоздаются. Раньше такая правка пересобирала каждый затронутый вариант целиком (около секунды на вариант). Если результат нельзя доказать равным полному Apply — например, слот по умолчанию заменён вручную, у ссылки есть ref.slots или scale, или правка цвета иконки может быть переписана другим блоком, — Apply выполняется полностью, как раньше. Подробнее: Composition.
  • Слоты после Generate на большой странице: сразу после сборки набора Figma какое-то время не принимает привязку нативного слота к свойству компонента; на странице с сотнями компонентов плагин ждал слишком мало и сообщал «SLOT bindings could not be established», хотя повторный Apply привязывал слот. Теперь ожидание дольше и тратится только пока Figma отказывает. Для одиночного компонента (без вариантов) результат привязки слотов теперь дожидается: раньше сбой мог не попасть в итог операции.
  • Компонент, получивший оси, остаётся тем же узлом: если у компонента без props в JSON появились оси, Smart Apply делает его вариантом по умолчанию нового набора с тем же id и экземплярами. Раньше это получалось, только если трекинг уже хранил компонент под ключом варианта: обычно он лежит под ключом одиночного компонента, а после неудачного Apply (например, из-за неразрешённой ссылки) — не лежит вовсе, и Apply собирал новый набор рядом, оставляя исходный компонент отдельно и сообщая об успехе. Теперь такой прогон либо включает исходный компонент в набор, либо останавливается до объединения с ошибкой и убирает варианты, созданные в этом прогоне (раньше они оставались на странице отдельными компонентами). Набор встаёт в ту же секцию или фрейм, где лежал компонент (раньше — на страницу в координатах секции, далеко от неё). Обратно — если оси из JSON убрать — набор сворачивается в свой вариант по умолчанию с его id на месте набора; раньше этот переход останавливался ошибкой миграции вариантов («invalid variant key») или создавал новый компонент. Подробнее: Composition.
  • Агент ведёт плагин сам: Remote Connect включается при каждом запуске плагина и ждёт команд в фоне. Интерфейс остаётся доступным, после пересборки и перезапуска Bridge связь восстанавливается сама. Опасные команды включаются сами с Bridge 1.11, кроме защищённых файлов; агент управляет ими командами set_session_policy и protect_file. Bridge 1.11 держит плагин сразу в нескольких вкладках и отправляет команду в выбранный файл: любой инструмент плагина принимает targetFileKey, ответ показывает, куда ушла команда, а защищённый файл сам целью не становится. На macOS он открывает файлы в Figma Desktop, запускает и перезапускает плагин. Подробнее: Bridge.
  • План удаления показывает переменные, которые ещё используются: если экспорт с Delete или Force удаляет переменную, к которой ещё привязаны слои файла, в окне подтверждения видно, сколько слоёв и на каких страницах останутся со ссылкой на удалённую переменную.
  • Первый экспорт большого DS за один прогон: коллекции заполняются в порядке зависимостей (ref), отложенные алиасы досвязываются до сходимости; порядок коллекций в панели Variables остаётся порядком конфига.
  • Начертание веса шрифта не зависит от выбора коллекций: семейство, с которым используется токен fontWeight, ищется во всех включённых коллекциях. Раньше экспорт одной коллекции записывал, например, Semi Bold, а полный экспорт — Semibold, и два прогона перезаписывали значение друг друга.
  • Local Workspace: команда во время перечитывания диска ждёт, а не падает: если файл на диске только что изменился, экспорт и другие записи дожидаются перезагрузки workspace (до 20 секунд) вместо ошибки «write synchronization is not active».
  • Переходы: триггер по клавише (on-key Enter), mouse-enter / mouse-leave, задержка триггера, действия url, set-variable, set-variable-mode и несколько действий в одной реакции. Неизвестное слово в transitions останавливает Apply с ошибкой, а не превращается молча в on-click / smart-animate; cubic-bezier(…) с пробелами работает в сокращённой записи.
  • Новые ключи стилей: textWrap, listSpacing, hangingPunctuation, hangingList, strokeMiterLimit; удалённые из JSON торец, соединение и пунктир обводки сбрасываются при Apply.
  • ref.expose экспонирует вложенный инстанс на родительском компоненте; аудит дрейфа предупреждает о нарушении ограничений нативных слотов.
  • Переименование значения оси без потери экземпляров: tone: b → beta на той же позиции переименовывает варианты на месте, идентификаторы и экземпляры сохраняются; при удалении значения экземпляры сами переводятся на вариант с теми же остальными осями и значением по умолчанию. Раньше переименование удаляло варианты и оставляло экземпляры на удалённом компоненте.
  • Свойства инстанса в слоте вложенного инстанса: ref.nested.*.slots со свойством INSTANCE_SWAP по имени больше не завершается ошибкой «did not take effect».
  • Сохранение diff-id за доли секунды: сохранение трекинга композиции больше не зависит от объёма переменных в ledger (раньше около секунды на мегабайт).
  • Варианты достают до любой глубины: блок ref в секции $prop=value — наложение на структурный ref: component повторять не нужно, properties сливаются по ключу, nested, slots и overrides — по записи. Раньше блок без component и вариантный ref.nested молча не применялись.
  • Свойства стиля без эффекта видны: ключ, который для этого вида слоя ничего не делает (например, fill на FRAME), даёт предупреждение с названием слоя, селектора и подходящего свойства.
  • Индекс библиотеки: команда Index library components (окно Local Workspace, секция Workspace tools) в файле-библиотеке записывает в рабочую область имена и ключи её компонентов; после этого иконка или компонент библиотеки вставляется по имени, даже если в документе нет ни одного его инстанса. Подробнее: Composition.
  • Цвет с прозрачностью по переменным: ячейка «цвет + opacity» записывается в публичном формате Figma { color, opacity } (Plugin API, обновление 139 от 17 сентября 2026). Прежний внутренний формат Figma перестала принимать: каждая такая ячейка получала запечённый цвет и предупреждение. Старый формат остаётся запасным для прежних версий редактора, читаются оба; отказ формата для всех ячеек сообщается одним замечанием на экспорт.
  • nested.path через нативный слот: путь доходит до содержимого слота по имени слоя из JSON мастера. Figma называет инстанс по умолчанию внутри слота именем его компонента, поэтому путь останавливался на «segment … was not found». Правило действует только для нативного слота с единственным инстансом; остальные сегменты по-прежнему сопоставляются точно, слои не переименовываются.
  • Один файл токенов в двух коллекциях: файл библиотеки, включённый в свою коллекцию и подключённый как source в другой, больше не даёт «alias type is ambiguous» для третьей коллекции, которая на него ссылается. Определения, совпадающие по типу, алиасу и значению, считаются одним ответом; настоящие расхождения остаются ошибкой.
  • Причина неразрешённой ссылки видна в уведомлении: строка с причиной и охватом поиска (сколько инстансов и страниц прочитано) показывается как предупреждение, а не скрытая информационная запись.
  • Массовая генерация по зависимостям: bulk_generate_compositions генерирует мастер раньше композиций, которые на него ссылаются; порядок остальных файлов прежний. Чистая генерация рабочей области больше не требует повторных проходов из-за алфавитного порядка.
  • Local Workspace при задержанных ответах: оставшийся без ответа запрос событий больше не закрывает сессию после четырёх попыток. Такой запрос ничего не теряет — следующий повторяет тот же курсор, — поэтому плагин продолжает опрос до двух десятков попыток, например пока вкладка Figma в фоне; остальные сетевые ошибки обрабатываются как раньше.
  • Быстрое сохранение после Generate и Apply в Local Workspace: время записи Diff-ID после композиции больше не растёт вместе с числом переменных и стилей в файле. При первом сохранении в 2.9.6 разделы композиций в файле Diff-ID переезжают в конец файла: содержимое то же, в Git это выглядит как одно крупное перемещение. Версия 2.9.5 читает такой файл как обычно.
  • Список удаляемого и подтверждение при экспорте: экспорт, который собирается что-то удалить, сначала анализирует файл без изменений и показывает в уведомлении список по группам «Removed from JSON (tracked)», «Foreign — not created by SXL», «Disabled in config» и «Kept» с причиной, с кнопками удаления и отмены. Отмена ничего не меняет, вне подтверждённого списка ничего не удаляется; автоэкспорт после Pull не удаляет и не спрашивает. Подробнее: Экспорт переменных и стилей.
  • Новые правила Delete и Force update all: без обеих настроек экспорт только добавляет и обновляет, возвращая к JSON ручные правки имён и значений в Figma с теми же идентификаторами. Delete orphaned variables & styles удаляет только то, что SXL экспортировал раньше и чего больше нет в JSON, в выбранных коллекциях и типах; созданное вручную и отключённое в конфигурации не трогает. Force update all приводит файл точно к JSON без сброса идентификаторов: совпадающие значения не перезаписываются (на синхронизированном файле 0 создано, 0 обновлено, 0 удалено), а всё, чего нет во включённом JSON, удаляется — остатки прежних экспортов, созданное вручную, отключённые коллекции и режимы. При выборе части коллекций очистка идёт только внутри них; в файле без diff-id созданное вручную не удаляется; стили, используемые композициями, объекты библиотек и выключенные типы не затрагиваются.
  • Reset Diff-ID без дубликатов: следующий экспорт заново подключает существующие переменные по имени и типу, а стили по имени и виду, и записывает их идентификаторы.
  • Строгие числа и единицы: десятичная запятая (1,5px = 1.5), pt, pc, in, cm, mm, Q пересчитываются в пиксели (10pt = 13.33), регистр единиц не важен, то же работает в формулах (10pt + 2px, {a} * 1,5; внутри скобок функции запятая разделяет аргументы). Единицы без пиксельного значения (vw, vh, ch, fr и другие) и записи вроде 12abc или 1,234,567 больше не читаются как число перед хвостом: токен пропускается с причиной, соседние экспортируются. См. Dimension.
  • Цвета вне sRGB без сдвига оттенка: литералы lch(), oklch(), color(display-p3 …) и результаты lighten, darken, mix в lch и oklch приводятся в sRGB уменьшением насыщенности с сохранением светлоты и оттенка (CSS Color 4), а не обрезкой каналов. lighten на 100 % даёт точный белый, darken на 100 % — точный чёрный в любом пространстве.
  • Имена цветовых функций в любом регистре: RGB(…), OKLCH(…) принимаются; светлота oklch() может быть процентом, например oklch(70% 0.15 250).
  • Формулы в полях стилей: числовые поля теней, размытия, эффектов, сетки и типографики принимают формулы вроде "{dim.px} / 3"; значение вычисляется и записывается числом с замечанием, что формулу привязать нельзя, — для связи сошлитесь на токен с формулой. Литеральные числа в стилях принимают те же единицы; em в lineHeight и letterSpacing считается от размера шрифта (1.5em = 150 %). Стиль, подключённый по имени, считается обновлённым, а не созданным.
  • Доли в стекле и шуме: ссылка на токен прозрачности в lightIntensity, refraction, dispersion стекла и в opacity, density шума сохраняет долю: 0.48 остаётся 0.48, а не превращается в максимум.
  • Bridge 1.11: preview_export_variables возвращает тот же список удаляемого без записи, а export_variables, которому нужно что-то удалить, требует confirmDestructive: true; без него ничего не меняется.
  • rem base в настройках экспорта: базовый размер для rem, em и процентов задаётся в окне экспорта числом или ссылкой на токен; поле в Collection Settings убрано, значение по-прежнему хранится в config.json. Формулы и числа в полях стилей считаются от этой базы, а не от 16. Неразрешимая ссылка останавливает экспорт до любых изменений.
  • Local Workspace и серии сохранений: если файлы изменились на диске, пока плагин перечитывал рабочую область (сохранение нескольких файлов, git checkout), чтение повторяется само; раньше требовался ручной Reload.
  • variantMigration не мешает Generate: блок можно оставить в JSON навсегда; если набора вариантов нет или его матрица уже совпадает с JSON, он игнорируется, и Generate создаёт набор заново без правки JSON.

2.9.5

  • Compact Diff-ID: красное действие внизу дерева Tokens, когда ledger больше 28 MiB, и команда compact_diff_id для агентов переписывают ledger в компактную схему без экспорта и Apply, с сохранением всех id; если ledger вырос выше предела Bridge и рабочая область не открывается, та же кнопка появляется в сообщении об ошибке (Bridge 1.10.2 и новее).

  • Компактный трекинг композиций в diff-id (схема 3): ключи слоёв записываются один раз на корень, а варианты хранят только id, legacy-секция compositions не хранится, корень с удалённой нодой сворачивается при доказанной замене; ledger реального DS уменьшается в несколько раз, а Generate и Apply работают с теми же картами в памяти. Ledger, записанный 2.9.5, для Apply композиций требует 2.9.5 или новее; экспорт переменных и стилей не меняется.

  • Адаптивные варианты: STRING-токены в ref.properties, в том числе экспортированные в другой файл рабочей области (библиотека Core → файл компонентов): переменная импортируется по опубликованному ключу. Исходный вариант выбирается по режиму места размещения; неиспользуемые режимы переменной не мешают привязке, проверяется активное значение инстанса.

  • Миграция матрицы вариантов: изменение числа вариантов и осей обновляет существующий ComponentSet на месте с сохранением идентификаторов; экземпляры удаляемых вариантов переводятся на сохраняемые нативной заменой с сохранением переопределений; опубликованные варианты и удалённые значения осей требуют явной карты variantMigration.

  • Неразрешённые ссылки: результат становится ошибкой с первичной причиной, текущий слой сохраняет идентификатор без каскадных ошибок и повторных заглушек, а после исправления ссылки Apply приводит его к JSON.

  • Grid и перенос строк в композициях целиком: сетка Figma со всеми настройками — число колонок и строк, дорожки fr/px/hug (в том числе repeat(7, 1fr)), отступы, автопозиционирование (gridAutoFlow, gridAutoRows), явное размещение инстансов по ячейкам (gridRow, gridColumn, span, выравнивание); перенос строк с wrapGap: "auto" и space-evenly/space-around. Удалённые из JSON ключи сетки и переноса сбрасываются при Apply, несовпадение числа дорожек и колонок — ошибка авторства с исправлением.

  • Hover без сдвига соседей: добавлен рецепт независимого увеличения всей карточки в Auto Layout и Grid: фиксированная ячейка сохраняет место и min/max-переменные, внутренний слой сохраняет пропорции. Это явная структура композиции, а не автоматическая обёртка.

  • Пропорции и ограничения размеров: масштабирование учитывает min/max переменные; замок в JSON с разными переменными на двух сторонах одной пары (width/height, minWidth/minHeight, maxWidth/maxHeight) — ошибка авторства с указанием слоя, пары и исправления до любых изменений; один токен на обеих сторонах пары и переменные в разных парах допустимы; замок с канваса (унаследованный или ручной) даёт предупреждение aspect-lock-settled; сбой стиля корня не оставляет вариант пустым. Исправлен сброс явно включённого constrainProportions у FRAME.

  • Восстановление управляемых привязок в Smart: поддерживаемые прямые связи с переменными проверяются и без изменения соответствующего JSON-блока. Ручное содержимое слотов и унаследованные слои инстансов сохраняются.

  • Масштаб инстансов из JSON: абсолютный scale для явно объявленных INSTANCE и ICON, включая default-инстанс нативного слота. Повторный Apply не накапливает масштаб; удаление значения возвращает масштаб к единице. Поддерживаемые сочетания и ограничения описаны в Composition.

  • Поздние привязки стилей: стиль любого вида (текст, заливка, градиент, тень, размытие, сетка), экспортированный раньше своих переменных, сохраняет литеральное значение и сообщает о каждом таком поле с подсказкой, как исправить. Когда зависимости экспортированы, обычный повторный экспорт восстанавливает привязки без Force update all и сохраняет ID стиля.

  • Привязка размера текста: fontSize сохраняет числовую переменную после записи размера; ошибка привязки попадает в диагностику. Стиль любого вида (текстовый, заливка, градиент, тень, blur, сетка), экспортированный раньше своих переменных, получает литерал и замечание по каждому полю с подсказкой; после экспорта зависимостей обычный повторный экспорт восстанавливает привязки без Force update all, сохраняя ID стиля.

  • Прозрачность и blend mode слоя с цветом по переменной: слой заливки со ссылкой на цветовую переменную и своей opacity получает прозрачность уже при первом экспорте — Figma сбрасывала её при создании стиля, и значение появлялось только после второго экспорта. Blend mode у такого слоя Figma не хранит: экспорт оставляет NORMAL и сообщает замечанием; чтобы сохранить blend mode, задайте цвет слоя литералом.

  • Local Workspace и сохранения в редакторе (Bridge 1.10.0): после записи плагина в файл Bridge мог перестать замечать последующие сохранения этого же файла в редакторе до перезапуска. Ожидание завершения записи теперь выполняет сам Bridge, и мгновенное отсутствие файла во время журналируемой замены его не сбивает.

  • Вложенные слоты при смене варианта хоста: содержимое, которое композиция положила в нативный слот вложенного инстанса, остаётся авторским, когда тот же блок ref.nested переключает VARIANT-свойство инстанса (например size: md): Figma пересобирает слои инстанса с новыми идентификаторами, а владение переносится вместо ошибки «copied slot ownership…». Скопированный вручную инстанс с таким же содержимым по-прежнему не присваивается.

  • Нативный слот в наборе вариантов при Generate: в библиотечном файле генерация могла остановиться на «Slot … could not be attached», потому что ссылка нового слота на свойство приходила пустой сразу после объединения вариантов. Плагин читает ссылки при создании и вокруг объединения и перепроверяет привязку; в замечании об отказе видны ключи и трасса создания слота.

  • Замена содержимого слота без нативной привязки: если слой слота у host-компонента остался обычным FRAME (компонент создан до нативных слотов), ref.slots с op: "replace" меняет единственный инстанс внутри него на месте нативной заменой компонента вместо скрытия старого и вставки нового, которую Figma внутри инстанса запрещает; при отказе прежнее содержимое остаётся видимым, а результат получает ошибку.

  • Три статуса результата и Auto-fix: успех, предупреждение с рекомендациями по пунктам и ошибка с перечнем исправлений; кнопки Repair и Auto-fix прямо в уведомлении (повторная привязка вариантов, ожидание Local Workspace, Repair, затем Smart). Bridge 1.10.0 возвращает status, diagnostics (с details и fixes), suggestedAction; команды auto_fix_composition и reload_local_workspace; get_plugin_status показывает состояние Local Workspace. Замечания и ошибки во всех уведомлениях — композиции, экспорт переменных и стилей, Apply Tokens, Apply Data — оформлены единым списком: значок серьёзности, сначала ошибки; длинное сообщение разобрано на заголовок и строки «что не так», шаги исправления — отдельными стрелками, свойства и токены выделены, общий набор шагов показан один раз над списком; счёт «N errors · M notices», Show N more для длинных списков. Apply Data перечисляет пропущенные поля с причиной и исправлением вместо «Applied to 0 layers».

  • Редактирование активного профиля Local Workspace: имя и папки активного профиля меняются без деактивации — кнопка Save and reopen сохраняет профиль и заново открывает рабочую область из новых папок; несохранённый черновик редактора или конфликт с диском останавливают сохранение с объяснением; удаление активного профиля по-прежнему требует Use Plugin Local. Рядом с полями корня, tokens и data — кнопка выбора папки через системный диалог (нужен Bridge 1.10.0); папки tokens и data должны лежать внутри Git-корня.

  • Local Workspace без незавершённых операций: ожидание перезагрузки рабочей области перед записью и повтор записи трекинга после изменения канваса; изменение файла на диске во время операции применяется в её точке ожидания, а конфликт несохранённого черновика с диском остаётся решением пользователя.

  • Привязка переменной к VARIANT при вариантных ref: блок ref внутри $prop=value-секции стилей меняет только названные свойства вложенного инстанса; привязки {token} из структурного ref (например _breakpoint: "{breakpoint}") сохраняются, а после всех стадий Apply каждая такая привязка проверяется: потеря становится ошибкой, а не успехом.

  • Смена вида слоя FRAME ↔ SLOT: Apply меняет тег существующего слоя на месте: на одиночном компоненте создаётся нативный слот, в наборе вариантов — свойство SLOT со связанными слоями; обратная смена снимает свойство без пересоздания узлов.

  • Литеральные свойства ссылок в Smart: Smart Apply сверяет текстовые, логические и вариантные значения ref.properties вложенных инстансов с живыми и переприменяет разошедшиеся, например после переименования свойства в компоненте-источнике.

  • INSTANCE_SWAP и вариантные ссылки: значение по умолчанию берётся из JSON; вариантная замена компонента на привязанном слое сообщается предупреждением, а аудит понимает вариантные замены на обычных слоях.

  • Надёжнее Generate и Apply: исправлены выбор целевой страницы, добавление и переименование нативных слотов, привязка существующих слотов и обработка отмены. Незавершённая операция не получает отметку об успешном обновлении.

2.9.4

  • Настройки нативных слотов из JSON: описание, предпочтительные компоненты, минимальное и максимальное число слоёв, отображение пустого слота и настройка растягивания при вставке. Ограничения количества слоёв рекомендательные и не удаляют существующее содержимое.
  • Переименование свойства слота через Apply: изменение имени в componentProperties при прежнем layer сохраняет идентификатор свойства, привязку и содержимое слота. Неизменённый JSON сохраняет ручное имя в Figma. Для композиций из предыдущих версий сначала выполните Apply с прежним JSON, затем меняйте имя. См. Настройки слотов.
  • Default-содержимое слотов по вариантам: Generate и Apply учитывают компонент, его свойства и стили для каждого варианта родителя. Можно задать default-компонент и во вложенном нативном слоте. Ручные замены, изменённые свойства, скрытое и намеренно пустое содержимое защищены от перезаписи.
  • Точнее выбор компонентов: ключ опубликованного набора выбирает нужный вариант; поиск по имени больше не подставляет компонент только из-за совпадения части имени. При разрешении ссылки точное локальное имя имеет приоритет. Если default слота уже создан через другое совпадение имени, используйте Repair для повторного разрешения ссылки. Явные key и library сохраняют приоритет и ограничения источника.
  • Восстановление потерянных связей: Apply может перепривязать существующий инстанс с удалённым локальным мастером к единственному подтверждённому компоненту из того же JSON-источника. При неоднозначности или неподтверждённой сохранности ручного содержимого плагин сообщает о проблеме.
  • Прозрачность по ссылке в цветовых выражениях: поддерживаемые rgb, rgba, hsl, hsla, lch, oklch и color(...) могут сохранять ссылку на токен прозрачности без обязательного figma.modify. Для нативной связи прозрачности цвет по ссылке должен быть непрозрачным. Если Figma не поддерживает нужную связь, экспорт сохраняет вычисленный цвет и сообщает об ограничении.
  • Изображения в JSON композиций: Get Code встраивает PNG, JPEG и GIF, сохраняет обрезку, отражение, скрытые слои и порядок поддерживаемых эффектов. Generate и Apply читают встроенные изображения; недоступный источник вызывает ошибку и сохраняет прежние заливки. GLASS зависит от доступности эффекта в Figma и поддерживается без привязок переменных.
  • Надёжнее Apply и Get Code: сохраняются привязки и настройки слотов, описания, предпочтительные компоненты и пустые слоты. Ошибки привязки свойств и неполные обновления больше не считаются успешным применением. Недопустимая привязка внешнего свойства к обычному слою внутри слота диагностируется до изменения структуры.
  • Local Workspace и повторный Apply: генерация и обновление проверяют готовность синхронизации до изменения слоёв. Ошибка сохранения привязок явно сообщается, а повтор с неполным трекингом не создаёт дубликаты существующих вариантов.
  • Массовые команды Remote Connect: некорректные запросы отклоняются до начала работы, а Cancel останавливает следующие композиции активного прогона. Уже выполненные изменения сохраняются.

2.9.3

  • Apply может заново создать удалённый обычный корень композиции (component: false). Недоступное значение по умолчанию свойства замены инстанса вызывает предупреждение, но не помечает весь Apply незавершённым.

  • Подписи сетки следуют за перенесённым набором при Apply; старые подписи на другой странице удаляются. Повторный Apply сохраняет неизменные подписи, а ручные изменения текста и оформления исправляются.

  • Повторный Apply в Local Workspace быстрее: данные привязки композиции записываются только при изменении.

  • После сетевого сбоя Local Workspace больше не сообщает об успешном сохранении по старой копии файла. Если результат записи неизвестен, перед следующим сохранением требуется перезагрузить рабочую область.

  • После частично неудачного Apply обработанные варианты сохраняют связь с композицией, а следующий Apply повторяет незавершённую работу. Повторный Apply также сохраняет связи вариантов с их слоями.

  • Apply сохраняет исходную страницу и позицию компонента, в том числе при переходах между одиночным компонентом и набором вариантов. Если страница цели недоступна, Apply останавливается до изменений на канвасе.

  • Композиции учитывают явно указанную библиотеку и ключ опубликованного компонента, в том числе при замене вложенных иконок. Недоступная ссылка вызывает предупреждение вместо молчаливой подстановки локального компонента с тем же именем.

  • Local Workspace: после повторного открытия плагина успешное подключение восстанавливает экспорт и сохранение, даже если первая проверка соединения завершилась ошибкой.

  • В экспорте остался один переключатель Sort для стилей и их папок. Сортировка сохраняет идентификаторы и привязки; настройка пересоздания коллекций убрана. Существующие коллекции, моды и переменные плагины Figma переставлять не могут.

  • Композиции: удаление слоя из JSON надёжно применяется smart Apply. Раньше после структурной правки штамп «нестилевого» хэша набора не обновлялся, и следующий Apply считал удаление слоя стилевой правкой, оставляя слой на канвасе до repair. Быстрый стилевой путь дополнительно сверяет живые слои со структурой. Результат Apply содержит applyPlan: какой план сработал и почему. ref.nested.<слой>.component меняет вложенный инстанс, как ручная замена в Figma; переопределения инстансов при Apply сохраняются, id нод не меняются.

  • Композиции: свойство INSTANCE_SWAP по умолчанию получает тот вариант, который слой уже показывает (ref.properties), а не вариант набора по умолчанию, поэтому привязка свойства больше не сбрасывает variant=secondary. Аудит дрейфа сравнивает хэш композиции с последним Generate/Apply, учитывает переопределения instanceProperties по вариантам, не считает ручные реакции прототипа дрейфом и понимает component: false; для component: false ведётся трекинг в diff-id. Команда get_drift_status в Bridge отвечает по хэшу, а не всегда «нет дрейфа».

  • Композиции: CSS-градиент под углом (linear-gradient(135deg, …)) на фигуре теперь записывается: стопы приводятся к диапазону Figma сдвигом ручек, раньше Figma отклоняла заливку молча. backgroundBlur / layerBlur по токену стиля ({blur.bound} → {core.space.md}) получают радиус из цепочки ссылок и привязку к переменной; отказ записи заливки или обводки попадает в предупреждения результата.

  • Композиции: заливка по токену стиля (fill: "{gradient.brand}", "{img.logo}", "{fill.surface-tinted}") подключает стиль заливки Figma или собирает слои из значения токена; blendMode задаётся на слое; значения enum-полей из токенов (textCase, textDecoration) переводятся в термины Figma; Apply работает для component: false; аудиты и поиск использований переменных видят привязки текстовых полей (размер, начертание, интерлиньяж, текст).

  • Local Workspace: после смены ветки или коммита в репозитории токенов сессия переоткрывается сама, без Reload. Если в редакторе есть несохранённый черновик, плагин показывает конфликт и ждёт решения.

  • Композиции: Apply больше не стирает реакции прототипа, добавленные вручную, а переписывает только созданные из transitions; добавленные Apply варианты получают свои переходы, а не копии переходов шаблона; Apply не двигает существующий набор в центр экрана; первый Apply после Adopt не удаляет component properties, созданные дизайнером; padding массивом раскладывается по сторонам как CSS; lineHeight и letterSpacing из токена без переменной Figma записываются корректно.

  • Композиции: селектор с условием и классом ("$variant=secondary .root") принимает вложенные блоки классов, порядок условий и классов в ключе свободный. Раньше такие правила терялись, а вложенный блок попадал в базовые стили.

  • Композиции: visible: "{token}" привязывает булеву переменную; ссылка на вес шрифта из строковой переменной привязывается к полю Font style, из числовой — к Font weight; border: "none" снимает обводку; размеры дорожек сетки fr / px / auto записываются в актуальном формате Figma, строковая форма "1fr 200px auto" тоже работает; textSizing: "truncate" пишется как обрезка с многоточием без устаревшего режима.

  • Переходы: именованные правила ("hover-in") работают через from / to в объектной форме, а правило без направления попадает в предупреждения (раньше такие правила из документации не создавали ни одной реакции); значения осей с дефисами в правилах ($size=extra-large -> …), after-timeout 500 в сокращённой записи, matchLayers у направленных переходов; неизвестная анимация или кривая теперь попадает в предупреждения, а не подменяется молча.

  • Курсив в текстовом стиле сохраняется, даже если вес привязан к строковой переменной: начертание пишется литералом с подсказкой в отчёте.

  • Стили по ссылке на переменную: fill из одной ссылки на цвет и blur / backdrop-blur из ссылки на число привязывают переменную; сетки со STRETCH, MIN, MAX, CENTER проходят проверку Figma; слой noise пишется без blendMode.

  • Значения в форме DTCG: объекты { "value", "unit" } для длин и длительностей, цвет каналами { r, g, b, a } и объект цвета DTCG (colorSpace, components, alpha, hex) читаются как обычные значения. Формулы для duration считаются в миллисекундах.

  • Цвет с прозрачностью экспортируется составной ячейкой Figma: токен цвета с модификатором alpha получает переменную цвета и переменную прозрачности в одной ячейке, как в панели Variables, и это работает и для ссылки на цвет с числовой прозрачностью. Где Figma ещё не открыла запись, цвет остаётся с запечённой прозрачностью, а отчёт перечисляет такие переменные.

  • Файлы, коллекции и папки на экране Tokens открываются во вкладках, как в IDE: переименование двойным щелчком, точка несохранённых изменений, вопрос при закрытии, память вкладок и вида для каждой рабочей области. Датасеты и маппинги вкладки Database живут в той же полосе.

  • Карточка токена по наведению на бейдж переработана: полный путь и тип, превью, значение как в JSON и ссылки с файлами, где они определены; ссылка на формулу считается до числа; клик копирует значение. Без выбранного мода превью считает значения для мода открытого файла.

  • Стили заливки: слои video и pattern, картинки и видео из Database, режим масштабирования, поворот и коррекция изображения, видимость слоя, прозрачность слоя ссылкой на токен. Градиенты: repeating-*, направление словами, форма, размер и позиция radial и conic, позиции стопов в пикселях и долях, ссылки в угле и позициях. Все ссылки на цвета по-прежнему становятся переменными в стиле.

  • Текстовые стили: оси переменных шрифтов fontVariationSettings (Figma Plugin API 1.138), listSpacing, textWrapStyle, hangingPunctuation, hangingList; форма типографики умеет их добавлять.

  • Формы токенов больше не теряют поля при редактировании: видимость, режим наложения и «тень позади слоя» у теней, объектные значения размытий и картинок, цвет и видимость сетки.

  • Импорт из Figma читает все слои стиля заливки, а не только первый, и не выбрасывает скрытые слои эффектов.

2.9.2

  • Поддержаны новые типы переменных Figma Timing и Easing: токены duration экспортируются как Timing, cubicBezier и новый тип easing как Easing, включая пресеты и пружины. При импорте из Figma они возвращаются в JSON. В окнах Export и Import появились переключатели Timing и Easing.
  • Стили эффектов поддерживают все текущие эффекты Figma: обычное и прогрессивное размытие, шум, текстуру, стекло и шейдеры, с привязкой переменных к цвету, смещению, радиусу и размытию теней.
  • Цвет с переменной прозрачности: когда Figma включит эту возможность в вашем файле, токен цвета с модификатором alpha на ссылку сам привяжет переменную прозрачности; пока возможности нет, экспорт работает как раньше.
  • Сохранение файла токенов больше не может зависнуть молча: через 20 секунд без ответа редактор показывает причину, а команда status в Diagnostics печатает очередь операций и последние сохранения.

2.9.1

  • В форме Git-подключения появились кнопки Test connection и Fix: проверка токена, репозитория, ветки и папок с отчётом и автоматическим исправлением опечаток в путях и имени ветки.
  • Новая вкладка Diagnostics в окне синхронизации: команды status, diag, test, log и другие, отчёт для поддержки без токенов.
  • Окно Git Sync упрощено: источники переключаются кнопками Use Git и Set Active в строках подключений, статус показывает время последней проверки.
  • Окна Pull и Push сравнивают файлы как в IDE: неизменённые области свёрнуты, есть переходы между изменениями и фильтры по типу изменения.
  • Переключение из Local Workspace на Git проверяет подключение заранее и не оставляет плагин без источника, если Git недоступен.
  • Понятные тексты ошибок GitHub и GitLab: ответ 404 объясняется правами токена, ошибки авторизации и лимитов не выглядят как пустой репозиторий.

2.9.0

  • Новый источник Local Workspace: плагин работает прямо с папкой репозитория на диске через SXL Bridge, следит за изменениями файлов и защищает несохранённый черновик редактора от перезаписи.
  • Несколько профилей Local Workspace с быстрым переключением из футера; последний источник запоминается для каждого файла Figma.
  • В подключении Git появилось поле Figma File URL or Key для случаев, когда плагин не может определить ключ файла сам.
  • Исправлено повторное применение композиций к обычным компонентам.

2.8.10

  • Композиции получили описание в Markdown и ссылки на документацию, которые попадают в панель Figma при Generate и Apply.
  • Get Code обновляет только сгенерированные поля композиции и сохраняет ваши правки.
  • В редакторе токенов для булевых переменных нет scopes, а для fontWeight допустим только FONT_STYLE.

2.8.9

  • Умное сопоставление переменных и стилей при экспорте: без дубликатов стилей и осиротевших переменных.
  • Композиции сообщают о недостающих компонентах и непривязанных переменных в отчёте Apply.
  • Служебный файл Diff-ID сравнивается по содержанию, а не по форматированию; добавьте diff-id.*.json в .prettierignore.

См. также