~/wiki / figma-i-makety / code-to-canvas-figma-workflow

Code-to-Canvas: разработчик сгенерировал код — он попадает в Figma как редактируемые слои

Основной чат

Чат для вайбкодеров: новости, гайды, поиск исполнителей, маркетплейс и разбор реальных кейсов.

$ cd раздел/ $ join vibe dev
Code-to-Canvas: разработчик сгенерировал код — он попадает в Figma как редактируемые слои - обложка

Обычно мы привыкли к одному направлению потока: дизайнер рисует в Figma, разработчик переводит макет в код. Code-to-Canvas разворачивает стрелку. Код — сгенерированный человеком, ИИ-агентом или вытащенный из живого продакшна — превращается обратно в редактируемые слои Figma. Не картинку. Не превью. Именно слои с автолейаутом, компонентами, переменными.

Звучит как фокус, но на практике это серьёзный сдвиг рабочего процесса. Дизайн перестаёт быть «исходником истины», который медленно расходится с реальным продуктом. И одновременно появляется новый класс рисков: что считать каноном, кто владеет компонентом, как не утонуть в дублирующих слоях, сгенерированных за ночь.

Почему это вообще стало возможно

Несколько вещей сошлись одновременно. Во-первых, фронтенд стал предсказуемо декларативным: React, Vue, SwiftUI, Compose описывают UI деревом, очень похожим на дерево слоёв Figma. Во-вторых, у Figma появилось то, чего раньше не хватало для двусторонней работы — автолейаут как полноценный аналог flex, переменные как аналог токенов, code connect и MCP-интеграции. В-третьих, генерация кода ИИ-агентами стала рутиной: разработчик за день получает десятки экранов, которые нужно где-то отсмотреть и согласовать.

Когда поток кода вырос на порядок, узким местом стал не код, а его дизайн-ревью.

Что значит «редактируемые слои», а не картинка

Это водораздел, на котором стоит весь подход. Если код импортируется как png или embed — это просто документация. Полезно, но не отличается от Storybook со скриншотами.

Редактируемые слои — это:

  • Фреймы с автолейаутом, где padding и gap соответствуют реальным CSS-значениям
  • Текстовые слои с реальным контентом и применёнными text styles
  • Использованные инстансы дизайн-системы, а не отрисованные с нуля прямоугольники
  • Цвета и размеры, привязанные к переменным, а не захардкоженные
  • Иерархия, повторяющая структуру компонентов в коде

Только в таком виде с макетом можно работать: двигать, переставлять, предлагать альтернативу, мерджить с существующей библиотекой.

Анти-паттерны импорта

  • Каждый div превращается в отдельный фрейм без автолейаута — получаем «слоёный пирог», который рассыпается от первого изменения
  • Цвета приходят как hex, а не как привязка к переменной — дизайн-система обходится стороной
  • Вместо инстанса Button рисуется его копия слоями — библиотека деградирует с каждым импортом
  • Имена слоёв вида div, div 2, Frame 1247 — поиск и навигация по файлу превращаются в боль

Сценарии, в которых Code-to-Canvas реально окупается

Сценарий 1: дизайн-ревью ИИ-сгенерированного UI

Разработчик за вечер собрал в Cursor десять экранов нового онбординга. Раньше дизайнер либо смотрел вживую в браузере (без возможности предложить альтернативу в макете), либо перерисовывал всё в Figma вручную. Теперь экраны приезжают слоями: можно сразу подсветить, где отступы не из системы, где использован не тот компонент, где иерархия заголовков поехала.

Сценарий 2: документация существующего продукта

В крупных продуктах живые экраны давно разошлись с макетами. Code-to-Canvas позволяет периодически «снимать слепок» реального состояния — не скриншотами, а слоями — и сравнивать с эталонной библиотекой. Расхождения видны сразу: где компонент кастомизировали в коде, где появились локальные стили, где дизайн-токен не дошёл.

Сценарий 3: быстрая итерация на существующем экране

Иногда быстрее изменить код, прогнать его обратно в Figma и обсудить с командой, чем рисовать макет с нуля. Особенно для плотных табличных интерфейсов и админок, где руками воссоздавать структуру — это часы, а из кода она приходит за секунды.

Когда сценарий не работает

  • Концептуальная фаза, где ещё нет кода и не должно быть
  • Маркетинговые лендинги с уникальной композицией — там слои из кода обычно беднее задумки
  • Команды без дизайн-системы: импортировать нечего, всё прилетает как сырой набор фреймов

Короткий итог сегмента

