Дизайн-системы: компонентные библиотеки
Дизайн-система — набор стандартизированных UI-компонентов, токенов (цвета, отступы, типографика) и правил их использования, обеспечивающий визуальную согласованность продуктов компании.
Зачем нужно
Без дизайн-системы в большой команде каждый разработчик делает свою кнопку: разные отступы, шрифты, состояния hover. Дизайн-система устанавливает единый источник истины: компоненты переиспользуются, изменение в библиотеке автоматически применяется везде. Это ускоряет разработку, обеспечивает визуальную согласованность и упрощает коммуникацию между дизайнерами и разработчиками.
Где используется
- Крупные продукты с несколькими командами (Google — Material Design, Apple — HIG)
- SaaS-компании с несколькими приложениями на общей платформе
- Публичные UI-библиотеки: Material UI, Ant Design, Chakra UI, Radix UI
- Проекты, где важна консистентность бренда
Структура дизайн-системы
Tokens (дизайн-токены)
├── Цвета: --color-primary: #0070f3
├── Типографика: --font-size-base: 16px
├── Отступы: --spacing-4: 16px
└── Тени, радиусы, z-index
Компоненты (иерархия Atomic Design)
├── Atoms: Button, Input, Icon, Badge, Tag
├── Molecules: FormField, SearchBar, Toast
├── Organisms: Header, DataTable, Modal
└── Templates: PageLayout, DashboardLayout
Документация (Storybook)
└── Stories, Props API, Usage Guidelines
Дизайн-токены через CSS Custom Properties
/* tokens.css — единый источник дизайн-решений */
:root {
/* Цвета */
--color-primary-500: #0070f3;
--color-primary-600: #0060df;
--color-neutral-100: #f5f5f5;
--color-neutral-900: #111111;
/* Типографика */
--font-size-sm: 0.875rem; /* 14px */
--font-size-base: 1rem; /* 16px */
--font-size-lg: 1.125rem; /* 18px */
--font-weight-medium: 500;
--font-weight-bold: 700;
/* Отступы (4px grid) */
--spacing-1: 4px;
--spacing-2: 8px;
--spacing-4: 16px;
--spacing-6: 24px;
/* Скругления */
--radius-sm: 4px;
--radius-md: 8px;
--radius-lg: 12px;
}
Использование токенов в компоненте
// Button.jsx — использует токены вместо хардкода
function Button({ children, variant = 'primary', size = 'md', ...props }) {
return (
<button
className={`btn btn--${variant} btn--${size}`}
{...props}
>
{children}
</button>
);
}
/* Button.module.css */
.btn {
font-weight: var(--font-weight-medium);
border-radius: var(--radius-md);
cursor: pointer;
border: none;
}
.btn--primary {
background: var(--color-primary-500);
color: white;
padding: var(--spacing-2) var(--spacing-4);
}
.btn--md {
font-size: var(--font-size-base);
padding: var(--spacing-2) var(--spacing-4);
}
Популярные готовые библиотеки
| Библиотека | Стек | Особенность |
|---|---|---|
| Material UI (MUI) | React | Реализация Material Design |
| Ant Design | React | Enterprise, богатый набор |
| Chakra UI | React | Простая кастомизация |
| Radix UI | React | Headless, доступность |
| shadcn/ui | React + Tailwind | Copy-paste, не npm |
Частые ошибки
- Начинают с компонентов, не токенов — без токенов компоненты хардкодят значения, и централизованное изменение темы становится невозможным.
- Слишком ранняя абстракция — создают дизайн-систему для стартапа из 2 человек; это оправдано при 4+ командах.
- Нет Storybook / документации — компоненты есть, но никто не знает как их использовать.
Связанные темы
- _MOC SPA
- Atomic Design
- Storybook -- разработка компонентов
- CSS Modules в SPA
- CSS-in-JS -- Styled Components, Emotion