# @suaveplan/react-forms - React forms library — ApiClient/Auth contexts, ValidationEngine, useFormValidation/useDomainForm with field rendering, createDomainForm factory (with three escape hatches), four recipes (wizard, repeating-fieldset, conditional, async-search), MoneyInput + Field re-exports, and a TranslationKey-typed validator suite (sync + async + composers). ## Summary React forms library for the Suaveplan ecosystem. Wraps react-hook-form + Zod with a primitives + factory + recipes architecture: every user-facing string is typed `TranslationKey`, every error code is registered with `@suaveplan/error`, every lifecycle event emits OTel telemetry. Wave 5b adds the field-rendering layer, the `createDomainForm` factory (with three escape hatches), four recipes (wizard, repeating-fieldset, conditional, async-search), and the `MoneyInput` primitive on top of Wave 5a's contexts + validation engine + validator suite. ## Documentation tree - [api-client-context](./src/core/api-client-context/api-client-context.md) — _(no submodules)_ - use-api-client — React hook that reads the active `… - [api-client-context](./src/core/api-client-context/api-client-context.md) — _(no submodules)_ - use-api-client — React hook that reads the active `… - [use-api-client](./src/core/api-client-context/use-api-client.md) — React hook that reads the active `ApiClient` from the surrounding `` and returns it typed as the con… - [auth-context](./src/core/auth-context/auth-context.md) — _(no submodules)_ - use-auth — React hook that reads the active `AuthCo… - [auth-context](./src/core/auth-context/auth-context.md) — _(no submodules)_ - use-auth — React hook that reads the active `AuthCo… - [use-auth](./src/core/auth-context/use-auth.md) — React hook that reads the active `AuthContextValue` from the surrounding `` and returns it typed as `Auth… - [use-domain-form](./src/core/use-domain-form/use-domain-form.md) — _(no submodules)_ - [use-domain-form](./src/core/use-domain-form/use-domain-form.md) — _(no submodules)_ - [use-form-validation](./src/core/use-form-validation/use-form-validation.md) — _(no submodules)_ - [use-form-validation](./src/core/use-form-validation/use-form-validation.md) — _(no submodules)_ - [validation-engine](./src/core/validation-engine/validation-engine.md) — _(no submodules)_ - [cross-field-rule](./src/core/validation-engine/cross-field-rule.md) — Convenience factory + helper for declaring `CrossFieldRule` values. Cross-field rules are the second pipeline phase ins… - [server-error-mapper](./src/core/validation-engine/server-error-mapper.md) — Bridges server-side validation envelopes into the engine's per-field `ValidatorFailure` shape. When a form's `submit.on… - [validation-engine](./src/core/validation-engine/validation-engine.md) — _(no submodules)_ - [error-codes](./src/errors/error-codes.md) — Registers the thirteen stable error codes used by `@suaveplan/react-forms` under the `REACT_FORMS` namespace via `defin… - [react-forms-error](./src/errors/react-forms-error.md) — Defines the base `ReactFormsError` class shared by every error path in `@suaveplan/react-forms`. Extending the project… - [create-domain-form](./src/factory/create-domain-form/create-domain-form.md) — Declarative typed-form factory. Wraps `useDomainForm` + `` + the layout dispatcher into a single comp… - [create-domain-form](./src/factory/create-domain-form/create-domain-form.md) — Declarative typed-form factory. Wraps `useDomainForm` + `` + the layout dispatcher into a single comp… - [field-config](./src/factory/field-config/field-config.md) — `FieldConfig` discriminated union, per-kind Zod schemas, and the `validateFieldConfig` / `validateFieldConfigMap` helpe… - [field-config](./src/factory/field-config/field-config.md) — `FieldConfig` discriminated union, per-kind Zod schemas, and the `validateFieldConfig` / `validateFieldConfigMap` helpe… - [render-field](./src/factory/render-field/render-field.md) — Single-field renderer used by `useDomainForm` and `createDomainForm` to turn a typed `FieldConfig` into a `` cha… - [render-field](./src/factory/render-field/render-field.md) — Single-field renderer used by `useDomainForm` and `createDomainForm` to turn a typed `FieldConfig` into a `` cha… - [locales](./src/locales/locales.md) — Bundled translation strings shipped with `@suaveplan/react-forms`. - [augmentation](./src/locales/augmentation.md) — Side-effect-only TypeScript module that augments `@suaveplan/react-i18n`'s `ContributedTranslationKeys` interface with… - [locales](./src/locales/locales.md) — Bundled translation strings shipped with `@suaveplan/react-forms`. - [translation-keys](./src/locales/translation-keys.md) — `translation-keys.ts` is the codegen-emitted string-literal union of every translation key contributed by `@suaveplan/r… - [observability](./src/observability/react-forms-metrics.md) — _(no submodules)_ - [react-forms-metrics](./src/observability/react-forms-metrics.md) — _(no submodules)_ - [field](./src/primitives/field/field.md) — _(no submodules)_ - [field](./src/primitives/field/field.md) — _(no submodules)_ - [money-input](./src/primitives/money-input/money-input.md) — Locale-aware currency input wrapping `@suaveplan/react-ui`'s ``. - [money-input](./src/primitives/money-input/money-input.md) — Locale-aware currency input wrapping `@suaveplan/react-ui`'s ``. - [async-search](./src/recipes/async-search/async-search.md) — Async-prefilled form recipe. Resolves an entity by `id` via the supplied `load(id, signal)` callback, then mounts the u… - [async-search](./src/recipes/async-search/async-search.md) — Async-prefilled form recipe. Resolves an entity by `id` via the supplied `load(id, signal)` callback, then mounts the u… - [conditional](./src/recipes/conditional/conditional.md) — Show / hide form fields based on a predicate over the parent form's values. When the gate flips closed the recipe unreg… - [conditional](./src/recipes/conditional/conditional.md) — Show / hide form fields based on a predicate over the parent form's values. When the gate flips closed the recipe unreg… - [repeating-fieldset](./src/recipes/repeating-fieldset/repeating-fieldset.md) — Dynamic-array fieldset recipe backed by react-hook-form's `useFieldArray`. Renders one row per array entry; add / remov… - [repeating-fieldset](./src/recipes/repeating-fieldset/repeating-fieldset.md) — Dynamic-array fieldset recipe backed by react-hook-form's `useFieldArray`. Renders one row per array entry; add / remov… - [wizard](./src/recipes/wizard/wizard.md) — Multi-step wizard recipe. Each step owns a Zod sub-schema and a typed field-config map; navigating forward validates th… - [wizard](./src/recipes/wizard/wizard.md) — Multi-step wizard recipe. Each step owns a Zod sub-schema and a typed field-config map; navigating forward validates th… - [async-email-unique](./src/validation/async/async-email-unique/async-email-unique.md) — _(no submodules)_ - [async-email-unique](./src/validation/async/async-email-unique/async-email-unique.md) — _(no submodules)_ - [async-username-available](./src/validation/async/async-username-available/async-username-available.md) — _(no submodules)_ - [async-username-available](./src/validation/async/async-username-available/async-username-available.md) — _(no submodules)_ - [compose](./src/validation/compose/compose.md) — _(no submodules)_ - or — OR-semantics composer for the validator suite.… - [compose](./src/validation/compose/compose.md) — _(no submodules)_ - or — OR-semantics composer for the validator suite.… - [or](./src/validation/compose/or.md) — OR-semantics composer for the validator suite. Returns a validator that passes when any of the input validators passes.… - [sequence](./src/validation/compose/sequence.md) — Short-circuit AND composer with explicit ordering semantics. Identical to `compose` in result — every validator must pa… - [shared](./src/validation/compose/shared.md) — Tiny internal helper module shared by every composer in `validation/compose`. Centralises the `Promise` discrimination… - [bic](./src/validation/validators/bic/bic.md) — _(no submodules)_ - [bic](./src/validation/validators/bic/bic.md) — _(no submodules)_ - [credit-card](./src/validation/validators/credit-card/credit-card.md) — _(no submodules)_ - [credit-card](./src/validation/validators/credit-card/credit-card.md) — _(no submodules)_ - [custom](./src/validation/validators/custom/custom.md) — _(no submodules)_ - [custom](./src/validation/validators/custom/custom.md) — _(no submodules)_ - [email](./src/validation/validators/email/email.md) — _(no submodules)_ - [email](./src/validation/validators/email/email.md) — _(no submodules)_ - [iban](./src/validation/validators/iban/iban.md) — _(no submodules)_ - [iban](./src/validation/validators/iban/iban.md) — _(no submodules)_ - [max-length](./src/validation/validators/max-length/max-length.md) — _(no submodules)_ - [max-length](./src/validation/validators/max-length/max-length.md) — _(no submodules)_ - [min-length](./src/validation/validators/min-length/min-length.md) — _(no submodules)_ - [min-length](./src/validation/validators/min-length/min-length.md) — _(no submodules)_ - [password-strength](./src/validation/validators/password-strength/password-strength.md) — _(no submodules)_ - [password-strength](./src/validation/validators/password-strength/password-strength.md) — _(no submodules)_ - [pattern](./src/validation/validators/pattern/pattern.md) — _(no submodules)_ - [pattern](./src/validation/validators/pattern/pattern.md) — _(no submodules)_ - [phone](./src/validation/validators/phone/phone.md) — _(no submodules)_ - [phone](./src/validation/validators/phone/phone.md) — _(no submodules)_ - [postcode](./src/validation/validators/postcode/postcode.md) — _(no submodules)_ - [postcode](./src/validation/validators/postcode/postcode.md) — _(no submodules)_ - [required](./src/validation/validators/required/required.md) — _(no submodules)_ - [required](./src/validation/validators/required/required.md) — _(no submodules)_ - [url](./src/validation/validators/url/url.md) — _(no submodules)_ - [url](./src/validation/validators/url/url.md) — _(no submodules)_ - use-api-client — React hook that reads the active `… - [api-client-context](./src/core/api-client-context/api-client-context.md) — _(no submodules)_- use-api-client — React hook that reads the active `… - [use-api-client](./src/core/api-client-context/use-api-client.md) — React hook that reads the active `ApiClient` from the surrounding `` and returns it typed as the con… - [auth-context](./src/core/auth-context/auth-context.md) — _(no submodules)_- use-auth — React hook that reads the active `AuthCo… - [auth-context](./src/core/auth-context/auth-context.md) — _(no submodules)_- use-auth — React hook that reads the active `AuthCo… - [use-auth](./src/core/auth-context/use-auth.md) — React hook that reads the active `AuthContextValue` from the surrounding `` and returns it typed as `Auth… - [use-domain-form](./src/core/use-domain-form/use-domain-form.md) — _(no submodules)_- [use-domain-form](./src/core/use-domain-form/use-domain-form.md) — _(no submodules)_- [use-form-validation](./src/core/use-form-validation/use-form-validation.md) — _(no submodules)_- [use-form-validation](./src/core/use-form-validation/use-form-validation.md) — _(no submodules)_- [validation-engine](./src/core/validation-engine/validation-engine.md) — _(no submodules)_- [cross-field-rule](./src/core/validation-engine/cross-field-rule.md) — Convenience factory + helper for declaring `CrossFieldRule` values. Cross-field rules are the second pipeline phase ins… - [server-error-mapper](./src/core/validation-engine/server-error-mapper.md) — Bridges server-side validation envelopes into the engine's per-field `ValidatorFailure` shape. When a form's `submit.on… - [validation-engine](./src/core/validation-engine/validation-engine.md) — _(no submodules)_- [error-codes](./src/errors/error-codes.md) — Registers the thirteen stable error codes used by `@suaveplan/react-forms` under the `REACT_FORMS` namespace via `defin… - [react-forms-error](./src/errors/react-forms-error.md) — Defines the base `ReactFormsError` class shared by every error path in `@suaveplan/react-forms`. Extending the project… - [create-domain-form](./src/factory/create-domain-form/create-domain-form.md) — Declarative typed-form factory. Wraps `useDomainForm` + `` + the layout dispatcher into a single comp… - [create-domain-form](./src/factory/create-domain-form/create-domain-form.md) — Declarative typed-form factory. Wraps `useDomainForm` + `` + the layout dispatcher into a single comp… - [field-config](./src/factory/field-config/field-config.md) — `FieldConfig` discriminated union, per-kind Zod schemas, and the `validateFieldConfig` / `validateFieldConfigMap` helpe… - [field-config](./src/factory/field-config/field-config.md) — `FieldConfig` discriminated union, per-kind Zod schemas, and the `validateFieldConfig` / `validateFieldConfigMap` helpe… - [render-field](./src/factory/render-field/render-field.md) — Single-field renderer used by `useDomainForm` and `createDomainForm` to turn a typed `FieldConfig` into a `` cha… - [render-field](./src/factory/render-field/render-field.md) — Single-field renderer used by `useDomainForm` and `createDomainForm` to turn a typed `FieldConfig` into a `` cha… - [locales](./src/locales/locales.md) — Bundled translation strings shipped with `@suaveplan/react-forms`. - [augmentation](./src/locales/augmentation.md) — Side-effect-only TypeScript module that augments `@suaveplan/react-i18n`'s `ContributedTranslationKeys` interface with… - [locales](./src/locales/locales.md) — Bundled translation strings shipped with `@suaveplan/react-forms`. - [translation-keys](./src/locales/translation-keys.md) — `translation-keys.ts` is the codegen-emitted string-literal union of every translation key contributed by `@suaveplan/r… - [observability](./src/observability/react-forms-metrics.md) — _(no submodules)_- [react-forms-metrics](./src/observability/react-forms-metrics.md) — _(no submodules)_- [field](./src/primitives/field/field.md) — _(no submodules)_- [field](./src/primitives/field/field.md) — _(no submodules)_- [money-input](./src/primitives/money-input/money-input.md) — Locale-aware currency input wrapping `@suaveplan/react-ui`'s ``. - [money-input](./src/primitives/money-input/money-input.md) — Locale-aware currency input wrapping `@suaveplan/react-ui`'s ``. - [async-search](./src/recipes/async-search/async-search.md) — Async-prefilled form recipe. Resolves an entity by `id` via the supplied `load(id, signal)` callback, then mounts the u… - [async-search](./src/recipes/async-search/async-search.md) — Async-prefilled form recipe. Resolves an entity by `id` via the supplied `load(id, signal)` callback, then mounts the u… - [conditional](./src/recipes/conditional/conditional.md) — Show / hide form fields based on a predicate over the parent form's values. When the gate flips closed the recipe unreg… - [conditional](./src/recipes/conditional/conditional.md) — Show / hide form fields based on a predicate over the parent form's values. When the gate flips closed the recipe unreg… - [repeating-fieldset](./src/recipes/repeating-fieldset/repeating-fieldset.md) — Dynamic-array fieldset recipe backed by react-hook-form's `useFieldArray`. Renders one row per array entry; add / remov… - [repeating-fieldset](./src/recipes/repeating-fieldset/repeating-fieldset.md) — Dynamic-array fieldset recipe backed by react-hook-form's `useFieldArray`. Renders one row per array entry; add / remov… - [wizard](./src/recipes/wizard/wizard.md) — Multi-step wizard recipe. Each step owns a Zod sub-schema and a typed field-config map; navigating forward validates th… - [wizard](./src/recipes/wizard/wizard.md) — Multi-step wizard recipe. Each step owns a Zod sub-schema and a typed field-config map; navigating forward validates th… - [async-email-unique](./src/validation/async/async-email-unique/async-email-unique.md) — _(no submodules)_- [async-email-unique](./src/validation/async/async-email-unique/async-email-unique.md) — _(no submodules)_- [async-username-available](./src/validation/async/async-username-available/async-username-available.md) — _(no submodules)_- [async-username-available](./src/validation/async/async-username-available/async-username-available.md) — _(no submodules)_- [compose](./src/validation/compose/compose.md) — _(no submodules)_- or — OR-semantics composer for the validator suite.… - [compose](./src/validation/compose/compose.md) — _(no submodules)_- or — OR-semantics composer for the validator suite.… - [or](./src/validation/compose/or.md) — OR-semantics composer for the validator suite. Returns a validator that passes when any of the input validators passes.… - [sequence](./src/validation/compose/sequence.md) — Short-circuit AND composer with explicit ordering semantics. Identical to `compose` in result — every validator must pa… - [shared](./src/validation/compose/shared.md) — Tiny internal helper module shared by every composer in `validation/compose`. Centralises the `Promise` discrimination… - [bic](./src/validation/validators/bic/bic.md) — _(no submodules)_- [bic](./src/validation/validators/bic/bic.md) — _(no submodules)_- [credit-card](./src/validation/validators/credit-card/credit-card.md) — _(no submodules)_- [credit-card](./src/validation/validators/credit-card/credit-card.md) — _(no submodules)_- [custom](./src/validation/validators/custom/custom.md) — _(no submodules)_- [custom](./src/validation/validators/custom/custom.md) — _(no submodules)_- [email](./src/validation/validators/email/email.md) — _(no submodules)_- [email](./src/validation/validators/email/email.md) — _(no submodules)_- [iban](./src/validation/validators/iban/iban.md) — _(no submodules)_- [iban](./src/validation/validators/iban/iban.md) — _(no submodules)_- [max-length](./src/validation/validators/max-length/max-length.md) — _(no submodules)_- [max-length](./src/validation/validators/max-length/max-length.md) — _(no submodules)_- [min-length](./src/validation/validators/min-length/min-length.md) — _(no submodules)_- [min-length](./src/validation/validators/min-length/min-length.md) — _(no submodules)_- [password-strength](./src/validation/validators/password-strength/password-strength.md) — _(no submodules)_- [password-strength](./src/validation/validators/password-strength/password-strength.md) — _(no submodules)_- [pattern](./src/validation/validators/pattern/pattern.md) — _(no submodules)_- [pattern](./src/validation/validators/pattern/pattern.md) — _(no submodules)_- [phone](./src/validation/validators/phone/phone.md) — _(no submodules)_- [phone](./src/validation/validators/phone/phone.md) — _(no submodules)_- [postcode](./src/validation/validators/postcode/postcode.md) — _(no submodules)_- [postcode](./src/validation/validators/postcode/postcode.md) — _(no submodules)_- [required](./src/validation/validators/required/required.md) — _(no submodules)_- [required](./src/validation/validators/required/required.md) — _(no submodules)_- [url](./src/validation/validators/url/url.md) — _(no submodules)_- [url](./src/validation/validators/url/url.md) — _(no submodules)_- use-api-client — React hook that reads the active `… - [api-client-context](./src/core/api-client-context/api-client-context.md) — _(no submodules)_- use-api-client — React hook that reads the active `… - [use-api-client](./src/core/api-client-context/use-api-client.md) — React hook that reads the active `ApiClient` from the surrounding `` and returns it typed as the con… - [auth-context](./src/core/auth-context/auth-context.md) — _(no submodules)_- use-auth — React hook that reads the active `AuthCo… - [auth-context](./src/core/auth-context/auth-context.md) — _(no submodules)_- use-auth — React hook that reads the active `AuthCo… - [use-auth](./src/core/auth-context/use-auth.md) — React hook that reads the active `AuthContextValue` from the surrounding `` and returns it typed as `Auth… - [use-domain-form](./src/core/use-domain-form/use-domain-form.md) — _(no submodules)_- [use-domain-form](./src/core/use-domain-form/use-domain-form.md) — _(no submodules)_- [use-form-validation](./src/core/use-form-validation/use-form-validation.md) — _(no submodules)_- [use-form-validation](./src/core/use-form-validation/use-form-validation.md) — _(no submodules)_- [validation-engine](./src/core/validation-engine/validation-engine.md) — _(no submodules)_- [cross-field-rule](./src/core/validation-engine/cross-field-rule.md) — Convenience factory + helper for declaring `CrossFieldRule` values. Cross-field rules are the second pipeline phase ins… - [server-error-mapper](./src/core/validation-engine/server-error-mapper.md) — Bridges server-side validation envelopes into the engine's per-field `ValidatorFailure` shape. When a form's `submit.on… - [validation-engine](./src/core/validation-engine/validation-engine.md) — _(no submodules)_- [error-codes](./src/errors/error-codes.md) — Registers the thirteen stable error codes used by `@suaveplan/react-forms` under the `REACT_FORMS` namespace via `defin… - [react-forms-error](./src/errors/react-forms-error.md) — Defines the base `ReactFormsError` class shared by every error path in `@suaveplan/react-forms`. Extending the project… - [create-domain-form](./src/factory/create-domain-form/create-domain-form.md) — Declarative typed-form factory. Wraps `useDomainForm` + `` + the layout dispatcher into a single comp… - [create-domain-form](./src/factory/create-domain-form/create-domain-form.md) — Declarative typed-form factory. Wraps `useDomainForm` + `` + the layout dispatcher into a single comp… - [field-config](./src/factory/field-config/field-config.md) — `FieldConfig` discriminated union, per-kind Zod schemas, and the `validateFieldConfig` / `validateFieldConfigMap` helpe… - [field-config](./src/factory/field-config/field-config.md) — `FieldConfig` discriminated union, per-kind Zod schemas, and the `validateFieldConfig` / `validateFieldConfigMap` helpe… - [render-field](./src/factory/render-field/render-field.md) — Single-field renderer used by `useDomainForm` and `createDomainForm` to turn a typed `FieldConfig` into a `` cha… - [render-field](./src/factory/render-field/render-field.md) — Single-field renderer used by `useDomainForm` and `createDomainForm` to turn a typed `FieldConfig` into a `` cha… - [locales](./src/locales/locales.md) — Bundled translation strings shipped with `@suaveplan/react-forms`. - [augmentation](./src/locales/augmentation.md) — Side-effect-only TypeScript module that augments `@suaveplan/react-i18n`'s `ContributedTranslationKeys` interface with… - [locales](./src/locales/locales.md) — Bundled translation strings shipped with `@suaveplan/react-forms`. - [translation-keys](./src/locales/translation-keys.md) — `translation-keys.ts` is the codegen-emitted string-literal union of every translation key contributed by `@suaveplan/r… - [observability](./src/observability/react-forms-metrics.md) — _(no submodules)_- [react-forms-metrics](./src/observability/react-forms-metrics.md) — _(no submodules)_- [field](./src/primitives/field/field.md) — _(no submodules)_- [field](./src/primitives/field/field.md) — _(no submodules)_- [money-input](./src/primitives/money-input/money-input.md) — Locale-aware currency input wrapping `@suaveplan/react-ui`'s ``. - [money-input](./src/primitives/money-input/money-input.md) — Locale-aware currency input wrapping `@suaveplan/react-ui`'s ``. - [async-search](./src/recipes/async-search/async-search.md) — Async-prefilled form recipe. Resolves an entity by `id` via the supplied `load(id, signal)` callback, then mounts the u… - [async-search](./src/recipes/async-search/async-search.md) — Async-prefilled form recipe. Resolves an entity by `id` via the supplied `load(id, signal)` callback, then mounts the u… - [conditional](./src/recipes/conditional/conditional.md) — Show / hide form fields based on a predicate over the parent form's values. When the gate flips closed the recipe unreg… - [conditional](./src/recipes/conditional/conditional.md) — Show / hide form fields based on a predicate over the parent form's values. When the gate flips closed the recipe unreg… - [repeating-fieldset](./src/recipes/repeating-fieldset/repeating-fieldset.md) — Dynamic-array fieldset recipe backed by react-hook-form's `useFieldArray`. Renders one row per array entry; add / remov… - [repeating-fieldset](./src/recipes/repeating-fieldset/repeating-fieldset.md) — Dynamic-array fieldset recipe backed by react-hook-form's `useFieldArray`. Renders one row per array entry; add / remov… - [wizard](./src/recipes/wizard/wizard.md) — Multi-step wizard recipe. Each step owns a Zod sub-schema and a typed field-config map; navigating forward validates th… - [wizard](./src/recipes/wizard/wizard.md) — Multi-step wizard recipe. Each step owns a Zod sub-schema and a typed field-config map; navigating forward validates th… - [async-email-unique](./src/validation/async/async-email-unique/async-email-unique.md) — _(no submodules)_- [async-email-unique](./src/validation/async/async-email-unique/async-email-unique.md) — _(no submodules)_- [async-username-available](./src/validation/async/async-username-available/async-username-available.md) — _(no submodules)_- [async-username-available](./src/validation/async/async-username-available/async-username-available.md) — _(no submodules)_- [compose](./src/validation/compose/compose.md) — _(no submodules)_- or — OR-semantics composer for the validator suite.… - [compose](./src/validation/compose/compose.md) — _(no submodules)_- or — OR-semantics composer for the validator suite.… - [or](./src/validation/compose/or.md) — OR-semantics composer for the validator suite. Returns a validator that passes when any of the input validators passes.… - [sequence](./src/validation/compose/sequence.md) — Short-circuit AND composer with explicit ordering semantics. Identical to `compose` in result — every validator must pa… - [shared](./src/validation/compose/shared.md) — Tiny internal helper module shared by every composer in `validation/compose`. Centralises the `Promise` discrimination… - [bic](./src/validation/validators/bic/bic.md) — _(no submodules)_- [bic](./src/validation/validators/bic/bic.md) — _(no submodules)_- [credit-card](./src/validation/validators/credit-card/credit-card.md) — _(no submodules)_- [credit-card](./src/validation/validators/credit-card/credit-card.md) — _(no submodules)_- [custom](./src/validation/validators/custom/custom.md) — _(no submodules)_- [custom](./src/validation/validators/custom/custom.md) — _(no submodules)_- [email](./src/validation/validators/email/email.md) — _(no submodules)_- [email](./src/validation/validators/email/email.md) — _(no submodules)_- [iban](./src/validation/validators/iban/iban.md) — _(no submodules)_- [iban](./src/validation/validators/iban/iban.md) — _(no submodules)_- [max-length](./src/validation/validators/max-length/max-length.md) — _(no submodules)_- [max-length](./src/validation/validators/max-length/max-length.md) — _(no submodules)_- [min-length](./src/validation/validators/min-length/min-length.md) — _(no submodules)_- [min-length](./src/validation/validators/min-length/min-length.md) — _(no submodules)_- [password-strength](./src/validation/validators/password-strength/password-strength.md) — _(no submodules)_- [password-strength](./src/validation/validators/password-strength/password-strength.md) — _(no submodules)_- [pattern](./src/validation/validators/pattern/pattern.md) — _(no submodules)_- [pattern](./src/validation/validators/pattern/pattern.md) — _(no submodules)_- [phone](./src/validation/validators/phone/phone.md) — _(no submodules)_- [phone](./src/validation/validators/phone/phone.md) — _(no submodules)_- [postcode](./src/validation/validators/postcode/postcode.md) — _(no submodules)_- [postcode](./src/validation/validators/postcode/postcode.md) — _(no submodules)_- [required](./src/validation/validators/required/required.md) — _(no submodules)_- [required](./src/validation/validators/required/required.md) — _(no submodules)_- [url](./src/validation/validators/url/url.md) — _(no submodules)_- [url](./src/validation/validators/url/url.md) — _(no submodules)_- use-api-client — React hook that reads the active `… - [api-client-context](./src/core/api-client-context/api-client-context.md) — _(no submodules)_- use-api-client — React hook that reads the active `… - [use-api-client](./src/core/api-client-context/use-api-client.md) — React hook that reads the active `ApiClient` from the surrounding `` and returns it typed as the con… - [auth-context](./src/core/auth-context/auth-context.md) — _(no submodules)_- use-auth — React hook that reads the active `AuthCo… - [auth-context](./src/core/auth-context/auth-context.md) — _(no submodules)_- use-auth — React hook that reads the active `AuthCo… - [use-auth](./src/core/auth-context/use-auth.md) — React hook that reads the active `AuthContextValue` from the surrounding `` and returns it typed as `Auth… - [use-domain-form](./src/core/use-domain-form/use-domain-form.md) — _(no submodules)_- [use-domain-form](./src/core/use-domain-form/use-domain-form.md) — _(no submodules)_- [use-form-validation](./src/core/use-form-validation/use-form-validation.md) — _(no submodules)_- [use-form-validation](./src/core/use-form-validation/use-form-validation.md) — _(no submodules)_- [validation-engine](./src/core/validation-engine/validation-engine.md) — _(no submodules)_- [cross-field-rule](./src/core/validation-engine/cross-field-rule.md) — Convenience factory + helper for declaring `CrossFieldRule` values. Cross-field rules are the second pipeline phase ins… - [server-error-mapper](./src/core/validation-engine/server-error-mapper.md) — Bridges server-side validation envelopes into the engine's per-field `ValidatorFailure` shape. When a form's `submit.on… - [validation-engine](./src/core/validation-engine/validation-engine.md) — _(no submodules)_- [error-codes](./src/errors/error-codes.md) — Registers the thirteen stable error codes used by `@suaveplan/react-forms` under the `REACT_FORMS` namespace via `defin… - [react-forms-error](./src/errors/react-forms-error.md) — Defines the base `ReactFormsError` class shared by every error path in `@suaveplan/react-forms`. Extending the project… - [create-domain-form](./src/factory/create-domain-form/create-domain-form.md) — Declarative typed-form factory. Wraps `useDomainForm` + `` + the layout dispatcher into a single comp… - [create-domain-form](./src/factory/create-domain-form/create-domain-form.md) — Declarative typed-form factory. Wraps `useDomainForm` + `` + the layout dispatcher into a single comp… - [field-config](./src/factory/field-config/field-config.md) — `FieldConfig` discriminated union, per-kind Zod schemas, and the `validateFieldConfig` / `validateFieldConfigMap` helpe… - [field-config](./src/factory/field-config/field-config.md) — `FieldConfig` discriminated union, per-kind Zod schemas, and the `validateFieldConfig` / `validateFieldConfigMap` helpe… - [render-field](./src/factory/render-field/render-field.md) — Single-field renderer used by `useDomainForm` and `createDomainForm` to turn a typed `FieldConfig` into a `` cha… - [render-field](./src/factory/render-field/render-field.md) — Single-field renderer used by `useDomainForm` and `createDomainForm` to turn a typed `FieldConfig` into a `` cha… - [locales](./src/locales/locales.md) — Bundled translation strings shipped with `@suaveplan/react-forms`. - [augmentation](./src/locales/augmentation.md) — Side-effect-only TypeScript module that augments `@suaveplan/react-i18n`'s `ContributedTranslationKeys` interface with… - [locales](./src/locales/locales.md) — Bundled translation strings shipped with `@suaveplan/react-forms`. - [translation-keys](./src/locales/translation-keys.md) — `translation-keys.ts` is the codegen-emitted string-literal union of every translation key contributed by `@suaveplan/r… - [observability](./src/observability/react-forms-metrics.md) — _(no submodules)_- [react-forms-metrics](./src/observability/react-forms-metrics.md) — _(no submodules)_- [field](./src/primitives/field/field.md) — _(no submodules)_- [field](./src/primitives/field/field.md) — _(no submodules)_- [money-input](./src/primitives/money-input/money-input.md) — Locale-aware currency input wrapping `@suaveplan/react-ui`'s ``. - [money-input](./src/primitives/money-input/money-input.md) — Locale-aware currency input wrapping `@suaveplan/react-ui`'s ``. - [async-search](./src/recipes/async-search/async-search.md) — Async-prefilled form recipe. Resolves an entity by `id` via the supplied `load(id, signal)` callback, then mounts the u… - [async-search](./src/recipes/async-search/async-search.md) — Async-prefilled form recipe. Resolves an entity by `id` via the supplied `load(id, signal)` callback, then mounts the u… - [conditional](./src/recipes/conditional/conditional.md) — Show / hide form fields based on a predicate over the parent form's values. When the gate flips closed the recipe unreg… - [conditional](./src/recipes/conditional/conditional.md) — Show / hide form fields based on a predicate over the parent form's values. When the gate flips closed the recipe unreg… - [repeating-fieldset](./src/recipes/repeating-fieldset/repeating-fieldset.md) — Dynamic-array fieldset recipe backed by react-hook-form's `useFieldArray`. Renders one row per array entry; add / remov… - [repeating-fieldset](./src/recipes/repeating-fieldset/repeating-fieldset.md) — Dynamic-array fieldset recipe backed by react-hook-form's `useFieldArray`. Renders one row per array entry; add / remov… - [wizard](./src/recipes/wizard/wizard.md) — Multi-step wizard recipe. Each step owns a Zod sub-schema and a typed field-config map; navigating forward validates th… - [wizard](./src/recipes/wizard/wizard.md) — Multi-step wizard recipe. Each step owns a Zod sub-schema and a typed field-config map; navigating forward validates th… - [async-email-unique](./src/validation/async/async-email-unique/async-email-unique.md) — _(no submodules)_- [async-email-unique](./src/validation/async/async-email-unique/async-email-unique.md) — _(no submodules)_- [async-username-available](./src/validation/async/async-username-available/async-username-available.md) — _(no submodules)_- [async-username-available](./src/validation/async/async-username-available/async-username-available.md) — _(no submodules)_- [compose](./src/validation/compose/compose.md) — _(no submodules)_- or — OR-semantics composer for the validator suite.… - [compose](./src/validation/compose/compose.md) — _(no submodules)_- or — OR-semantics composer for the validator suite.… - [or](./src/validation/compose/or.md) — OR-semantics composer for the validator suite. Returns a validator that passes when any of the input validators passes.… - [sequence](./src/validation/compose/sequence.md) — Short-circuit AND composer with explicit ordering semantics. Identical to `compose` in result — every validator must pa… - [shared](./src/validation/compose/shared.md) — Tiny internal helper module shared by every composer in `validation/compose`. Centralises the `Promise` discrimination… - [bic](./src/validation/validators/bic/bic.md) — _(no submodules)_- [bic](./src/validation/validators/bic/bic.md) — _(no submodules)_- [credit-card](./src/validation/validators/credit-card/credit-card.md) — _(no submodules)_- [credit-card](./src/validation/validators/credit-card/credit-card.md) — _(no submodules)_- [custom](./src/validation/validators/custom/custom.md) — _(no submodules)_- [custom](./src/validation/validators/custom/custom.md) — _(no submodules)_- [email](./src/validation/validators/email/email.md) — _(no submodules)_- [email](./src/validation/validators/email/email.md) — _(no submodules)_- [iban](./src/validation/validators/iban/iban.md) — _(no submodules)_- [iban](./src/validation/validators/iban/iban.md) — _(no submodules)_- [max-length](./src/validation/validators/max-length/max-length.md) — _(no submodules)_- [max-length](./src/validation/validators/max-length/max-length.md) — _(no submodules)_- [min-length](./src/validation/validators/min-length/min-length.md) — _(no submodules)_- [min-length](./src/validation/validators/min-length/min-length.md) — _(no submodules)_- [password-strength](./src/validation/validators/password-strength/password-strength.md) — _(no submodules)_- [password-strength](./src/validation/validators/password-strength/password-strength.md) — _(no submodules)_- [pattern](./src/validation/validators/pattern/pattern.md) — _(no submodules)_- [pattern](./src/validation/validators/pattern/pattern.md) — _(no submodules)_- [phone](./src/validation/validators/phone/phone.md) — _(no submodules)_- [phone](./src/validation/validators/phone/phone.md) — _(no submodules)_- [postcode](./src/validation/validators/postcode/postcode.md) — _(no submodules)_- [postcode](./src/validation/validators/postcode/postcode.md) — _(no submodules)_- [required](./src/validation/validators/required/required.md) — _(no submodules)_- [required](./src/validation/validators/required/required.md) — _(no submodules)_- [url](./src/validation/validators/url/url.md) — _(no submodules)_- [url](./src/validation/validators/url/url.md) — _(no submodules)_- [api-client-context](./src/core/api-client-context/api-client-context.md) — _(no submodules)_- [use-api-client](./src/core/api-client-context/use-api-client.md) — React hook that reads the active `ApiClient` from the surrounding `` and returns it typed as the con… - [auth-context](./src/core/auth-context/auth-context.md) — _(no submodules)_ - [auth-context](./src/core/auth-context/auth-context.md) — _(no submodules)_ - [use-auth](./src/core/auth-context/use-auth.md) — React hook that reads the active `AuthContextValue` from the surrounding `` and returns it typed as `Auth… - [use-domain-form](./src/core/use-domain-form/use-domain-form.md) — _(no submodules)_ - [use-domain-form](./src/core/use-domain-form/use-domain-form.md) — _(no submodules)_- [use-form-validation](./src/core/use-form-validation/use-form-validation.md) — _(no submodules)_ - [use-form-validation](./src/core/use-form-validation/use-form-validation.md) — _(no submodules)_- [validation-engine](./src/core/validation-engine/validation-engine.md) — _(no submodules)_ - [cross-field-rule](./src/core/validation-engine/cross-field-rule.md) — Convenience factory + helper for declaring `CrossFieldRule` values. Cross-field rules are the second pipeline phase ins… - [server-error-mapper](./src/core/validation-engine/server-error-mapper.md) — Bridges server-side validation envelopes into the engine's per-field `ValidatorFailure` shape. When a form's `submit.on… - [validation-engine](./src/core/validation-engine/validation-engine.md) — _(no submodules)_- [error-codes](./src/errors/error-codes.md) — Registers the thirteen stable error codes used by `@suaveplan/react-forms` under the `REACT_FORMS` namespace via `defin… - [react-forms-error](./src/errors/react-forms-error.md) — Defines the base `ReactFormsError` class shared by every error path in `@suaveplan/react-forms`. Extending the project… - [create-domain-form](./src/factory/create-domain-form/create-domain-form.md) — Declarative typed-form factory. Wraps `useDomainForm` + `` + the layout dispatcher into a single comp… - [create-domain-form](./src/factory/create-domain-form/create-domain-form.md) — Declarative typed-form factory. Wraps `useDomainForm` + `` + the layout dispatcher into a single comp… - [field-config](./src/factory/field-config/field-config.md) — `FieldConfig` discriminated union, per-kind Zod schemas, and the `validateFieldConfig` / `validateFieldConfigMap` helpe… - [field-config](./src/factory/field-config/field-config.md) — `FieldConfig` discriminated union, per-kind Zod schemas, and the `validateFieldConfig` / `validateFieldConfigMap` helpe… - [render-field](./src/factory/render-field/render-field.md) — Single-field renderer used by `useDomainForm` and `createDomainForm` to turn a typed `FieldConfig` into a `` cha… - [render-field](./src/factory/render-field/render-field.md) — Single-field renderer used by `useDomainForm` and `createDomainForm` to turn a typed `FieldConfig` into a `` cha… - [locales](./src/locales/locales.md) — Bundled translation strings shipped with `@suaveplan/react-forms`. - [augmentation](./src/locales/augmentation.md) — Side-effect-only TypeScript module that augments `@suaveplan/react-i18n`'s `ContributedTranslationKeys` interface with… - [locales](./src/locales/locales.md) — Bundled translation strings shipped with `@suaveplan/react-forms`. - [translation-keys](./src/locales/translation-keys.md) — `translation-keys.ts` is the codegen-emitted string-literal union of every translation key contributed by `@suaveplan/r… - [observability](./src/observability/react-forms-metrics.md) — _(no submodules)_ - [react-forms-metrics](./src/observability/react-forms-metrics.md) — _(no submodules)_- [field](./src/primitives/field/field.md) — _(no submodules)_ - [field](./src/primitives/field/field.md) — _(no submodules)_- [money-input](./src/primitives/money-input/money-input.md) — Locale-aware currency input wrapping `@suaveplan/react-ui`'s ``. - [money-input](./src/primitives/money-input/money-input.md) — Locale-aware currency input wrapping `@suaveplan/react-ui`'s ``. - [async-search](./src/recipes/async-search/async-search.md) — Async-prefilled form recipe. Resolves an entity by `id` via the supplied `load(id, signal)` callback, then mounts the u… - [async-search](./src/recipes/async-search/async-search.md) — Async-prefilled form recipe. Resolves an entity by `id` via the supplied `load(id, signal)` callback, then mounts the u… - [conditional](./src/recipes/conditional/conditional.md) — Show / hide form fields based on a predicate over the parent form's values. When the gate flips closed the recipe unreg… - [conditional](./src/recipes/conditional/conditional.md) — Show / hide form fields based on a predicate over the parent form's values. When the gate flips closed the recipe unreg… - [repeating-fieldset](./src/recipes/repeating-fieldset/repeating-fieldset.md) — Dynamic-array fieldset recipe backed by react-hook-form's `useFieldArray`. Renders one row per array entry; add / remov… - [repeating-fieldset](./src/recipes/repeating-fieldset/repeating-fieldset.md) — Dynamic-array fieldset recipe backed by react-hook-form's `useFieldArray`. Renders one row per array entry; add / remov… - [wizard](./src/recipes/wizard/wizard.md) — Multi-step wizard recipe. Each step owns a Zod sub-schema and a typed field-config map; navigating forward validates th… - [wizard](./src/recipes/wizard/wizard.md) — Multi-step wizard recipe. Each step owns a Zod sub-schema and a typed field-config map; navigating forward validates th… - [async-email-unique](./src/validation/async/async-email-unique/async-email-unique.md) — _(no submodules)_ - [async-email-unique](./src/validation/async/async-email-unique/async-email-unique.md) — _(no submodules)_- [async-username-available](./src/validation/async/async-username-available/async-username-available.md) — _(no submodules)_ - [async-username-available](./src/validation/async/async-username-available/async-username-available.md) — _(no submodules)_- [compose](./src/validation/compose/compose.md) — _(no submodules)_ - [compose](./src/validation/compose/compose.md) — _(no submodules)_ - [or](./src/validation/compose/or.md) — OR-semantics composer for the validator suite. Returns a validator that passes when any of the input validators passes.… - [sequence](./src/validation/compose/sequence.md) — Short-circuit AND composer with explicit ordering semantics. Identical to `compose` in result — every validator must pa… - [shared](./src/validation/compose/shared.md) — Tiny internal helper module shared by every composer in `validation/compose`. Centralises the `Promise` discrimination… - [bic](./src/validation/validators/bic/bic.md) — _(no submodules)_ - [bic](./src/validation/validators/bic/bic.md) — _(no submodules)_- [credit-card](./src/validation/validators/credit-card/credit-card.md) — _(no submodules)_ - [credit-card](./src/validation/validators/credit-card/credit-card.md) — _(no submodules)_- [custom](./src/validation/validators/custom/custom.md) — _(no submodules)_ - [custom](./src/validation/validators/custom/custom.md) — _(no submodules)_- [email](./src/validation/validators/email/email.md) — _(no submodules)_ - [email](./src/validation/validators/email/email.md) — _(no submodules)_- [iban](./src/validation/validators/iban/iban.md) — _(no submodules)_ - [iban](./src/validation/validators/iban/iban.md) — _(no submodules)_- [max-length](./src/validation/validators/max-length/max-length.md) — _(no submodules)_ - [max-length](./src/validation/validators/max-length/max-length.md) — _(no submodules)_- [min-length](./src/validation/validators/min-length/min-length.md) — _(no submodules)_ - [min-length](./src/validation/validators/min-length/min-length.md) — _(no submodules)_- [password-strength](./src/validation/validators/password-strength/password-strength.md) — _(no submodules)_ - [password-strength](./src/validation/validators/password-strength/password-strength.md) — _(no submodules)_- [pattern](./src/validation/validators/pattern/pattern.md) — _(no submodules)_ - [pattern](./src/validation/validators/pattern/pattern.md) — _(no submodules)_- [phone](./src/validation/validators/phone/phone.md) — _(no submodules)_ - [phone](./src/validation/validators/phone/phone.md) — _(no submodules)_- [postcode](./src/validation/validators/postcode/postcode.md) — _(no submodules)_ - [postcode](./src/validation/validators/postcode/postcode.md) — _(no submodules)_- [required](./src/validation/validators/required/required.md) — _(no submodules)_ - [required](./src/validation/validators/required/required.md) — _(no submodules)_- [url](./src/validation/validators/url/url.md) — _(no submodules)_ - [url](./src/validation/validators/url/url.md) — _(no submodules)_ ## Install ```bash bun add @suaveplan/react-forms ``` Peer deps: `react ^18.0.0 || ^19.0.0`, `@suaveplan/react-ui` (must be provided by the consumer; this package re-exports `` and imports `` / `