~/wiki / dizayn-sistema-i-komponenty / atomarnyy-dizayn-na-praktike

Атомарный дизайн на практике: перестань лепить интерфейс с нуля каждый раз

Основной чат

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

$ cd раздел/ $ join vibe dev
Атомарный дизайн на практике: перестань лепить интерфейс с нуля каждый раз - обложка

В проекте без системы каждый новый экран начинается с нуля. Дизайнер рисует кнопку — не ту же что на прошлом экране, похожую. Чуть другой padding. Чуть другой шрифт. Через год в продукте 40 вариантов кнопки где по логике должно быть 4.

Атомарный дизайн — методология которая делает это невозможным. Не через договорённости, а через структуру.


Пять уровней и зачем каждый

Атомы

Несократимые элементы. Нельзя разобрать на части без потери смысла.

Button, Input, Icon, Label, Checkbox, Avatar, Badge — атомы.

Ключевое свойство: атом не знает контекста. Button не знает что она на странице оплаты. Она просто Button с вариантами (Primary/Secondary/Ghost) и состояниями (Default/Hover/Active/Disabled/Loading). Это намеренно — атом работает в любом контексте без изменений.

Следствие: в системе один мастер-компонент Button. Не «кнопка для форм» и «кнопка для хедера» — одна кнопка, разные варианты.

Молекулы

Группы атомов с одной конкретной функцией.

SearchBar = Input + Icon + Button/Ghost. Как целое — ищет. UserCard = Avatar + Text/Name + Text/Role + Badge/Status. Как целое — показывает пользователя. FormField = Label + Input + HelperText/Error. Как целое — поле формы с подсказкой.

Правило: молекула делает одно — хорошо. Если молекула пытается делать два разных дела — это две молекулы или уже организм.

Организмы

Сложные компоненты из молекул и атомов. Пользователь взаимодействует с организмом как с единицей — «заполняет форму», «использует навигацию».

Header = Logo + Navigation + SearchBar + Button/CTA + Avatar/User. RegistrationForm = несколько FormField + Select + Checkbox + Button/Primary. UserList = несколько UserCard + Pagination + SearchBar.

Организм — граница между «компонент» и «раздел страницы».

Шаблоны и страницы

Шаблон — каркас без реального контента: где что стоит, какая сетка, как соотносятся организмы. Страница — шаблон с реальными данными.

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


Где методология ломается — реальные ситуации

Молекула внутри молекулы

Самое частое нарушение. ProductCard помещают внутрь CartRow — обе молекулы. Это уже организм.

Последствие практическое: когда обновляешь атом (Button), ожидаешь что обновятся все молекулы которые его используют, и все организмы из этих молекул. Цепочка обновлений работает только если иерархия соблюдена. Нарушение = непредсказуемые обновления.

Локальная кастомизация вместо системного варианта

«Здесь нужна кнопка чуть побольше» — кто-то детачит компонент. Через месяц три кнопки «побольше» с разными значениями.

Правильный ответ: добавь вариант size/xl в мастер-компонент. Один раз — и вариант доступен везде, обновляется централизованно, не создаёт скрытый долг.

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

Именование которое устаревает

Button/Blue/Large — неправильное имя. Когда бренд меняется и кнопка становится зелёной — имя лжёт. Когда размеры унифицируются — имя теряет смысл.

Button/Primary/Default — правильное имя. Primary — функциональная роль (главное действие). Default — состояние. Ни то ни другое не зависит от конкретного цвета.

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


Атомарная система и AI: как меняется промпт

Без иерархии: «создай карточку пользователя» → AI придумывает новые атомы. Свой Avatar, свою типографику, новые отступы. Всё не из системы.

С иерархией и AGENTS.md:

markdown
Создай молекулу UserCard используя только эти атомы:
- atoms/Avatar/Medium — 48×48px, fallback на инициалы
- atoms/Text/Subheading — имя пользователя
- atoms/Text/Caption — должность
- atoms/Badge/Status — online/offline/away

Auto Layout Horizontal, gap var(--spacing-4).
Варианты: Default и Compact (Avatar/Small, без Caption).
Hover: background → color/background/surface-hover.
Не создавать новых атомов — только из списка выше.

AI собирает из существующего. Результат консистентен по определению.


Карта иерархии для команды

