Компонентный подход в дизайне: как создавать переиспользуемые элементы и поддерживать консистентность

Компонентный подход в дизайне: как создавать переиспользуемые элементы и поддерживать консистентность

Компонентный подход (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: Начните с атомов

Создайте базовые элементы:

  1. Typography system (H1-H6, Body, Caption, все размеры и веса)

  2. Color palette (primary, secondary, error, warning, success, neutral shades)

  3. Spacing scale (4px, 8px, 12px, 16px, 24px, 32px, 48px, 64px)

  4. Border radius (0, 4px, 8px, 16px, 24px, full)

  5. Shadows (sm, md, lg, xl)

  6. 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-900

  • Semantic (смысловые): color.primary, color.error, color.success

  • Component (для компонентов): button.background, input.border

Пример цветовой системы:

Primitive:

  • blue-500: #6366F1

  • red-500: #EF4444

  • green-500: #10B981

Semantic:

  • color.primary: blue-500

  • color.error: red-500

  • color.success: green-500

Component:

  • button.primary.background: color.primary

  • button.primary.text: white

Если бренд меняет primary цвет, меняете только color.primary: purple-500. Все кнопки автоматически станут фиолетовыми.

2. Typography tokens

  • font.family.base: 'Inter', sans-serif

  • font.size.xs: 12px

  • font.size.sm: 14px

  • font.size.base: 16px

  • font.size.lg: 18px

  • font.weight.regular: 400

  • font.weight.medium: 500

  • font.weight.bold: 700

  • line-height.tight: 1.25

  • line-height.normal: 1.5

3. Spacing tokens

Используйте scale (обычно 4px base):

  • spacing-0: 0px

  • spacing-1: 4px

  • spacing-2: 8px

  • spacing-3: 12px

  • spacing-4: 16px

  • spacing-6: 24px

  • spacing-8: 32px

  • spacing-12: 48px

  • spacing-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: 0px

  • radius-sm: 4px

  • radius-md: 8px

  • radius-lg: 12px

  • radius-xl: 16px

  • radius-full: 9999px

Как внедрить design tokens

В Figma (2025):

  1. Создайте Variables (не Styles!)

  2. Организуйте в коллекции (Colors, Typography, Spacing)

  3. Используйте Modes для тем (Light/Dark)

  4. Применяйте variables к компонентам

В коде:

  1. Храните tokens в JSON/YAML файлах

  2. Используйте Style Dictionary для генерации platform-specific файлов

  3. Импортируйте в 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/Primary

  • Button/Secondary

  • Button/Destructive

  • Form/Input/Default

  • Form/Input/Error

  • Card/Product

  • Card/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 | Destructive

  • size (variant): Small | Medium | Large

  • state (variant): Default | Hover | Active | Disabled

  • hasIcon (boolean): true | false

  • icon (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

  1. ☐ Использует Auto Layout (не fixed sizes)

  2. ☐ Использует Variables для цветов, spacing, typography

  3. ☐ Правильное именование (Category/Name/Variant)

  4. ☐ Component properties настроены (variants, boolean, text, instance swap)

  5. ☐ Все состояния покрыты (default, hover, active, disabled, error)

  6. ☐ Responsive (адаптируется под контент)

  7. ☐ Nested components используются где возможно

  8. ☐ Documentation добавлена (description, usage examples)

  9. ☐ 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

Процесс добавления/изменения компонентов:

  1. Proposal: заполнить форму (зачем нужен компонент, кто будет использовать)

  2. Review: design system team review (нужен ли новый компонент или можно использовать существующий)

  3. Design: создание в Figma + review

  4. Development: код + тесты + stories

  5. Documentation: usage guidelines

  6. 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 size

4. 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 для создания и экспорта tokensFree + Pro $10/мес

Supernova

Design system platform, tokens management, documentationОт $49/мес

Component development

ИнструментЗачем нуженЦена

React

Основной framework для component-based developmentFree (open-source)

styled-components

CSS-in-JS для стилизации React компонентовFree

Tailwind CSS

Utility-first CSS framework с design tokensFree + UI Kit $299

Storybook

UI playground для разработки и документации компонентовFree

Testing

ИнструментЗачем нуженЦена

Jest

Unit testing для React компонентовFree

React Testing Library

Тестирование компонентов с фокусом на UXFree

Chromatic

Visual regression testing для StorybookFree tier + от $149/мес

Percy

Visual testing platformFree 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

GoogleColor system, components, accessibility, documentation

Carbon

IBMEnterprise components, data viz, patterns (не только компоненты)

Polaris

ShopifyMerchant-first подход, accessible components

Atlassian Design System

AtlassianComponent structure, elevation system, comprehensive guidance

Fluent

MicrosoftCross-platform components, adaptive design

Ant Design

AlibabaEnterprise 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 недели)

  1. ☐ Провести аудит текущих UI элементов (сколько разных кнопок, форм, карточек)

  2. ☐ Собрать команду (1 lead + 2-3 дизайнера + 2-3 разработчика)

  3. ☐ Изучить best practices (Material Design, Carbon, Polaris)

  4. ☐ Выбрать инструменты (Figma + React + Storybook стандарт)

  5. ☐ Определить scope (начать с 10-15 базовых компонентов)

Фаза 2: Foundation (2-3 недели)

  1. ☐ Создать design tokens (colors, typography, spacing, shadows, radius)

  2. ☐ Настроить Variables в Figma

  3. ☐ Настроить tokens в коде (JSON + Style Dictionary)

  4. ☐ Создать базовую документацию structure

Фаза 3: Atoms (2-3 недели)

  1. ☐ Button (все варианты: primary, secondary, destructive, sizes, states)

  2. ☐ Input (text, email, password, textarea)

  3. ☐ Checkbox

  4. ☐ Radio

  5. ☐ Toggle/Switch

  6. ☐ Icon library

  7. ☐ Typography components

  8. ☐ Badge/Tag

Для каждого компонента:

  • ☐ Создать в Figma (с Auto Layout, Variables, variants)

  • ☐ Написать код (React + TypeScript)

  • ☐ Создать stories (Storybook)

  • ☐ Написать тесты (unit + visual regression)

  • ☐ Документация (когда использовать, props API, accessibility)

Фаза 4: Molecules (2-3 недели)

  1. ☐ Form field (label + input + helper + error)

  2. ☐ Search bar

  3. ☐ Breadcrumbs

  4. ☐ Pagination

  5. ☐ Alert/Notification

  6. ☐ Avatar with name

  7. ☐ Menu item

Фаза 5: Organisms (3-4 недели)

  1. ☐ Navigation bar

  2. ☐ Card (product, user, article)

  3. ☐ Form (login, registration, checkout)

  4. ☐ Table with filters and pagination

  5. ☐ Modal/Dialog

  6. ☐ Dropdown menu

Фаза 6: Documentation & Governance (1-2 недели)

  1. ☐ Написать contribution guidelines

  2. ☐ Настроить versioning process

  3. ☐ Создать changelog template

  4. ☐ Настроить automated checks (linting, visual regression)

  5. ☐ Провести onboarding для команд

  6. ☐ Запланировать office hours

Фаза 7: Adoption (ongoing)

  1. ☐ Pilot project (1-2 команды начинают использовать)

  2. ☐ Собрать feedback

  3. ☐ Итерации и улучшения

  4. ☐ Постепенный rollout на все команды

  5. ☐ Quarterly audits (adoption rate, usage statistics)

  6. ☐ Continuous improvement

Итого: 12-16 недель от старта до первой версии design system с базовыми компонентами.

Красные флаги (когда что-то идёт не так)

  1. ☐ Компоненты слишком специфичные (работают только для одного кейса)

  2. ☐ Слишком много вариантов (Button с 50 props и 200 variants)

  3. ☐ Нет документации (разработчики не знают как использовать)

  4. ☐ Разработчики detach компоненты и меняют локально

  5. ☐ Дизайнеры копируют компоненты вместо использования библиотеки

  6. ☐ Design system team перегружен (не успевают обрабатывать requests)

  7. ☐ Low adoption rate (команды не используют design system)

Если видите 3+ красных флага, нужно остановиться и пересмотреть подход.

Помните: design system это продукт. У него есть пользователи (дизайнеры и разработчики). Если они не используют ваш design system, он провалился. Фокусируйтесь на user experience, документации, support. Качество компонентов важно, но adoption важнее.

А лучшие вакансии для ux/ui и продуктовых дизайнеров ищите на hirehi.ru