Система вариантов
Назначение и область применения
Система вариантов — это базовый слой стилизации@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.Обзор категорий вариантов
Источники: README.md174-217 src/components/README.md206-221
Варианты отступов
Варианты отступов управляют padding и margin с использованием последовательной шкалы. Каждый вариант поддерживает направленные модификаторы.Структура вариантов отступов
Варианты цветов
Варианты цветов применяют семантические цветовые токены системы дизайна к фону, тексту и границам. Цвета автоматически поддерживают темную тему через переменные Tailwind CSS.Отображение вариантов цветов
Варианты макета
Варианты макета управляют размерами и позиционированием элементов. Варианты ширины и высоты поддерживают адаптивное и внутреннее изменение размеров.Значения размеров макета
Примеры использования:
Варианты типографики
Варианты типографики управляют внешним видом текста: размером, весом, выравниванием и межстрочным интервалом (line height).Матрица вариантов типографики
Варианты эффектов
Варианты эффектов применяют визуальные улучшения: скругленные углы, тени и границы.Категории вариантов эффектов
Примеры использования:
Движок 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 и валидацию во время компиляции
- Паттерны композиции: Варианты легко комбинируются в примитивах, композитах и макетах