Skip to main content

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 в трёхуровневой архитектуре, располагаясь между базовыми примитивами и шаблонами макетов:
Источники: README.md62-79 README.md105-145 src/components/README.md8-19

Основные принципы

1. Архитектура проброса пропсов

UI-компоненты расширяют базовые примитивы, пробрасывая пропсы вариантов и добавляя специфичную для компонента функциональность. Этот паттерн позволяет разработчикам использовать пропсы для отступов, макетов и стилизации напрямую без управления className:
Источники: src/components/ui/Badge/Badge.tsx1-96 src/components/README.md8-19

2. Композиция типов TypeScript

Компоненты достигают типобезопасности путём композиции интерфейсов из нескольких источников типов вариантов:
Источники: src/components/ui/Badge/Badge.tsx20-32 src/components/README.md206-221

3. Соглашение data-class

Все UI-компоненты применяют семантические атрибуты data-class для согласованного таргетирования DOM и тестирования. Это соглашение позволяет использовать CSS-селекторы и запросы для тестов без зависимости от динамически генерируемых имён классов: Источники: src/components/ui/Badge/Badge.tsx59-92 src/components/ui/Accordion/Accordion.tsx67-182 src/components/README.md223-235

4. Паттерн составных компонентов

Сложные компоненты используют вложенные подкомпоненты с общим контекстом для гибкой композиции:
Источники: src/components/ui/Accordion/Accordion.tsx9-182 README.md17 README.md125-144

Полный каталог компонентов

Библиотека предоставляет 15 композитных UI-компонентов, организованных по функциональным категориям: Источники: README.md370-386 src/components/README.md21-203

Реализация проброса пропсов

Паттерн деструктуризации и проброса

UI-компоненты используют согласованный паттерн для проброса пропсов, проиллюстрированный реализацией Badge:
Пример реализации из Badge: src/components/ui/Badge/Badge.tsx34-95 Ключевые характеристики:
  1. Выборочная деструктуризация - Извлечение только тех пропсов вариантов, которые использует компонент
  2. Оператор spread - Сбор оставшихся HTML-атрибутов в ...props
  3. Разрешение CVA - Применение каждой функции варианта с соответствующим пропсом
  4. Слияние классов - Использование утилиты cn() для слияния всех строк классов
  5. Проброс - Передача объединённого className и распакованных пропсов в базовый компонент
Источники: src/components/ui/Badge/Badge.tsx34-95

Паттерны интеграции вариантов

Мультивариантная композиция

Компоненты обычно интегрируют 3-7 категорий вариантов одновременно:

Паттерн импорта и применения

Каждый UI-компонент следует этой структуре импорта:
Источники: src/components/ui/Badge/Badge.tsx1-18 src/components/ui/Accordion/Accordion.tsx5-7

Архитектура типобезопасности

Стратегия композиции интерфейсов

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 из вариантов макета
  • Типизацию контекста - Типобезопасные значения контекста для составных компонентов
Источники: src/components/ui/Badge/Badge.tsx20-32 src/components/ui/Accordion/Accordion.tsx26-93

Реализация составных компонентов

Разделение состояния на основе контекста

Сложные компоненты, такие как Accordion, используют React Context для управления состоянием между подкомпонентами:

Паттерн реализации Accordion

Компонент Accordion демонстрирует двухуровневую иерархию контекста:
  1. AccordionContext - Управляет глобальным состоянием аккордеона (открытые элементы, обработчики кликов)
  2. AccordionItemContext - Предоставляет специфичное для элемента значение триггерам/контенту
  3. Управление состоянием - Поддерживает контролируемый и неконтролируемый режимы
  4. Координация подкомпонентов - Триггер читает контекст для переключения, контент читает для отрисовки
Источники: src/components/ui/Accordion/Accordion.tsx9-182

Паттерн составного Card

Card использует более простой паттерн без контекста, опираясь на композицию пропсов:
Каждый подкомпонент:
  • Получает все пропсы вариантов независимо
  • Применяет семантические атрибуты data-class
  • Пробрасывает refs для доступа к DOM
  • Расширяет базовые примитивы
Источники: README.md125-144 src/components/README.md96-117

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

Базовое использование компонентов

Простые компоненты с пропсами вариантов:

Композиция составных компонентов

Сложные компоненты с вложенной структурой:

Использование компонентов макета

Адаптивные макеты с пропсами вариантов:
Источники: README.md121-145 src/components/README.md23-203

Интеграция с базовыми примитивами

UI-компоненты расширяют базовые примитивы, сохраняя тот же API пропсов вариантов: Отношение наследования обеспечивает:
  1. Повторное использование вариантов - Все варианты отступов, макета, цветов из примитивов
  2. Проброс refs - Доступ к базовым DOM-элементам через forwardRef
  3. HTML-атрибуты - Все стандартные HTML-пропсы проходят через
  4. Типобезопасность - Полная поддержка TypeScript через цепочку композиции
Источники: src/components/README.md8-19 README.md81-103

Лучшие практики

1. Предпочитайте варианты вместо className

Используйте пропсы вариантов вместо ручного className для согласованности:

2. Используйте data-class для пользовательской стилизации

Таргетируйте компоненты через атрибуты data-class в пользовательском CSS:

3. Используйте составные компоненты

Используйте подкомпоненты для семантической структуры:

4. Применяйте типобезопасность

Используйте TypeScript-интерфейсы для валидации пропсов:
Источники: src/components/README.md237-258 .devin/wiki.json200-209

Резюме

UI-компоненты на уровне 2 предоставляют:
  • 15 композитных компонентов, охватывающих общие UI-паттерны
  • Проброс пропсов от базовых примитивов к пользовательскому API
  • Типобезопасность через составленные TypeScript-интерфейсы
  • Интеграцию вариантов через 12 переиспользуемых категорий вариантов
  • Соглашение data-class для стабильного таргетирования DOM
  • Составные паттерны для гибкой композиции
  • Семантический HTML со встроенной доступностью
Эта архитектура достигает цели библиотеки — построения сложных интерфейсов с минимальным кодом при сохранении типобезопасности, гибкости и согласованности. Для подробной документации API по каждому компоненту см. Справочник API UI-компонентов. Для примеров использования и рабочих процессов см. Базовый рабочий процесс. Источники: README.md105-145 src/components/README.md1-258 .devin/wiki.json75-84