UI-компоненты
Назначение и область применения
Эта страница документирует композитные UI-компоненты уровня 2, расположенные вsrc/components/ui/. Эти 15 компонентов предоставляют удобный для разработчиков API, который расширяет базовые примитивы с помощью проброса пропсов, интеграции вариантов и семантических паттернов композиции.
Для документации по базовым примитивам (Box, Block, Grid, Flex, Stack) см. Базовые компоненты. Для системы вариантов, обеспечивающей стилизацию, см. Система вариантов. Для полного справочника API, включая все пропсы, см. Справочник API UI-компонентов.
Источники: README.md105-145 src/components/README.md1-20 .devin/wiki.json75-84
Позиция в архитектуре
UI-компоненты занимают уровень 2 в трёхуровневой архитектуре, располагаясь между базовыми примитивами и шаблонами макетов:Основные принципы
1. Архитектура проброса пропсов
UI-компоненты расширяют базовые примитивы, пробрасывая пропсы вариантов и добавляя специфичную для компонента функциональность. Этот паттерн позволяет разработчикам использовать пропсы для отступов, макетов и стилизации напрямую без управленияclassName:
2. Композиция типов TypeScript
Компоненты достигают типобезопасности путём композиции интерфейсов из нескольких источников типов вариантов:3. Соглашение data-class
Все UI-компоненты применяют семантические атрибутыdata-class для согласованного таргетирования DOM и тестирования. Это соглашение позволяет использовать CSS-селекторы и запросы для тестов без зависимости от динамически генерируемых имён классов:
| Компонент | Корневой data-class | data-class подкомпонентов |
|---|---|---|
| Badge | data-class="badge" | badge-dot, badge-left-section, badge-right-section |
| Card | data-class="card" | card-header, card-title, card-description, card-content, card-footer |
| Accordion | data-class="accordion" | accordion-item, accordion-trigger, accordion-content |
| Button | data-class="button" | button-left-section, button-right-section |
4. Паттерн составных компонентов
Сложные компоненты используют вложенные подкомпоненты с общим контекстом для гибкой композиции:Полный каталог компонентов
Библиотека предоставляет 15 композитных UI-компонентов, организованных по функциональным категориям:| Компонент | Расположение | Базовый примитив | Основное назначение | Ключевые варианты |
|---|---|---|---|---|
| Button | src/components/ui/Button | BaseButton | Интерактивные действия | buttonStyleVariants, buttonSizeVariants |
| Card | src/components/ui/Card | BaseCard | Контейнеры для контента | spacingVariants, roundedVariants, shadowVariants |
| Badge | src/components/ui/Badge | BaseBadge | Индикаторы статуса | badgeSizeVariants, badgeStyleVariants |
| Text | src/components/ui/Text | Box | Семантические текстовые элементы | typographyVariants, colorVariants |
| Title | src/components/ui/Title | Box | Иерархия заголовков (h1-h6) | typographyVariants, colorVariants |
| Container | src/components/ui/Container | Block | Адаптивные контейнеры | layoutVariants, spacingVariants |
| Icon | src/components/ui/Icon | Box | Обёртка для SVG-иконок | colorVariants, spacingVariants |
| Image | src/components/ui/Image | Box | Оптимизированные изображения | roundedVariants, shadowVariants, layoutVariants |
| Group | src/components/ui/Group | Flex | Горизонтальная группировка | flexVariants, spacingVariants |
| Stack | src/components/ui/Stack | Flex | Вертикальное/горизонтальное размещение | flexVariants, spacingVariants |
| Grid | src/components/ui/Grid | Grid | CSS Grid макеты | gridVariants, spacingVariants |
| Sheet | src/components/ui/Sheet | Block | Выдвижные панели/шиты | layoutVariants, shadowVariants |
| Accordion | src/components/ui/Accordion | На основе контекста | Раскрывающиеся секции | flexVariants, layoutVariants |
| Flex | src/components/ui/Flex | Flex | Flexbox макеты | flexVariants, spacingVariants |
| Block | src/components/ui/Block | Block | Семантические секции | Все варианты через проброс |
Реализация проброса пропсов
Паттерн деструктуризации и проброса
UI-компоненты используют согласованный паттерн для проброса пропсов, проиллюстрированный реализацией Badge:- Выборочная деструктуризация - Извлечение только тех пропсов вариантов, которые использует компонент
- Оператор spread - Сбор оставшихся HTML-атрибутов в
...props - Разрешение CVA - Применение каждой функции варианта с соответствующим пропсом
- Слияние классов - Использование утилиты
cn()для слияния всех строк классов - Проброс - Передача объединённого className и распакованных пропсов в базовый компонент
Паттерны интеграции вариантов
Мультивариантная композиция
Компоненты обычно интегрируют 3-7 категорий вариантов одновременно:Паттерн импорта и применения
Каждый UI-компонент следует этой структуре импорта:Архитектура типобезопасности
Стратегия композиции интерфейсов
UI-компоненты составляют свои TypeScript-интерфейсы из нескольких источников, используя утилитные типыPick для выборочного включения пропсов:
Пример: композиция типов Badge
src/components/ui/Badge/Badge.tsx20-32 Этот паттерн достигает:- Выборочное включение - Экспонировать только необходимые пропсы отступов (m, mx, my), а не все пропсы padding
- Наследование типов - Расширить базовые HTML-пропсы для обработчиков событий
- Интеграцию вариантов - Включить все пропсы из интерфейсов вариантов
- Пользовательское расширение - Добавить специфичные для компонента пропсы (leftSection, rightSection, dot)
Пример: композиция типов Accordion
src/components/ui/Accordion/Accordion.tsx26-32 src/components/ui/Accordion/Accordion.tsx91-93 Демонстрирует:- Контролируемый/неконтролируемый - Поддержку обоих паттернов значения
- Выборочную ширину - Выбор только
wиз вариантов макета - Типизацию контекста - Типобезопасные значения контекста для составных компонентов
Реализация составных компонентов
Разделение состояния на основе контекста
Сложные компоненты, такие как Accordion, используют React Context для управления состоянием между подкомпонентами:Паттерн реализации Accordion
Компонент Accordion демонстрирует двухуровневую иерархию контекста:- AccordionContext - Управляет глобальным состоянием аккордеона (открытые элементы, обработчики кликов)
- AccordionItemContext - Предоставляет специфичное для элемента значение триггерам/контенту
- Управление состоянием - Поддерживает контролируемый и неконтролируемый режимы
- Координация подкомпонентов - Триггер читает контекст для переключения, контент читает для отрисовки
Паттерн составного Card
Card использует более простой паттерн без контекста, опираясь на композицию пропсов:- Получает все пропсы вариантов независимо
- Применяет семантические атрибуты
data-class - Пробрасывает refs для доступа к DOM
- Расширяет базовые примитивы
Паттерны использования
Базовое использование компонентов
Простые компоненты с пропсами вариантов:Композиция составных компонентов
Сложные компоненты с вложенной структурой:Использование компонентов макета
Адаптивные макеты с пропсами вариантов:Интеграция с базовыми примитивами
UI-компоненты расширяют базовые примитивы, сохраняя тот же API пропсов вариантов:| UI-компонент | Расширяет примитив | Добавленные возможности |
|---|---|---|
| Button | BaseButton | Варианты размера, варианты стиля, состояние загрузки, секции иконок |
| Badge | BaseBadge | Варианты размера, варианты стиля, индикатор точки, секции иконок |
| Card | BaseCard | Составная структура (Header, Content, Footer, Title, Description) |
| Text | Box | Семантические текстовые элементы (p, span, em, strong), усечение |
| Title | Box | Иерархия заголовков (h1-h6), семантический проп order |
| Container | Block | Предустановки адаптивных размеров, проп centered |
| Icon | Box | Интеграция Lucide-иконок, масштабирование размера |
| Group | Flex | Горизонтальные значения по умолчанию, упрощённые justify/align |
| Stack | Flex | Вертикальное/горизонтальное размещение, упрощённый проп gap |
- Повторное использование вариантов - Все варианты отступов, макета, цветов из примитивов
- Проброс refs - Доступ к базовым DOM-элементам через forwardRef
- HTML-атрибуты - Все стандартные HTML-пропсы проходят через
- Типобезопасность - Полная поддержка TypeScript через цепочку композиции
Лучшие практики
1. Предпочитайте варианты вместо className
Используйте пропсы вариантов вместо ручногоclassName для согласованности:
2. Используйте data-class для пользовательской стилизации
Таргетируйте компоненты через атрибутыdata-class в пользовательском CSS:
3. Используйте составные компоненты
Используйте подкомпоненты для семантической структуры:4. Применяйте типобезопасность
Используйте TypeScript-интерфейсы для валидации пропсов:Резюме
UI-компоненты на уровне 2 предоставляют:- 15 композитных компонентов, охватывающих общие UI-паттерны
- Проброс пропсов от базовых примитивов к пользовательскому API
- Типобезопасность через составленные TypeScript-интерфейсы
- Интеграцию вариантов через 12 переиспользуемых категорий вариантов
- Соглашение data-class для стабильного таргетирования DOM
- Составные паттерны для гибкой композиции
- Семантический HTML со встроенной доступностью