Code-to-Canvas — это не про «дизайнер больше не нужен». Это про то, что код и макет наконец становятся одним графом, между узлами которого можно ходить в обе стороны. Дальше разберём, как настроить пайплайн, что должно быть в коде, чтобы он импортировался осмысленно, и как не превратить Figma-файл в свалку автогенерированных фреймов.

Как устроен пайплайн на практике

Между «разработчик нажал кнопку» и «дизайнер увидел редактируемые слои в Figma» обычно стоит цепочка из трёх звеньев: исходный код, маппинг на дизайн-систему, импортёр. Если хоть одно звено настроено криво, на выходе получается мусор, который проще выкинуть, чем чинить.

Что должно быть в коде, чтобы он импортировался осмысленно

Импорт хорош ровно настолько, насколько хорош код-источник. Минимальный набор:

  • Компоненты названы как в Figma-библиотеке, а не Wrapper, Box, Container2
  • Стили идут через токены дизайн-системы (CSS-переменные, theme tokens), а не литералы
  • Структура верстки повторяет логику фрейма: один flex-контейнер — один автолейаут
  • Иконки подключены как компоненты из общего набора, а не svg инлайном
  • В коде есть code connect маппинг (или его аналог), который явно говорит: вот этот <Button variant="primary"> — это вот тот инстанс в библиотеке

Если разработчик сгенерировал экран в Cursor одним промптом без подключения системы — на вход импортёру приходит «дикий» JSX, и любые слои на выходе будут такими же дикими.

Что должно быть в Figma-файле

  • Опубликованная библиотека с осмысленными именами компонентов и вариантов
  • Переменные для цвета, типографики, отступов, радиусов
  • Отдельная страница Imports или Inbox, куда падают свежие импорты до ревью
  • Договорённость, что в основные страницы импорт переезжает только после проверки

Диагностика: почему импорт получился плохим

Когда слои приехали и выглядят странно, не надо чинить точечно. Сначала найдите, на каком звене сломалось.

Симптом Где искать причину
Цвета как hex, не как переменные Маппинг токенов или отсутствие переменных в Figma
Вместо инстансов — нарисованные копии Code connect не настроен или имена расходятся
Поехала иерархия, всё в одном фрейме Верстка в коде через абсолютное позиционирование
Текст без text style В коде нет токенов типографики, инлайн font-size
Имена слоёв вида div, Frame 12 Импортёр не получил семантических имён компонентов

Правило простое: чинить на стороне кода и маппинга, а не выправлять руками каждый импорт. Иначе через месяц вы тратите больше времени на чистку, чем экономили на ревью.

Типичные ошибки команд

  • Импортируют всё подряд в основной файл. Через неделю в библиотеке три варианта одной кнопки: настоящий, импортированный и ещё один «временный»
  • Не договорились, кто отвечает за маппинг. Дизайнер думает, что это задача фронта; фронт — что дизайн-системы. Маппинг не делается никем
  • Используют импорт как замену проектированию. Дизайнер перестаёт думать макетом и просто комментирует то, что приехало. Качество интерфейса деградирует тихо
  • Игнорируют дрейф. Импорт показывает, что код разошёлся с макетами, но команда продолжает рисовать «как должно быть», а не чинить расхождение

Как дизайнеру встроить это в рабочий процесс

Чеклист перед импортом

  • В Figma есть актуальная библиотека с переменными
  • В коде используется дизайн-система, а не локальные стили
  • Настроен маппинг между кодовыми и фигма-компонентами
  • Есть отдельное место (страница, файл), куда падают свежие импорты
  • Договорено, кто и когда смотрит инбокс

Вопросы для ревью импортированного экрана

  • Все ли компоненты — инстансы из библиотеки, или есть «нарисованные» копии?
  • Цвета, типографика, отступы — переменные или хардкод?
  • Иерархия слоёв читается, или это плоский салат фреймов?
  • Что в этом экране отличается от макета, и почему: осознанное решение разработчика или дрейф?
  • Если двинуть один блок — автолейаут переживёт, или развалится?

Куда это встраивается в неделю

В команде обычно достаточно одного-двух слотов: например, в начале спринта дизайнер проходит по инбоксу импортов за неделю, отмечает расхождения, заводит задачи на маппинг и на фронт. Это занимает час-полтора и снимает большую часть скрытого дрейфа.

Короткий итог сегмента

Code-to-Canvas начинает приносить пользу не с момента установки плагина, а с момента, когда у команды есть дизайн-система с обеих сторон и явный маппинг между ними. Дальше посмотрим, как этот подход меняет роль дизайнера в продуктовом цикле и где у него границы, за которые лезть не стоит.

