Skip to main content

Система вариантов

Назначение и область применения

Система вариантов — это базовый слой стилизации @ui8kit/core, предоставляющий подход к стилизации компонентов на основе CVA (class-variance-authority). Эта система группирует утилитарные классы Tailwind CSS в 12 композируемых, переиспользуемых категорий вариантов, которые покрывают приблизительно 80% сценариев дизайна, устраняя необходимость в ручном управлении className и сокращая дублирование стилей в компонентах. Данный документ охватывает архитектуру вариантов, 12 категорий вариантов, генерацию классов CVA, механику извлечения и паттерны композиции. Для информации о том, как компоненты используют эти варианты, см. Базовые компоненты и UI-компоненты. Для извлечения классов вариантов во время сборки см. Система сборки. Источники: README.md170-217 .devin/wiki.json19-22

Обзор архитектуры

Система вариантов работает как конвейер из трех этапов: определения вариантов, разрешение CVA и применение классов.

Конвейер системы вариантов

Источники: README.md64-88 scripts/cva-extractor.ts282-291 src/lib/core-classes.json1-624

12 категорий вариантов

Система предоставляет 12 категорий вариантов, организованных по области дизайна. Каждая категория преобразует понятные разработчику имена пропсов в утилитарные классы Tailwind CSS.

Обзор категорий вариантов

Источники: README.md174-217 src/components/README.md206-221

Варианты отступов

Варианты отступов управляют padding и margin с использованием последовательной шкалы. Каждый вариант поддерживает направленные модификаторы.

Структура вариантов отступов

Примеры использования:
Извлеченные классы (образец):
Источники: README.md174-181 src/lib/core-classes.json261-463 src/components/README.md209-212

Варианты цветов

Варианты цветов применяют семантические цветовые токены системы дизайна к фону, тексту и границам. Цвета автоматически поддерживают темную тему через переменные Tailwind CSS.

Отображение вариантов цветов

Примеры использования:
Извлеченные классы (образец):
Источники: README.md183-190 src/lib/core-classes.json26-576

Варианты макета

Варианты макета управляют размерами и позиционированием элементов. Варианты ширины и высоты поддерживают адаптивное и внутреннее изменение размеров.

Значения размеров макета

Примеры использования:
Извлеченные классы (образец):
Источники: README.md192-199 src/lib/core-classes.json196-606

Варианты типографики

Варианты типографики управляют внешним видом текста: размером, весом, выравниванием и межстрочным интервалом (line height).

Матрица вариантов типографики

Примеры использования:
Извлеченные классы:
Источники: README.md201-208 src/lib/core-classes.json150-579

Варианты эффектов

Варианты эффектов применяют визуальные улучшения: скругленные углы, тени и границы.

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

Примеры использования:
Направленные варианты границ:
Извлеченные классы (образец):
Источники: README.md210-217 src/lib/core-classes.json48-540

Движок CVA и генерация классов

Система вариантов использует class-variance-authority (CVA) для преобразования API на основе пропсов в классы Tailwind CSS.

Поток обработки CVA

Паттерн определения CVA: Паттерн CVA, используемый в файлах вариантов, следует этой структуре:
Паттерн использования в компоненте: Компоненты импортируют и применяют варианты:
Источники: scripts/cva-extractor.ts114-143 README.md283-304

Система извлечения и белого списка

Система сборки извлекает все классы, определенные в CVA, чтобы сгенерировать белый список для очистки Tailwind CSS и утилит tw-merge.

Конвейер извлечения

Детали скрипта извлечения: Скрипт извлечения scripts/cva-extractor.ts1-339 реализует следующие шаги:
  1. Рекурсивное сканирование src/core/variants/ для файлов .ts и .tsx scripts/cva-extractor.ts67-93
  2. Разбор TypeScript с использованием парсера Babel с плагинами ['typescript', 'jsx'] scripts/cva-extractor.ts103-106
  3. Обход AST для поиска узлов CallExpression, где callee является cva scripts/cva-extractor.ts114-125
  4. Извлечение классов из:
  5. Разделение по пробелам для отделения отдельных имен классов scripts/cva-extractor.ts200-203
  6. Дедупликация в Set, затем сортировка по алфавиту scripts/cva-extractor.ts46-51
Структура сгенерированного белого списка: Выходной файл src/lib/core-classes.json1-624 содержит:
Использование в конфигурации Tailwind:
Источники: scripts/cva-extractor.ts1-339 src/lib/core-classes.json1-624

Композиция вариантов

Варианты спроектированы как композируемые — несколько вариантов могут быть объединены в одном компоненте для достижения сложных дизайнов.

Паттерны композиции

Приоритет композиции

Когда варианты конфликтуют, порядок приоритета следующий:
  1. Пропсы, специфичные для компонента (более высокая специфичность)
  2. Направленные варианты (px, py) переопределяют общие варианты (p)
  3. Последний пропс побеждает в списке пропсов компонента
  4. Пропс className переопределяет все варианты (аварийный люк)
Пример: Переопределение направления
Пример: Аварийный люк className
Источники: src/components/README.md238-257

Типобезопасность и IntelliSense

Система вариантов обеспечивает полную поддержку TypeScript для типобезопасного использования пропсов и автодополнения IntelliSense.

Структура определения типов

Пример определения типов:
Преимущества IntelliSense:
  1. Автодополнение: Введите <Card p= и IntelliSense покажет 'none' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'
  2. Проверка типов: Использование <Card p="invalid"> приводит к ошибке TypeScript
  3. Документация: Наведите курсор на пропсы, чтобы увидеть доступные значения
  4. Рефакторинг: Безопасное переименование значений вариантов во всей кодовой базе
Источники: README.md11-12

Структура файлов системы вариантов

Система вариантов организована по областям в src/core/variants/:
Паттерн экспорта: Все варианты экспортируются из src/index.ts1-3:
Это позволяет потребителям импортировать варианты:
Источники: src/index.ts1-3

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

Паттерн 1: Прямое использование примитивов

Примитивы (Block, Box, Grid, Flex, Stack) непосредственно применяют варианты:
Источники: README.md82-103 src/components/README.md23-92

Паттерн 2: Проброс пропсов композитных компонентов

Композитные компоненты (Card, Button, Badge) расширяют примитивы и пробрасывают пропсы вариантов:
Источники: README.md38-145 src/components/README.md94-149

Паттерн 3: Композиция шаблонов макета

Макеты используют варианты для последовательных отступов и структуры:
Источники: README.md147-168

Резюме

Система вариантов обеспечивает базовый слой стилизации для @ui8kit/core через:
  • 12 композируемых категорий: Отступы, цвета, макет, типографика и эффекты, покрывающие ~80% сценариев дизайна
  • Движок на основе CVA: Типобезопасное разрешение вариантов с использованием class-variance-authority
  • 618 извлеченных классов: Извлечение во время сборки генерирует белый список для очистки Tailwind
  • API на основе пропсов: Чистый опыт разработчика с p="lg" вместо className="p-8"
  • Полная типобезопасность: Типы TypeScript обеспечивают IntelliSense и валидацию во время компиляции
  • Паттерны композиции: Варианты легко комбинируются в примитивах, композитах и макетах
Эта архитектура устраняет дублирование стилей, снижает сложность CSS и поддерживает типобезопасность, обеспечивая неограниченную гибкость дизайна через композицию. Источники: README.md1-453 .devin/wiki.json19-22 scripts/cva-extractor.ts1-339 src/lib/core-classes.json1-624