Справочник
Архитектура
useForm
│
├── Нормализация схемы (json / zod / yup / valibot / openapi)
│ └── FieldDefinition[]
│
├── ConditionEvaluator
│ watchEffect → вычисляет visible / disabled / options для каждого поля
│
├── ValidationEngine
│ синхронные валидаторы → errors Record<path, string[]>
│ асинхронные валидаторы → дебаунс 300мс
│ getByPath / setByPath — хелперы для dot-path, также экспортированы отдельно
│
├── schemaUtils
│ mergeSchemas / omitFields / pickFields / extendField
│ discriminatedFields — visible-связка для наборов полей на основе дискриминатора
│
├── serverErrors
│ applyServerErrors / normalizeServerErrors — laravel / drf / flat / кастомный
│
├── registry
│ createFormRegistry (плагин Vue) / provideRegistry (поддерево) / useRegistry
│ — цепочка подмены компонентов, читаемая FormRenderer и его тематическими вариантами
│
├── MaskEngine (автономный)
│ applyMask / removeMask / bindMask
│
└── (опционально) UI-подпакеты
FormRenderer [/ui]
TailwindFormRenderer [/ui/tailwind]
ShadcnFormRenderer [/ui/shadcn]
PrimeVueFormRenderer [/ui/primevue]
NaiveFormRenderer [/ui/naive]
useFieldArray [core]
useMultiStepForm [core]
useFormDebug [core]
useFormField [core]
installFormDevtools [/devtools]Совместимость с SSR
Ядро (useForm, валидаторы, парсеры, ConditionEvaluator) не использует browser API. bindMask и FormRenderer используют DOM API — оборачивайте их в onMounted или <ClientOnly>, когда нужно. Персистентные формы (persist: 'local' | 'session') защищают чтение из хранилища проверкой typeof window !== 'undefined', так что при SSR они разрешаются в собственный defaultValue поля и подхватывают реальное сохранённое значение после монтирования.
Доступность
Все встроенные компоненты полей включают полный набор атрибутов a11y:
aria-required
Устанавливается в "true" на обязательных input, select, textarea, fieldset.
aria-invalid
Устанавливается в "true", когда поле touched и есть ошибки.
aria-describedby
Указывает на "{name}-error", когда есть ошибки.
role="alert" + aria-live="polite"
Списки ошибок озвучиваются скринридерами при появлении.
label[for] + input[id]
Все input имеют соответствующие label и id.
fieldset + legend
Группы radio используют семантическую группировку.
aria-checked
Чекбоксы явно отражают булево состояние.
Размер бандла и peer-зависимости
| Точка входа | Peer-зависимости | Заметки |
|---|---|---|
vue-form-schema | vue ^3.3 | Базовая часть — headless, без UI |
vue-form-schema/zod | zod ^3 | Опциональный адаптер |
vue-form-schema/yup | yup ^1 | Опциональный адаптер |
vue-form-schema/valibot | valibot ^1 | Опциональный адаптер |
vue-form-schema/openapi | нет | Адаптер стандартной JSON Schema / OpenAPI — без peer-зависимостей |
vue-form-schema/ui | vue ^3.3 | Встроенные компоненты в стиле BEM |
vue-form-schema/ui/tailwind | vue ^3.3, Tailwind CSS | Компоненты на utility-классах Tailwind |
vue-form-schema/ui/shadcn | vue ^3.3, Tailwind CSS | Tailwind-разметка в стиле shadcn/ui (см. заметку выше — не обёртка компонентов shadcn-vue) |
vue-form-schema/ui/primevue | vue ^3.3, primevue ^4 | ^5 | Настоящие обёртки компонентов PrimeVue |
vue-form-schema/ui/naive | vue ^3.3, naive-ui ^2.38 | Настоящие обёртки компонентов Naive UI |
vue-form-schema/devtools | @vue/devtools-api ^6 | ^7 | ^8 | Инспектор Vue DevTools + таймлайн, только для dev |
vue-form-schema/style.css | — | Стили для dropzone загрузки файлов в теме ui/primevue — импортируйте один раз, если используете FileField этой темы |
Все точки входа — tree-shakeable ESM + CJS сборки.
Лицензия
MIT