Находим мелких «мерзавчиков»
Находим мелких «мерзавчиков»

Дизайнеру никто не скажет, ведь не критично, но неприятно.

Привет, Хабр! Бывало ли у вас так: дизайнер выкатывает потрясающий, концептуальный, невероятно эстетичный интерфейс и все там внутри хорошо. НО… После переноса его в код разработчик начинает испытывать душевный дискомфорт, любые последующие касания с макетом нарушают тонкое ментальное равновесие и запускают избегающее поведение? И вроде как ИИ может помочь, но по грязному макету выходит грязный код. Верстальщику неприятно чистить это.

Если взять грязный и чистый макеты одного и того же скрина — прогнать через Claude Design с одним и тем же промптом (чистый HTML, CSS по BEM, JavaScript без библиотек, без сокращений в названиях классов, функций, переменных; переключение состояний классами, а не инлайн‑стилями), который закрывает фронтовой минимум, то получим следующее: код с грязного макета — это кромешный ад для разраба, чертыхания и стрелы проклятий в дизайнера. ИИ распарсил, многое интерпретировал — дальше либо домысливать самому в спорных кейсах, либо идти к дизайнеру, куча вопросов. Каждый <div> — спотыкание на ровном месте: что там имелось в виду и как точно это должно работать. Код со второго макета, который собран по описанным в статье правилам, — это адекватный код, он структурирован, понятен для разработки и ИИ. На сгенерерированной странице верстальщик видит, как это должно работать, есть однозначное понимание логики и всей специфики макета — это огромная (ну нормальная) помощь для всего фронта.

Внедрение этих правил и подсказок сильно сократило количество обращений разработки с уточняющими вопросами. Если ориентироваться на треки в Jira, да и просто по ощущениям — подобные коммуникации практически исчезли.

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


➀ Архитектура и структура макета

1.1 — Auto Layout* — гайд от Figma
* Фрейм, в основе механики которого лежат принципы, аналогичные CSS Flexbox и CSS Grid в веб‑разработке.

Забываем про хаотично раскиданные элементы. Все, абсолютно все, должно быть обернуто в Auto Layout (Shift+A). Допускается абсолютное позиционирование отдельных элементов, только если это оправдано дизайном и без этого, ну никак… Например, фоновое изображение/видео логического блока. Auto Layout — не эстетство, а способ передать разработчику отступы и поведение без слов.

Фронт и ИИ видят правила, которые заложил дизайнер
Фронт и ИИ видят правила, которые заложил дизайнер

1.2 — Frame* — гайд
* Холст/артборд — аналог тега <div>

Фреймы без Auto Layout используем в крайних случаях. При этом фрейм должен быть правильно назван, спозиционирован и обладать предсказуемым и описанным в сопроводительной документации поведением.

Мало информации, что очевидно
Мало информации, что очевидно

1.3 — Groups* (Cmd/Ctrl+G) — забыть в контексте архитектуры и структуры макета
* Способ объединить несколько слоев или объектов вместе, чтобы перемещать, масштабировать и трансформировать их как единое целое, но это никак не самостоятельный юнит для верстки. Это пассивная обертка.

Для черновика, иллюстраций, логотипов — на здоровье.

В макете, который уходит разработке, группа — черный ящик: у нее нет паддингов, нет Hug/Fill, и при растяжении она ведет себя как захочет, внутри нее происходит непредсказуемое. Нужно что‑то подобное и никак иначе? Оборачиваем в Auto Layout и/или Frame и обязательно выносим отдельно для экспорта.

1.4 — Layout guides* — гайд
* Система координат, помогает визуализировать структуру макета

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

Подсвечиваем фронту гриды и структуру, на которой работал сам дизайнер
Подсвечиваем фронту гриды и структуру, на которой работал сам дизайнер

1.5 — Строгая вложенность

Собираем элементы логически. Визуальная иерархия макета должна на 100% совпадать со структурой слоев. Разработчики (и тем более ИИ) считывают макет последовательно, сверху вниз, как дерево объектов. Если структура слоев нарушена, верстка «поплывет».

Визуально идентичные макеты, но слева — хаос, справа — предсказуемая структура
Визуально идентичные макеты, но слева — хаос, справа — предсказуемая структура

1.6 — Гигиена сама по себе

Все пустые фреймы, неиспользуемые элементы и скрытый «на всякий случай» мусор — должны удаляться без сожалений. Никто, кроме вас, не должен о них знать.

