Войти
Песочница

Дизайн-система

Почему большие проекты без неё разваливаются, как построить свою, и почему AI-инженер должен знать это лучше дизайнера.

⏱️ 25 минут чтения📐 10+ инструментов💻 Примеры кода🤖 AI-подход

📑 Содержание

1. Что такое дизайн-система и зачем она нужна2. Из чего состоит: 5 слоёв3. Дизайн-токены — фундамент всего4. Компоненты: от кнопки до страницы5. Паттерны и правила использования6. Документация: Storybook, Zeroheight7. Инструменты: Figma, Token Studio, Style Dictionary8. AI и дизайн-системы: как автоматизировать9. Пошаговый план внедрения10. Примеры: Material, Ant, shadcn/ui

Что такое дизайн-система и зачем она нужна

Дизайн-система — это единый язык, на котором говорят дизайнеры, разработчики и AI-агенты. Это не просто UI Kit. Это набор правил, компонентов, токенов и документации, который позволяет создавать интерфейсы быстро, согласованно и без хаоса.

Проблема без дизайн-системы

Представьте: в проекте 50 страниц, 3 разработчика и AI-агент. Дизайнер нарисовал кнопку с `border-radius: 8px`. Разработчик 1 сделал `border-radius: 6px`. Разработчик 2 — `10px`. AI-агент сгенерировал `12px`. Через месяц у вас 5 разных кнопок, 3 оттенка акцентного цвета и ад в CSS. Это реальная проблема большинства проектов.

🚫 Без дизайн-системы:
  • Каждый разработчик изобретает свои отступы и цвета
  • AI генерирует несогласованные компоненты
  • Дизайнер не может проверить реализацию
  • Любое изменение дизайна = переписывание всего CSS
✅ С дизайн-системой:
  • Единый источник правды — токены в коде
  • AI получает контекст: «используй радиус M, цвет accent»
  • Изменение одного токена меняет весь интерфейс
  • Дизайнер и разработчик говорят на одном языке

Из чего состоит: 5 слоёв

Дизайн-система — это не просто «набор компонентов». Это пирамида из 5 слоёв. Каждый слой зависит от предыдущего.

5. Страницы и шаблоны
Типовые экраны: дашборд, форма, список. Собраны из организмов.
4. Организмы
Секции: хедер, футер, карточка товара. Собраны из молекул.
3. Молекулы
Составные элементы: поиск (input + кнопка), карточка (изображение + текст).
2. Атомы
Базовые элементы: кнопка, input, иконка, текст, цвет. Неделимые.
1. Токены
Переменные: цвета, шрифты, отступы, радиусы, тени. Фундамент всего.

Atomic Design — методология

Эту модель придумал Брэд Фрост в 2013 году. Она называется Atomic Design. Идея проста: интерфейс строится из атомов (кнопки, поля), которые собираются в молекулы (форма поиска), те — в организмы (хедер сайта), а из организмов — страницы.

Для AI-инженера это критически важно: когда вы даёте промпт AI-агенту, вы можете сказать «собери страницу из компонентов Button, Input и Card», и агент поймёт что делать. Без системы — агент сгенерирует хаос.

Дизайн-токены — фундамент всего

Токены — это переменные. Вместо того чтобы писать color: #0fb880 в 50 местах, вы пишете color: var(--color-accent). Когда дизайнер решит сменить акцентный цвет, вы меняете ОДНУ переменную.

Категории токенов

/* ═══════════════════════════
   Design Tokens — пример
   ═══════════════════════════ */
:root {
  /* 🎨 Цвета */
  --color-accent: #0fb880;
  --color-accent-hover: #0ca36e;
  --color-bg-primary: #ffffff;
  --color-bg-secondary: #f5f5f3;
  --color-text-primary: #1a1a1a;
  --color-text-secondary: #5c5c50;
  --color-border: #d4d4cc;

  /* 📏 Отступы */
  --space-xs: 4px;
  --space-s: 8px;
  --space-m: 16px;
  --space-l: 24px;
  --space-xl: 40px;

  /* 🔤 Типографика */
  --font-heading: "Onest", sans-serif;
  --font-body: "Inter", sans-serif;
  --text-xs: 12px;
  --text-s: 14px;
  --text-m: 16px;
  --text-l: 20px;
  --text-xl: 28px;

  /* ⭕ Радиусы */
  --radius-s: 4px;
  --radius-m: 8px;
  --radius-l: 12px;
  --radius-full: 9999px;

  /* 🌑 Тени */
  --shadow-s: 0 1px 2px rgba(0,0,0,0.04);
  --shadow-m: 0 2px 8px rgba(0,0,0,0.08);
  --shadow-l: 0 4px 16px rgba(0,0,0,0.12);
}

