Продвинутый рабочий процесс
Цель и область применения
Этот документ охватывает нестандартные сценарии, когда 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. Однако некоторые элементы намеренно отсутствуют в библиотеке:| Отсутствующий тип компонента | Причина отсутствия | Продвинутое решение |
|---|---|---|
| Элементы форм (Form, Label, Input) | HTML-семантика сильно варьируется | Компоновать Block + Box с пропом component |
| Выпадающие списки Select | Требуется сложное управление состоянием | Использовать Box component="select" с вариантами |
| Пользовательские интерактивные виджеты | Специфическая для приложения логика | Строить с помощью примитивов + вариантов |
| Нестандартные макеты | Уникальные структурные требования | Компоновать Grid, Flex, Stack напрямую |
Построение форм с помощью Block и Box
Библиотека не включает специализированные компоненты Form, Label или Input. Вместо этого используйте полиморфный пропcomponent на Block и Box для рендеринга семантических HTML-элементов с полной системой вариантов.
Паттерн пропа component
Пропcomponent преобразует примитивы в любой HTML-элемент, сохраняя типобезопасные пропы вариантов:
Паттерн структуры формы
ИспользуйтеBlock с component="form" как обёртку формы, применяя варианты макета и стилизации:
Структура контейнера формы:
| Элемент | Компонент | Пропы | Назначение |
|---|---|---|---|
| Обёртка формы | <Block component="form"> | w, maxW, p, rounded, shadow, bg | Семантический контейнер формы с макетом |
| Группы полей | <Block> | w="full", className="space-y-2" | Вертикальное расстояние между полями |
| Метки | <Box component="label"> | c, className="text-sm font-medium" | Доступные метки полей |
| Поля ввода | <Box component="input"> | w="full", p, rounded, border, borderColor | Поля ввода формы |
| Текстовые области | <Box component="textarea"> | w="full", p, rounded, border, minH | Многострочный ввод текста |
| Кнопка отправки | <Button> | w="full", size, variant | Отправка формы |
Паттерны полей ввода
Все типы ввода используют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. Ключевые варианты для построения форм:Варианты расстояний
| Проп | Значения | Назначение |
|---|---|---|
p, px, py, pt, pb, pl, pr | none, xs, sm, md, lg, xl, 2xl | Управление padding |
m, mx, my, mt, mb, ml, mr | none, xs, sm, md, lg, xl, 2xl, auto | Управление margin |
Варианты макета
| Проп | Значения | Назначение |
|---|---|---|
w | auto, full, screen, fit, min, max, 1/2, 1/3, и т.д. | Управление шириной |
h | auto, full, screen, fit, min, max | Управление высотой |
minH | Числовые значения типа "32", "64" | Минимальная высота (полезно для textarea) |
maxW | xs, sm, md, lg, xl, 2xl, 3xl, и т.д. | Максимальная ширина (полезно для центрированных форм) |
display | block, flex, grid, inline, none | Тип отображения |
Варианты границ и стиля
| Проп | Значения | Назначение |
|---|---|---|
border | none, default, 2, 4, 8 | Ширина границы |
borderColor | Все цвета дизайн-системы | Цвет границы |
rounded | none, sm, md, lg, xl, 2xl, 3xl, full | Радиус скругления |
shadow | none, sm, md, lg, xl, 2xl | Тень блока |
Варианты цвета
| Проп | Значения | Назначение |
|---|---|---|
bg | Все цвета дизайн-системы (напр., white, card, gray-50) | Цвет фона |
c | Все цвета дизайн-системы (напр., gray-700, red-600) | Цвет текста |
Лучшие практики для продвинутой компоновки
Рекомендации для полей формы
- Всегда устанавливайте
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 Продвинутый рабочий процесс
Когда использовать каждый подход:| Особенность | Базовый рабочий процесс | Продвинутый рабочий процесс |
|---|---|---|
| Скорость разработки | Быстрая (готовые компоненты) | Умеренная (ручная компоновка) |
| Гибкость | Ограничена пропами компонентов | Полный контроль через примитивы |
| Поддержка кода | Проще (меньше компонентов) | Более сложная (больше кода) |
| Типобезопасность | Полная (типы составных компонентов) | Полная (типы примитивных компонентов) |
| Поддержка вариантов | Через пробрасывание пропов | Прямое применение |
| Семантический HTML | Предопределённая структура | Полный контроль через проп component |
| Лучше всего для | Стандартных UI-паттернов | Пользовательских/уникальных требований |
Резюме
Продвинутый рабочий процесс позволяет создавать пользовательские интерфейсы, когда 15 составных компонентов недостаточны:- Формы: Компонуйте
Block+Boxс пропомcomponentдля элементов форм, меток и полей ввода - Пользовательские виджеты: Используйте примитивы с семантическими пропами
componentи системой вариантов - Уникальные макеты: Компонуйте
Grid,Flex,Stackдля структурных требований - Гибридный подход: Комбинируйте пропы вариантов (~80% покрытие) с
classNameдля граничных случаев