import { CSSProperties, ExtractPropTypes, PropType, DefineComponent, VNode, RendererNode, RendererElement, ComponentOptionsMixin, PublicProps, ComponentProvideOptions } from 'vue';
import { KeyboardEventHandler } from '../_util/EventInterface';
import { Key, VueNode } from '../_util/type';
import { AlignType } from '../vc-trigger/interface';
import { ScrollConfig, ScrollTo } from '../vc-virtual-list/List';
import { BaseOptionType } from './Select';
import { VueTypeValidableDef } from 'vue-types';
export type RenderNode = VueNode | ((props: any) => VueNode);
export type RenderDOMFunc = (props: any) => HTMLElement;
export type Mode = 'multiple' | 'tags' | 'combobox';
export type Placement = 'bottomLeft' | 'bottomRight' | 'topLeft' | 'topRight';
export type RawValueType = string | number;
export interface RefOptionListProps {
    onKeydown: KeyboardEventHandler;
    onKeyup: KeyboardEventHandler;
    scrollTo?: (index: number | ScrollConfig) => void;
}
export interface CustomTagProps {
    label: any;
    value: any;
    disabled: boolean;
    onClose: (event?: MouseEvent) => void;
    closable: boolean;
    option: BaseOptionType;
}
export interface DisplayValueType {
    key?: Key;
    value?: RawValueType;
    label?: any;
    disabled?: boolean;
    option?: BaseOptionType;
}
export interface BaseSelectRef {
    focus: () => void;
    blur: () => void;
    scrollTo: ScrollTo;
}
declare const baseSelectPrivateProps: () => {
    prefixCls: StringConstructor;
    id: StringConstructor;
    omitDomProps: PropType<string[]>;
    displayValues: PropType<DisplayValueType[]>;
    onDisplayValuesChange: PropType<(values: DisplayValueType[], info: {
        type: "add" | "remove" | "clear";
        values: DisplayValueType[];
    }) => void>;
    /** Current dropdown list active item string value */
    activeValue: StringConstructor;
    /** Link search input with target element */
    activeDescendantId: StringConstructor;
    onActiveValueChange: PropType<(value: string | null) => void>;
    searchValue: StringConstructor;
    /** Trigger onSearch, return false to prevent trigger open event */
    onSearch: PropType<(searchValue: string, info: {
        source: "typing" | "effect" | "submit" | "blur";
    }) => void>;
    /** Trigger when search text match the `tokenSeparators`. Will provide split content */
    onSearchSplit: PropType<(words: string[]) => void>;
    maxLength: NumberConstructor;
    OptionList: VueTypeValidableDef<any>;
    /** Tell if provided `options` is empty */
    emptyOptions: BooleanConstructor;
};
export interface DropdownObject {
    menuNode?: VueNode;
    props?: Record<string, any>;
}
export type DropdownRender = (opt?: DropdownObject) => VueNode;
export declare const baseSelectPropsWithoutPrivate: () => {
    showSearch: {
        type: BooleanConstructor;
        default: undefined;
    };
    tagRender: {
        type: PropType<(props: CustomTagProps) => any>;
    };
    optionLabelRender: {
        type: PropType<(option: Record<string, any>) => any>;
    };
    direction: {
        type: PropType<"ltr" | "rtl">;
    };
    tabindex: NumberConstructor;
    autofocus: BooleanConstructor;
    notFoundContent: VueTypeValidableDef<any>;
    placeholder: VueTypeValidableDef<any>;
    onClear: PropType<() => void>;
    choiceTransitionName: StringConstructor;
    mode: PropType<Mode>;
    disabled: {
        type: BooleanConstructor;
        default: undefined;
    };
    loading: {
        type: BooleanConstructor;
        default: undefined;
    };
    open: {
        type: BooleanConstructor;
        default: undefined;
    };
    defaultOpen: {
        type: BooleanConstructor;
        default: undefined;
    };
    onDropdownVisibleChange: {
        type: PropType<(open: boolean) => void>;
    };
    getInputElement: {
        type: PropType<() => any>;
    };
    getRawInputElement: {
        type: PropType<() => any>;
    };
    maxTagTextLength: NumberConstructor;
    maxTagCount: {
        type: PropType<number | "responsive">;
    };
    maxTagPlaceholder: VueTypeValidableDef<any>;
    tokenSeparators: {
        type: PropType<string[]>;
    };
    allowClear: {
        type: BooleanConstructor;
        default: undefined;
    };
    showArrow: {
        type: BooleanConstructor;
        default: undefined;
    };
    inputIcon: VueTypeValidableDef<any>;
    /** Clear all icon */
    clearIcon: VueTypeValidableDef<any>;
    /** Selector remove icon */
    removeIcon: VueTypeValidableDef<any>;
    animation: StringConstructor;
    transitionName: StringConstructor;
    dropdownStyle: {
        type: PropType<CSSProperties>;
    };
    dropdownClassName: StringConstructor;
    dropdownMatchSelectWidth: {
        type: PropType<boolean | number>;
        default: undefined;
    };
    dropdownRender: {
        type: PropType<DropdownRender>;
    };
    dropdownAlign: PropType<AlignType>;
    placement: {
        type: PropType<Placement>;
    };
    getPopupContainer: {
        type: PropType<RenderDOMFunc>;
    };
    showAction: {
        type: PropType<("focus" | "click")[]>;
    };
    onBlur: {
        type: PropType<(e: FocusEvent) => void>;
    };
    onFocus: {
        type: PropType<(e: FocusEvent) => void>;
    };
    onKeyup: PropType<(e: KeyboardEvent) => void>;
    onKeydown: PropType<(e: KeyboardEvent) => void>;
    onMousedown: PropType<(e: MouseEvent) => void>;
    onPopupScroll: PropType<(e: UIEvent) => void>;
    onInputKeyDown: PropType<(e: KeyboardEvent) => void>;
    onMouseenter: PropType<(e: MouseEvent) => void>;
    onMouseleave: PropType<(e: MouseEvent) => void>;
    onClick: PropType<(e: MouseEvent) => void>;
};
declare const baseSelectProps: () => {
    showSearch: {
        type: BooleanConstructor;
        default: undefined;
    };
    tagRender: {
        type: PropType<(props: CustomTagProps) => any>;
    };
    optionLabelRender: {
        type: PropType<(option: Record<string, any>) => any>;
    };
    direction: {
        type: PropType<"ltr" | "rtl">;
    };
    tabindex: NumberConstructor;
    autofocus: BooleanConstructor;
    notFoundContent: VueTypeValidableDef<any>;
    placeholder: VueTypeValidableDef<any>;
    onClear: PropType<() => void>;
    choiceTransitionName: StringConstructor;
    mode: PropType<Mode>;
    disabled: {
        type: BooleanConstructor;
        default: undefined;
    };
    loading: {
        type: BooleanConstructor;
        default: undefined;
    };
    open: {
        type: BooleanConstructor;
        default: undefined;
    };
    defaultOpen: {
        type: BooleanConstructor;
        default: undefined;
    };
    onDropdownVisibleChange: {
        type: PropType<(open: boolean) => void>;
    };
    getInputElement: {
        type: PropType<() => any>;
    };
    getRawInputElement: {
        type: PropType<() => any>;
    };
    maxTagTextLength: NumberConstructor;
    maxTagCount: {
        type: PropType<number | "responsive">;
    };
    maxTagPlaceholder: VueTypeValidableDef<any>;
    tokenSeparators: {
        type: PropType<string[]>;
    };
    allowClear: {
        type: BooleanConstructor;
        default: undefined;
    };
    showArrow: {
        type: BooleanConstructor;
        default: undefined;
    };
    inputIcon: VueTypeValidableDef<any>;
    /** Clear all icon */
    clearIcon: VueTypeValidableDef<any>;
    /** Selector remove icon */
    removeIcon: VueTypeValidableDef<any>;
    animation: StringConstructor;
    transitionName: StringConstructor;
    dropdownStyle: {
        type: PropType<CSSProperties>;
    };
    dropdownClassName: StringConstructor;
    dropdownMatchSelectWidth: {
        type: PropType<boolean | number>;
        default: undefined;
    };
    dropdownRender: {
        type: PropType<DropdownRender>;
    };
    dropdownAlign: PropType<AlignType>;
    placement: {
        type: PropType<Placement>;
    };
    getPopupContainer: {
        type: PropType<RenderDOMFunc>;
    };
    showAction: {
        type: PropType<("focus" | "click")[]>;
    };
    onBlur: {
        type: PropType<(e: FocusEvent) => void>;
    };
    onFocus: {
        type: PropType<(e: FocusEvent) => void>;
    };
    onKeyup: PropType<(e: KeyboardEvent) => void>;
    onKeydown: PropType<(e: KeyboardEvent) => void>;
    onMousedown: PropType<(e: MouseEvent) => void>;
    onPopupScroll: PropType<(e: UIEvent) => void>;
    onInputKeyDown: PropType<(e: KeyboardEvent) => void>;
    onMouseenter: PropType<(e: MouseEvent) => void>;
    onMouseleave: PropType<(e: MouseEvent) => void>;
    onClick: PropType<(e: MouseEvent) => void>;
    prefixCls: StringConstructor;
    id: StringConstructor;
    omitDomProps: PropType<string[]>;
    displayValues: PropType<DisplayValueType[]>;
    onDisplayValuesChange: PropType<(values: DisplayValueType[], info: {
        type: "add" | "remove" | "clear";
        values: DisplayValueType[];
    }) => void>;
    /** Current dropdown list active item string value */
    activeValue: StringConstructor;
    /** Link search input with target element */
    activeDescendantId: StringConstructor;
    onActiveValueChange: PropType<(value: string | null) => void>;
    searchValue: StringConstructor;
    /** Trigger onSearch, return false to prevent trigger open event */
    onSearch: PropType<(searchValue: string, info: {
        source: "typing" | "effect" | "submit" | "blur";
    }) => void>;
    /** Trigger when search text match the `tokenSeparators`. Will provide split content */
    onSearchSplit: PropType<(words: string[]) => void>;
    maxLength: NumberConstructor;
    OptionList: VueTypeValidableDef<any>;
    /** Tell if provided `options` is empty */
    emptyOptions: BooleanConstructor;
};
export type BaseSelectPrivateProps = Partial<ExtractPropTypes<ReturnType<typeof baseSelectPrivateProps>>>;
export type BaseSelectProps = Partial<ExtractPropTypes<ReturnType<typeof baseSelectProps>>>;
export type BaseSelectPropsWithoutPrivate = Omit<BaseSelectProps, keyof BaseSelectPrivateProps>;
export declare function isMultiple(mode: Mode): mode is "multiple" | "tags";
declare const _default: DefineComponent<ExtractPropTypes<{
    showSearch: {
        type: BooleanConstructor;
        default: undefined;
    };
    tagRender: {
        type: PropType<(props: CustomTagProps) => any>;
    };
    optionLabelRender: {
        type: PropType<(option: Record<string, any>) => any>;
    };
    direction: {
        type: PropType<"ltr" | "rtl">;
    };
    tabindex: NumberConstructor;
    autofocus: BooleanConstructor;
    notFoundContent: VueTypeValidableDef<any>;
    placeholder: VueTypeValidableDef<any>;
    onClear: PropType<() => void>;
    choiceTransitionName: StringConstructor;
    mode: PropType<Mode>;
    disabled: {
        type: BooleanConstructor;
        default: undefined;
    };
    loading: {
        type: BooleanConstructor;
        default: undefined;
    };
    open: {
        type: BooleanConstructor;
        default: undefined;
    };
    defaultOpen: {
        type: BooleanConstructor;
        default: undefined;
    };
    onDropdownVisibleChange: {
        type: PropType<(open: boolean) => void>;
    };
    getInputElement: {
        type: PropType<() => any>;
    };
    getRawInputElement: {
        type: PropType<() => any>;
    };
    maxTagTextLength: NumberConstructor;
    maxTagCount: {
        type: PropType<number | "responsive">;
    };
    maxTagPlaceholder: VueTypeValidableDef<any>;
    tokenSeparators: {
        type: PropType<string[]>;
    };
    allowClear: {
        type: BooleanConstructor;
        default: undefined;
    };
    showArrow: {
        type: BooleanConstructor;
        default: undefined;
    };
    inputIcon: VueTypeValidableDef<any>;
    /** Clear all icon */
    clearIcon: VueTypeValidableDef<any>;
    /** Selector remove icon */
    removeIcon: VueTypeValidableDef<any>;
    animation: StringConstructor;
    transitionName: StringConstructor;
    dropdownStyle: {
        type: PropType<CSSProperties>;
    };
    dropdownClassName: StringConstructor;
    dropdownMatchSelectWidth: {
        type: PropType<boolean | number>;
        default: undefined;
    };
    dropdownRender: {
        type: PropType<DropdownRender>;
    };
    dropdownAlign: PropType<AlignType>;
    placement: {
        type: PropType<Placement>;
    };
    getPopupContainer: {
        type: PropType<RenderDOMFunc>;
    };
    showAction: {
        type: PropType<("focus" | "click")[]>;
    };
    onBlur: {
        type: PropType<(e: FocusEvent) => void>;
    };
    onFocus: {
        type: PropType<(e: FocusEvent) => void>;
    };
    onKeyup: PropType<(e: KeyboardEvent) => void>;
    onKeydown: PropType<(e: KeyboardEvent) => void>;
    onMousedown: PropType<(e: MouseEvent) => void>;
    onPopupScroll: PropType<(e: UIEvent) => void>;
    onInputKeyDown: PropType<(e: KeyboardEvent) => void>;
    onMouseenter: PropType<(e: MouseEvent) => void>;
    onMouseleave: PropType<(e: MouseEvent) => void>;
    onClick: PropType<(e: MouseEvent) => void>;
    prefixCls: StringConstructor;
    id: StringConstructor;
    omitDomProps: PropType<string[]>;
    displayValues: PropType<DisplayValueType[]>;
    onDisplayValuesChange: PropType<(values: DisplayValueType[], info: {
        type: "add" | "remove" | "clear";
        values: DisplayValueType[];
    }) => void>;
    /** Current dropdown list active item string value */
    activeValue: StringConstructor;
    /** Link search input with target element */
    activeDescendantId: StringConstructor;
    onActiveValueChange: PropType<(value: string | null) => void>;
    searchValue: StringConstructor;
    /** Trigger onSearch, return false to prevent trigger open event */
    onSearch: PropType<(searchValue: string, info: {
        source: "typing" | "effect" | "submit" | "blur";
    }) => void>;
    /** Trigger when search text match the `tokenSeparators`. Will provide split content */
    onSearchSplit: PropType<(words: string[]) => void>;
    maxLength: NumberConstructor;
    OptionList: VueTypeValidableDef<any>;
    /** Tell if provided `options` is empty */
    emptyOptions: BooleanConstructor;
}>, () => VNode<RendererNode, RendererElement, {
    [key: string]: any;
}> | VNode<RendererNode, RendererElement, {
    [key: string]: any;
}>, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<ExtractPropTypes<{
    showSearch: {
        type: BooleanConstructor;
        default: undefined;
    };
    tagRender: {
        type: PropType<(props: CustomTagProps) => any>;
    };
    optionLabelRender: {
        type: PropType<(option: Record<string, any>) => any>;
    };
    direction: {
        type: PropType<"ltr" | "rtl">;
    };
    tabindex: NumberConstructor;
    autofocus: BooleanConstructor;
    notFoundContent: VueTypeValidableDef<any>;
    placeholder: VueTypeValidableDef<any>;
    onClear: PropType<() => void>;
    choiceTransitionName: StringConstructor;
    mode: PropType<Mode>;
    disabled: {
        type: BooleanConstructor;
        default: undefined;
    };
    loading: {
        type: BooleanConstructor;
        default: undefined;
    };
    open: {
        type: BooleanConstructor;
        default: undefined;
    };
    defaultOpen: {
        type: BooleanConstructor;
        default: undefined;
    };
    onDropdownVisibleChange: {
        type: PropType<(open: boolean) => void>;
    };
    getInputElement: {
        type: PropType<() => any>;
    };
    getRawInputElement: {
        type: PropType<() => any>;
    };
    maxTagTextLength: NumberConstructor;
    maxTagCount: {
        type: PropType<number | "responsive">;
    };
    maxTagPlaceholder: VueTypeValidableDef<any>;
    tokenSeparators: {
        type: PropType<string[]>;
    };
    allowClear: {
        type: BooleanConstructor;
        default: undefined;
    };
    showArrow: {
        type: BooleanConstructor;
        default: undefined;
    };
    inputIcon: VueTypeValidableDef<any>;
    /** Clear all icon */
    clearIcon: VueTypeValidableDef<any>;
    /** Selector remove icon */
    removeIcon: VueTypeValidableDef<any>;
    animation: StringConstructor;
    transitionName: StringConstructor;
    dropdownStyle: {
        type: PropType<CSSProperties>;
    };
    dropdownClassName: StringConstructor;
    dropdownMatchSelectWidth: {
        type: PropType<boolean | number>;
        default: undefined;
    };
    dropdownRender: {
        type: PropType<DropdownRender>;
    };
    dropdownAlign: PropType<AlignType>;
    placement: {
        type: PropType<Placement>;
    };
    getPopupContainer: {
        type: PropType<RenderDOMFunc>;
    };
    showAction: {
        type: PropType<("focus" | "click")[]>;
    };
    onBlur: {
        type: PropType<(e: FocusEvent) => void>;
    };
    onFocus: {
        type: PropType<(e: FocusEvent) => void>;
    };
    onKeyup: PropType<(e: KeyboardEvent) => void>;
    onKeydown: PropType<(e: KeyboardEvent) => void>;
    onMousedown: PropType<(e: MouseEvent) => void>;
    onPopupScroll: PropType<(e: UIEvent) => void>;
    onInputKeyDown: PropType<(e: KeyboardEvent) => void>;
    onMouseenter: PropType<(e: MouseEvent) => void>;
    onMouseleave: PropType<(e: MouseEvent) => void>;
    onClick: PropType<(e: MouseEvent) => void>;
    prefixCls: StringConstructor;
    id: StringConstructor;
    omitDomProps: PropType<string[]>;
    displayValues: PropType<DisplayValueType[]>;
    onDisplayValuesChange: PropType<(values: DisplayValueType[], info: {
        type: "add" | "remove" | "clear";
        values: DisplayValueType[];
    }) => void>;
    /** Current dropdown list active item string value */
    activeValue: StringConstructor;
    /** Link search input with target element */
    activeDescendantId: StringConstructor;
    onActiveValueChange: PropType<(value: string | null) => void>;
    searchValue: StringConstructor;
    /** Trigger onSearch, return false to prevent trigger open event */
    onSearch: PropType<(searchValue: string, info: {
        source: "typing" | "effect" | "submit" | "blur";
    }) => void>;
    /** Trigger when search text match the `tokenSeparators`. Will provide split content */
    onSearchSplit: PropType<(words: string[]) => void>;
    maxLength: NumberConstructor;
    OptionList: VueTypeValidableDef<any>;
    /** Tell if provided `options` is empty */
    emptyOptions: BooleanConstructor;
}>> & Readonly<{}>, {
    open: boolean;
    disabled: boolean;
    autofocus: boolean;
    dropdownMatchSelectWidth: number | boolean;
    loading: boolean;
    allowClear: boolean;
    defaultOpen: boolean;
    showSearch: boolean;
    showArrow: boolean;
    emptyOptions: boolean;
}, {}, {}, {}, string, ComponentProvideOptions, true, {}, any>;
export default _default;
