/// <reference types="react" />
import { StyleProps, ReactElement } from '../../@declares';
import { Records } from 'jmini';
import { InputTypes } from '.';
declare namespace Autocomplete {
    type Input<T = Value> = InputTypes.CoreInput<T | T[]> & React.DOMAttributes<HTMLInputElement> & {
        label?: ReactElement;
        tone?: InputTypes.BoxTone;
        tabIndex?: number;
        id?: string;
        disabled?: boolean;
        min?: number;
        max?: number;
        multiSelect?: boolean;
        value?: T | T[];
        options: Option<T>[];
        emptySelect?: boolean;
        leftIndicator?: ReactElement | false;
        rightIndicator?: ReactElement | false;
        leftIcon?: ReactElement | false;
        rightIcon?: ReactElement | false;
        searchInputPlaceholder?: string;
        onDynamicSearchOptions?: onDynamicSearchOptions<T>;
        onDynamicSearchOptionsDelay?: number;
        onSelectorRender?(p: onSelectorRenderProps<T>): React.JSX.Element;
        onSelectedRender?(p: onSelectedRenderProps<T>): React.JSX.Element;
        pickerStyles?: StyleProps.StyleProps;
        pickerPosition?: 1 | 2 | 3 | 4;
    };
    type Value<T = any> = T extends infer V ? V : string | number | boolean | Records | void | null;
    type Option<T = Value> = {
        type?: 'selector';
        id?: string;
        label?: ReactElement;
        selectedLabel?: ReactElement;
        value: T;
        searchValue?: string;
    } | {
        type: 'label';
        id?: string;
        label?: ReactElement;
        selectedLabel?: ReactElement;
        value?: T;
        searchValue?: string;
    };
    type OptionsDict = {
        [key: string]: Option;
    };
    type onDynamicSearchOptions<T = Value> = {
        (k: string): Promise<Option<T>[]>;
    };
    type onSelectorRenderProps<T = Value> = {
        option: Option<T>;
        isSelected: boolean;
        isFocused: boolean;
        onAdd(): void;
        onKeyDown(event: React.KeyboardEvent): void;
    };
    type onSelectedRenderProps<T = Value> = {
        value: T;
        option?: Records;
        label: ReactElement;
        onRemove(event: any): void;
    };
    type WrapperStates = {
        rootStates: Input & {
            value: Value[];
        };
        val_options: Option[];
        set_options: React.Dispatch<React.SetStateAction<Option[]>>;
        val_optionFocused: string;
        set_optionFocused: React.Dispatch<React.SetStateAction<string>>;
        val_optionsDict: OptionsDict;
        set_optionsDict: React.Dispatch<React.SetStateAction<OptionsDict>>;
        val_optionsModified: boolean;
        set_optionsModified: React.Dispatch<React.SetStateAction<boolean>>;
        val_keyword: string;
        set_keyword: React.Dispatch<React.SetStateAction<string>>;
        val_status: InputTypes.Status<Value[]>;
        set_status: React.Dispatch<React.SetStateAction<InputTypes.Status>>;
    };
    type Component = {
        <T = Value>(p: Input<Value<T>>): React.JSX.Element;
    };
}
declare const Autocomplete: Autocomplete.Component;
export { Autocomplete, Autocomplete as default };
