import { default as React } from 'react';
import { TUseValues } from '../../AHooks/useValues';
import { IABaseProps } from '../ABase/ABase';
interface IOptionRendererProps<T> {
    /**
     * option : T
     *
     * Description : option item of ASelect
     */
    option: T;
}
interface ISelectedRendererProps<T> {
    /**
     * OptionRenderer : (props: IOptionRendererProps<T>) => React.ReactNode
     *
     * Description : OptionRenderer of ASelect
     */
    OptionRenderer: (props: IOptionRendererProps<Exclude<T, null>>) => React.ReactNode;
    /**
     * placeholder : React.ReactNode
     *
     * Description : placeholder of ASelect
     */
    placeholder?: React.ReactNode;
    /**
     * selected : T
     *
     * Description : selectedOption of ASelect
     */
    selectedOption: T;
}
export declare const ASelectTypes: readonly ["Primary", "Secondary", "Raw"];
export type TASelectTypes = (typeof ASelectTypes)[number];
export interface IASelectProps<T> extends IABaseProps {
    /**
     * OptionRenderer? : (props: IOptionRendererProps<T>) => React.ReactNode = DefaultSelectedRenderer
     *
     * Description : OptionRenderer of Selected Options of ASelect
     */
    OptionRenderer?: (props: IOptionRendererProps<Exclude<T, null>>) => React.ReactNode;
    /**
     * SelectedRenderer? : (props: ISelectedRendererProps<T>) => React.ReactNode
     *
     * Description : SelectedRenderer of ASelect
     */
    SelectedRenderer?: (props: ISelectedRendererProps<T>) => React.ReactNode;
    /**
     * arrowProps? : React.HTMLProps<HTMLDivElement>
     *
     * Description : divProps for Arrow of ASelect
     */
    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 ASelect
     */
    isReadonly?: boolean;
    /**
     * maxShowRows? : number = 6
     *
     * Description : maxShowRows of ASelect. scrollbar will appear when overflow
     */
    maxShowRows?: number;
    /**
     * minShowRows? : number = 2
     *
     * Description : minShowRows of ASelect
     */
    minShowRows?: number;
    /**
     * onClose? : () => void
     *
     * Description : onClose of ASelect
     */
    onClose?: () => void;
    /**
     * options : T[]
     *
     * Description : options of ASelect. CAREFUL null is not rendered as an option.
     */
    options: readonly T[] | T[];
    /**
     * optionsRef? : React.RefObject<HTMLDivElement | null>
     *
     * Description : optionsRef of ASelect
     */
    optionsRef?: React.RefObject<HTMLDivElement | null>;
    /**
     * placeholder? : React.ReactNode
     *
     * Description : placeholder of ASelect. it is shown when no option is selected
     */
    placeholder?: React.ReactNode;
    /**
     * type? : TASelectTypes = 'Primary'
     *
     * Description : type of ASelect
     */
    type?: TASelectTypes;
    /**
     * useSelect? : TUseValues<T>
     *
     * Description : useSelect of ASelect
     */
    useSelect?: TUseValues<T>;
}
/**
 * AComponent : ASelect
 *
 * Description : ASelect is a select component. give options and useSelect to select an option.
 *
 * 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 [num, setNum] = useState<number | null>(null);
 *
 *
 *     if (case 1)
 *       <ASelect options={options}
 *         useSelect={[selected, setSelected]}/>
 *
 *     if (case 2)
 *       <ASelect options={options}
 *         useSelect={[selected, setSelected]}
 *         OptionRenderer={OptionRenderer}
 *         SelectedRenderer={SelectedRenderer}
 *       />
 *
 *     if (case 3)
 *       <ASelect options={[1, 2, 3]}
 *         useSelect={[num, setNum]}
 *         OptionRenderer={p => p.option !== null ? p.option : 'Select'}/> *
 *
 */
export declare const ASelect: <T>(props: IASelectProps<T>) => React.ReactNode;
export {};