Один документ — одна страница в Notion:

plaintext
Атомы:
  Button, Input, Icon, Label, Avatar, Badge, Checkbox, Toggle, Divider

Молекулы:
  SearchBar        (Input + Icon + Button)
  UserCard         (Avatar + Text/Name + Text/Role + Badge/Status)
  FormField        (Label + Input + HelperText)
  NavItem          (Icon + Text/Body + Badge/Count)
  NotificationItem (Avatar + Text/Title + Text/Body + Text/Time)

Организмы:
  Header      (Logo + NavItems + SearchBar + Button/CTA + Avatar)
  UserForm    (несколько FormField + Button/Primary)
  UserList    (несколько UserCard + Pagination)
  SideNav     (Logo + несколько NavItem)

Новый человек читает это за пять минут и понимает систему. AI-агент получает через AGENTS.md и знает что собирать из чего.

Обновлять при добавлении каждого нового компонента — не раз в квартал.


Частые вопросы о методологии

«Мы используем shadcn/ui — нужен ли атомарный дизайн?» Да. shadcn даёт атомы и базовые молекулы. Но организмы и их связи — это ваша система. Атомарный дизайн описывает как организовать то что вы строите поверх shadcn.

«Как называть компоненты которые не вписываются в иерархию?» Называй честно. Если это нечто между молекулой и организмом — называй организмом. Чистота иерархии важнее чем строгое соответствие теории.

«AI не соблюдает атомарную иерархию.» Потому что ты не объяснил явно. В AGENTS.md: «Новые компоненты строятся из существующих атомов. Список атомов: [Button, Input, Icon, Label, Avatar, Badge]. Не создавать новые атомы без явного запроса». Явный список работает.


Промпт для аудита дублей

markdown
Найди дублирующиеся компоненты в проекте.

1. Найди все файлы с "Button" в имени в src/components/.
   Для каждого: padding (top/bottom, left/right), border-radius,
   font-size, font-weight, background-color в Default-состоянии.

2. Какие из них визуально идентичны или отличаются ОДНИМ значением?
   Это кандидаты на объединение через вариант или пропс.

3. Для каждого кандидата предложи: новый пропс size/variant/intent
   который заменяет отдельный компонент.

Цель: свести количество Button-компонентов к минимально необходимому
и объяснить как каждый из оставшихся отличается функционально.

Как атомарный дизайн меняет скорость на больших проектах

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

На проекте с 50 экранами — ситуация меняется. Первые 10 экранов без системы и с системой занимают примерно одинаково. К 30-му экрану разница становится ощутимой: с системой ты берёшь готовые блоки, без системы — снова решаешь уже решённые вопросы.

К 50-му экрану без системы продукт выглядит как сделанный разными командами. С системой — консистентно. И скорость с системой выше: разработчик берёт компонент из библиотеки, а не пишет с нуля.

Пороговое значение — около 15 экранов. Если продукт вырастет до 15+ экранов, система окупится. Если это одностраничный лендинг — не тратить время.


Связь с AI-воркфлоу: почему без иерархии генерация деградирует

Когда AI генерирует 5-й экран подряд без чёткой атомарной структуры в AGENTS.md — начинается дрейф. Первая кнопка была сгенерирована одним способом, пятая — немного другим. Между ними нет явной связи.

С атомарной иерархией и AGENTS.md который явно перечисляет атомы — дрейф исключён. AI всегда возвращается к одному и тому же списку атомов. Каждая молекула строится из тех же кирпичей. Консистентность обеспечивается не через контроль каждого вывода, а через ограничение доступных блоков.

Это принципиальная разница в подходе: вместо «проверяй что сгенерировано» — «ограничь что может быть использовано».

plaintext
☐ Каждый атом — одна мастер-копия, не несколько похожих
☐ Молекулы состоят только из атомов (не из других молекул)
☐ Организмы могут содержать молекулы
☐ Имена функциональные: Button/Primary, не Button/Blue
☐ Формат имени: [Тип]/[Вариант]/[Состояние]
☐ Карта иерархии (атомы/молекулы/организмы) актуальна
☐ В AGENTS.md: список атомов, запрет создавать новые без явного запроса
☐ Детачнутых компонентов: ноль или задача в бэклоге
$ cd ../ ← назад к Дизайн-система и компоненты