import type { ChildrenList, PartialElement } from '@furystack/shades';
import { ObservableValue } from '@furystack/utils';
import type { InputValidationResult } from './inputs/input.js';
type UnknownFormValidationResult = {
    isValid: null;
};
type ValidFormValidationResult = {
    isValid: true;
};
type InvalidFormValidationResult = {
    isValid: false;
    reason: 'validation-failed' | 'input-validation-failed' | 'unknown';
};
type FormValidationResult = ValidFormValidationResult | InvalidFormValidationResult | UnknownFormValidationResult;
export declare class FormService<T> {
    validatedFormData: ObservableValue<T | null>;
    rawFormData: ObservableValue<{
        [k: string]: FormDataEntryValue;
    } | null>;
    validationResult: ObservableValue<FormValidationResult>;
    fieldErrors: ObservableValue<{
        [x: string]: {
            validationResult: InputValidationResult;
            validity: ValidityState;
        } | undefined;
    }>;
    inputs: Set<HTMLInputElement>;
    setFieldState: (key: keyof T, validationResult: InputValidationResult, validity: ValidityState) => void;
    [Symbol.dispose](): void;
}
type FormProps<T> = {
    onSubmit: (formData: T) => void;
    onReset?: () => void;
    validate: (formData: any) => formData is T;
} & PartialElement<Omit<HTMLFormElement, 'onsubmit' | 'onchange' | 'onreset'>>;
export declare const Form: <T>(props: FormProps<T>, children: ChildrenList) => JSX.Element;
export {};
//# sourceMappingURL=form.d.ts.map