Продвинутый рабочий процесс
Цель и область применения
Этот документ охватывает нестандартные сценарии, когда 15 составных UI-компонентов из src/components/ui/ недостаточны для вашей задачи. Вы узнаете, как компоновать пять базовых примитивов (Block, Box, Grid, Flex, Stack) из src/core/ui/ для создания пользовательских интерфейсов.
Для типичного использования компонентов с готовыми композитами см. Базовый рабочий процесс. Для общих рекомендаций по использованию и паттернов см. Лучшие практики.
Источники: .devin/wiki.json191-198 src/components/GUIDE_CREATE_FORM.md1-10
Когда использовать продвинутый рабочий процесс
Библиотека предоставляет 15 составных компонентов, которые покрывают ~80% обычных сценариев UI. Однако некоторые элементы намеренно отсутствуют в библиотеке:
Дерево решений: Базовый vs Продвинутый рабочий процесс
Построение форм с помощью Block и Box
Библиотека не включает специализированные компоненты Form, Label или Input. Вместо этого используйте полиморфный пропcomponent на Block и Box для рендеринга семантических HTML-элементов с полной системой вариантов.
Паттерн пропа component
Пропcomponent преобразует примитивы в любой HTML-элемент, сохраняя типобезопасные пропы вариантов:
Паттерн структуры формы
ИспользуйтеBlock с component="form" как обёртку формы, применяя варианты макета и стилизации:
Структура контейнера формы:
Пример структуры формы (см. src/components/GUIDE_CREATE_FORM.md14-32):
Паттерны полей ввода
Все типы ввода используютBox с component="input" и стандартными HTML-атрибутами:
Текстовое поле (src/components/GUIDE_CREATE_FORM.md37-50):
Поля Textarea
ИспользуйтеBox с component="textarea" для многострочного ввода текста:
Базовая текстовая область (src/components/GUIDE_CREATE_FORM.md99-115):
Полный пример формы
Архитектура контактной формы:- Обработка событий формы: проп
onSubmitна форме Block - Структура полей: обёртка Block → метка → поле ввода в каждой группе
- Расстояния:
className="space-y-6"на форме,className="space-y-2"на группах полей - Валидация: атрибут
requiredна полях ввода - Состояния фокуса: комбинация вариантов с
classNameдля колец фокуса
Многоколоночный макет формы
Для сложных форм используйтеBox с grid-отображением (src/components/GUIDE_CREATE_FORM.md228-277):
Паттерн валидации формы
Создавайте переиспользуемые компоненты полей с валидацией (src/components/GUIDE_CREATE_FORM.md311-339):- Условные
borderColorиbgна основе состояния ошибки - Динамические цвета кольца фокуса через
className - Отображение сообщения об ошибке с
Boxдля цвета текста - Распространение пропов с
{...props}для HTML-атрибутов
Доступные пропы вариантов для примитивов
Все примитивы поддерживают 12 категорий вариантов CVA. Ключевые варианты для построения форм:Варианты расстояний
Варианты макета
Варианты границ и стиля
Варианты цвета
Источники: src/components/GUIDE_CREATE_FORM.md279-301 src/components/README.md205-222
Лучшие практики для продвинутой компоновки
Рекомендации для полей формы
- Всегда устанавливайте
w="full"на полях ввода для согласованной ширины (src/components/GUIDE_CREATE_FORM.md304) - Используйте
Blockдля структуры формы (элемент формы, группы полей) (src/components/GUIDE_CREATE_FORM.md305) - Используйте
Boxдля фактических полей ввода (input, textarea, select) (src/components/GUIDE_CREATE_FORM.md306) - Комбинируйте пропы вариантов с Tailwind-классами для состояний фокуса (src/components/GUIDE_CREATE_FORM.md307)
- Используйте
minHдля textarea вместо фиксированной высоты (src/components/GUIDE_CREATE_FORM.md308) - Применяйте
className="resize-none"для предотвращения изменения размера textarea при необходимости (src/components/GUIDE_CREATE_FORM.md309)
Гибридный паттерн Вариант + className
Система вариантов покрывает ~80% потребностей в стилизации. Для оставшихся 20% комбинируйте варианты сclassName:
className:
- Интерактивные состояния (
:hover,:focus,:active) - Псевдоэлементы (
:before,:after) - Сложные анимации
- Grid/flex утилиты, не покрытые вариантами
- Точки останова адаптивности за пределами системы вариантов
Пользовательская компоновка компонентов
Создание переиспользуемых композитов
Когда вам нужен один и тот же паттерн многократно, извлеките его в пользовательский компонент: Паттерн: Поле ввода с меткой- Принимать пропы вариантов и HTML-атрибуты через распространение пропов
- Обрабатывать условную логику (состояния ошибок, валидация)
- Поддерживать доступность (ассоциации меток, ARIA-атрибуты)
- Возвращать компоновку примитивов (Block + Box)
Нестандартные пользовательские сценарии, не связанные с формами
Пользовательские интерактивные виджеты: При создании специфичных для приложения виджетов (слайдеры, пикеры, пользовательские элементы управления):- Начинайте с
BoxилиBlockкак контейнера - Применяйте семантический проп
component(<Box component="button">для кликабельных элементов) - Используйте пропы вариантов для макета и стилизации
- Добавляйте обработчики событий (
onClick,onChange, и т.д.) - Комбинируйте с
classNameдля сложных взаимодействий
- Компонуйте
Grid,FlexилиStackиз src/core/ui/ - Применяйте варианты макета (
cols,gap,align,justify) - Вкладывайте примитивы для иерархической структуры
- Используйте
Blockсcomponent="section"/component="aside"для семантической разметки
Сравнение: Базовый vs Продвинутый рабочий процесс
Когда использовать каждый подход:
Источники: src/components/README.md1-19 src/components/GUIDE_CREATE_FORM.md1-10
Резюме
Продвинутый рабочий процесс позволяет создавать пользовательские интерфейсы, когда 15 составных компонентов недостаточны:- Формы: Компонуйте
Block+Boxс пропомcomponentдля элементов форм, меток и полей ввода - Пользовательские виджеты: Используйте примитивы с семантическими пропами
componentи системой вариантов - Уникальные макеты: Компонуйте
Grid,Flex,Stackдля структурных требований - Гибридный подход: Комбинируйте пропы вариантов (~80% покрытие) с
classNameдля граничных случаев