/* 🌙 Тёмная тема — просто переопределяем токены */
[data-theme="dark"] {
  --color-bg-primary: #1a1a1a;
  --color-bg-secondary: #242424;
  --color-text-primary: #f5f5f3;
  --color-text-secondary: #b0b0a4;
  --color-border: #3e3e38;
}

Токены в Tailwind CSS 4

В Tailwind 4 можно связать CSS-переменные с утилитарными классами через @theme:

/* tailwind.css */
@import "tailwindcss";

@theme {
  --color-accent: var(--color-accent);
  --spacing-s: var(--space-s);
  --spacing-m: var(--space-m);
  --text-xs: var(--text-xs);
  --radius-m: var(--radius-m);
}

/* Теперь можно писать: */
/* <button className="bg-accent text-white px-m py-s rounded-m"> */

Компоненты: от кнопки до страницы

Компонент — это переиспользуемый блок интерфейса. Хороший компонент: изолирован, настраивается через props, задокументирован.

Пример: компонент Button

// Button.tsx — атом дизайн-системы
import { forwardRef } from "react";

interface ButtonProps {
  variant?: "primary" | "secondary" | "ghost";
  size?: "sm" | "md" | "lg";
  children: React.ReactNode;
}

const variantStyles = {
  primary: { background: "var(--color-accent)", color: "white" },
  secondary: { background: "var(--color-bg-tertiary)", color: "var(--color-text-primary)" },
  ghost: { background: "transparent", color: "var(--color-text-secondary)", border: "1px solid var(--color-border)" },
};

const sizeStyles = {
  sm: { padding: "4px 10px", fontSize: "var(--text-xs)" },
  md: { padding: "8px 16px", fontSize: "var(--text-s)" },
  lg: { padding: "12px 24px", fontSize: "var(--text-m)" },
};

export const Button = forwardRef<HTMLButtonElement, ButtonProps>(
  ({ variant = "primary", size = "md", children }, ref) => (
    <button ref={ref} style={{
      display: "inline-flex", alignItems: "center", gap: "var(--space-xs)",
      border: "none", borderRadius: "var(--radius-m)",
      fontWeight: 600, cursor: "pointer",
      transition: "opacity 0.15s",
      ...variantStyles[variant],
      ...sizeStyles[size],
    }}>
      {children}
    </button>
  )
);

// Использование:
<Button variant="primary" size="lg">Купить</Button>
<Button variant="ghost" size="sm">Отмена</Button>

Компонент Card с вариантами

// Card.tsx — молекула дизайн-системы
interface CardProps {
  padding?: "s" | "m" | "l";
  elevated?: boolean;
  accent?: boolean;
  children: React.ReactNode;
}

export function Card({ padding = "m", elevated, accent, children }: CardProps) {
  const pads = { s: "var(--space-s)", m: "var(--space-m)", l: "var(--space-l)" };
  return (
    <div style={{
      padding: pads[padding],
      background: "var(--color-surface)",
      border: accent ? "1px solid var(--color-accent)" : "1px solid var(--color-border-light)",
      borderRadius: "var(--radius-l)",
      boxShadow: elevated ? "var(--shadow-m)" : "none",
      ...(accent && { borderTop: "3px solid var(--color-accent)" }),
    }}>
      {children}
    </div>
  );
}

Паттерны и правила использования

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

Паттерн: Форма с валидацией

✅ Правильно
  • Поля сгруппированы логически
  • Лейблы над полями
  • Ошибка под проблемным полем
  • Кнопка primary + кнопка ghost для отмены
❌ Неправильно
  • Все поля в один столбец без группировки
  • Лейблы как placeholder (исчезают)
  • Ошибка alert'ом вверху страницы
  • Две primary кнопки рядом

Чек-лист качества компонента