Вне контекста темы раздела: заметьте — практически нет фиолетовых участков (нет компонентов). Все построено на фреймах (в лучшем случае Auto Layout), но при этом очевидно, что есть дублирующиеся блоки. В разделе компонентов — будет альтернативный скриншот
Вне контекста темы раздела: заметьте  практически нет фиолетовых участков (нет компонентов). Все построено на фреймах (в лучшем случае Auto Layout), но при этом очевидно, что есть дублирующиеся блоки. В разделе компонентов  будет альтернативный скриншот

➁ Нейминг и семантика

Педро против верблюда
Педро против верблюда

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

2.1 — Функция прежде всего

Название слоев строго по их функции: Header, ButtonPrimary, CardArticle, InputEmail. Разработчик не должен гадать, что находится внутри. Варианты Frame 112, Rectangle 4, Group 14 — в топку.

Название слоя в дереве — говорит или не говорит само за себя
Название слоя в дереве — говорит или не говорит само за себя

2.2 — PascalCase

Главное — единообразие с принятым в команде стеком, а не сам выбор регистра. В СВОЙ Тех предпочтение отдали стилю PascalCase (например, UserFirstName, CalculatorContainer) непосредственно в названиях слоев. Почему? Потому что Педро Паскаль — хороший актер, и он точно симпатичнее верблюда (camelCase). А еще разработка сказала: «Нам так удобнее».

На этом и договорились. Главное — не смешивать Педро с верблюдом в одном проекте и чтобы имена слоев в макете совпадали с именами компонентов в коде. UserFirstName в макете совпадает с UserFirstName в коде — это договоренность. ИИ по осмысленному дереву генерит осмысленный код — по Frame 112 он генерит Frame 112.

➂ Графика, экспорт

3.1 — Vector/image

Иконки, логотипы должны быть помещены в отдельный фрейм с системным названием (Icon, Img, BG).

3.2 — Сохраняем исходники

Если флатим вектор (Outline stroke + Flatten), то обязательно оставляем редактируемый оригинал в мастер‑компоненте на отдельной странице для коллег.

Значение блюра заведено в переменные, что гарантирует консистентность применяемого эффекта по всему макету
Значение блюра заведено в переменные, что гарантирует консистентность применяемого эффекта по всему макету

3.3 — Эффекты
Заводим свойства эффектов в переменные и не злоупотребляем. Все новое и прекрасное обсуждаем сначала с разработкой — готовы ли они это реализовывать и дадут ли им на это квоту.

3.4 — Унификация изображений

Все картинки для одного компонента должны быть одинаковыми: идентичный размер, позиционирование и поведение (Fill/Crop).

3.5 — Отдельный фрейм для экспорта

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

4️⃣— Спецификация

➃ Спецификация

4.1 — Есть макет — есть спека

Появилось что‑то новое — пишем спецификацию/аннотацию и описываем поведение, плюс генерим то, как оно должно быть, чтобы разработка не придумывала и не ходила спрашивать: «А как…?».

4.2 — Кейсы

Закрываем все кейсы: показываем, как ведет себя макет во всех «положениях» — будь то Hero Headline из 300 символов (и такое может быть), ошибка загрузки, состояние пустой страницы, в общем все, что может случиться на проде — все есть в макете и все знают, где оно сидит/стоит/лежит/не прячется. Избегаем Lorem ipsum. Не дали контент — генерим через ИИ от Figma или накидываем самостоятельно.

4.3 — Есть компонент — есть спека

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

Разработка и ИИ однозначно трактуют компонент, есть четкие правила
Разработка и ИИ однозначно трактуют компонент, есть четкие правила

➄ Текст и типографика

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

5.1 — Правила текстовой гигиены:

5.1.1 — Text styles ONLY

Есть стиль. Нужен другой вес или размер? Создаем новый системный стиль. Проект с 10–20 стилями — будет отлично, увеличение количества стилей — должно быть обосновано.

5.1.2 — Letter Spacing

Желательно 3 значения на весь проект. Используем проценты (%). Значения в процентах из Figma конвертируются в CSS напрямую: -2% в Figma = -0.02 em в CSS.

Для крупных заголовков — отрицательные значения, для мелкого текста — положительные. Базовый текст — 0%. Пример рабочей триады: 0%, -1%, 1%.

5.1.3 — Line Height

Забываем про значение Auto! Идеальное соотношение высоты строки к размеру текста: 1.2–1.5. Если используем точные пиксели (px), то без дробей (например, 24px, 32px).

Но лучшая практика — проценты (%) (например, 150%, 120%). Это прямая совместимость с кодом, экономия переменных в дизайн‑системе, проценты адаптивны и предсказуемы при изменении размера текста.

По‑хорошему не более 2–3 процентных значений высоты на все стили.

5.1.4 — Paragraph spacing

Никаких двойных нажатий Enter для создания отступа между абзацами. Используем Paragraph spacing — заводим в переменные и пишем в спеке, чтобы все знали. Либо разносим по контейнерам с Auto Layout + gap.

