Заранее извиняюсь перед дизайнерами, которые сейчас будут кидаться в меня Figma‑файлами. Тема неприятная, но обсудить её надо.

Более 15 лет я являюсь Lead Product дизайнером в B2B‑командах. И все эти 15 лет в каждом проекте повторялся один и тот же ритуал: дизайнер рисует макет, разработчик смотрит на макет, разработчик делает похоже. Ключевое слово — «похоже».

Дальше начинается известный жанр. «А почему отступ 20, а не 24?» — «Ну там компонент такой». «А почему кнопка серая?» — «А это disabled из старой библиотеки, её никто не трогал с 2021». «А сделай как в макете» — «Так в макете нарисовано то, чего у нас в коде нет».

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

Как я вляпался

У меня был проект — SaaS с картами, довольно зрелый фронтенд на React. Я, как обычно, собирал макеты в Figma. Аккуратно, из компонентов, не из прямоугольников. Гордился собой.

А потом выяснилось, что аналитик в этой же команде давно делает по‑другому. Он взял форк фронтенда, поднял Storybook и собирает макеты прямо из настоящих React‑компонентов. Разработчик открывает такой макет и видит не картинку, а готовый JSX, который можно скопировать.

В его инструкции была фраза, от которой мне поплохело: «макет заменяет статичный фрейм в Figma».

То есть моя работа — это то, от чего он уходит.

Интересненько.

Первая мысль была неправильная

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

Вторая мысль оказалась полезнее. Я сел и сравнил его цвета с моими токенами. Совпали. Все. Тот же синий #4350AF, те же варианты кнопок, та же шкала шрифтов.

Это не две дизайн‑системы. Это одна, просто в двух носителях. И проблема не в том, что кто‑то из нас лишний, а в том, что между носителями нет моста. Каждый ведёт свою копию правды.

У Figma для этого вообще‑то есть штатный механизм — Code Connect, он привязывает компонент в макете к компоненту в коде. Я обрадовался, полез — и упёрся в «нужен план Organization или Enterprise». У меня Professional. Спасибо, до свидания.

Ну ладно. Мост сделаем сами.

Мост

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

И вот тут, когда я начал этот файл заполнять, полезло всё, что годами пряталось.

Кнопки. В Figma у меня был один монолитный компонент: Type × Size × State. Внутри Type лежало вперемешку: и Primary/Ghost (это варианты), и Link (а это, оказывается, вообще другой компонент в коде — легаси‑обёртка над MUI), и квадратные иконочные (а это третий компонент). Цвета не было как отдельной оси вообще, хотя в коде она есть.

Состояния. У меня были нарисованы Hover и Active как варианты компонента. В коде их нет и быть не может — это CSS‑псевдоклассы. Я годами рисовал сущности, которых в природе не существует.

Типографика. В Figma 13 текстовых стилей. В коде — 10. Три стиля я исправно применял в макетах, а разработчику приходилось каждый раз что‑то придумывать.

Знаете, что самое неприятное? Ни один разработчик мне за все эти годы про это не сказал. Они просто молча подставляли ближайшее похожее. И были правы — объяснять дизайнеру, что его дизайн‑система врёт, дороже, чем поставить body‑m-400 вместо несуществующего стиля.

Я пересобрал кнопку в Figma заново. Оси назвал ровно как пропсы в коде, значения — ровно как значения в коде, вплоть до регистра: variant, color, size, disabled. Получилось 54 варианта. Hover и Active выкинул. Теперь маппинг тождественный: что видишь в макете — то и пишется в коде, переводчик не нужен.

Что получилось в итоге

Пайплайн сейчас выглядит так.

Я собираю макет в Figma строго из компонентов. Не рисую, а именно собираю — ни одного отсоединённого инстанса, ни одного нарисованного руками прямоугольника, который «выглядит как инпут».

Дальше агент читает этот макет через MCP. Не картинку — структуру: какой компонент, в каком варианте, с каким текстом. По манифесту переводит это в реальные компоненты кода, лезет в репозиторий, читает их настоящие сигнатуры и собирает.stories.tsx.

Потом tsc. Ноль ошибок — значит, я в макете не наврал. Есть ошибки — значит, наврал, и мне это скажут через минуту, а не через две недели на код‑ревью.

Разработчик открывает Storybook и видит готовый JSX из тех же компонентов, которые он и так использует. Копипастит.

Скриншоты в этом процессе не участвуют вообще. Совсем. Это принципиально: как только в цепочке появляется картинка, кто‑то начинает угадывать.

Где нейронка налажала

Раз уж пошли откровения.

Она отрисовала кнопку «Reset to defaults», которой в макете не было. То есть была — но скрытая, отключённая. Агент увидел слой и вывел его. Пришлось отдельным правилом записывать: скрытое не рендерим.

Она вывела счётчики на вкладках, которых я тоже скрыл. Тот же баг, тот же корень.

Она полдня не могла победить горизонтальный скролл в модалке. Я в итоге сам открыл девтулзы и нашёл: у скроллбара стоит min‑width: 100%, а MUI‑шная сетка с отступами рендерится шириной calc(100% + N). Одно упирается в другое, вылезает полоса прокрутки. Агент до этого честно перебрал три неправильные гипотезы.

Она обернула вкладки в свой контейнер с рамкой — а компонент рисует рамку сам. Получилось две полоски.

Ну и половина интерфейса внезапно заговорила по‑русски, потому что в Storybook язык по умолчанию оказался не английский.

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

Когда я отдавал разработчику картинку, у меня не было ни одного способа проверить, что он собрал именно то. Вообще ни одного. Я мог только смотреть глазами и сравнивать с макетом — то есть заниматься тем же угадыванием, только с другой стороны.

Так это про замену людей?

Нет. И вот здесь я, пожалуй, поясню подробнее.

Разработчиков этот пайплайн не заменяет. Он заменяет передачу макета — тот самый момент, где смысл терялся. Разработчик по‑прежнему пишет продукт, спорит со мной про UX, чинит то, что я собрал криво, и он же должен внести в код те правки, которые я у себя пометил комментарием «для разработчика».

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

По итогу

В стартапах и малом бизнесе нейронки уже успешно заменяют дизайнеров, разработчиков и даже аналитиков. В общем‑то, и коперайтеров тоже.

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
У вас получилось собрать нормальный пайплайн Jira → Figma → Storybook?
0%Да, у нас дизайнеры деливерят фронт-шаблоны0
0%Ещё в процессе0
100%Чего?8
Проголосовали 8 пользователей. Воздержались 5 пользователей.