title: "Atomic Design: Методологія UI" description: "Детальний розбір методології Atomic Design: від атомів до сторінок з прикладами на React."
::
Уявіть, що ви будуєте місто з LEGO. Ви не починаєте одразу з цілих будинків. Ви берете найменші детальки, з’єднуєте їх у стіни, стіни — у кімнати, кімнати — у будинки, а будинки — у квартали.
У веб-розробці ми часто робимо помилку, намагаючись "будувати квартали", ігноруючи якість цеглинок. Atomic Design — це методологія, створена Бредом Фростом (Brad Frost), яка пропонує будувати інтерфейси так само системно, як природа будує матерію.
Без системного підходу UI проекти швидко перетворюються на хаос:
UserProfile на трьох різних екранах.Atomic Design вирішує це, розбиваючи інтерфейс на 5 чітких рівнів ієрархії.
Погляньмо на ієрархію від найпростішого до найскладнішого:
Це базові будівельні блоки матерії. У UI це елементи, які неможливо розбити на менші функціональні частини без втрати сенсу.
<label>, <input>, <button>), кольори палітри, шрифти, іконки.// Атом: Найпростіший компонент. Ніякої бізнес-логіки, чистий UI.
import React from 'react'
type ButtonProps = {
variant?: 'primary' | 'secondary'
} & React.ButtonHTMLAttributes<HTMLButtonElement>
export const Button = ({ variant = 'primary', className, ...props }: ButtonProps) => {
const baseStyle = 'px-4 py-2 rounded font-medium transition-colors'
const variants = {
primary: 'bg-blue-600 text-white hover:bg-blue-700',
secondary: 'bg-gray-200 text-gray-800 hover:bg-gray-300',
}
return <button className={`${baseStyle} ${variants[variant]} ${className || ''}`} {...props} />
}
Молекули — це групи атомів, з'єднаних разом, що набувають нових властивостей. Це найпростіші функціональні одиниці.
import React from 'react'
import { Button } from '../atoms/Button' // Імпортуємо Атом
import { Input } from '../atoms/Input' // Імпортуємо Атом
import { Icon } from '../atoms/Icon' // Імпортуємо Атом
export const SearchForm = ({ onSearch }: { onSearch: (term: string) => void }) => {
const [term, setTerm] = React.useState('')
// Молекула визначає ЛОГІКУ взаємодії атомів (тут: сабміт форми)
const handleSubmit = (e: React.FormEvent) => {
e.preventDefault()
onSearch(term)
}
return (
<form onSubmit={handleSubmit} className="flex gap-2 p-2 border rounded-lg bg-white">
<Icon name="search" className="text-gray-400" />
<Input value={term} onChange={(e) => setTerm(e.target.value)} placeholder="Пошук..." />
<Button type="submit">Знайти</Button>
</form>
)
}
Організми — це відносно складні UI-компоненти, складені з груп молекул та/або атомів. Це секції інтерфейсу, які ми сприймаємо як окремі блоки.
import { Logo } from '../atoms/Logo'
import { Navigation } from '../molecules/Navigation'
import { SearchForm } from '../molecules/SearchForm'
import { UserProfile } from '../molecules/UserProfile'
export const Header = ({ user }) => {
return (
<header className="flex justify-between items-center px-6 py-4 shadow-sm bg-white">
<div className="flex items-center gap-8">
<Logo /> {/* Атом */}
<Navigation /> {/* Молекула */}
</div>
<div className="flex items-center gap-4">
<SearchForm onSearch={(t) => console.log(t)} /> {/* Молекула */}
{/* Умова відображення - це рівень організму */}
{user ? <UserProfile user={user} /> : <a href="/login">Увійти</a>}
</div>
</header>
)
}
Шаблони — це "скелет" сторінки. Тут ми перестаємо говорити про абстрактні компоненти і починаємо говорити про Layout. Шаблони визначають, де будуть розміщені організми.
Це фінальна стадія. Шаблон + Реальний контент.
Header, якщо ім'я користувача дуже довге? Як виглядає ProductGrid, якщо товарів немає?| Рівень | Сутність | Складність | Приклад | Reusability |
|---|---|---|---|---|
| Atom | Абстракція | Мінімальна | <Button> | Дуже висока |
| Molecule | Компонент | Низька | SearchForm | Висока |
| Organism | Секція | Середня | Header | Середня |
| Template | Лейаут | Висока | DashboardLayout | Низька |
| Page | Інстанс | Максимальна | DashboardPage | Відсутня |