Все, что можем - заводим в переменные
Все, что можем — заводим в переменные

5.2 — Контентные правила:

5.2.1 — Перенос строки через Enter

Не переносим текст на конкретной ширине кнопкой Enter “чтобы было красиво” — это прям боль… Потому всегда проверяем, сидит перенос строки в текстовом блоке или все хорошо.

5.2.2 — Неразрывные пробелы и дефисы — база

Не оставляем «сирот» и висячих предлогов в конце строк. С помощью непереносимых пробелов и дефисов настраиваем логичные переносы там, где разрыв строки может убить смысл фразы при адаптиве. Тыкаем аналитиков, тестировщиков и разработку, чтобы те в свою очередь тоже сохраняли бдительность…

5.2.3 — Текст = текст

Никогда не конвертируем шрифт в векторные кривые (Outline), если только это не уникальный логотип или что‑то такое, что можно уже назвать векторным изображением, на котором изображены буквы.

5.2.4 — Единый текст (содержание) на все разрешения

Текст один на все разрешения. Если на мобилке нужна короткая версия — это не «чтобы влезло», а контентное правило с описанием обоих вариантов в спеке.

5.2.5 — Ручные оверрайды

Допускаем изменение веса, цвета или «декораций» внутри одного текстового блока, но задаем эти изменения строго через стили.

5.2.6 — Склейка сущностей

Цифры и валюты пишем неразрывной сущностью (24 000 ₽).

➅ Компоненты, переменные

Базовая база, но проговариваем

6.1 — Нет сырым HEX‑кодам!

