sigilUI

Form

A form container with built-in validation, submission handling, and field-level error state propagation.

@sigil-ui/componentsReact

Preview

Live preview Interactive

Import

import { Form, Field, FieldLabel, FieldError } from "@sigil-ui/components";

Usage

<Form onSubmit={(data) => console.log(data)}>
  <Field>
    <FieldLabel>Name</FieldLabel>
    <Input name="name" required />
  </Field>
  <Button type="submit" variant="primary">Submit</Button>
</Form>

With validation

<Form
  onSubmit={(data) => save(data)}
  onError={(errors) => console.log(errors)}
>
  <Field>
    <FieldLabel>Email</FieldLabel>
    <Input name="email" type="email" required />
    <FieldError>Please enter a valid email.</FieldError>
  </Field>
  <Button type="submit" variant="primary">Sign up</Button>
</Form>

Controlled with react-hook-form

import { useForm } from "react-hook-form";

function SignupForm() {
  const { register, handleSubmit } = useForm();

  return (
    <Form onSubmit={handleSubmit((data) => save(data))}>
      <Field>
        <FieldLabel>Username</FieldLabel>
        <Input {...register("username", { required: true })} />
      </Field>
      <Button type="submit" variant="primary">Create account</Button>
    </Form>
  );
}

Token integration

CSS VariableUsed for
--s-space-6Gap between form fields
--s-errorValidation error state
--s-duration-fastError shake animation

Props

PropTypeDefaultDescription
onSubmit(data: FormData) => void—Submit handler
onError(errors: Record<string, string>) => void—Validation error handler
disabledbooleanfalseDisable all fields
classNamestring—Additional CSS classes
childrenReactNode—Form content

Plus all standard <form> HTML attributes.

Accessibility

  • Uses native <form> element with noValidate for custom validation
  • Error messages are linked via aria-errormessage
  • Focus moves to the first invalid field on submit