import { type Component, type InjectionKey, type DeepReadonly, type Ref, type PropType } from 'vue';
import type { z, TypeOf } from 'zod';
import type { FormComponentOptions, FormSchema, FormTemplate, InjectedFormData } from './types';
import { FormStatus } from './enums';
export declare const defineForm: <Schema extends FormSchema>(schema: Schema, provideKey: InjectionKey<InjectedFormData<Schema>>, options?: FormComponentOptions<Schema> | undefined, VvFormTemplate?: Component) => {
    errors: Ref<z.inferFormattedError<Schema, string> | undefined>;
    status: Ref<FormStatus | undefined>;
    formData: Ref<Partial<z.TypeOf<Schema> | undefined>>;
    /**
     * An hack to add types to the default slot
     */
    VvForm: {
        new (...args: any[]): {
            $: import("vue").ComponentInternalInstance;
            $data: {};
            $props: {
                template?: FormTemplate<Schema> | undefined;
                modelValue?: Record<string, any> | undefined;
                updateThrottle?: number | undefined;
                continuosValidation?: boolean | undefined;
                onInvalid?: ((...args: any[]) => any) | undefined;
                onValid?: ((...args: any[]) => any) | undefined;
                "onUpdate:modelValue"?: ((...args: any[]) => any) | undefined;
                key?: string | number | symbol | undefined;
                onSubmit?: ((...args: any[]) => any) | undefined;
                ref?: import("vue").VNodeRef | undefined;
                ref_for?: boolean | undefined;
                ref_key?: string | undefined;
                onVnodeBeforeMount?: ((vnode: import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
                    [key: string]: any;
                }>) => void) | ((vnode: import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
                    [key: string]: any;
                }>) => void)[] | undefined;
                onVnodeMounted?: ((vnode: import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
                    [key: string]: any;
                }>) => void) | ((vnode: import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
                    [key: string]: any;
                }>) => void)[] | undefined;
                onVnodeBeforeUpdate?: ((vnode: import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
                    [key: string]: any;
                }>, oldVNode: import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
                    [key: string]: any;
                }>) => void) | ((vnode: import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
                    [key: string]: any;
                }>, oldVNode: import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
                    [key: string]: any;
                }>) => void)[] | undefined;
                onVnodeUpdated?: ((vnode: import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
                    [key: string]: any;
                }>, oldVNode: import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
                    [key: string]: any;
                }>) => void) | ((vnode: import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
                    [key: string]: any;
                }>, oldVNode: import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
                    [key: string]: any;
                }>) => void)[] | undefined;
                onVnodeBeforeUnmount?: ((vnode: import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
                    [key: string]: any;
                }>) => void) | ((vnode: import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
                    [key: string]: any;
                }>) => void)[] | undefined;
                onVnodeUnmounted?: ((vnode: import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
                    [key: string]: any;
                }>) => void) | ((vnode: import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
                    [key: string]: any;
                }>) => void)[] | undefined;
                class?: unknown;
                style?: unknown;
            };
            $attrs: {
                [x: string]: unknown;
            };
            $refs: {
                [x: string]: unknown;
            };
            $slots: Readonly<{
                [name: string]: import("vue").Slot<any> | undefined;
            }>;
            $root: import("vue").ComponentPublicInstance<{}, {}, {}, {}, {}, {}, {}, {}, false, import("vue").ComponentOptionsBase<any, any, any, any, any, any, any, any, any, {}, {}, string, {}>, {}, {}> | null;
            $parent: import("vue").ComponentPublicInstance<{}, {}, {}, {}, {}, {}, {}, {}, false, import("vue").ComponentOptionsBase<any, any, any, any, any, any, any, any, any, {}, {}, string, {}>, {}, {}> | null;
            $emit: (event: "invalid" | "valid" | "update:modelValue" | "submit", ...args: any[]) => void;
            $el: any;
            $options: import("vue").ComponentOptionsBase<Readonly<import("vue").ExtractPropTypes<{
                modelValue: {
                    type: ObjectConstructor;
                    default: () => {};
                };
                updateThrottle: {
                    type: NumberConstructor;
                    default: number;
                };
                continuosValidation: {
                    type: BooleanConstructor;
                    default: boolean;
                };
                template: {
                    type: PropType<FormTemplate<Schema>>;
                    default: undefined;
                };
            }>> & {
                onInvalid?: ((...args: any[]) => any) | undefined;
                onValid?: ((...args: any[]) => any) | undefined;
                "onUpdate:modelValue"?: ((...args: any[]) => any) | undefined;
                onSubmit?: ((...args: any[]) => any) | undefined;
            }, {
                formData: Ref<Partial<z.TypeOf<Schema> | undefined>>;
                submit: () => boolean;
                validate: (value?: Partial<z.TypeOf<Schema> | undefined>) => boolean;
                errors: Readonly<Ref<DeepReadonly<z.inferFormattedError<Schema, string>> | undefined>>;
                status: Readonly<Ref<FormStatus | undefined>>;
                invalid: import("vue").ComputedRef<boolean>;
            }, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, ("invalid" | "valid" | "update:modelValue" | "submit")[], string, {
                template: FormTemplate<Schema>;
                modelValue: Record<string, any>;
                updateThrottle: number;
                continuosValidation: boolean;
            }, {}, string, {}> & {
                beforeCreate?: ((() => void) | (() => void)[]) | undefined;
                created?: ((() => void) | (() => void)[]) | undefined;
                beforeMount?: ((() => void) | (() => void)[]) | undefined;
                mounted?: ((() => void) | (() => void)[]) | undefined;
                beforeUpdate?: ((() => void) | (() => void)[]) | undefined;
                updated?: ((() => void) | (() => void)[]) | undefined;
                activated?: ((() => void) | (() => void)[]) | undefined;
                deactivated?: ((() => void) | (() => void)[]) | undefined;
                beforeDestroy?: ((() => void) | (() => void)[]) | undefined;
                beforeUnmount?: ((() => void) | (() => void)[]) | undefined;
                destroyed?: ((() => void) | (() => void)[]) | undefined;
                unmounted?: ((() => void) | (() => void)[]) | undefined;
                renderTracked?: (((e: import("vue").DebuggerEvent) => void) | ((e: import("vue").DebuggerEvent) => void)[]) | undefined;
                renderTriggered?: (((e: import("vue").DebuggerEvent) => void) | ((e: import("vue").DebuggerEvent) => void)[]) | undefined;
                errorCaptured?: (((err: unknown, instance: import("vue").ComponentPublicInstance<{}, {}, {}, {}, {}, {}, {}, {}, false, import("vue").ComponentOptionsBase<any, any, any, any, any, any, any, any, any, {}, {}, string, {}>, {}, {}> | null, info: string) => boolean | void) | ((err: unknown, instance: import("vue").ComponentPublicInstance<{}, {}, {}, {}, {}, {}, {}, {}, false, import("vue").ComponentOptionsBase<any, any, any, any, any, any, any, any, any, {}, {}, string, {}>, {}, {}> | null, info: string) => boolean | void)[]) | undefined;
            };
            $forceUpdate: () => void;
            $nextTick: typeof import("vue").nextTick;
            $watch<T extends string | ((...args: any) => any)>(source: T, cb: T extends (...args: any) => infer R ? (args_0: R, args_1: R) => any : (...args: any) => any, options?: import("vue").WatchOptions<boolean> | undefined): import("vue").WatchStopHandle;
        } & Readonly<import("vue").ExtractPropTypes<{
            modelValue: {
                type: ObjectConstructor;
                default: () => {};
            };
            updateThrottle: {
                type: NumberConstructor;
                default: number;
            };
            continuosValidation: {
                type: BooleanConstructor;
                default: boolean;
            };
            template: {
                type: PropType<FormTemplate<Schema>>;
                default: undefined;
            };
        }>> & {
            onInvalid?: ((...args: any[]) => any) | undefined;
            onValid?: ((...args: any[]) => any) | undefined;
            "onUpdate:modelValue"?: ((...args: any[]) => any) | undefined;
            onSubmit?: ((...args: any[]) => any) | undefined;
        } & import("vue").ShallowUnwrapRef<{
            formData: Ref<Partial<z.TypeOf<Schema> | undefined>>;
            submit: () => boolean;
            validate: (value?: Partial<z.TypeOf<Schema> | undefined>) => boolean;
            errors: Readonly<Ref<DeepReadonly<z.inferFormattedError<Schema, string>> | undefined>>;
            status: Readonly<Ref<FormStatus | undefined>>;
            invalid: import("vue").ComputedRef<boolean>;
        }> & {} & import("vue").ComponentCustomProperties & {};
        __isFragment?: undefined;
        __isTeleport?: undefined;
        __isSuspense?: undefined;
    } & import("vue").ComponentOptionsBase<Readonly<import("vue").ExtractPropTypes<{
        modelValue: {
            type: ObjectConstructor;
            default: () => {};
        };
        updateThrottle: {
            type: NumberConstructor;
            default: number;
        };
        continuosValidation: {
            type: BooleanConstructor;
            default: boolean;
        };
        template: {
            type: PropType<FormTemplate<Schema>>;
            default: undefined;
        };
    }>> & {
        onInvalid?: ((...args: any[]) => any) | undefined;
        onValid?: ((...args: any[]) => any) | undefined;
        "onUpdate:modelValue"?: ((...args: any[]) => any) | undefined;
        onSubmit?: ((...args: any[]) => any) | undefined;
    }, {
        formData: Ref<Partial<z.TypeOf<Schema> | undefined>>;
        submit: () => boolean;
        validate: (value?: Partial<z.TypeOf<Schema> | undefined>) => boolean;
        errors: Readonly<Ref<DeepReadonly<z.inferFormattedError<Schema, string>> | undefined>>;
        status: Readonly<Ref<FormStatus | undefined>>;
        invalid: import("vue").ComputedRef<boolean>;
    }, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, ("invalid" | "valid" | "update:modelValue" | "submit")[], "invalid" | "valid" | "update:modelValue" | "submit", {
        template: FormTemplate<Schema>;
        modelValue: Record<string, any>;
        updateThrottle: number;
        continuosValidation: boolean;
    }, {}, string, {}> & import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps & (new () => {
        $slots: {
            default: (_: {
                formData: unknown extends Partial<z.TypeOf<Schema>> | undefined ? undefined : Partial<z.TypeOf<Schema>> | undefined;
                submit: () => boolean;
                validate: () => boolean;
                errors: Readonly<Ref<DeepReadonly<z.inferFormattedError<Schema, string>>>>;
                status: Ref<DeepReadonly<`${FormStatus}` | undefined>>;
                invalid: Ref<DeepReadonly<boolean>>;
            }) => any;
        };
    });
};