Никаких вручную выставленных цветов (привет, #FF0000), свойств шрифтов или теней.

То, как не надо делать, если нет цели раздраконить разработку
То, как не надо делать, если нет цели раздраконить разработку

6.2 — Styles/Variables

Абсолютно все должно быть привязано к системным Styles и/или Variables. Используем Variables — настраиваем Modes для удобного переключения тем (например, Dark/Light).

Значения заведены в переменные, настроены моды. Стили привязаны к переменным, что гарантирует легкость и непринужденность, если вдруг вы решите что‑то поменять в цветовой схеме
Значения заведены в переменные, настроены моды. Стили привязаны к переменным, что гарантирует легкость и непринужденность, если вдруг вы решите что‑то поменять в цветовой схеме
Все, что можно настроить через переменные в стилях типографики — дает невероятную гибкость в последующих редакциях
Все, что можно настроить через переменные в стилях типографики, дает невероятную гибкость в последующих редакциях

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

6.3 — Component и Variants

Если элемент используется в макетах более одного раза — это Component. Настраиваем все состояния (Focus, Hover и так далее) и вариации (Neutral, Positive и так далее) внутри одного компонента/сета.

Тотальное применение компонентов — дает скорость и консистентность. Нет ничего, что нужно трогать руками, кроме оверрайдов для конкретных кейсов
Тотальное применение компонентов дает скорость и консистентность. Нет ничего, что нужно трогать руками, кроме оверрайдов для конкретных кейсов

6.4 — Booleans

Настраиваем видимость элементов внутри компонентов через логические переменные (Boolean).

Нет необходимости плодить почти одинаковые компоненты, вы просто скрываете/показываете нужные элементы
Нет необходимости плодить почти одинаковые компоненты — вы просто скрываете/показываете нужные элементы

➆ Адаптивность

7.1 — Любой макет должен тянуться

Забываем про Fixed width. Для веба макеты должны покрывать все ширины (Desktop, Tablet, Mobile) — не забываем про экстремальные ширины, поведение элементов адекватное, адаптивное и логичное. По приложениям помним про планшеты — среди Android уже есть раскладушки. У Apple — вопрос времени. И макет должен вести себя корректно везде.

7.2 — Тест на растяжение

Разработчик должен иметь возможность скопировать макет и потянуть за край фрейма, чтобы увидеть, как ведут себя элементы.

7.3 — Min /Max Width & Height
Где необходимо, обязательно настраиваем эти величины, чтобы интерфейс не ломался, например карточка продукта с изображением не должна быть меньше заданной ширины, чтобы изображение выглядело адекватно, а сопроводительный текст не превращался в нечто нечитаемое.

7.4 — Auto Layout/Frame

Уделяем время поведению при изменении ширины экрана (Hug, Fill, фиксация отступов).

Предсказуемое и непредсказуемое поведение блоков
Предсказуемое и непредсказуемое поведение блоков

Устраиваем краш‑тест!

Тянем репку макет

  • Текст переносится на новые строки, а не обрезается?

  • Карточки складываются в колонку?

  • Отступы не ломаются/согласуются?

  • Логические блоки влезают в один экран?

  • На любой ширине ваш макет ведет себя адекватно?

  • Учтены моменты, когда ширина экрана может быть более 1920 и до бесконечности?

  • Есть фавиконки, Open Graph Image, 404, меню, модалки, сеты иконок, все возможные кейсы, в общем все, что относится и применяется к вашему макету?

  • Написано сопроводительное, если есть нюансы по макету, поведению, отображению, анимации и так далее?

  • Контраст текста проходит (4.5:1 — основной текст, 3:1 — крупный)?

  • Тач‑таргеты соответствуют норме вашей платформы (iOS HIG — 44×44 pt, Material — 48×48 dp, WCAG 2.2 — минимум 24×24 CSS px)?

  • Вам нравится, как это выглядит?

Если ответ «Да» –

вы готовы, макет готов. Лиду не будет стыдно перед разработкой. Вам — перед лидом. Он не будет тратить время на ревью элементарного.


Как внедряли

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

Право развернуть

Ключевое — право разработки вернуть макет теперь опирается на документ. Один прогон через ИИ вкупе с этими правилами плюс краш‑тест — и все понятно. Ребята сами смотрят: косяки существенные или можно все же забрать. Спорное мелкое — сходить в личку к дизайнеру, перетереть. Но всегда есть аргументация, ведь фронты потратят существенно больше времени, чем дизайнер. Да, это тема для спекуляции, саботажа, но ревью на груминге закрывает это окно возможностей.

Право на время

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

Вери ургант асап хот таски — что делаем

Иногда бывает, что у всех все горит и пылает ярким пламенем, сделаем сейчас на коленке — потом допилим, но это «допилим» потом лежит, пылится и любое касание — это страдания дизайнеров, фронта, QA, BA и других. И, конечно же, допиливать нет моральных сил, а чаще времени, потому что — новые задачи, новые горизонты. Потому если что‑то новое и срочное — договариваемся между собой, ведь в итоге это будет либо общая заслуга, либо общая боль. Бизнес принял эту арифметику и особо не кошмарит. Где‑то выделяется сразу адекватное время на макеты, где‑то договариваемся, что одновременно пилят покомпонентно и дизайнеры, и фронт с прогонами на соответствие. Иногда на бэклоге — дизайнер доделывает, ориентируясь уже на то, что и как реализовано на проде (ну а что делать?!).

Было тяжело начать — начать чистить за собой макет, ведь привыкли отдавать быстрее, мол, фронты разгребутся, не в первый и не в последний раз. Теперь же нужно сконцентрироваться, поиграться с макетом, потягать, найти косяки, а потом их еще поправить. Да, дизайнеры стали тратить больше времени на настройку и описание, но исчезли возвраты и коммуникации про «а что тут имелось в виду». Внутри Figma есть масса инструментов для организации чистоты — один агент чего стоит, да пока это бетка и никто не знает, что будет потом. Но и без агента никто не убирал ИИ‑тулы, которыми можно закрыть почти все проблемы. Идет в оборот все, что удобно и что закрывает «надобности» дизайнера, например Design Lint, Clean Document, органайзеры стилей, переменных, дизайн‑систем. В итоге: то на то выходит по времени, но качество несопоставимо выше, лучше, быстрее.

В зависимости от объема и запущенности проекта процесс организации чистоты занимал/занимает где‑то пару часов, а где‑то пару месяцев, но если сделал — потом снимаешь сливки. Начиная работу над чем‑то новым, уже стартуешь с пониманием: потратив время сейчас — получишь в уже следующей итерации экономию времени, унификацию, масштабирование и ощутимо лучшее качество всего того, что отдаешь на фронт.


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

Времени разработчика на каждое «а что тут имелось в виду» — жалко. За чистый макет — разработка будет готова целовать вас в уста.

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Что бесит больше всего в макетах?
50%Frame 112, Rectangle 4, Group 141
0%Группы вместо Auto Layout0
50%Каждый новый контейнер со своими кастомными паддингами, гапами, стилями1
50%Дублирующиеся блоки, но каждый раз по-разному1
0%Паддинги и гапы по 13px, 17.56px0
0%Как кони скачут letter spacing, line height0
50%Придумали чот охрененное, но не описали1
0%Много всего, а обоснование одно – «красивое»0
50%Изображения для мобилки под 360, а что будет на 640 – догадайтесь сами1
0%Сырые HEXы0
0%Нет/не все состояния0
0%Макет только под мобилку и десктоп, а как между – догадайтесь сами0
0%Я дизайнер, и сейчас обидно0
Проголосовали 2 пользователя. Воздержавшихся нет.