Продвинутые сценарии: где Code-to-Canvas даёт максимум

Базовый кейс «фронт прислал экран — посмотрели в Figma» — это только начало. Интереснее становится, когда импорт встраивается в более сложные процессы.

Сценарий 1: A/B-тест в живом коде, ревью в Figma

Команда крутит несколько вариантов экрана через фичефлаги. Дизайнер не видит их в продакшене, потому что не попадает в нужный сегмент. Импорт каждого варианта в отдельный фрейм в Figma даёт нормальную поверхность для разговора: вот вариант A, вот B, вот что отличается, вот почему один проигрывает по метрикам.

Без этого дизайнер обсуждает варианты по скриншотам в Slack, и через две недели никто не помнит, что именно тестировали.

Сценарий 2: Аудит расхождений между макетом и продом

Берём страницу из макета и ту же страницу, импортированную из реального кода. Кладём рядом. Дальше — буквально визуальный diff: где отступы поехали, где компонент заменён на самописный, где появилась лишняя обводка.

Это не для того, чтобы ткнуть фронта носом. Это для того, чтобы понять: расхождение — это баг реализации, осознанный компромисс или сигнал, что макет был нереалистичный.

Сценарий 3: Документация существующего продукта

Легаси-продукт без актуальных макетов — обычная история. Вместо того чтобы перерисовывать всё руками, имеет смысл прогнать ключевые экраны через импорт и получить редактируемую базу. Дальше уже её причёсывать: переименовывать слои, подтягивать к библиотеке, отмечать, где компоненты живут отдельной жизнью.

Это грязная работа, но в разы быстрее, чем восстанавливать макеты с нуля по скриншотам.

AI-генерация и Code-to-Canvas: где аккуратнее

Связка «продакт пишет промпт — LLM генерит код — код прилетает в Figma» звучит как мечта, но именно тут ломается больше всего.

Что идёт не так

  • LLM генерит компоненты заново вместо того, чтобы использовать существующие из библиотеки. На выходе — десять разных «карточек», ни одна не маппится
  • Модель придумывает токены, которых нет в системе: color-primary-450, хотя у вас только 400 и 500
  • Сгенерированный код проходит ESLint, но семантически — мусор: <div> вместо <Button>, инлайн-стили, никаких aria
  • В Figma приезжает что-то визуально похожее, и команда принимает это за рабочий артефакт

Как страховаться

  • Промптить модель с явным контекстом дизайн-системы: список компонентов, токенов, правил
  • Прогонять сгенерированный код через тот же линтер и code connect, что и обычный
  • Договориться, что AI-импорт всегда падает в отдельную страницу с пометкой ai-draft, и в библиотеку не уходит до ручной проверки
  • На ревью спрашивать: «это сгенерировано или написано?» — не для того, чтобы запретить, а чтобы понимать уровень доверия

Как объяснить подход команде

Внедрение Code-to-Canvas — это не про плагин, а про договорённости. И именно здесь дизайнер часто проваливается: ставит инструмент, ждёт магии, не получает её, обвиняет инструмент.

Что сказать фронтам

  • «Мне не нужно, чтобы вы рисовали в Figma. Мне нужно видеть, что реально в коде»
  • «Если ваш компонент в коде совпадает с библиотечным, импорт это покажет. Если нет — это повод обсудить, а не претензия»
  • «Маппинг — это разовая работа, дальше он окупается на каждом ревью»

Что сказать продакту

  • Дрейф между макетом и продом не виден, пока его не измеришь. Импорт делает его видимым
  • Это сокращает количество споров «а должно было быть вот так» — потому что есть единый артефакт
  • Это не ускоряет дизайн, но ускоряет согласование и снижает количество переделок

Анти-паттерны при внедрении

  • Сразу на всю команду. Лучше один продукт, один флоу, две недели — потом расширять
  • Без метрики успеха. Договоритесь заранее, что считаете победой: меньше расхождений, быстрее ревью, меньше «а почему в проде по-другому»
  • Внедряет один дизайнер в одиночку. Если фронт не в курсе зачем это, маппинг не появится, и всё развалится

Вопросы, на которые стоит ответить до старта

  • Кто владелец маппинга и куда он коммитится?
  • Где живут «сырые» импорты и кто за ними следит?
  • Что мы делаем, когда импорт показал расхождение: чиним код, чиним макет или фиксируем как осознанное?
  • Как мы поступаем с AI-сгенерированным кодом — отдельный трек или общий поток?
  • По каким признакам через месяц поймём, что подход работает?

