import { CSSProperties, ElementType } from 'react';
import { FormikHelpers, FormikProps } from 'formik';
import { FieldProps } from '../Field/Field';
import { FieldArrayProps } from '../FieldArray/FieldArray';
import { ValidatedApiResult } from '../Validation/ValidatedApiResult';
export declare type FormBuilderProp<TForm extends object> = {
    Field: <TProp extends keyof TForm, TRenderComponent extends ElementType>(props: FieldProps<TForm, TProp, TRenderComponent>) => JSX.Element;
    FieldArray: <TProp extends keyof TForm>(props: FieldArrayProps<TForm, TProp>) => JSX.Element;
};
export interface FullFormProps<TForm extends object> {
    /** The `<Field/>` and `<FieldArray/>` components. */
    children: (formBuilder: FormBuilderProp<TForm>) => JSX.Element;
    /** Submission handler  */
    onSubmit: (formValues: TForm, formikBag: FormikHelpers<TForm>) => Promise<ValidatedApiResult>;
    /** Submission handler for forms that use [FormData](https://developer.mozilla.org/en-US/docs/Web/API/FormData).*/
    onFormDataSubmit: (formValues: FormData, formikBag: FormikHelpers<TForm>) => Promise<ValidatedApiResult>;
    className?: string;
    style?: CSSProperties;
    /** Prevent the user from leaving the form if they have edited any field. This is presented as a JS `alert()`. */
    ignoreLostChanges?: boolean;
    /** The intitial values of the form. */
    initialValues?: TForm;
    /** A ref to the form element. */
    innerRef?: React.Ref<FormikProps<TForm>>;
}
declare type RequireAtLeastOne<T, Keys extends keyof T = keyof T> = Pick<T, Exclude<keyof T, Keys>> & {
    [K in Keys]-?: Required<Pick<T, K>> & Partial<Pick<T, Exclude<Keys, K>>>;
}[Keys];
export declare type FormProps<TForm extends object> = RequireAtLeastOne<FullFormProps<TForm>, 'onSubmit' | 'onFormDataSubmit'>;
/** Define a form. Uses [formik](https://formik.org/docs/overview). Usually contains many `<Field/>` components. */
declare function Form<TForm extends object>({ children, className, style, ignoreLostChanges, onSubmit, onFormDataSubmit, initialValues, ...props }: FormProps<TForm>): JSX.Element;
declare namespace Form {
    var DisplayFormState: () => JSX.Element;
}
export default Form;
