Компонентный подход (component-based design) это метод создания интерфейсов из переиспользуемых, самостоятельных элементов (компонентов). Вместо дизайна отдельных экранов создаётся библиотека компонентов которые комбинируются для построения любых интерфейсов.
Проблема: без компонентного подхода дизайнеры копируют элементы между файлами, разработчики дублируют код, консистентность теряется, обновления превращаются в ад (изменить кнопку на 50 экранах вручную).
Решение: design system с компонентами, design tokens, документацией. Одно изменение в компоненте автоматически обновляет все его использования. 69% компаний отмечают улучшение коллаборации дизайнеров и разработчиков. Команды сокращают время разработки UI на 40%.
В статье: что такое компоненты, как их правильно создавать, Atomic Design, design tokens, практические инструменты (Figma, React, Storybook), реальные кейсы, чек-листы.
1. Что такое компонент и зачем он нужен
Определение компонента
Компонент это переиспользуемый блок интерфейса со своей структурой, стилями и поведением. Компонент можно использовать многократно в разных частях продукта.
Примеры компонентов:
Простые (Atoms): кнопка, input, иконка, label, checkbox
Средние (Molecules): поле ввода с лейблом и ошибкой, карточка товара, menu item
Сложные (Organisms): header с навигацией, форма регистрации, таблица с фильтрами
Компонент vs обычный элемент
| Обычный элемент | Компонент |
|---|---|
| Нарисован отдельно на каждом экране | Создан один раз, используется везде как instance/экземпляр |
| Изменения нужно вносить вручную на каждом экране | Изменения в master component автоматически применяются ко всем instances |
| Легко потерять консистентность (кнопки разные на разных экранах) | Консистентность гарантирована (все кнопки одинаковые) |
| Нет связи между дизайном и кодом | Компоненты в дизайне соответствуют компонентам в коде |
Зачем нужны компоненты: статистика
Скорость: команды с organized design-to-code workflows сокращают время разработки UI на 40%
Консистентность: Airbnb улучшил консистентность дизайна на 20% после внедрения component-based подхода
Коллаборация: 69% компаний с component libraries отмечают улучшение коллаборации между дизайнерами и разработчиками
Handoff: Airbnb сократил время design-to-development handoff на 35%
Тестирование: Atlassian достиг 90% test coverage с automated visual regression testing
Проблемы без компонентного подхода
Пример: У вас e-commerce приложение. Есть 15 типов кнопок на 120 экранах.
Без компонентов:
Дизайнер меняет primary button (новый цвет, border-radius). Нужно найти и изменить вручную на 120 экранах. Займёт 2 дня. Пропустит 15 экранов. Консистентность нарушена.
Разработчик смотрит дизайн. Видит 15 разных кнопок. Не понимает какая правильная. Делает как понял. Результат не совпадает с дизайном.
Через месяц никто не помнит какая версия кнопки актуальная. В продакшене 8 разных вариантов кнопок.
С компонентами:
Дизайнер меняет master component кнопки. Все 120 экранов обновляются автоматически. Занимает 5 минут.
Разработчик видит название компонента "Button/Primary". Использует готовый React компонент из библиотеки. 100% совпадение с дизайном.
Всегда одна актуальная версия. Консистентность гарантирована.
2. Atomic Design: система организации компонентов
Что такое Atomic Design
Atomic Design это методология Brad Frost для создания design systems. Суть: разбиваем интерфейс на 5 уровней от простого к сложному (как в химии: атомы → молекулы → организмы).
5 уровней Atomic Design
1. Atoms (Атомы) - базовые неделимые элементы
Самые простые UI элементы которые нельзя разбить дальше.
Примеры:
Button (просто кнопка без контекста)
Input field (поле ввода)
Label (текстовая метка)
Icon (иконка)
Typography (стили текста: H1, H2, Body, Caption)
Color tokens (цвета: primary, secondary, error)
Spacing tokens (отступы: 4px, 8px, 16px, 24px)
2. Molecules (Молекулы) - простые группы атомов
Несколько атомов объединённых вместе для выполнения функции.
Примеры:
Form field = Label + Input + Error message
Search bar = Input + Search icon + Button
Card header = Avatar + Name + Date
Breadcrumb = Icon + Link + Separator
Пример молекулы: Form Field
Состоит из:
Label (атом)
Input (атом)
Helper text (атом)
Error message (атом)
Все вместе образуют переиспользуемое поле формы.
3. Organisms (Организмы) - сложные секции интерфейса
Группы молекул и атомов образующие самостоятельную секцию интерфейса.
Примеры:
Header = Logo + Navigation + Search bar + User menu + Notifications
Product card = Image + Title + Price + Rating + Add to cart button
Registration form = Multiple form fields + Checkbox + Submit button
Data table = Header + Filters + Rows + Pagination
4. Templates (Шаблоны) - структура страницы
Каркас страницы показывающий где размещаются организмы. Без реального контента (placeholder текст и изображения).
Примеры:
Dashboard template = Header + Sidebar + Content area + Footer
Article template = Header + Breadcrumbs + Article content + Related articles
Checkout template = Progress bar + Form + Order summary + Payment
5. Pages (Страницы) - конкретные экраны
Templates с реальным контентом. Конечный результат который видит пользователь.
Примеры:
Home page
Product detail page
User profile
Checkout flow
Как применять Atomic Design на практике
Шаг 1: Начните с атомов
Создайте базовые элементы:
Typography system (H1-H6, Body, Caption, все размеры и веса)
Color palette (primary, secondary, error, warning, success, neutral shades)
Spacing scale (4px, 8px, 12px, 16px, 24px, 32px, 48px, 64px)
Border radius (0, 4px, 8px, 16px, 24px, full)
Shadows (sm, md, lg, xl)
Base components (Button, Input, Checkbox, Radio, Toggle)
Шаг 2: Соберите молекулы
Комбинируйте атомы в функциональные группы:
Form field (Label + Input + Helper + Error)
Search bar (Input + Icon + Button)
Avatar with name (Avatar + Typography)
Шаг 3: Создайте организмы
Группируйте молекулы и атомы в секции:
Navigation bar
Product card
Comment section
Шаг 4: Соберите templates
Определите layout структуры для разных типов страниц.
Шаг 5: Создайте pages
Наполните templates реальным контентом.
3. Design Tokens: фундамент консистентности
Что такое design tokens
Design tokens это именованные переменные для хранения визуальных решений (цвета, шрифты, отступы, тени). Вместо hardcoded значений используются токены.
Плохо (hardcoded):
button {
background: #6366F1;
padding: 12px 24px;
border-radius: 8px;
font-size: 16px;
}Хорошо (tokens):
button {
background: var(--color-primary-500);
padding: var(--spacing-3) var(--spacing-6);
border-radius: var(--radius-md);
font-size: var(--font-size-base);
}Почему tokens важны
1. Кросс-платформенная консистентность
Один токен color.primary.500 используется в:
Figma (дизайн)
React (web)
React Native (iOS/Android)
Flutter (mobile)
Меняете значение токена в одном месте, обновляется везде автоматически.
2. Семантическое именование
Вместо blue-500 используете color.primary.500. Если бренд меняет primary цвет с синего на фиолетовый, меняете только значение токена. Код остаётся тем же.
3. Theming и dark mode
С токенами легко поддерживать темы:
/* Light theme */
--color-background: #ffffff;
--color-text: #1a1a1a;
/* Dark theme */
--color-background: #1a1a1a;
--color-text: #ffffff;Переключение темы меняет значения токенов, весь UI перекрашивается автоматически.
Типы design tokens
1. Color tokens
Организация по уровням:
Primitive (базовые цвета):
blue-50доblue-900,red-50доred-900Semantic (смысловые):
color.primary,color.error,color.successComponent (для компонентов):
button.background,input.border
Пример цветовой системы:
Primitive:
blue-500: #6366F1red-500: #EF4444green-500: #10B981
Semantic:
color.primary: blue-500color.error: red-500color.success: green-500
Component:
button.primary.background: color.primarybutton.primary.text: white
Если бренд меняет primary цвет, меняете только color.primary: purple-500. Все кнопки автоматически станут фиолетовыми.
2. Typography tokens
font.family.base: 'Inter', sans-seriffont.size.xs: 12pxfont.size.sm: 14pxfont.size.base: 16pxfont.size.lg: 18pxfont.weight.regular: 400font.weight.medium: 500font.weight.bold: 700line-height.tight: 1.25line-height.normal: 1.5
3. Spacing tokens
Используйте scale (обычно 4px base):
spacing-0: 0pxspacing-1: 4pxspacing-2: 8pxspacing-3: 12pxspacing-4: 16pxspacing-6: 24pxspacing-8: 32pxspacing-12: 48pxspacing-16: 64px
4. Shadow tokens
shadow-sm: 0 1px 2px rgba(0,0,0,0.05)shadow-md: 0 4px 6px rgba(0,0,0,0.1)shadow-lg: 0 10px 15px rgba(0,0,0,0.1)shadow-xl: 0 20px 25px rgba(0,0,0,0.15)
5. Border radius tokens
radius-none: 0pxradius-sm: 4pxradius-md: 8pxradius-lg: 12pxradius-xl: 16pxradius-full: 9999px
Как внедрить design tokens
В Figma (2025):
Создайте Variables (не Styles!)
Организуйте в коллекции (Colors, Typography, Spacing)
Используйте Modes для тем (Light/Dark)
Применяйте variables к компонентам
В коде:
Храните tokens в JSON/YAML файлах
Используйте Style Dictionary для генерации platform-specific файлов
Импортируйте в CSS/SCSS/styled-components
Пример tokens.json:
{
"color": {
"primary": {
"500": { "value": "#6366F1" }
}
},
"spacing": {
"4": { "value": "16px" }
}
}Style Dictionary генерирует:
CSS: --color-primary-500: #6366F1;
iOS: let colorPrimary500 = UIColor(hex: "6366F1")
Android: <color name="colorPrimary500">#6366F1</color>
4. Создание компонентов в Figma: best practices 2025
Новые возможности Figma 2025
1. Variables (вместо Styles)
С 2024 года Figma переходит на Variables. Ключевые улучшения:
Modes: переключение между темами (Light/Dark) одним кликом
Logic: variables поддерживают условную логику
Performance: обновления variables на 30-60% быстрее чем styles
Code sync: variables легче синхронизировать с кодом
2. Slots (early access 2025)
Добавление кастомных слоёв внутри instances без detach. Решает проблему "слишком много вариантов".
Пример:
Старый способ: Card компонент с 50 вариантами (Image Left, Image Top, No Image, With Button и тд). Maintenance кошмар.
Новый способ со Slots: Один Card компонент с Slot для контента. Slot можно заменить на что угодно (изображение, видео, текст, график). Один компонент вместо 50 вариантов.
3. Code Connect
Связывает Figma компоненты с реальным production кодом. В Dev Mode разработчик видит не generic CSS а реальные React imports и props.
Best practices создания компонентов
1. Начинайте с атомарных компонентов
Не создавайте сразу сложные организмы. Сначала базовые атомы (Button, Input), потом комбинируйте их в молекулы.
2. Используйте Auto Layout везде
Auto Layout 5.0 (2024-2025) поддерживает:
Wrap (перенос элементов)
Min/Max width/height
Padding per side
Gap between items
Компоненты с Auto Layout адаптируются под контент автоматически.
3. Правильные naming conventions
Используйте иерархическую структуру с /:
Button/PrimaryButton/SecondaryButton/DestructiveForm/Input/DefaultForm/Input/ErrorCard/ProductCard/User
Это создаёт структуру в панели Assets и помогает разработчикам находить нужные компоненты.
4. Component properties (не просто variants)
Используйте разные типы properties:
Boolean:
hasIcon(показать/скрыть иконку)Instance swap:
icon(выбрать какую иконку показать)Text:
label(текст кнопки)Variant:
size(small/medium/large),state(default/hover/active/disabled)
Пример: Button компонент
Properties:
type(variant): Primary | Secondary | Destructivesize(variant): Small | Medium | Largestate(variant): Default | Hover | Active | DisabledhasIcon(boolean): true | falseicon(instance swap): любая иконка из библиотекиlabel(text): текст кнопки
Итого: 3 типа × 3 размера × 4 состояния × 2 (с иконкой/без) = 72 комбинации. Но создаёте базовую структуру один раз, варианты генерируются автоматически.
5. Nested components (компоненты внутри компонентов)
Переиспользуйте атомы внутри молекул:
Button внутри Card
Icon внутри Button
Avatar внутри Comment
Когда обновляете базовый Button, все Cards с этой кнопкой обновятся автоматически.
6. Documentation прямо в Figma
Используйте:
Description: для чего компонент, когда использовать
Component playground: показать все варианты использования
Links: ссылка на Storybook, code repository
Чек-лист создания компонента в Figma
☐ Использует Auto Layout (не fixed sizes)
☐ Использует Variables для цветов, spacing, typography
☐ Правильное именование (
Category/Name/Variant)☐ Component properties настроены (variants, boolean, text, instance swap)
☐ Все состояния покрыты (default, hover, active, disabled, error)
☐ Responsive (адаптируется под контент)
☐ Nested components используются где возможно
☐ Documentation добавлена (description, usage examples)
☐ Accessibility учтена (контраст, размеры touch targets min 44px)
5. Создание компонентов в коде: React best practices
Почему React
74% разработчиков используют React для component-based development. React идеально подходит для компонентного подхода:
Компоненты как first-class citizens
Props для кастомизации
Composition (вложенность)
Огромная экосистема (Storybook, styled-components, Material-UI)
Принципы создания переиспользуемых React компонентов
1. Single Responsibility Principle
Один компонент делает одну вещь. Если компонент делает больше одной вещи, разбейте на несколько.
Плохо:
function UserDashboard() {
// 500 строк кода
// Показывает профиль + список заказов + статистику + настройки
return (...)
}Хорошо:
function UserDashboard() {
return (
<>
<UserProfile />
<OrdersList />
<Statistics />
<Settings />
</>
)
}2. Props interface для гибкости
Используйте TypeScript interfaces для типизации props:
interface ButtonProps {
variant: 'primary' | 'secondary' | 'destructive';
size: 'sm' | 'md' | 'lg';
disabled?: boolean;
loading?: boolean;
icon?: React.ReactNode;
onClick: () => void;
children: React.ReactNode;
}
function Button({
variant = 'primary',
size = 'md',
disabled = false,
loading = false,
icon,
onClick,
children
}: ButtonProps) {
return (...)
}3. Composition over configuration
Плохо (слишком много props):
<Card
hasImage={true}
imageUrl="/photo.jpg"
hasTitle={true}
title="Product"
hasDescription={true}
description="Text"
hasButton={true}
buttonText="Buy"
buttonVariant="primary"
/>Хорошо (composition):
<Card>
<Card.Image src="/photo.jpg" />
<Card.Title>Product</Card.Title>
<Card.Description>Text</Card.Description>
<Card.Actions>
<Button variant="primary">Buy</Button>
</Card.Actions>
</Card>4. Design tokens в коде
Используйте tokens вместо hardcoded значений:
Плохо:
const Button = styled.button`
background: #6366F1;
padding: 12px 24px;
border-radius: 8px;
`;Хорошо:
const Button = styled.button`
background: ${tokens.color.primary[500]};
padding: ${tokens.spacing[3]} ${tokens.spacing[6]};
border-radius: ${tokens.radius.md};
`;5. Controlled vs Uncontrolled components
Для form inputs делайте controlled компоненты (значение контролируется через props):
interface InputProps {
value: string;
onChange: (value: string) => void;
}
function Input({ value, onChange }: InputProps) {
return (
<input
value={value}
onChange={(e) => onChange(e.target.value)}
/>
)
}6. Accessibility из коробки
Компоненты должны быть accessible по умолчанию:
function Button({ children, ...props }: ButtonProps) {
return (
<button
role="button"
aria-disabled={props.disabled}
aria-label={props['aria-label']}
{...props}
>
{children}
</button>
)
}Пример: создание Button компонента
// Button.tsx
import styled from 'styled-components';
import { tokens } from './tokens';
interface ButtonProps {
variant?: 'primary' | 'secondary' | 'destructive';
size?: 'sm' | 'md' | 'lg';
disabled?: boolean;
loading?: boolean;
icon?: React.ReactNode;
onClick: () => void;
children: React.ReactNode;
}
const sizes = {
sm: {
padding: `${tokens.spacing[2]} ${tokens.spacing[4]}`,
fontSize: tokens.fontSize.sm,
},
md: {
padding: `${tokens.spacing[3]} ${tokens.spacing[6]}`,
fontSize: tokens.fontSize.base,
},
lg: {
padding: `${tokens.spacing[4]} ${tokens.spacing[8]}`,
fontSize: tokens.fontSize.lg,
}
};
const variants = {
primary: {
background: tokens.color.primary[500],
color: tokens.color.white,
},
secondary: {
background: tokens.color.gray[200],
color: tokens.color.gray[900],
},
destructive: {
background: tokens.color.error[500],
color: tokens.color.white,
}
};
const StyledButton = styled.button<ButtonProps>`
${props => sizes[props.size || 'md']}
${props => variants[props.variant || 'primary']}
border: none;
border-radius: ${tokens.radius.md};
font-weight: ${tokens.fontWeight.medium};
cursor: pointer;
display: inline-flex;
align-items: center;
gap: ${tokens.spacing[2]};
transition: all 0.2s;
&:hover:not(:disabled) {
transform: translateY(-2px);
box-shadow: ${tokens.shadow.md};
}
&:disabled {
opacity: 0.5;
cursor: not-allowed;
}
`;
export function Button({
variant = 'primary',
size = 'md',
disabled = false,
loading = false,
icon,
onClick,
children
}: ButtonProps) {
return (
<StyledButton
variant={variant}
size={size}
disabled={disabled || loading}
onClick={onClick}
>
{loading ? <Spinner /> : icon}
{children}
</StyledButton>
);
}Использование:
<Button variant="primary" size="md" onClick={handleClick}>
Click me
</Button>
<Button variant="secondary" size="lg" icon={<IconPlus />}>
Add item
</Button>6. Документация и Storybook
Зачем нужна документация компонентов
Компоненты без документации бесполезны. Разработчики не знают:
Какие props доступны
Как компонент выглядит в разных состояниях
Когда использовать этот компонент vs другой
Best practices использования
Результат: дублируют компоненты, создают свои кастомные версии, консистентность теряется.
Что такое Storybook
Storybook это UI playground для компонентов. Позволяет:
Разрабатывать компоненты изолированно (без запуска всего приложения)
Документировать все варианты использования (stories)
Тестировать компоненты визуально
Показывать компоненты дизайнерам и стейкхолдерам
Создание stories для компонентов
Пример Button.stories.tsx:
import type { Meta, StoryObj } from '@storybook/react';
import { Button } from './Button';
const meta: Meta<typeof Button> = {
title: 'Components/Button',
component: Button,
tags: ['autodocs'],
argTypes: {
variant: {
control: 'select',
options: ['primary', 'secondary', 'destructive'],
},
size: {
control: 'select',
options: ['sm', 'md', 'lg'],
},
},
};
export default meta;
type Story = StoryObj<typeof Button>;
export const Primary: Story = {
args: {
variant: 'primary',
children: 'Primary Button',
},
};
export const Secondary: Story = {
args: {
variant: 'secondary',
children: 'Secondary Button',
},
};
export const WithIcon: Story = {
args: {
variant: 'primary',
icon: <IconPlus />,
children: 'Add Item',
},
};
export const Loading: Story = {
args: {
variant: 'primary',
loading: true,
children: 'Loading...',
},
};
export const Disabled: Story = {
args: {
variant: 'primary',
disabled: true,
children: 'Disabled',
},
};
export const AllSizes: Story = {
render: () => (
<div style={{ display: 'flex', gap: '16px', alignItems: 'center' }}>
<Button size="sm">Small</Button>
<Button size="md">Medium</Button>
<Button size="lg">Large</Button>
</div>
),
};Что включать в документацию
1. Overview
Что делает компонент
Когда его использовать
Когда НЕ использовать
2. Props API
Список всех props
Типы
Default values
Required/optional
3. Visual examples
Все варианты (размеры, состояния, темы)
Do/Don't примеры
Edge cases (очень длинный текст, много элементов)
4. Code examples
Базовое использование
Продвинутые кейсы
Composition с другими компонентами
5. Accessibility
Keyboard navigation
Screen reader support
ARIA attributes
Автогенерация документации
Storybook может генерировать документацию автоматически из:
TypeScript types/interfaces
JSDoc comments
Stories
Добавьте tags: ['autodocs'] в meta и получите ready-to-use документацию.
7. Поддержание консистентности: governance и process
Проблема drift (расползание)
Design system создан, компоненты готовы. Через 6 месяцев:
Разработчики detach компоненты и меняют стили локально
Дизайнеры создают новые версии компонентов "для конкретного кейса"
Появляются 5 разных версий одной кнопки
Документация устарела
Никто не знает какая версия актуальная
Это называется design drift. Результат: консистентность потеряна, design system мёртв.
Как предотвратить drift
1. Design system team
Выделите людей ответственных за design system:
Design system lead: 1 человек (senior designer или frontend)
Contributors: 2-3 дизайнера + 2-3 разработчика
Governance board: представители от всех команд
Типичное соотношение: 1 researcher : 5 designers : 50 developers.
2. Contribution guidelines
Процесс добавления/изменения компонентов:
Proposal: заполнить форму (зачем нужен компонент, кто будет использовать)
Review: design system team review (нужен ли новый компонент или можно использовать существующий)
Design: создание в Figma + review
Development: код + тесты + stories
Documentation: usage guidelines
Release: версионирование, changelog, анонс команде
3. Versioning (Semantic Versioning)
Используйте semver для компонентов:
Major (1.0.0 → 2.0.0): breaking changes (изменился API, удалены props)
Minor (1.0.0 → 1.1.0): новые фичи (добавлены props, новые варианты)
Patch (1.0.0 → 1.0.1): багфиксы
Changelog обязателен:
## [2.0.0] - 2025-01-15
### Breaking Changes
- Button: removed `type` prop, use `variant` instead
### Added
- Button: new `loading` state
### Fixed
- Button: icon alignment in small size4. Automated checks
Используйте инструменты для автоматического контроля:
Linters: ESLint rules для запрета hardcoded цветов/spacing
Visual regression tests: Percy, Chromatic для отлова визуальных изменений
Accessibility tests: axe, eslint-plugin-jsx-a11y
Type checking: TypeScript для проверки props
Пример ESLint rule:
// Запретить hardcoded цвета
rules: {
'no-hardcoded-colors': 'error',
// background: '#6366F1' → error
// background: tokens.color.primary → ok
}5. Regular audits
Каждый квартал:
Audit компонентов (какие используются, какие нет)
Проверка adoption rate (сколько команд используют design system)
Сбор feedback от пользователей
Deprecation неиспользуемых компонентов
6. Office hours и support
Регулярные сессии где команды могут:
Задать вопросы по использованию компонентов
Предложить улучшения
Получить помощь с интеграцией
8. Инструменты для component-based design 2025
Дизайн
| Инструмент | Зачем нужен | Цена |
|---|---|---|
Figma | Основной инструмент для создания design system. Components, Variables, Auto Layout, Dev Mode | $12-45/мес на редактора |
Sketch | Альтернатива Figma (Mac only). Symbols, Shared Libraries | $10/мес |
Adobe XD | Компоненты, стили. Уступает Figma в коллаборации | $10/мес |
Design tokens management
| Инструмент | Зачем нужен | Цена |
|---|---|---|
Style Dictionary | Генерация platform-specific файлов из JSON tokens (CSS, iOS, Android) | Free (open-source) |
Tokens Studio | Figma plugin для создания и экспорта tokens | Free + Pro $10/мес |
Supernova | Design system platform, tokens management, documentation | От $49/мес |
Component development
| Инструмент | Зачем нужен | Цена |
|---|---|---|
React | Основной framework для component-based development | Free (open-source) |
styled-components | CSS-in-JS для стилизации React компонентов | Free |
Tailwind CSS | Utility-first CSS framework с design tokens | Free + UI Kit $299 |
Storybook | UI playground для разработки и документации компонентов | Free |
Testing
| Инструмент | Зачем нужен | Цена |
|---|---|---|
Jest | Unit testing для React компонентов | Free |
React Testing Library | Тестирование компонентов с фокусом на UX | Free |
Chromatic | Visual regression testing для Storybook | Free tier + от $149/мес |
Percy | Visual testing platform | Free tier + от $299/мес |
Documentation
| Инструмент | Зачем нужен | Цена |
|---|---|---|
Storybook | Интерактивная документация компонентов | Free |
zeroheight | Design system documentation platform, синк с Figma/Storybook | От $85/мес |
Supernova | Design-to-code platform с документацией | От $49/мес |
Docusaurus | Static site generator для документации | Free |
Ready-to-use design systems (для вдохновения или форка)
| Design System | Компания | Что скопировать |
|---|---|---|
Material Design | Color system, components, accessibility, documentation | |
Carbon | IBM | Enterprise components, data viz, patterns (не только компоненты) |
Polaris | Shopify | Merchant-first подход, accessible components |
Atlassian Design System | Atlassian | Component structure, elevation system, comprehensive guidance |
Fluent | Microsoft | Cross-platform components, adaptive design |
Ant Design | Alibaba | Enterprise components, internationalisation, rich features |
9. Реальные кейсы: как компании внедрили component-based подход
Кейс 1: Airbnb Design Language System (DLS)
Проблема:
Airbnb разрабатывал web, iOS, Android одновременно. Каждая платформа со своим дизайном. Консистентности ноль. Handoff занимал недели.
Решение:
Внедрили Atomic Design
Создали 200+ переиспользуемых компонентов
Design tokens для кросс-платформенной консистентности
Единый source of truth в Sketch (позже Figma)
Результаты:
35% сокращение времени design-to-development handoff
20% улучшение консистентности дизайна
30% сокращение времени создания новых feature
Ключевой инсайт: Начали с атомарных компонентов (Button, Input), постепенно собрали в молекулы и организмы. Не пытались создать всё сразу.
Кейс 2: Atlassian Design System
Проблема:
Atlassian владеет Jira, Confluence, Trello, Bitbucket. Каждый продукт со своим UI. Пользователи путались переключаясь между продуктами.
Решение:
Единый design system для всех продуктов
Component library с 90% test coverage
Automated visual regression testing
Подробная документация не только для компонентов но и для patterns (логины, формы, фильтры)
Результаты:
90% test coverage с automated testing
Единый UX across всех продуктов
Быстрые итерации (изменения в одном компоненте обновляют все продукты)
Ключевой инсайт: Документировали не только компоненты но и UI patterns (как делать фильтрацию, как создавать формы). Это помогло командам делать правильные решения.
Кейс 3: Shopify Polaris
Проблема:
Тысячи merchants используют Shopify admin. Каждое обновление ломало пользовательский опыт если не было консистентности.
Решение:
Polaris Design System с фокусом на merchant experience
Accessible components (WCAG AAA)
Opinionated patterns (не просто компоненты, а готовые решения типичных задач)
Open-source (community contributions)
Результаты:
Высокая accessibility (все компоненты WCAG compliant)
Быстрая разработка новых features
Community adoption (используется не только внутри Shopify)
Ключевой инсайт: Сделали design system open-source. Получили feedback от community, улучшили качество, стали industry standard для e-commerce.
Кейс 4: Uber Base Design System
Проблема:
Uber имеет десятки sub-brands (Uber, Uber Eats, Uber Freight) и продуктов (rider app, driver app, merchant app). Каждый со своим дизайном.
Решение:
Base Design System как foundation
Performance-oriented components (оптимизация для high-scale apps)
Clear API documentation для разработчиков
Multi-brand support (темы для разных sub-brands)
Результаты:
Единая база для всех Uber продуктов
Performance optimization (компоненты оптимизированы для mobile)
Быстрое создание новых sub-brands
Ключевой инсайт: Сфокусировались на performance (mobile apps в странах с медленным интернетом). Компоненты лёгкие, быстро загружаются, адаптивные.
10. Чек-лист: внедрение компонентного подхода
Фаза 1: Подготовка (1-2 недели)
☐ Провести аудит текущих UI элементов (сколько разных кнопок, форм, карточек)
☐ Собрать команду (1 lead + 2-3 дизайнера + 2-3 разработчика)
☐ Изучить best practices (Material Design, Carbon, Polaris)
☐ Выбрать инструменты (Figma + React + Storybook стандарт)
☐ Определить scope (начать с 10-15 базовых компонентов)
Фаза 2: Foundation (2-3 недели)
☐ Создать design tokens (colors, typography, spacing, shadows, radius)
☐ Настроить Variables в Figma
☐ Настроить tokens в коде (JSON + Style Dictionary)
☐ Создать базовую документацию structure
Фаза 3: Atoms (2-3 недели)
☐ Button (все варианты: primary, secondary, destructive, sizes, states)
☐ Input (text, email, password, textarea)
☐ Checkbox
☐ Radio
☐ Toggle/Switch
☐ Icon library
☐ Typography components
☐ Badge/Tag
Для каждого компонента:
☐ Создать в Figma (с Auto Layout, Variables, variants)
☐ Написать код (React + TypeScript)
☐ Создать stories (Storybook)
☐ Написать тесты (unit + visual regression)
☐ Документация (когда использовать, props API, accessibility)
Фаза 4: Molecules (2-3 недели)
☐ Form field (label + input + helper + error)
☐ Search bar
☐ Breadcrumbs
☐ Pagination
☐ Alert/Notification
☐ Avatar with name
☐ Menu item
Фаза 5: Organisms (3-4 недели)
☐ Navigation bar
☐ Card (product, user, article)
☐ Form (login, registration, checkout)
☐ Table with filters and pagination
☐ Modal/Dialog
☐ Dropdown menu
Фаза 6: Documentation & Governance (1-2 недели)
☐ Написать contribution guidelines
☐ Настроить versioning process
☐ Создать changelog template
☐ Настроить automated checks (linting, visual regression)
☐ Провести onboarding для команд
☐ Запланировать office hours
Фаза 7: Adoption (ongoing)
☐ Pilot project (1-2 команды начинают использовать)
☐ Собрать feedback
☐ Итерации и улучшения
☐ Постепенный rollout на все команды
☐ Quarterly audits (adoption rate, usage statistics)
☐ Continuous improvement
Итого: 12-16 недель от старта до первой версии design system с базовыми компонентами.
Красные флаги (когда что-то идёт не так)
☐ Компоненты слишком специфичные (работают только для одного кейса)
☐ Слишком много вариантов (Button с 50 props и 200 variants)
☐ Нет документации (разработчики не знают как использовать)
☐ Разработчики detach компоненты и меняют локально
☐ Дизайнеры копируют компоненты вместо использования библиотеки
☐ Design system team перегружен (не успевают обрабатывать requests)
☐ Low adoption rate (команды не используют design system)
Если видите 3+ красных флага, нужно остановиться и пересмотреть подход.
Помните: design system это продукт. У него есть пользователи (дизайнеры и разработчики). Если они не используют ваш design system, он провалился. Фокусируйтесь на user experience, документации, support. Качество компонентов важно, но adoption важнее.
А лучшие вакансии для ux/ui и продуктовых дизайнеров ищите на hirehi.ru