Короткий итог сегмента

Продвинутые сценарии Code-to-Canvas — это не про более крутой плагин, а про то, что у команды появляется общий язык между макетом и продом. AI добавляет скорости и одновременно шума, поэтому отдельная гигиена для сгенерированного кода — не паранойя, а необходимость. В финальном сегменте разберём, как этот подход меняет роль дизайнера и где у него границы.

Чеклист готовности к Code-to-Canvas

Прежде чем тащить импорт в продакшн-флоу, пройдитесь по списку. Если хотя бы половина пунктов не закрыта — это будет дорогая игрушка, а не рабочий инструмент.

До первого импорта

  • В коде есть библиотека компонентов, которую все фронты реально используют
  • У этих компонентов есть имена, совпадающие с именами в Figma-библиотеке (или есть таблица соответствий)
  • Дизайн-токены вынесены отдельно: цвета, отступы, типографика — не магические числа в стилях
  • В Figma есть отдельная страница или файл под ai-draft и code-import, не в основной библиотеке
  • Есть человек, который владеет маппингом — не "вся команда", а конкретный ник
  • Договорились, что считать успехом через месяц: меньше расхождений, быстрее ревью, меньше переделок

На каждом импорте

  • Импорт прилетает в служебную страницу, не в боевые макеты
  • Слои переименованы или хотя бы сгруппированы по смыслу
  • Сверено: что подтянулось как компонент библиотеки, а что осталось отдельным фрагментом
  • Расхождения зафиксированы списком — даже если чинить будем не сегодня
  • Если код сгенерирован AI — это явно помечено в названии фрейма

Раз в спринт

  • Прошли по списку расхождений: что закрыли, что висит, что осознанно оставили
  • Пересмотрели маппинг: появились ли новые компоненты, отмерли ли старые
  • Проверили, что фронты всё ещё в курсе зачем это и что им с этого

Анти-паттерны, которые встречаются чаще всего

"Импорт вместо дизайна"

Дизайнер начинает рисовать сразу в импортированных слоях, минуя этап замысла. Через месяц макеты — это слегка причёсанные слепки с продакшна, а не проектные решения. Импорт должен быть зеркалом, а не холстом.

"Зеркало без отражения"

Импорт настроили, он работает, но никто в него не смотрит. Расхождения копятся, мусорные страницы растут, и в какой-то момент команда тихо договаривается всё это игнорировать. Если на ревью не задаётся вопрос "а что там в импорте?" — инструмент мёртв.

"Маппинг как разовый проект"

Сделали соответствие компонентов один раз, отчитались, забыли. Через два релиза половина уже неактуальна. Маппинг — это не проект, а гигиена, как обновление зависимостей.

"AI-импорт на правах обычного"

Сгенерированный код прилетает в общий поток, и никто не помнит, что это драфт от модели. Через неделю он уже воспринимается как факт. Помечайте источник на уровне фрейма, а не только в голове.

"Один герой"

Один дизайнер всё внедрил, всё настроил, всё держит. Уходит в отпуск — система останавливается. Если подход не пережил отпуск автора, его нет.

Вопросы для ревью макета и импорта

Эти вопросы стоит задавать на проектном ревью, когда рядом лежат макет и импорт из кода.

  • Что в импорте отличается от макета — и это баг, фича или осознанное?
  • Какие компоненты в коде не маппятся на библиотеку? Почему?
  • Есть ли в импорте слои, которые мы вообще не закладывали в дизайн?
  • Какие токены в коде не из системы? Это новые или это самодеятельность?
  • Если этот фрейм сгенерирован AI — кто и когда проверил его глазами?
  • Что мы делаем с найденными расхождениями к концу спринта: чиним, фиксируем как технический долг или закрываем как осознанное решение?
  • Готовы ли мы показать этот импорт продакту или его ещё нужно причесать?

Короткий практический итог

Code-to-Canvas работает не тогда, когда плагин установлен, а когда команда договорилась, что считает правдой — макет или код — и в каких случаях. Чеклист и анти-паттерны выше — это не про "правильно настроить инструмент", а про то, чтобы у подхода была гигиена и владелец. AI добавляет шума, поэтому сгенерированный код живёт в отдельном треке с пометкой и проходит ту же проверку, что и человеческий, — иначе он быстро становится "вроде бы фактом", которым на самом деле не является. Начинайте с одного флоу, одного человека-владельца и одной метрики успеха через месяц — этого достаточно, чтобы понять, останется подход в команде или нет.

$ cd ../ ← назад к Figma и макеты