Компонент работает изолированно (можно использовать без контекста)
Все варианты задокументированы (primary, secondary, disabled, loading)
Состояния обработаны (hover, focus, active, disabled, error)
Доступность (aria-атрибуты, keyboard navigation, contrast)
Адаптивность (компонент корректно выглядит на мобильных)
Нет хардкода цветов/размеров — только токены

Документация: Storybook, Zeroheight

Дизайн-система без документации — как карта без легенды. Инструменты:

Storybook

Стандарт индустрии для изолированной разработки компонентов. Каждый компонент имеет свою «историю» (story) — пример использования с разными props. Позволяет тестировать компоненты визуально, проверять accessibility, делать скриншот-тесты.

// Button.stories.tsx
import type { Meta, StoryObj } from "@storybook/react";
import { Button } from "./Button";

const meta: Meta<typeof Button> = {
  title: "Atoms/Button",
  component: Button,
  argTypes: {
    variant: { control: "select", options: ["primary", "secondary", "ghost"] },
    size: { control: "select", options: ["sm", "md", "lg"] },
  },
};
export default meta;

export const Primary: StoryObj<typeof Button> = {
  args: { variant: "primary", children: "Кнопка" },
};

export const AllVariants = {
  render: () => (
    <div style={{ display: "flex", gap: 12 }}>
      <Button variant="primary">Primary</Button>
      <Button variant="secondary">Secondary</Button>
      <Button variant="ghost">Ghost</Button>
    </div>
  ),
};

Другие инструменты документации

Zeroheight
Платформа для дизайн-документации. Связывает Figma с кодом. Используют Uber, Adobe.
Backlight
All-in-one платформа: код, документация, дизайн в одном месте.
Docz
Документация на MDX. Простой, на React. Хорош для небольших систем.
Notion + Figma
Быстрый старт: описание в Notion, макеты в Figma, код в GitHub.

Инструменты: Figma, Token Studio, Style Dictionary

Figma

Основной инструмент дизайнеров. Но AI-инженеру тоже полезно знать:

  • Dev Mode — показывает CSS-код, отступы, токены прямо из макета
  • Variables — аналог CSS-переменных в Figma (цвета, числа, строки)
  • Components + Variants — компоненты с вариантами (как props в React)
  • Auto Layout — аналог Flexbox в Figma
  • Plugins: Tokens Studio, Figma to Code, Design Lint

Tokens Studio (Figma Plugin)

Самый важный плагин для синхронизации токенов между Figma и кодом. Позволяет экспортировать токены в JSON, который можно преобразовать в CSS-переменные через Style Dictionary.

// tokens.json — экспорт из Tokens Studio
{
  "color": {
    "accent": { "value": "#0fb880", "type": "color" },
    "bg": {
      "primary": { "value": "#ffffff", "type": "color" },
      "secondary": { "value": "#f5f5f3", "type": "color" }
    }
  },
  "spacing": {
    "s": { "value": "8px", "type": "spacing" },
    "m": { "value": "16px", "type": "spacing" }
  }
}

Style Dictionary

Инструмент от Amazon, который преобразует токены из одного формата в другой: JSON → CSS, SCSS, JavaScript, iOS, Android. Ключевое звено между дизайном и кодом.

// config.json — Style Dictionary
{
  "source": ["tokens/**/*.json"],
  "platforms": {
    "css": {
      "transformGroup": "css",
      "buildPath": "src/styles/",
      "files": [{ "destination": "tokens.css", "format": "css/variables" }]
    },
    "ts": {
      "transformGroup": "js",
      "buildPath": "src/lib/",
      "files": [{ "destination": "tokens.ts", "format": "javascript/es6" }]
    }
  }
}

// Запуск: npx style-dictionary build
// На выходе:
// src/styles/tokens.css — CSS-переменные
// src/lib/tokens.ts — TypeScript-константы

AI и дизайн-системы: как автоматизировать

Это главная причина, почему AI-инженеру нужна дизайн-система. AI-агенты (Cursor, Claude, Reasonix) генерируют код на основе промптов. Если у агента нет контекста о вашей дизайн-системе — он сгенерирует случайные стили.

Промпт для AI с дизайн-системой

Ты — frontend-разработчик. Твоя задача — создать страницу настроек
профиля. Используй дизайн-систему проекта:

ТОКЕНЫ (всегда используй эти переменные, не хардкодь цвета):
- Цвета: var(--color-accent), var(--color-bg-primary),
  var(--color-text-secondary), var(--color-border)
- Отступы: var(--space-s), var(--space-m), var(--space-l)
- Радиусы: var(--radius-m), var(--radius-l)
- Текст: var(--text-xs), var(--text-s), var(--text-m)

КОМПОНЕНТЫ (используй готовые, не создавай новые):
- Button: <Button variant="primary|secondary|ghost" size="sm|md|lg">
- Card: <Card padding="m" elevated>...</Card>
- Input: <Input label="Название" error="Ошибка" />

ПРАВИЛА:
- Формы: группируй поля в Card, лейблы над полями
- Кнопки: одна primary (главное действие) + ghost (отмена)
- Не используй inline-стили без крайней необходимости

AI-агенты, которые работают с дизайн-системами

Cursor
Читает ваш проект. Если в AGENTS.md описана дизайн-система — использует её токены и компоненты.
v0.dev
Генерирует UI по описанию. Можно указать: «используй shadcn/ui + Tailwind».
Claude Code
Работает как агент в терминале. Может прочитать tokens.css и использовать переменные.
Bolt.new
Генерирует full-stack приложения. Понимает Tailwind-классы и CSS-переменные.

Пошаговый план внедрения

Как внедрить дизайн-систему в существующий или новый проект:

1
Аудит
Соберите все используемые цвета, отступы, шрифты в проекте. Вы удивитесь сколько дубликатов: 5 оттенков серого, 3 синих, 8 размеров шрифта.
2
Токены
Создайте CSS-переменные для всего что нашли. Объедините похожие значения. Должно остаться: 5-7 цветов, 4-5 отступов, 3-4 размера шрифта.
3
Базовые компоненты
Выделите самые используемые элементы: Button, Input, Card, Badge. Создайте компоненты с вариантами (variant, size).
4
Документация
Поднимите Storybook. Добавьте stories для каждого компонента. Покажите все варианты и состояния.
5
AI-контекст
Опишите дизайн-систему в AGENTS.md / .cursorrules. Укажите токены, компоненты, правила использования. AI-агенты будут это читать.
6
Миграция
Постепенно заменяйте хардкод на токены и готовые компоненты. Не всё сразу — по одной странице за раз.
7
Поддержка
Дизайн-система живёт. Новые компоненты → в систему. Изменения токенов → через Style Dictionary. Документация → обновляется.

Уникальность: как не делать клонов

Главная проблема AI-разработки 2026: все проекты выглядят одинаково. Один и тот же Tailwind, один и тот же shadcn/ui, одни и те же синие кнопки и белые карточки. Пользователь заходит на сайт и думает: «Я это уже видел». Это убивает доверие и конверсию.

Почему AI генерирует одинаковый дизайн

Все используют дефолтные темы
Tailwind без кастомизации = синий, серый, белый. Shadcn/ui без темы = те же neutral/slate тона.
Одинаковые промпты
"Создай лендинг с hero, features, pricing" — AI выдаёт один и тот же шаблон, потому что его так обучили.
Страх отойти от системы
Разработчики боятся менять дизайн-систему. «Работает — не трогай». В итоге 100 сайтов выглядят как клоны.
Нет слоя бренда
Дизайн-система отвечает на «как», но не на «почему именно так». Бренд-айдентика остаётся за бортом.

Решение: слой уникальности над дизайн-системой

Дизайн-система даёт фундамент. Но поверх неё нужен слой бренда — то, что делает проект узнаваемым. Это не противоречит системе — это её расширение.

🎨 Бренд-токены
Уникальная палитра, типографика, радиусы, тени. Не дефолт Tailwind.
🧩 Компоненты
Те же Button/Card, но со стилем бренда. Не копия shadcn/ui.
📐 Дизайн-система
Токены, сетка, правила. Может быть общей для многих проектов.

6 приёмов для уникальности

