@letar/forms

Advanced Patterns

Complex forms — auth integration, form composition, recipes

Form Composition

Combine multiple features in a single form:

<RelationFieldProvider relations={relations}>
  <FormI18nProvider locale={locale} t={t}>
    <Form
      schema={ProductCreateFormSchema}
      initialValue={defaults}
      onSubmit={createProduct}
      persistence={{ key: 'product-draft' }}
    >
      <Form.Steps animated validateOnNext>
        <Form.Steps.Step title="Basic Info">
          <Form.AutoFields include={['name', 'description', 'price']} />
        </Form.Steps.Step>

        <Form.Steps.Step title="Details">
          <Form.Field.Select name="categoryId" />
          <Form.Field.Tags name="tags" />
          <Form.Field.Rating name="rating" />

          <Form.When field="status" is="ACTIVE">
            <Form.Field.Date name="publishDate" />
          </Form.When>
        </Form.Steps.Step>

        <Form.Steps.Step title="Review">
          <Form.DebugValues />
        </Form.Steps.Step>

        <Form.Steps.Navigation />
      </Form.Steps>
    </Form>
  </FormI18nProvider>
</RelationFieldProvider>

Auth-Aware Forms

Disable fields based on user role:

function AdminForm({ isAdmin }: { isAdmin: boolean }) {
  return (
    <Form schema={Schema} initialValue={data} onSubmit={save}>
      <Form.Field.String name="name" />
      <Form.Field.Select name="status" disabled={!isAdmin} />
      <Form.Field.Number name="price" readOnly={!isAdmin} />
      <Form.Button.Submit>Save</Form.Button.Submit>
    </Form>
  )
}

Form Builder (JSON Config)

Generate forms from JSON configuration:

<Form.Builder
  config={{
    fields: [
      { name: 'name', type: 'string', label: 'Name', required: true },
      { name: 'email', type: 'string', label: 'Email', validation: 'email' },
      { name: 'role', type: 'select', label: 'Role', options: roles },
    ],
  }}
  onSubmit={handleSubmit}
/>

On this page