import { default as React } from 'react';
import { TUseValues } from '../../AHooks/useValues';
import { IABaseProps } from '../ABase/ABase';
interface IOptionRendererProps<T> {
    /**
     * option : T
     *
     * Description : option of AMultiSelect
     */
    option: T;
}
interface ISelectedRendererProps<T> {
    /**
     * OptionRenderer : (props: IAMultiSelectOptionRendererProps<I>) => React.ReactNode
     *
     * Description : OptionRenderer of AMultiSelect
     */
    OptionRenderer: (props: IOptionRendererProps<T>) => React.ReactNode;
    /**
     * placeholder : React.ReactNode
     *
     * Description : placeholder of AMultiSelect
     */
    placeholder?: React.ReactNode;
    /**
     * selectedOptions : T[]
     *
     * Description : selected options of AMultiSelect
     */
    selectedOptions: T[];
}
export interface IAMultiSelectProps<T> extends IABaseProps {
    /**
     * OptionRenderer? : (props: IOptionRendererProps<T>) => React.ReactNode = DefaultOptionRenderer
     *
     * Description : Renderer of Options of AMultiSelect
     */
    OptionRenderer?: (props: IOptionRendererProps<T>) => React.ReactNode;
    /**
     * SelectedRenderer? : (props: ISelectedRendererProps<T>) => React.ReactNode = DefaultSelectedRenderer
     *
     * Description : Renderer of Selected Options of AMultiSelect
     */
    SelectedRenderer?: (props: ISelectedRendererProps<T>) => React.ReactNode;
    /**
     * arrowProps? : React.HTMLProps<HTMLDivElement>
     *
     * Description : divProps for Arrow of AMultiSelect
     */
    arrowProps?: React.HTMLProps<HTMLDivElement>;
    /**
     * isAutoWidth? : boolean = false
     *
     * Description : When true, automatically adjusts the width based on the longest option element
     */
    isAutoWidth?: boolean;
    /**
     * isReadonly? : boolean
     *
     * Description : isReadonly of AMultiSelect
     */
    isReadonly?: boolean;
    /**
     * maxShowRows? : number = 6
     *
     * Description : maxShowRows of AMultiSelect. scrollbar will appear when overflow
     */
    maxShowRows?: number;
    /**
     * minShowRows? : number = 2
     *
     * Description : minShowRows of AMultiSelect
     */
    minShowRows?: number;
    /**
     * onClose? : () => void
     *
     * Description : onClose of AMultiSelect
     */
    onClose?: () => void;
    /**
     * options : T[]
     *
     * Description : options of AMultiSelect
     */
    options: T[] | readonly T[];
    /**
     * placeholder? : React.ReactNode
     *
     * Description : placeholder of AMultiSelect. it is shown when no option is selected
     */
    placeholder?: React.ReactNode;
    /**
     * type? : 'Primary' | 'Secondary' = 'Primary'
     *
     * Description : type of AMultiSelect
     */
    type?: 'Primary' | 'Secondary';
    /**
     * useSelect? : TUseValues<T[]>
     *
     * Description : useSelect of AMultiSelect
     */
    useSelect?: TUseValues<T[]>;
}
/**
 * AComponent : AMultiSelect
 *
 * Description : AMultiSelect is a select component. give options and useSelect to select an option.
 * if useSelect is given for I[], it will act as a multi select, otherwise it will act as a single select.
 *
 * Basic Usage :
 *
 *     const options = [{idx : 1, name : 'option1'}, {idx : 2, name : 'option2'}, {idx : 3, name : 'option3'}];
 *     const [selected, setSelected] = useState<typeof options[0]>(options[0]);
 *     const OptionRenderer = ({option}) => <div>{option.name}</div>;
 *     const SelectedRenderer = ({selected, placeholder}) => selected ? selected.name : placeholder;
 *     const [multiSelected, setMultiSelected] = useState<(typeof options[0])[]>([options[0]]);
 *     const MultiSelectedRenderer = ({selected, placeholder}) => selected.length > 0 ? string.join(selected.map(e => e.name), ', ') : placeholder;
 *
 *     if (case 1)
 *       <AMultiSelect options={strOptions}
 *         useSelect={[selected, setSelected]}/>
 *
 *     if (case 2)
 *       <AMultiSelect options={options}
 *         useSelect={[selected, setSelected]}
 *         OptionRenderer={OptionRenderer}/>
 *
 *     if (case 3)
 *       <AMultiSelect options={options}
 *         useSelect={[selected, setSelected]}
 *         OptionRenderer={OptionRenderer}
 *         SelectedRenderer={SelectedRenderer}/>
 *
 *     if (case 4)
 *       <AMultiSelect options={options}
 *         useSelect={[multiSelected, setMultiSelected]}
 *         OptionRenderer={OptionRenderer}
 *         SelectedRenderer={MultiSelectedRenderer}/>
 *
 */
export declare const AMultiSelect: <T>(props: IAMultiSelectProps<T>) => React.ReactNode;
export {};
