Typed forms
Field validation, submission and accessible error messages.
01 / Live preview● Interactive
Interact with the component. The source on the right is the actual code.
forms.tsx
● Zidom
import { signal, onCleanup } from '@zidomjs/core';import { createForm } from '@zidomjs/forms';export default function FormsDemo() { const form = createForm( { name: '', email: '' }, { name: value => value.trim().length >= 2 ? undefined : 'Enter at least two characters', email: value => value.includes('@') ? undefined : 'Enter a valid email' } ); onCleanup(() => form.dispose()); const name = form.field('name'); const email = form.field('email'); const message = signal(''); return ( <form className="example-card demo-form" onSubmit={(event: Event) => { event.preventDefault(); void form.submit(async values => { message.value = `Saved ${values.name} (${values.email})`; }); }} > <label htmlFor="demo-name">Name</label> <input id="demo-name" value={name.value} aria-describedby="demo-name-error" aria-invalid={() => Boolean(name.error.value)} onInput={(event: Event) => { name.set((event.currentTarget as HTMLInputElement).value); message.value = ''; }} onBlur={() => name.touch()} /> <p className="demo-error" id="demo-name-error" role="status"> {name.error} </p> <label htmlFor="demo-email">Email</label> <input id="demo-email" type="email" value={email.value} aria-describedby="demo-email-error" aria-invalid={() => Boolean(email.error.value)} onInput={(event: Event) => { email.set((event.currentTarget as HTMLInputElement).value); message.value = ''; }} onBlur={() => email.touch()} /> <p className="demo-error" id="demo-email-error" role="status"> {email.error} </p> <button type="submit" disabled={form.submitting}> Validate and save </button> <p role="status">{message}</p> </form> );}This website demo runs pinned Zidom beta.1 packages; the latest framework release is beta.2. See release details and limitations. Report a problem with this example.