import * as Atom from "@effect-atom/atom/Atom"; import * as Effect from "effect/Effect"; import * as Option from "effect/Option"; import * as ParseResult from "effect/ParseResult"; import * as Schema from "effect/Schema"; import * as Field from "./Field.ts"; import * as FormBuilder from "./FormBuilder.ts"; import { type WeakRegistry } from "./internal/weak-registry.ts"; import * as Mode from "./Mode.ts"; import * as Validation from "./Validation.ts"; export interface FieldAtoms { readonly valueAtom: Atom.Writable; readonly initialValueAtom: Atom.Atom; readonly touchedAtom: Atom.Writable; readonly errorAtom: Atom.Atom>; readonly isDirtyAtom: Atom.Atom; readonly validationAtom: Atom.AtomResultFn; readonly displayErrorAtom: Atom.Atom>; readonly fieldValidationCountAtom: Atom.Writable; readonly shouldValidateAtom: Atom.Atom; readonly triggerValidationAtom: Atom.Atom; } export interface PublicFieldAtoms { readonly value: Atom.Atom>; readonly error: Atom.Atom>; readonly isDirty: Atom.Atom; readonly isTouched: Atom.Atom; readonly isValidating: Atom.Atom; readonly setValue: Atom.Writable E)>; readonly setTouched: Atom.Writable; readonly validate: Atom.Writable; } export interface FormAtomsConfig { readonly runtime: Atom.AtomRuntime; readonly formBuilder: FormBuilder.FormBuilder; readonly mode?: Mode.FormMode; readonly reactivityKeys?: ReadonlyArray | Readonly>> | undefined; readonly onSubmit: (args: SubmitArgs, ctx: { readonly decoded: Field.DecodedFromFields; readonly encoded: Field.EncodedFromFields; readonly get: Atom.FnContext; }) => A | Effect.Effect; } export type FieldRefs = { readonly [K in keyof TFields]: TFields[K] extends Field.FieldDef ? FormBuilder.FieldRef> : TFields[K] extends Field.ArrayFieldDef ? FormBuilder.FieldRef>> : never; }; export interface FormAtoms { readonly stateAtom: Atom.Writable>, Option.Option>>; readonly errorsAtom: Atom.Writable, Map>; readonly rootErrorAtom: Atom.Atom>; readonly valuesAtom: Atom.Atom>>; readonly dirtyFieldsAtom: Atom.Atom>; readonly isDirtyAtom: Atom.Atom; readonly submitCountAtom: Atom.Atom; readonly validationCountAtom: Atom.Atom; readonly lastSubmittedValuesAtom: Atom.Atom>>; readonly changedSinceSubmitFieldsAtom: Atom.Atom>; readonly hasChangedSinceSubmitAtom: Atom.Atom; readonly submitAtom: Atom.AtomResultFn; readonly validateAtom: Atom.AtomResultFn; readonly combinedSchema: Schema.Schema, Field.EncodedFromFields, R>; readonly fieldRefs: FieldRefs; readonly validationAtomsRegistry: WeakRegistry>; readonly fieldAtomsRegistry: WeakRegistry; readonly getOrCreateValidationAtom: (fieldPath: string, schema: Schema.Schema.Any) => Atom.AtomResultFn; readonly getOrCreateFieldAtoms: (fieldPath: string, schema: Schema.Schema.Any) => FieldAtoms; readonly resetValidationAtoms: (ctx: { set: (atom: Atom.Writable, value: W) => void; }) => void; readonly operations: FormOperations; readonly resetAtom: Atom.Writable; readonly revertToLastSubmitAtom: Atom.Writable; readonly setValuesAtom: Atom.Writable>; readonly getFieldAtoms: (field: FormBuilder.FieldRef) => PublicFieldAtoms; /** * Root anchor atom for the form's dependency graph. * Mount this atom to keep all form state alive even when field components unmount. * * Useful for: * - Multi-step wizards where steps unmount but state should persist * - Conditional fields (toggles) where state should survive visibility changes * * @example * ```tsx * // Keep form state alive at wizard root level * function Wizard() { * useAtomMount(step1Form.mount) * useAtomMount(step2Form.mount) * return currentStep === 1 ? : * } * ``` */ readonly autoSubmitAtom: Atom.Atom; readonly onBlurSubmitAtom: Atom.Writable; readonly mountAtom: Atom.Atom; readonly keepAliveActiveAtom: Atom.Writable; } export interface FormOperations { readonly createInitialState: (defaultValues: Field.EncodedFromFields) => FormBuilder.FormState; readonly createResetState: (state: FormBuilder.FormState) => FormBuilder.FormState; readonly createSubmitState: (state: FormBuilder.FormState) => FormBuilder.FormState; readonly setFieldValue: (state: FormBuilder.FormState, fieldPath: string, value: unknown) => FormBuilder.FormState; readonly setFormValues: (state: FormBuilder.FormState, values: Field.EncodedFromFields) => FormBuilder.FormState; readonly setFieldTouched: (state: FormBuilder.FormState, fieldPath: string, touched: boolean) => FormBuilder.FormState; readonly appendArrayItem: (state: FormBuilder.FormState, arrayPath: string, itemSchema: Schema.Schema.Any, value?: unknown) => FormBuilder.FormState; readonly removeArrayItem: (state: FormBuilder.FormState, arrayPath: string, index: number) => FormBuilder.FormState; readonly swapArrayItems: (state: FormBuilder.FormState, arrayPath: string, indexA: number, indexB: number) => FormBuilder.FormState; readonly moveArrayItem: (state: FormBuilder.FormState, arrayPath: string, fromIndex: number, toIndex: number) => FormBuilder.FormState; readonly revertToLastSubmit: (state: FormBuilder.FormState) => FormBuilder.FormState; } export declare const make: (config: FormAtomsConfig) => FormAtoms; //# sourceMappingURL=FormAtoms.d.ts.map