import { ComponentOptionsMixin } from 'vue';
import { ComponentProvideOptions } from 'vue';
import { ComponentType } from '@xfc/vue3-json-render';
import { DefineComponent } from 'vue';
import { ExtractPropTypes } from 'vue';
import { Field } from '@xfc/vue3-json-render';
import { Hook } from '@xfc/vue3-json-render';
import { PropType } from 'vue';
import { PublicProps } from 'vue';
import { Recordable } from '@xfc/vue3-json-render';
import { Ref } from 'vue';
import { RendererElement } from 'vue';
import { RendererNode } from 'vue';
import { ShallowRef } from 'vue';
import { VNode } from 'vue';
import { WritableComputedRef } from 'vue';

export declare type BeRef<T = any> = T | Ref<T> | ShallowRef<T> | WritableComputedRef<T>;

export declare type FieldType = 'formItem' | 'container';

export declare interface FormField extends Field {
    id: string;
    type: FieldType;
    icon?: string;
    value?: any;
    label: string;
    hideLabel?: boolean;
    readonly?: boolean;
    required?: boolean;
    hidden: boolean;
    rules?: Recordable[];
    children?: FormField[];
}

export declare interface FormRenderOptions {
    globalHook?: Hook<FormField>;
    renders?: Recordable<(field: FormField) => VNode | undefined>;
    injects?: Recordable;
}

export declare function useFormRender(options?: BeRef<FormRenderOptions>): {
    Render: DefineComponent<ExtractPropTypes<    {
    field: {
    type: PropType<FormField>;
    required: true;
    };
    modelValue: {
    type: PropType<any>;
    required: false;
    };
    readonly: {
    type: PropType<boolean>;
    required: false;
    default: boolean;
    };
    }>, () => VNode<RendererNode, RendererElement, {
    [key: string]: any;
    }>, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
    'update:modelValue': (value: any) => true;
    input: (value: any) => true;
    }, string, PublicProps, Readonly<ExtractPropTypes<    {
    field: {
    type: PropType<FormField>;
    required: true;
    };
    modelValue: {
    type: PropType<any>;
    required: false;
    };
    readonly: {
    type: PropType<boolean>;
    required: false;
    default: boolean;
    };
    }>> & Readonly<{
    "onUpdate:modelValue"?: ((value: any) => any) | undefined;
    onInput?: ((value: any) => any) | undefined;
    }>, {
    readonly: boolean;
    }, {}, {}, {}, string, ComponentProvideOptions, true, {}, any>;
    FormRender: DefineComponent<ExtractPropTypes<    {
    field: {
    type: PropType<FormField>;
    required: true;
    };
    formData: {
    type: PropType<Recordable>;
    required: true;
    };
    readonly: {
    type: BooleanConstructor;
    default: boolean;
    };
    }>, () => VNode<RendererNode, RendererElement, {
    [key: string]: any;
    }> | undefined, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<ExtractPropTypes<    {
    field: {
    type: PropType<FormField>;
    required: true;
    };
    formData: {
    type: PropType<Recordable>;
    required: true;
    };
    readonly: {
    type: BooleanConstructor;
    default: boolean;
    };
    }>> & Readonly<{}>, {
    readonly: boolean;
    }, {}, {}, {}, string, ComponentProvideOptions, true, {}, any>;
    addComponent: (name: string, component: ComponentType, hook?: Hook<FormField> | undefined) => void;
    removeComponent: (name: string) => void;
    components: Recordable<ComponentType>;
    hooks: Recordable<Hook<FormField>>;
};


export * from "@xfc/vue3-json-render";

export { }
