import * as vue from 'vue-demi';
import { App, ExtractPropTypes, PropType } from 'vue-demi';

declare type EventShim = {
    new (...args: any[]): {
        $props: {
            onClick?: (...args: any[]) => void;
        };
    };
};
declare type WithInstall<T> = T & {
    install(app: App): void;
} & EventShim;

declare type ButtonType = 'default' | 'primary' | 'success' | 'warning' | 'danger';
declare type ButtonSize = 'large' | 'normal' | 'small' | 'mini';

declare const useSmallBtn: () => {
    smallBtnDefaultText: any;
};

declare type ButtonProps = ExtractPropTypes<typeof buttonProps>;
declare const buttonProps: {
    text: StringConstructor;
    type: {
        type: vue.PropType<ButtonType>;
        default: ButtonType;
    };
    loadingText: StringConstructor;
    color: StringConstructor;
    loading: BooleanConstructor;
    disabled: BooleanConstructor;
};
declare const useBtn: () => {
    btnDefaultText: any;
};

declare const Button: WithInstall<vue.DefineComponent<{
    text: StringConstructor;
    type: {
        type: vue.PropType<ButtonType>;
        default: ButtonType;
    };
    loadingText: StringConstructor;
    color: StringConstructor;
    loading: BooleanConstructor;
    disabled: BooleanConstructor;
}, () => JSX.Element, unknown, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, ("click" | "clickSmall")[], "click" | "clickSmall", vue.VNodeProps & vue.AllowedComponentProps & vue.ComponentCustomProps, Readonly<vue.ExtractPropTypes<{
    text: StringConstructor;
    type: {
        type: vue.PropType<ButtonType>;
        default: ButtonType;
    };
    loadingText: StringConstructor;
    color: StringConstructor;
    loading: BooleanConstructor;
    disabled: BooleanConstructor;
}>> & {
    onClick?: ((...args: any[]) => any) | undefined;
    onClickSmall?: ((...args: any[]) => any) | undefined;
}, {
    type: ButtonType;
    loading: boolean;
    disabled: boolean;
}>>;

declare module 'vue-demi' {
    interface GlobalComponents {
        FastUseButton: typeof Button;
    }
}

declare type TagSize = 'large' | 'medium';
declare type TagType = 'default' | 'primary' | 'success' | 'warning' | 'danger';

declare type TagProps = ExtractPropTypes<typeof tagProps>;
declare const tagProps: {
    size: PropType<TagSize>;
    mark: BooleanConstructor;
    show: {
        type: BooleanConstructor;
        default: true;
    };
    type: {
        type: PropType<TagType>;
        default: TagType;
    };
    color: StringConstructor;
    plain: BooleanConstructor;
    round: BooleanConstructor;
    textColor: StringConstructor;
    closeable: BooleanConstructor;
};

declare const Tag: WithInstall<vue.DefineComponent<{
    size: vue.PropType<TagSize>;
    mark: BooleanConstructor;
    show: {
        type: BooleanConstructor;
        default: true;
    };
    type: {
        type: vue.PropType<TagType>;
        default: TagType;
    };
    color: StringConstructor;
    plain: BooleanConstructor;
    round: BooleanConstructor;
    textColor: StringConstructor;
    closeable: BooleanConstructor;
}, () => JSX.Element, unknown, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, "close"[], "close", vue.VNodeProps & vue.AllowedComponentProps & vue.ComponentCustomProps, Readonly<vue.ExtractPropTypes<{
    size: vue.PropType<TagSize>;
    mark: BooleanConstructor;
    show: {
        type: BooleanConstructor;
        default: true;
    };
    type: {
        type: vue.PropType<TagType>;
        default: TagType;
    };
    color: StringConstructor;
    plain: BooleanConstructor;
    round: BooleanConstructor;
    textColor: StringConstructor;
    closeable: BooleanConstructor;
}>> & {
    onClose?: ((...args: any[]) => any) | undefined;
}, {
    type: TagType;
    mark: boolean;
    show: boolean;
    plain: boolean;
    round: boolean;
    closeable: boolean;
}>>;

declare module 'vue-demi' {
    interface GlobalComponents {
        FastUseTag: typeof Tag;
    }
}

export { Button, ButtonProps, ButtonSize, ButtonType, Tag, TagProps, TagSize, TagType, buttonProps, tagProps, useBtn, useSmallBtn };
