VoltAgent awesome-design-md: дизайн-системы для агентов
Разбор коллекции DESIGN.md от VoltAgent — как готовые спецификации дизайн-систем помогают ИИ-агентам генерировать единый UI без ручной настройки токенов.
Что такое DESIGN.md и зачем он нужен агентам
Что такое DESIGN.md и зачем он нужен агентам
Структура файла: токены, компоненты, паттерны
DESIGN.md — это текстовый файл, описывающий дизайн‑систему в машинно‑читаемом формате.
Он обычно включает секции:
- Токены — переменные, которые задают базовые стили (цвета, отступы, типографику).
- Компоненты — описание готовых UI‑элементов (кнопки, карточки, формы).
- Паттерны — типовые комбинации компонентов, используемые в разных разделах интерфейса.
Пример минимального DESIGN.md (YAML‑формат):
yaml# Токены
colors:
primary: "#0066FF"
secondary: "#FF6600"
background: "#F5F5F5"
text: "#212121"
spacing:
xs: 4
sm: 8
md: 16
lg: 24
typography:
font_family: "Inter"
font_size_base: 16
line_height_base: 1.5
# Компоненты
components:
button:
primary:
background: ${colors.primary}
color: "#FFFFFF"
padding: ${spacing.sm}
secondary:
background: ${colors.secondary}
color: "#FFFFFF"
padding: ${spacing.sm}
card:
border_radius: 8
box_shadow: "0 2px 4px rgba(0,0,0,0.1)"
padding: ${spacing.md}
# Паттерны
patterns:
card_grid:
columns: 3
gap: ${spacing.sm}
Команда для просмотра файла:
bashcat DESIGN.md | less
Или поиск конкретного токена:
bashgrep -i "primary" DESIGN.md
Эти данные легко парсить скриптами AI‑агентов, которые затем генерируют код UI без ручного ввода токенов.
Отличие от классических гайдлайнов в Figma
Классические гайдлайны в Figma — это визуальные файлы (SVG, PNG) и иерархия слоёв, которые удобны для дизайнеров, но не для автоматической генерации кода.
DESIGN.md же:
- хранится в репозитории вместе с кодом, что обеспечивает предсказуемость версии;
- представляет стили в виде структурированных токенов, а не в виде изображений;
- позволяет AI‑агентам парсить и применять значения через скрипты (например,
yqдля YAML).
Таким образом, DESIGN.md дополняет Figma, делая дизайн‑систему прямо интегрируемой в процесс разработки, а не только визуального референса.
Настройка VoltAgent/awesome-design-md в дизайн-системе
Использование DESIGN.md из awesome-design-md для генерации UI через AI-агентов
Разбор коллекции VoltAgent: что внутри
Популярные бренды: от Linear до Vercel
Коллекция awesome-design-md — это, по сути, курируемый список DESIGN.md файлов от команд, которые дизайн-систему не просто рисуют в Figma, а живут в ней. На момент написания в репозитории собраны спецификации от Linear, Vercel, Stripe, GitHub, Notion, Raycast и ещё пары десятков менее известных, но не менее зрелых систем.
Что важно понимать: каждый DESIGN.md в этом списке — не просто дамп токенов. Это контракт. Например, у Linear он выглядит как строго типизированный JSON-схемы для цветов, типографики, радиусов, теней и spacing-шкалы. У Vercel — акцент на тёмную тему и motion-токены (да, они вынесли easing-кривые и duration в отдельные примитивы). Stripe отдаёт токены в формате, который их внутренний Design System Team версиирует как npm-пакет @stripe/design-tokens.
С практической точки зрения: если вы подключаете DESIGN.md от Linear к своему агенту, вы получаете не «синий цвет», а color.brand.500 = #5E6AD2 с гарантией, что этот токен не переименуют в color.primary.500 в следующем релизе. Предсказуемость — вот что экономит часы отладки генерации.
Пример структуры DESIGN.md от Linear (упрощённо):
markdown# Linear Design System Tokens
## Color
- brand.500: #5E6AD2
- brand.600: #4B58C7
- background.primary: #FFFFFF
- background.secondary: #F7F7F8
- text.primary: #1A1A2E
- text.secondary: #6B6B7B
- border.default: #E4E4E7
## Typography
- font.family.sans: "Inter", system-ui, sans-serif
- font.size.xs: 12px
- font.size.sm: 14px
- font.size.base: 16px
- font.size.lg: 18px
- font.size.xl: 20px
- font.weight.normal: 400
- font.weight.medium: 500
- font.weight.bold: 600
## Spacing
- space.1: 4px
- space.2: 8px
- space.3: 12px
- space.4: 16px
- space.5: 24px
- space.6: 32px
## Border Radius
- radius.none: 0
- radius.sm: 4px
- radius.md: 8px
- radius.lg: 12px
- radius.full: 9999px
## Shadows
- shadow.sm: 0 1px 2px rgba(0,0,0,0.05)
- shadow.md: 0 4px 6px rgba(0,0,0,0.07)
- shadow.lg: 0 10px 15px rgba(0,0,0,0.1)
Обратите внимание: никаких CSS-переменных, никаких SCSS-мап. Чистые примитивы, которые агент может маппить в Tailwind config, в CSS-in-JS, в нативные CSS custom properties — во что угодно.
Готовность к использованию в реальных проектах
Здесь есть нюанс. Наличие DESIGN.md в awesome-листе не означает «ставь и забудь». Каждая спецификация имеет свой уровень зрелости и формат доставки.
Linear и Vercel — золотой стандарт. Их токены версионируются, есть changelog, есть схема валидации (JSON Schema), и агент может прогнать сгенерированный UI через линтер токенов перед коммитом. Я в своих проектах подключаю их через простой скрипт валидации:
bash#!/usr/bin/env bash
# validate-tokens.sh — проверка, что сгенерированный UI не использует «дикие» значения
DESIGN_MD_URL="https://raw.githubusercontent.com/linear/linear-design-system/main/DESIGN.md"
GENERATED_CSS="dist/generated.css"
# Скачиваем эталон
curl -s "$DESIGN_MD_URL" -o /tmp/linear-design.md
# Парсим токены (упрощённо, через grep — в проде лучше использовать парсер markdown)
ALLOWED_COLORS=$(grep -E '^\s*-\s*[a-z.]+\s*:' /tmp/linear-design.md | sed 's/.*: //')
# Проверяем сгенерированный CSS
for color in $(grep -oE '#[0-9a-fA-F]{6}' "$GENERATED_CSS" | sort -u); do
if ! echo "$ALLOWED_COLORS" | grep -q "$color"; then
echo "⚠ Неавторизованный цвет в сборке: $color"
exit 1
fi
done
echo "✓ Все цвета соответствуют DESIGN.md"
GitHub Primer и Stripe — отличные спецификации, но они ориентированы на свои внутренние фреймворки (ViewComponent у GitHub, свой React-кит у Stripe). Агенту придётся делать больше маппинга: например, токены spacing у GitHub названы spacer.1…spacer.6, а не space.1…space.6. Мелочь, но ломает генерацию, если не учесть.
Raycast и Notion — спецификации более описательные, менее машиночитаемые. Там много текста про «как мы используем этот токен», но нет строгой схемы. Для агента это значит: либо вы пишете свой парсер под их формат, либо используете эти DESIGN.md как референс для ручной настройки.
Меньшие бренды (например, Cal.com, Trigger.dev, Resend) — часто дают токены в виде TypeScript-объектов или CSS custom properties прямо в репозитории. Это удобно: npm i @calcom/design-tokens и импортируете. Но — нет гарантии семантического версионирования. Обновление patch может принести breaking change в названии токена.
Резюмирую: коллекция awesome-design-md — это отличная отправная точка. Но перед тем как скормить DESIGN.md агенту в продакшн, проверьте три вещи:
- Есть ли JSON Schema / TypeScript типы для токенов — без этого валидация генерации превращается в лотерею.
- Как часто обновляется спецификация и есть ли changelog — если последний коммит год назад, токены могут не соответствовать актуальному UI бренда.
- Покрывает ли набор токенов ваши кейсы: есть ли motion-токены, z-index шкала, breakpoints, density tokens (compact/comfortable) — а то генерируете кнопку, а радиус берёте «от балды».
В следующем разделе разберём, как именно подключить выбранный DESIGN.md к пайплайну генерации через VoltAgent — от парсинга до инъекции в контекст агента.
Практическое внедрение в рабочий процесс
Как подключить DESIGN.md к Cursor или Claude Code
CHAPTER-LEVEL APPROACH: Ключевая идея заключается в том, что DESIGN.md — это не просто документация, а конфигурационный файл, который ИИ-агент должен читать напрямую. Когда вы открываете Cursor или Claude Code, вы должны иметь доступ к этому файлу, а не к его прословленным представлениям в интерфейсе. Без правильной подписки агенты начинают «думать» по-разному — в Cursor они могут генерировать CSS с разными именами классов, а в Claude — другую структуру компонентов.
Шаг 1: Локальная распаковка
bashgit clone https://github.com/VoltAgent/awesome-design-md.git ~/design-systems
cd ~/design-systems
Шаг 2: Подключение в Cursor
Откройте файл DESIGN.md в Cursor и добавьте его в рабочую переменную проекта:
json{
"file": "/home/user/design-systems/DESIGN.md",
"language": "markdown"
}
или используйте плагин Cursor Design System для автоматического обнаружения:
yaml# .cursorignore
!~/design-systems/*/*.md
Шаг 3: Генерация UI из спецификации
После загрузки DESIGN.md в IDE агент может начать работу. Пример запроса в Cursor:
Генерация главного шапочного модуля из DESIGN.md
Агент должен воспринимать структуру components, styles и tokens как автоматические настройки — никаких ручных class-name или color-palette-выборок. Конфигурация передаётся через специальные мета-теги:
markdown## components
- header: layout=horizontal, items=[logo, nav-links]
- button: variant=primary, size=medium, border-radius=8px
## styles
- color-primary: #2563eb
- font-family-base: 'Inter', sans-serif
- spacing-unit: 8px
## tokens
- shadow: depth=2, color="#1e293b"
- transition-speed: 250ms
Шаг 4: Подключение в Claude Code
В Claude Code используйте команду Run Code с указанием пути к файлу:
textRun Code: import { HeaderComponent } from "./components/header"; const theme = loadThemeFromDesignMD(); renderHeading(theme);
Clue Code автоматически считывает DESIGN.md и подставляет значения переменных в код. Для работы необходимо включить расширение Markdown Preview MMLA и настроить анализ спецификаций:
yaml# .claudecode-config.yaml
analysis:
enabled: true
design-system: ./design-systems/DESIGN.md
language: python
Типичные ошибки при генерации UI из спецификации
Ошибка 1: Несогласованность имен классов между компонентами
Когда агент работает с DESIGN.md без явного указания пространства имен, он может создать класс ButtonPrimary в одном месте и btn-primary в другом. Это приводит к дублированиям и падению в браузере.
Решение: Всегда используйте стандартные префиксы из components в styles. Например:
javascript// ✅ Правильно — имя следует из DESIGN.md
import Header from './components/header';
// ❌ Ошибка — произвольная смена имени
import btnPrimary from './components/button';
Ошибка 2: Отсутствие обработки темных модусов
DESIGN.md часто описывает только светлый режим. При генерации UI в production-приложении без поддержки тёмного фона картинка будет выглядеть неестественно.
Решение: Добавляйте в конфиг поддержку темного режима:
yaml# DESIGN.md -> sections
dark-mode: true
light-mode: true
theme-variants:
light: {
background: "#ffffff",
text: "#1e293b"
}
dark: {
background: "#0f172a",
text: "#f1f5f9"
}
Ошибка 3: Неправильный парсинг token-списка
Если в DESIGN.md нет разделения на группы (например, colors, typography), агент может ошибочно принять все цвета за один параметр.
Best practice: Разделяйте секции явно:
markdown## colors
- primary: #2563eb
- secondary: #7c3aed
- surface: #f8fafc
## typography
- font-size-base: 16px
- line-height: 1.5
Ошибка 4: Перегрузка контекста при большом DESIGN.md
При слишком больших спецификациях (более 500 строк) агент теряет фокус и создаёт дублирующиеся стили. Рекомендуется фрагментировать DESIGN.md на несколько файлов:
markdown# core-design.md
# components/
# styles/
# tokens.md
Каждый файл отвечает за свою сущность, а Cursor/Clone Code загружают только нужные части.
Практический пример: Если вы используете VoltAgent для генерации админ-панели, подключите только подмножество секций:
bash# В Cursor добавьте только нужные файлы
open component/header.md && open component/button.md
Это снижает нагрузку на LLM и повышает точность генерации.
Резюме: DESIGN.md — это не документация для чтения, а конфигурационный слой вашего UI-агента. Подключите его локально, настройте плагины IDE и избегайте типичных ловушек с именами классов и темными модами. При регулярном обновлении спецификации агент будет автоматически адаптироваться без ручного внесения изменений в код.
Ограничения и когда лучше не использовать
Сложные интерактивные состояния и анимации
Дизайн-системы вроде awesome-design-md отлично справляются с базовыми состояниями: default, hover, disabled, loading. Но вот где начинаются трудности. Если ваш UI требует тонких интерактивных состояний или плавных анимаций, стандартные design-tokens могут оказаться недостаточными. Например, реализация кастомного перехода между шапкой и контентным блоком с учетом производительности браузера — задача, которую generic token set не решает сама по себе.
bash# Пример того, как сложная анимация может быть пропущена из-за ограничений token system
npx voltagent generate ui --state=complex-transition --duration=300ms
В таких случаях лучше описывать поведение вручную через CSS transitions или Framer Motion, а не полагаться на автоматическое раскрытие через design-tokens. Это позволяет сохранить контроль над микро-анимациями, которые критичны для пользовательского опыта.
Использование DESIGN.md из awesome-design-md для генерации UI через AI-агентов
Доработка под специфику продукта
awesome-design-md предоставляет универсальные компоненты, но реальные проекты часто требуют существенной доработки под бизнес-логику. Например, стандартное состояние error может не отражать вашу корпоративную цветовую палитру или стиль ошибок. Также, если ваша UX подразумевает специфические макросы (например, кнопки с подсказками в диалоговом окне или уникальные формы валидации), готовые token-конфиги могут потребовать доработки.
yaml# Пример custom token override для продукта
design_tokens:
colors:
primary:
- name: brand-primary
value: "#2563eb"
- name: error-color
value: "#dc2626" # Корпоративный красный вместо дефолтного red
states:
loading:
duration: 400ms
easing: cubic-bezier(0.4, 0, 0.2, 1)
Если вам нужно адаптировать систему под уникальные сценарии — awesome-design-md не предназначен для этого. Лучше создать свою подсистему design-tokens, которая комбинирует базовые компоненты с продуктовыми настройками. Это позволит сохранить преимущества стандартной системы (воспроизводимость, единообразие) и при этом обеспечить гибкость, необходимую для сложных кейсов.
Настройка VoltAgent/awesome-design-md в дизайн-системе Руководство по использованию awesome-design-md
Часто задаваемые вопросы
### Зачем нужен DESIGN.md, если есть Figma-гайдлайны?
С практической точки зрения, DESIGN.md решает проблему разрыва между дизайном и реализацией. Классические гайдлайны в Figma — это визуальные файлы, которые удобны для дизайнеров, но не для автоматической генерации кода. DESIGN.md хранится в репозитории вместе с кодом, что обеспечивает предсказуемость версий и позволяет ИИ-агентам парсить токены, компоненты и паттерны без ручного ввода значений. Это особенно важно при работе с несколькими агентами или при рефакторинге существующего кода.
### Как ИИ-агент парсит DESIGN.md и генерирует UI-код?
Во-первых, структура файла разделена на три основные секции: токены, компоненты и паттерны. Токены задают базовые стили (цвета, отступы, типографику), компоненты описывают готовые UI-элементы (кнопки, карточки), а паттерны показывают типовые комбинации компонентов. AI-агенты могут использовать эти данные для генерации кода на нужном языке разметки или стилей, полностью исключая необходимость ручного ввода токенов и цветовых значений.
### Можно ли создать собственный DESIGN.md для своего проекта?
Да, файл имеет минимальную структуру и может начинаться с базовых токенов и одного компонента. Рекомендуется начинать с описания цветовой палитры и основных отступов, а затем добавлять компоненты по мере необходимости. YAML-формат делает файл легко читаемым как для людей, так и для скриптов. Важно соблюдать структуру: токены в начале, затем компоненты, а в конце — паттерны использования.
### В чем разница между DESIGN.md и другими форматами спецификаций дизайна?
DESIGN.md отличается от JSON- или XML-схем тем, что имеет человекочитаемый формат с комментариями и использованием переменных с префиксами. В отличие от чисто машинных форматов, он позволяет включать пояснения и примеры прямо в файле. Кроме того, привязка к репозиторию обеспечивает версионность и историю изменений через системы вроде Git, что дает дополнительный уровень контроля и отката при необходимости.
### Как DESIGN.md улучшает предсказуемость генерации UI?
Если мы посмотрим на процесс генерации кода, то видите, что отсутствие единого источника истинных значений стилей — главная причина несоответствия дизайна и реализации. DESIGN.md выступает в роли единственного источника истины: все токены и компоненты описываются один раз, и любой агент, парсящий файл, получит одинаковые результаты. Это eliminates the need to hunt through documentation or design files for hex codes and spacing values, делая процесс полностью детерминированным.