Skip to main content

Продвинутый рабочий процесс

Цель и область применения

Этот документ охватывает нестандартные сценарии, когда 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 Продвинутый рабочий процесс
Источники: src/components/README.md1-8 src/components/GUIDE_CREATE_FORM.md5-10

Построение форм с помощью Block и Box

Библиотека не включает специализированные компоненты Form, Label или Input. Вместо этого используйте полиморфный проп component на Block и Box для рендеринга семантических HTML-элементов с полной системой вариантов.

Паттерн пропа component

Проп component преобразует примитивы в любой HTML-элемент, сохраняя типобезопасные пропы вариантов:
Источники: src/components/GUIDE_CREATE_FORM.md7-9

Паттерн структуры формы

Используйте Block с component="form" как обёртку формы, применяя варианты макета и стилизации: Структура контейнера формы: Пример структуры формы (см. src/components/GUIDE_CREATE_FORM.md14-32):
Источники: src/components/GUIDE_CREATE_FORM.md11-33

Паттерны полей ввода

Все типы ввода используют Box с component="input" и стандартными HTML-атрибутами: Текстовое поле (src/components/GUIDE_CREATE_FORM.md37-50):
Поле с состояниями фокуса (src/components/GUIDE_CREATE_FORM.md54-67):
Поле пароля (src/components/GUIDE_CREATE_FORM.md70-82):
Числовое поле с ограничениями (src/components/GUIDE_CREATE_FORM.md84-97):
Источники: src/components/GUIDE_CREATE_FORM.md35-97

Поля Textarea

Используйте Box с component="textarea" для многострочного ввода текста: Базовая текстовая область (src/components/GUIDE_CREATE_FORM.md99-115):
Текстовая область с минимальной высотой (src/components/GUIDE_CREATE_FORM.md117-129):
Источники: src/components/GUIDE_CREATE_FORM.md99-129

Полный пример формы

Архитектура контактной формы:
Полная реализация в src/components/GUIDE_CREATE_FORM.md134-226 Ключевые паттерны:
  1. Обработка событий формы: проп onSubmit на форме Block
  2. Структура полей: обёртка Block → метка → поле ввода в каждой группе
  3. Расстояния: className="space-y-6" на форме, className="space-y-2" на группах полей
  4. Валидация: атрибут required на полях ввода
  5. Состояния фокуса: комбинация вариантов с className для колец фокуса
Источники: src/components/GUIDE_CREATE_FORM.md131-226

Многоколоночный макет формы

Для сложных форм используйте Box с grid-отображением (src/components/GUIDE_CREATE_FORM.md228-277):
Источники: src/components/GUIDE_CREATE_FORM.md228-277

Паттерн валидации формы

Создавайте переиспользуемые компоненты полей с валидацией (src/components/GUIDE_CREATE_FORM.md311-339):
Разбор паттерна:
  • Условные borderColor и bg на основе состояния ошибки
  • Динамические цвета кольца фокуса через className
  • Отображение сообщения об ошибке с Box для цвета текста
  • Распространение пропов с {...props} для HTML-атрибутов
Источники: src/components/GUIDE_CREATE_FORM.md311-339

Доступные пропы вариантов для примитивов

Все примитивы поддерживают 12 категорий вариантов CVA. Ключевые варианты для построения форм:

Варианты расстояний

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

Варианты границ и стиля

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

Источники: src/components/GUIDE_CREATE_FORM.md279-301 src/components/README.md205-222

Лучшие практики для продвинутой компоновки

Рекомендации для полей формы

  1. Всегда устанавливайте w="full" на полях ввода для согласованной ширины (src/components/GUIDE_CREATE_FORM.md304)
  2. Используйте Block для структуры формы (элемент формы, группы полей) (src/components/GUIDE_CREATE_FORM.md305)
  3. Используйте Box для фактических полей ввода (input, textarea, select) (src/components/GUIDE_CREATE_FORM.md306)
  4. Комбинируйте пропы вариантов с Tailwind-классами для состояний фокуса (src/components/GUIDE_CREATE_FORM.md307)
  5. Используйте minH для textarea вместо фиксированной высоты (src/components/GUIDE_CREATE_FORM.md308)
  6. Применяйте className="resize-none" для предотвращения изменения размера textarea при необходимости (src/components/GUIDE_CREATE_FORM.md309)

Гибридный паттерн Вариант + className

Система вариантов покрывает ~80% потребностей в стилизации. Для оставшихся 20% комбинируйте варианты с className:
Когда использовать className:
  • Интерактивные состояния (:hover, :focus, :active)
  • Псевдоэлементы (:before, :after)
  • Сложные анимации
  • Grid/flex утилиты, не покрытые вариантами
  • Точки останова адаптивности за пределами системы вариантов
Источники: src/components/GUIDE_CREATE_FORM.md302-310 src/components/README.md237-244

Пользовательская компоновка компонентов

Создание переиспользуемых композитов

Когда вам нужен один и тот же паттерн многократно, извлеките его в пользовательский компонент: Паттерн: Поле ввода с меткой
Подход к реализации:
  1. Принимать пропы вариантов и HTML-атрибуты через распространение пропов
  2. Обрабатывать условную логику (состояния ошибок, валидация)
  3. Поддерживать доступность (ассоциации меток, ARIA-атрибуты)
  4. Возвращать компоновку примитивов (Block + Box)
Источники: src/components/GUIDE_CREATE_FORM.md311-339

Нестандартные пользовательские сценарии, не связанные с формами

Пользовательские интерактивные виджеты: При создании специфичных для приложения виджетов (слайдеры, пикеры, пользовательские элементы управления):
  1. Начинайте с Box или Block как контейнера
  2. Применяйте семантический проп component (<Box component="button"> для кликабельных элементов)
  3. Используйте пропы вариантов для макета и стилизации
  4. Добавляйте обработчики событий (onClick, onChange, и т.д.)
  5. Комбинируйте с className для сложных взаимодействий
Пользовательские структуры макета: Для уникальных требований к макету, не покрытых DashLayout, LayoutBlock или SplitBlock:
  1. Компонуйте Grid, Flex или Stack из src/core/ui/
  2. Применяйте варианты макета (cols, gap, align, justify)
  3. Вкладывайте примитивы для иерархической структуры
  4. Используйте Block с component="section"/component="aside" для семантической разметки
Источники: src/components/README.md237-244 .devin/wiki.json191-198

Сравнение: Базовый vs Продвинутый рабочий процесс

Когда использовать каждый подход:
Матрица возможностей: Источники: src/components/README.md1-19 src/components/GUIDE_CREATE_FORM.md1-10

Резюме

Продвинутый рабочий процесс позволяет создавать пользовательские интерфейсы, когда 15 составных компонентов недостаточны:
  1. Формы: Компонуйте Block + Box с пропом component для элементов форм, меток и полей ввода
  2. Пользовательские виджеты: Используйте примитивы с семантическими пропами component и системой вариантов
  3. Уникальные макеты: Компонуйте Grid, Flex, Stack для структурных требований
  4. Гибридный подход: Комбинируйте пропы вариантов (~80% покрытие) с className для граничных случаев
Для стандартных сценариев с существующими компонентами используйте Базовый рабочий процесс. Для общих рекомендаций см. Лучшие практики. Источники: src/components/GUIDE_CREATE_FORM.md341-347 .devin/wiki.json191-198