import { DependencyList, FormEvent, ReactElement } from "react";
import type { Atom } from "../atom/definition.ts";
import { Field } from "../field/definition.ts";
export declare const formChange: Form.Change;
declare const hintSymbol: unique symbol;
export declare class Form<Value> implements Form.Interface<Value> {
    static use<Value>(initialValue: Value, deps: DependencyList, options?: Form.Options<Value>): Form<Value>;
    static Component<Payload, IsServer extends boolean | undefined = undefined>(props: Form.ComponentProps<Payload, IsServer>): ReactElement<HTMLFormElement>;
    [hintSymbol]: true;
    constructor(initialValue: Value, options?: Form.Options<Value>);
    get id(): string;
    get field(): Field<Value>;
    get value(): Atom.Value.Prop<Atom.Def<Value>>;
    useValue: Atom.Value.Use.Prop<"field", "exact", Atom.Def<Value>, Atom.Qualifier.Default>;
    set(value: Value): void;
    get dirty(): boolean;
    useDirty: Field.Dirty.Use.Prop<Atom.Qualifier.Default>;
    commit(): void;
    reset(): void;
    get initial(): Atom.Value.Prop<Atom.Def<Value>>;
    useCompute: Atom.Compute.Use.Prop<Atom.Def<Value>, Atom.Qualifier.Default>;
    get $(): Atom.$.Prop<"field", "exact", Value, Atom.Qualifier.Default>;
    at: Atom.At.Prop<"field", "exact", Value, Atom.Qualifier.Default>;
    try: Atom.TryProp<"field", "exact", Atom.Def<Value>, Atom.Qualifier.Default, Atom.Parent.Default>;
    into: Atom.Proxy.Into.Prop<"field", "exact", Atom.Def<Value>, Atom.Qualifier.Default, Atom.Parent.Default>;
    useInto: Atom.Proxy.Into.Use.Prop<"field", "exact", Atom.Def<Value>, Atom.Qualifier.Default, Atom.Parent.Default>;
    watch(callback: Atom.Watch.Callback<Atom.Def<Value>>): Atom.Unwatch;
    useWatch(callback: Atom.Watch.Callback<Atom.Def<Value>>, deps: DependencyList): Atom.Unwatch;
    get submitting(): boolean;
    useSubmitting(): boolean;
    get errors(): Field.Error[];
    useErrors: Field.Errors.Use.Prop<Atom.Qualifier.Default>;
    get valid(): boolean;
    useValid: Field.Valid.Use.Prop<Atom.Qualifier.Default>;
    validate(): Promise<void>;
    addError: Field.AddError.Prop;
    clearErrors(): void;
    control<IsServer extends boolean | undefined = undefined>(props?: Form.ControlProps<Value, IsServer> | undefined): Form.ControlRegistration;
}
export declare namespace Form {
    interface Interface<Value> extends Field.Ish.Value.Read<Atom.Def<Value>, Atom.Qualifier.Default>, Field.Ish.Value.Write<Atom.Qualifier.Default>, Field.Ish.Validation<Atom.Def<Value>, Atom.Qualifier.Default> {
        [hintSymbol]: true;
        id: string;
        field: Field<Value>;
        value: Atom.Value.Prop<Atom.Def<Value>>;
        useValue: Atom.Value.Use.Prop<"field", "exact", Atom.Def<Value>, Atom.Qualifier.Default>;
        set(value: Value): void;
        useCompute: Atom.Compute.Use.Prop<Atom.Def<Value>, Atom.Qualifier.Default>;
        get $(): Atom.$.Prop<"field", "exact", Value, Atom.Qualifier.Default>;
        at: Atom.At.Prop<"field", "exact", Value, Atom.Qualifier.Default>;
        try: Atom.TryProp<"field", "exact", Atom.Def<Value>, Atom.Qualifier.Default, Atom.Parent.Default>;
        into: Atom.Proxy.Into.Prop<"field", "exact", Atom.Def<Value>, Atom.Qualifier.Default, Atom.Parent.Default>;
        useInto: Atom.Proxy.Into.Use.Prop<"field", "exact", Atom.Def<Value>, Atom.Qualifier.Default, Atom.Parent.Default>;
        watch(callback: Atom.Watch.Callback<Atom.Def<Value>>): Atom.Unwatch;
        useWatch(callback: Atom.Watch.Callback<Atom.Def<Value>>, deps: DependencyList): Atom.Unwatch;
        validate(): Promise<void>;
    }
    interface Change {
        formSubmitting: bigint;
        formSubmitted: bigint;
        formValid: bigint;
        formInvalid: bigint;
    }
    interface Options<Value> {
        id?: string;
        validate?: Field.Validator<Value>;
    }
    interface ComponentProps<Value, IsServer extends boolean | undefined> extends ControlProps<Value, IsServer>, Omit<React.FormHTMLAttributes<HTMLFormElement>, "onSubmit" | "onReset"> {
        form: Form<Value>;
        children?: React.ReactNode;
    }
    interface ControlProps<Value, IsServer extends boolean | undefined> {
        onSubmit?: Control.OnSubmit<Value, IsServer> | undefined;
        onReset?: Control.OnReset | undefined;
        server?: IsServer;
    }
    interface ControlRegistration {
        onSubmit(event: React.FormEvent<HTMLFormElement>): void;
        onReset(event: React.FormEvent<HTMLFormElement>): void;
    }
    namespace Control {
        type OnSubmit<Value, IsServer extends boolean | undefined> = true extends IsServer ? (payload: Value) => unknown | Promise<unknown> : (payload: Value, event: FormEvent<HTMLFormElement>) => unknown | Promise<unknown>;
        interface OnReset {
            (event: FormEvent<HTMLFormElement>): unknown | Promise<unknown>;
        }
    }
}
export {};
//# sourceMappingURL=definition.d.ts.map