Skip to main content

Introduction

Welcome to El Form - a powerful, schema-agnostic React form library that makes building forms simple, type-safe, and flexible.

What is El Form?

El Form is designed to solve the real problems developers face when building forms in React applications. Whether you need a simple contact form or a complex multi-step wizard, El Form provides the tools you need without locking you into specific validation libraries or architectural patterns.

Two ways to build forms:

  • 🤖 AutoForm - Generate complete forms from schemas instantly
  • 🛠️ useForm - Build custom forms with complete control

Works with any validation:

  • Zod (v3 and v4), Yup, Valibot schemas
  • Custom validation functions
  • No validation at all

Quick Examples

AutoForm: Zero boilerplate

import { AutoForm } from "el-form-react-components";
import { z } from "zod";

const schema = z.object({
email: z.string().email("Please enter a valid email"),
password: z.string().min(8, "Password must be at least 8 characters"),
});

<AutoForm
schema={schema}
onSubmit={(data) => console.log("Success:", data)}
onError={(errors) => console.log("Errors:", errors)}
/>;

useForm: Complete control

import { useForm } from "el-form-react-hooks";

const { register, handleSubmit, formState } = useForm({
validators: { onChange: schema },
defaultValues: { email: "", password: "" },
});

<form onSubmit={handleSubmit(handleLogin)}>
<input {...register("email")} placeholder="Email" />
{formState.errors.email && <span>{formState.errors.email}</span>}

<input {...register("password")} type="password" placeholder="Password" />
{formState.errors.password && <span>{formState.errors.password}</span>}

<button type="submit" disabled={formState.isSubmitting}>
{formState.isSubmitting ? "Signing in..." : "Sign In"}
</button>
</form>;

Key Features

  • 🔥 Schema-Agnostic - Use any validation library or custom functions
  • 🤖 Auto Form Generation - Complete forms from schemas instantly
  • 🛡️ Type Safety - Full TypeScript support with excellent inference
  • ⚡ High Performance - Optimized with minimal re-renders and debounced validation
  • 🎨 Fully Customizable - Override any component or styling
  • 🔄 Multiple Reusability Patterns - Context, prop-passing, or hybrid approaches
  • 📦 Modular - Install only what you need
  • 🔧 Great DX - Intuitive API with comprehensive TypeScript support

Why El Form?

Most form libraries force you into specific patterns or validation approaches. El Form is different:

  • Start simple, evolve complex - Begin with AutoForm and transition to custom forms as needed
  • Validation freedom - Switch between Zod, Yup, custom functions, or no validation without rewriting forms
  • Team flexibility - Supports multiple component reusability patterns so teams can choose what works best
  • TypeScript-first - Excellent type inference that "just works" with any validation approach

Learn more about El Form's philosophy and design decisions.

Architecture

El Form is built as a modular system:

el-form-react-hooks      → Core form state management
el-form-react-components → AutoForm + pre-built components
el-form-react → Everything combined
el-form-core → Framework-agnostic validation engine

Choose the package that fits your needs. See the installation guide for details.

Validation Approaches

El Form works with any validation approach:

// Schema validation (Zod, Yup, Valibot)
const form = useForm({ validators: { onChange: zodSchema } });

// Custom functions
const form = useForm({
validators: { onChange: (values) => customValidation(values) },
});

// Mixed validation
const form = useForm({
validators: { onChange: schema },
fieldValidators: {
email: { onChangeAsync: checkEmailAvailability },
},
});

// No validation (just state management)
const form = useForm({ defaultValues: { email: "" } });

Explore validation concepts to understand how this works.

Component Reusability

Build reusable form components that work across your application:

// Context pattern (TanStack-style)
<FormProvider form={form}>
<EmailField />
</FormProvider>

// Prop-passing pattern (Conform-style)
<EmailField form={form} />

// Hybrid - works with both approaches
<EmailField form={form || useFormContext()} />

Learn about component reusability patterns.

Next Steps

Get started quickly:

  1. Installation - Choose the right package for your project
  2. Quick Start - Build your first form in 5 minutes
  3. Examples - See El Form in action

Understand the concepts:

Build real forms:

Ready to build better forms? Let's get started!