Introduction
NotForm handles validation state, dirty/touched tracking, per-field triggers, and array manipulation for Vue 3. It renders nothing itself — you own every element of your UI.
It works with any Standard Schema compliant validator: Zod, Valibot, ArkType, Yup. The form API is identical regardless of which library you choose.
What's included
Validation
Full-form and per-field validation with async support. Trigger on blur, input, change, focus, or mount.
Dirty & touched tracking
Fields are compared against initial values on every change. Touched state is set on blur or form submit.
Array fields
Append, prepend, insert, remove, swap, move — with stable item keys that survive reorders.
Server errors
Apply server-side errors after submission. They live alongside schema errors and are cleared on re-validation.
Multiple instances
Each useNotForm call is fully isolated. No global state, no ID conflicts between forms.
End-to-end types
Field paths and their value types are inferred from your schema. Wrong paths are caught at compile time.
Core pieces
| Name | Type | Description |
|---|---|---|
useNotForm | composable | Creates a form instance with all state and methods. The single source of truth for a form. |
<NotForm> | component | Renders a <form> and provides the instance to all descendant field components. |
<NotField> | component | Renderless wrapper for a single field. Exposes state and event handlers via a slot. |
<NotMessage> | component | Renders the first error for a field. Renders nothing when there is no error. |
<NotArrayField> | component | Renderless wrapper for an array field. Exposes items with stable keys and mutation methods. |