Component

Form

A fully integrated form handler built with react-hook-form and Zod. Adheres to strict Neo-Brutalist parameters with error styling, outlines, and keyboard focus states.


Preview

User Registration

This is your public display name.

We will send account updates here.

Installation

pnpm dlx brutx@latest add form

Usage

import { useForm } from "react-hook-form"
import { z } from "zod"
import { zodResolver } from "@hookform/resolvers/zod"

import {
  Form,
  FormControl,
  FormDescription,
  FormField,
  FormItem,
  FormLabel,
  FormMessage,
} from "@/components/ui/form"
import { Input } from "@/components/ui/input"
import { Button } from "@/components/ui/button"

const formSchema = z.object({
  username: z.string().min(2),
})

function MyForm() {
  const form = useForm<z.infer<typeof formSchema>>({
    resolver: zodResolver(formSchema),
    defaultValues: {
      username: "",
    },
  })

  function onSubmit(values: z.infer<typeof formSchema>) {
    console.log(values)
  }

  return (
    <Form {...form}>
      <form onSubmit={form.handleSubmit(onSubmit)} className="space-y-4">
        <FormField
          control={form.control}
          name="username"
          render={({ field }) => (
            <FormItem>
              <FormLabel>Username</FormLabel>
              <FormControl>
                <Input placeholder="Enter username" {...field} />
              </FormControl>
              <FormDescription>Public display name.</FormDescription>
              <FormMessage />
            </FormItem>
          )}
        />
        <Button type="submit">Submit</Button>
      </form>
    </Form>
  )
}

API Reference

ComponentDescription
FormFormProvider context wrapper from react-hook-form.
FormFieldController wrapper matching field name contexts.
FormItemSpacing layout container that generates unique field IDs.
FormLabelHigh-contrast accessibility label (turns red on validation errors).
FormControlSlot wrapper injecting focus loops and state identifiers.
FormDescriptionHelper paragraph context for form guidance.
FormMessageError announcement display (renders only when field validation fails).

Accessibility

  • Utilizes aria-describedby to merge description and error labels.
  • Switches aria-invalid dynamically upon field failures.
  • Ensures full keyboard navigation and high visibility focus states.