GitHub

Introduction

Headless, schema-agnostic form management for Vue 3.

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

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.