Система вариантов
Назначение и область применения
Система вариантов — это базовый слой стилизации@ui8kit/core, предоставляющий подход к стилизации компонентов на основе CVA (class-variance-authority). Эта система группирует утилитарные классы Tailwind CSS в 12 композируемых, переиспользуемых категорий вариантов, которые покрывают приблизительно 80% сценариев дизайна, устраняя необходимость в ручном управлении className и сокращая дублирование стилей в компонентах.
Данный документ охватывает архитектуру вариантов, 12 категорий вариантов, генерацию классов CVA, механику извлечения и паттерны композиции. Для информации о том, как компоненты используют эти варианты, см. Базовые компоненты и UI-компоненты. Для извлечения классов вариантов во время сборки см. Система сборки.
Источники: README.md170-217 .devin/wiki.json19-22
Обзор архитектуры
Система вариантов работает как конвейер из трех этапов: определения вариантов, разрешение CVA и применение классов.Конвейер системы вариантов
12 категорий вариантов
Система предоставляет 12 категорий вариантов, организованных по области дизайна. Каждая категория преобразует понятные разработчику имена пропсов в утилитарные классы Tailwind CSS.Обзор категорий вариантов
| Категория | Пропсы вариантов | Диапазон значений | Назначение |
|---|---|---|---|
| Отступы | p, m, px, py, pt, pb, pl, pr, mx, my, mt, mb, ml, mr | none, xs, sm, md, lg, xl, 2xl, auto | Управление padding и margin |
| Цвета | bg, c, borderColor | Токены системы дизайна: primary, secondary, accent, destructive, muted, card, background, foreground и т.д. | Применение семантических цветов |
| Макет - Размеры | w, h, minH, maxW | auto, full, screen, fit, min, max | Управление шириной и высотой |
| Макет - Позиция | position | static, relative, absolute, fixed, sticky | Позиционирование элементов |
| Типографика - Размер | size | xs, sm, base, lg, xl, 2xl, 3xl, 4xl, 5xl | Масштабирование размера шрифта |
| Типографика - Вес | weight, fw | normal, medium, semibold, bold | Управление весом шрифта |
| Типографика - Выравнивание | align, ta | left, center, right, justify | Выравнивание текста |
| Типографика - Межстрочный интервал | leading | tight, normal, relaxed | Управление высотой строки |
| Эффекты - Скругление | rounded | none, sm, md, lg, xl, 2xl, 3xl, full | Радиус границ |
| Эффекты - Тень | shadow | none, sm, md, lg, xl, 2xl, inner | Применение box shadow |
| Эффекты - Граница | border | 0, default, 2, 4 + направленные варианты | Толщина границы |
| Flexbox/Grid | gap, justify, items, cols, rows | Контекстные значения | Выравнивание и отступы в макете |
Варианты отступов
Варианты отступов управляют padding и margin с использованием последовательной шкалы. Каждый вариант поддерживает направленные модификаторы.Структура вариантов отступов
Варианты цветов
Варианты цветов применяют семантические цветовые токены системы дизайна к фону, тексту и границам. Цвета автоматически поддерживают темную тему через переменные Tailwind CSS.Отображение вариантов цветов
Варианты макета
Варианты макета управляют размерами и позиционированием элементов. Варианты ширины и высоты поддерживают адаптивное и внутреннее изменение размеров.Значения размеров макета
| Пропс | Значения | Сгенерированные классы | Вариант использования |
|---|---|---|---|
w | auto, full, screen, fit, min, max, px, числовые | w-auto, w-full, w-screen, w-fit, w-3 до w-12 | Управление шириной |
h | auto, full, screen, fit, min, max, px, числовые | h-auto, h-full, h-screen, h-fit, h-3 до h-12 | Управление высотой |
minH | full, screen, 200px, 300px, 400px, 500px | min-h-full, min-h-screen, min-h-[200px] | Минимальная высота |
maxW | none, sm, md, lg, xl, 2xl, 4xl, 6xl, full, screen-* | max-w-sm, max-w-md, max-w-screen-lg | Ограничения максимальной ширины |
position | static, relative, absolute, fixed, sticky | static, relative, absolute, fixed, sticky | Режим позиционирования |
Варианты типографики
Варианты типографики управляют внешним видом текста: размером, весом, выравниванием и межстрочным интервалом (line height).Матрица вариантов типографики
Варианты эффектов
Варианты эффектов применяют визуальные улучшения: скругленные углы, тени и границы.Категории вариантов эффектов
| Категория | Пропс | Значения | Сгенерированные классы |
|---|---|---|---|
| Скругление | rounded | none, sm, md, lg, xl, 2xl, 3xl, full | rounded-none, rounded-sm, rounded-md, rounded-lg, rounded-xl, rounded-2xl, rounded-3xl, rounded-full |
| Тень | shadow | none, sm, md, lg, xl, 2xl, inner | shadow-none, shadow-sm, shadow-md, shadow-lg, shadow-xl, shadow-2xl, shadow-inner |
| Граница | border | 0, default, 2, 4 + направленные (t, r, b, l) | border-0, border, border-2, border-4, border-t, border-r, border-b, border-l |
Движок CVA и генерация классов
Система вариантов используетclass-variance-authority (CVA) для преобразования API на основе пропсов в классы Tailwind CSS.
Поток обработки CVA
Система извлечения и белого списка
Система сборки извлекает все классы, определенные в CVA, чтобы сгенерировать белый список для очистки Tailwind CSS и утилитtw-merge.
Конвейер извлечения
-
Рекурсивное сканирование
src/core/variants/для файлов.tsи.tsxscripts/cva-extractor.ts67-93 -
Разбор TypeScript с использованием парсера Babel с плагинами
['typescript', 'jsx']scripts/cva-extractor.ts103-106 -
Обход AST для поиска узлов
CallExpression, где callee являетсяcvascripts/cva-extractor.ts114-125 -
Извлечение классов из:
- Строковых литералов (базовые классы) scripts/cva-extractor.ts129-137
- Объектных выражений (определения вариантов) scripts/cva-extractor.ts138-142
- Вложенных объектов и массивов scripts/cva-extractor.ts164-195
- Разделение по пробелам для отделения отдельных имен классов scripts/cva-extractor.ts200-203
- Дедупликация в Set, затем сортировка по алфавиту scripts/cva-extractor.ts46-51
Композиция вариантов
Варианты спроектированы как композируемые — несколько вариантов могут быть объединены в одном компоненте для достижения сложных дизайнов.Паттерны композиции
Приоритет композиции
Когда варианты конфликтуют, порядок приоритета следующий:- Пропсы, специфичные для компонента (более высокая специфичность)
- Направленные варианты (
px,py) переопределяют общие варианты (p) - Последний пропс побеждает в списке пропсов компонента
- Пропс
classNameпереопределяет все варианты (аварийный люк)
Типобезопасность и IntelliSense
Система вариантов обеспечивает полную поддержку TypeScript для типобезопасного использования пропсов и автодополнения IntelliSense.Структура определения типов
- Автодополнение: Введите
<Card p=и IntelliSense покажет'none' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' - Проверка типов: Использование
<Card p="invalid">приводит к ошибке TypeScript - Документация: Наведите курсор на пропсы, чтобы увидеть доступные значения
- Рефакторинг: Безопасное переименование значений вариантов во всей кодовой базе
Структура файлов системы вариантов
Система вариантов организована по областям вsrc/core/variants/:
Паттерны использования
Паттерн 1: Прямое использование примитивов
Примитивы (Block, Box, Grid, Flex, Stack) непосредственно применяют варианты:
Паттерн 2: Проброс пропсов композитных компонентов
Композитные компоненты (Card, Button, Badge) расширяют примитивы и пробрасывают пропсы вариантов:
Паттерн 3: Композиция шаблонов макета
Макеты используют варианты для последовательных отступов и структуры:Резюме
Система вариантов обеспечивает базовый слой стилизации для@ui8kit/core через:
- 12 композируемых категорий: Отступы, цвета, макет, типографика и эффекты, покрывающие ~80% сценариев дизайна
- Движок на основе CVA: Типобезопасное разрешение вариантов с использованием
class-variance-authority - 618 извлеченных классов: Извлечение во время сборки генерирует белый список для очистки Tailwind
- API на основе пропсов: Чистый опыт разработчика с
p="lg"вместоclassName="p-8" - Полная типобезопасность: Типы TypeScript обеспечивают IntelliSense и валидацию во время компиляции
- Паттерны композиции: Варианты легко комбинируются в примитивах, композитах и макетах