@warpkit/forms
v0.0.6
Published
Reactive form management with validation for Svelte 5 and WarpKit
Maintainers
Readme
@warpkit/forms
Schema-driven form state management for Svelte 5 with deep proxy binding.
Installation
bun add @warpkit/forms @warpkit/validationFeatures
- Schema validation - StandardSchema compatible (Zod, TypeBox, Valibot)
- Deep binding - Transparent
bind:valuefor nested objects - Array support - push, remove, insert, move operations
- Validation modes - submit, blur, change, touched
- Typed errors - Autocomplete for top-level field keys
- Auto-cleanup - Timer cleanup via
$effect(no manualonDestroyneeded)
Usage
<script lang="ts">
import { useForm } from '@warpkit/forms';
import { Type } from '@sinclair/typebox';
const schema = Type.Object({
name: Type.String({ minLength: 1 }),
email: Type.String({ format: 'email' }),
tags: Type.Array(Type.String())
});
const form = useForm({
schema,
initialValues: { name: '', email: '', tags: [] },
onSubmit: async (values) => {
await saveUser(values);
}
});
</script>
<form onsubmit={form.submit}>
<input bind:value={form.data.name} />
{#if form.errors.name}
<span class="error">{form.errors.name}</span>
{/if}
<input bind:value={form.data.email} />
{#each form.data.tags as _, i}
<input bind:value={form.data.tags[i]} />
<button type="button" onclick={() => form.remove('tags', i)}>
Remove
</button>
{/each}
<button type="button" onclick={() => form.push('tags', '')}>
Add Tag
</button>
<button type="submit" disabled={form.isSubmitting}>
{form.isSubmitting ? 'Saving...' : 'Save'}
</button>
</form>API
useForm(options)
Options:
schema- StandardSchema for validationinitialValues- Initial form valuesonSubmit- Submit handlermode- Validation mode: 'submit' | 'blur' | 'change' | 'touched'revalidateMode- Revalidation mode after error
Returns:
data- Proxied form values (use with bind:value)errors- Typed field errors (autocomplete for top-level keys)warnings- Field warningstouched- Touched fieldsdirty- Dirty fieldsisDirty- Form has changesisValid- No validation errorsisSubmitting- Submit in progressisSubmitted- Form has been submittedsubmitError- Error from last submitsubmitCount- Number of submit attemptssubmit(event?)- Form submit handlerreset(newValues?)- Reset to initial valuesresetDirty()- Snapshot current values as dirty baselinevalidate()- Validate entire formvalidateField(field)- Validate single fieldsetField(field, value)- Set field valuesetError(field, message)- Set/clear field errorsetWarning(field, message)- Set/clear field warningtouch(field)- Mark field as touchedclearErrors()- Clear all errors and warningspush(field, value)- Add to arrayremove(field, index)- Remove from arrayinsert(field, index, value)- Insert into arraymove(field, from, to)- Reorder arrayswap(field, indexA, indexB)- Swap array itemsfield(path)- Get field-centric state viewcleanup()- Clean up timers (automatic via $effect)