1
Авторская палитра
Не берите дефолтный синий #3b82f6. Создайте свою палитру из 3-5 цветов. Используйте инструменты: Coolors.co, Huemint, AI-генераторы палитр. Пример: проект про экологию — зелёно-коричневая гамма, финтех — глубокий синий + золото.
2
Типографика с характером
Шрифт — это 50% характера. Не Inter (слишком популярен). Попробуйте: Onest (кириллица, современный), Unbounded (смелый), Raleway (элегантный). Используйте Display-шрифт для заголовков.
3
Геометрия и скругления
Радиусы создают настроение: 0px — строго, брутально; 4px — современно; 12px — мягко, дружелюбно; 9999px — pill-стиль. Смешивайте: карточки мягкие, кнопки жёсткие.
4
Микро-взаимодействия
AI не генерирует анимации. Добавьте их руками — это то, что отличает живой продукт от шаблона. Framer Motion, CSS transitions, кастомные easing-кривые.
5
Иллюстрации и иконки
Не используйте стандартные иконки без изменений. Добавьте свой стиль: duotone, обводка разной толщины, цветовые акценты. Для иллюстраций — единый стиль.
6
Тёмная тема с лицом
Не инвертируйте цвета механически. Тёмная тема — это шанс создать альтернативное настроение. Вместо чёрного фона — глубокий оттенок бренда.

Промпт для AI: «Сделай уникально»

Дайте AI-агенту контекст бренда. Не просто «создай компонент», а «создай компонент в стиле бренда X»:

Ты — frontend-разработчик. Создай карточку товара.

ДИЗАЙН-СИСТЕМА ПРОЕКТА (обязательно используй):
- Цвета: var(--brand-primary), var(--brand-accent)
- Радиусы: var(--radius-card) = 16px (мягкие)
- Шрифты: var(--font-body) = "Onest"
- Кнопки: variant="brand" (не primary/secondary из дефолта)

УНИКАЛЬНОСТЬ БРЕНДА:
- Мы — эко-маркетплейс. Никакого синего (#3b82f6).
- Акцент — золотой на тёмно-зелёном.
- Все карточки с мягкими углами (16px) и тёплыми тенями.
- Между карточками — 20px (не стандартные 16).
- Hover: карточка приподнимается на 4px с золотой тенью.

НЕ ИСПОЛЬЗУЙ:
- Дефолтные цвета Tailwind (blue-500, gray-100)
- Стандартные радиусы (8px, 12px — у нас 16px)
- Inter (у нас Onest)
- Стандартные серые тени (у нас тёплые)

Чек-лист: твой проект уникален?

Цвета не из дефолтной палитры Tailwind/shadcn (твой accent — не #3b82f6?)
Шрифт не Inter/Roboto (хотя бы заголовки — уникальный)
Радиусы не 8px везде (разные для разных элементов)
Тени с характером (не дефолтный box-shadow)
Есть фирменные микро-анимации (хотя бы на кнопках)
Иконки стилизованы (stroke-width, цвет, duotone)
Тёмная тема — не механический инверт (свои оттенки)
Промпты для AI включают бренд-контекст (цвета, шрифты, правила)

Примеры: Material, Ant, shadcn/ui

Готовые дизайн-системы, которые стоит изучить

Самая известная дизайн-система. Токены, компоненты, гайдлайны. Используется в Android, Flutter, Angular Material. Отличный пример токенов: dynamic color, тональные палитры.
🔧 Figma Kit · Material Web Components · Angular Material · Jetpack Compose
Китайская дизайн-система для enterprise-приложений. Огромная библиотека компонентов (таблицы, формы, модалки). Популярна в React-экосистеме. Хороший пример документирования.
🔧 React · Angular · Vue · Mobile · Charts
Не библиотека, а коллекция копируемых компонентов на Radix + Tailwind. Вы копируете код в свой проект и владеете им. Идеален для стартапов — быстрый старт, полный контроль.
🔧 Tailwind CSS · Radix UI · Class Variance Authority · Lucide Icons
Headless-компоненты (без стилей). Дают логику и accessibility, вы даёте стили. Идеально для своей дизайн-системы. Используется внутри shadcn/ui.
🔧 Dialog · Dropdown · Tabs · Tooltip · 30+ примитивов

Готов построить свою дизайн-систему?

Пройди Blueprint «Корпоративный сайт» — там есть этап «Дизайн-система и токены» с AI-промптами и примерами.

Пройти Blueprint →← В песочницу