import React from 'react';
import { Theme } from '../cn';
declare type CheckedOption = {
    /**
     * Уникальное значение, которое будет отправлено на сервер, если вариант выбран
     */
    value: string;
    /**
     * Текст варианта
     */
    text: string;
    /**
     * Текст, который будет отображаться при выборе
     */
    checkedText: string;
    /**
     * Иконка варианта
     */
    icon: React.ReactType;
};
declare type SelectDirectionsFieldType = 'top-left' | 'top-center' | 'top-right' | 'left-top' | 'left-center' | 'left-bottom' | 'right-top' | 'right-center' | 'right-bottom' | 'bottom-left' | 'bottom-center' | 'bottom-right';
export declare type SelectOptionsShapeType = {
    /**
     * Тип списка вариантов
     */
    type?: 'item' | 'group';
    /**
     * Уникальное значение, которое будет отправлено на сервер, если вариант выбран
     */
    value?: string | number;
    /**
     * Текст варианта
     */
    text?: React.ReactNode;
    /**
     * Текст варианта для нативного режима
     */
    nativeText?: string;
    /**
     * Отображение варианта
     */
    description?: React.ReactNode;
    /**
     * Текст, который будет отображаться при выборе
     */
    checkedText?: string;
    /**
     * Иконка варианта
     */
    icon?: React.ReactNode;
    /**
     * Список вариантов, только для type='group'
     */
    content?: any[];
    /**
     * Только для type='item': свойства для компонента [MenuItem](#!/MenuItem)
     */
    props?: object;
};
export declare type SelectProps = {
    /**
     * Дополнительный класс
     */
    className?: string;
    /**
     * Тип выпадающего списка
     */
    mode?: 'check' | 'radio' | 'radio-check';
    /**
     * Размещение заголовка групп: обычное или в одну строку с первым элементом группы
     */
    groupView?: 'default' | 'line';
    /**
     * Тип поля (filled только на белом фоне в размере m)
     */
    view?: 'default' | 'filled';
    /**
     * Управление возможностью компонента занимать всю ширину родителя
     */
    width?: 'default' | 'available';
    /**
     * Направления, в которые может открываться попап компонента
     */
    directions?: SelectDirectionsFieldType[];
    /**
     * Управление возможностью редактирования значения
     */
    disabled?: boolean;
    /**
     * Управление видимостью выпадающего списка
     */
    opened?: boolean;
    /**
     * Ширинa выпадающего списка равна ширине кнопки
     */
    equalPopupWidth?: boolean;
    /**
     * Список выбранных значений
     */
    value?: Array<string | number>;
    /**
     * Список вариантов выбора
     */
    options?: SelectOptionsShapeType[];
    /**
     * Вставляет попап со списком только если элемент активен
     */
    renderPopupOnFocus?: boolean;
    /**
     * Размер компонента
     */
    size?: 's' | 'm' | 'l' | 'xl';
    /**
     * Уникальный идентификатор блока
     */
    id?: string;
    /**
     * Уникальное имя блока
     */
    name?: string;
    /**
     * Лейбл для поля
     */
    label?: React.ReactNode;
    /**
     * Подсказка в поле
     */
    placeholder?: string;
    /**
     * Подсказка в качестве неактивного первого варианта выбора для нативного мобильного контрола
     */
    nativeOptionPlaceholder?: string;
    /**
     * Подсказка под полем
     */
    hint?: React.ReactNode;
    /**
     * Отображение ошибки
     */
    error?: React.ReactNode;
    /**
     * Управление нативным режимом на мобильных устройствах
     */
    mobileMenuMode?: 'native' | 'popup';
    /**
     * Подсказка над меню в мобильном режиме
     */
    mobileTitle?: React.ReactNode;
    /**
     * Смещение в пикселях всплывающего окна относительно основного направления (только на десктопе)
     */
    popupMainOffset?: number;
    /**
     * Смещение в пикселях всплывающего окна относительно второстепенного направления (только на десктопе)
     */
    popupSecondaryOffset?: number;
    /**
     * Скрытие галочки в правой части кнопки
     */
    hideTick?: boolean;
    /**
     * Тема компонента
     */
    theme?: Theme;
    /**
     * Обработчик фокуса на компоненте
     */
    onFocus?: (event?: React.FocusEvent<any>) => void;
    /**
     * Обработчик потери фокуса компонентом
     */
    onBlur?: (event?: React.FocusEvent<any>) => void;
    /**
     * Обработчик фокуса на кнопке
     */
    onButtonFocus?: (event?: React.FocusEvent<any>) => void;
    /**
     * Обработчик потери у кнопки
     */
    onButtonBlur?: (event?: React.FocusEvent<any>) => void;
    /**
     * Обработчик фокуса на меню
     */
    onMenuFocus?: (event?: React.FocusEvent<any>) => void;
    /**
     * Обработчик потери фокуса у меню
     */
    onMenuBlur?: (event?: React.FocusEvent<any>) => void;
    /**
     * Обработчик клика по кнопке компонента
     */
    onClick?: (event?: React.MouseEvent<any>) => void;
    /**
     * Обработчик клика вне компонента
     */
    onClickOutside?: (event?: React.MouseEvent<any>) => void;
    /**
     * Обработчик изменения значения
     */
    onChange?: (value?: any[], event?: React.ChangeEvent<any>) => void;
    /**
     * Обработчик нажатия на клавишу
     */
    onKeyDown?: (event?: React.KeyboardEvent<any>) => void;
    /**
     * Кастомный метод рендера содержимого кнопки, принимает на вход: массив элементов типа CheckedOption
     */
    renderButtonContent?: (checkedOptions: CheckedOption[]) => React.ReactNode;
    /**
     * Максимальная высота попапа
     */
    maxHeight?: number;
    /**
     * Идентификатор для систем автоматизированного тестирования
     */
    'data-test-id'?: string;
};
declare type SelectState = {
    hasGroup: boolean;
    isMobile: boolean;
    opened: boolean;
    popupStyles: {
        minWidth?: number;
        maxWidth?: number;
    };
    value: Array<string | number>;
    popupIsReady?: boolean;
};
/**
 * Компонент выпадающего списка.
 */
export declare class Select extends React.Component<SelectProps, SelectState> {
    protected cn: (this: void | {
        props?: Record<string, unknown>;
    }, elementNameOrMods?: string | {
        [key: string]: string | number | boolean;
    }, mods?: {
        [key: string]: string | number | boolean;
    }) => string;
    static defaultProps: Partial<SelectProps>;
    static contextTypes: any;
    state: SelectState;
    private root;
    private button;
    popup: any;
    private menu;
    private nativeSelect;
    /**
     * При открытом меню, нажатие на Esc устанавливает значение этой переменной в true
     * Далее фокус переводится на кнопку. Далее вызывается обработчик handleMenuBlur.
     * В обработчике закрываем попап, если ожидаем закрытия(this.awaitClosing) или фокус за пределами селекта.
     * Это нужно, т.к. в случае в renderPopupOnFocus={true} меню исчезнет быстрее, чем сработает onMenuBlur
     */
    private awaitClosing;
    UNSAFE_componentWillMount(): void;
    componentDidMount(): void;
    UNSAFE_componentWillReceiveProps(nextProps: any): void;
    componentDidUpdate(): void;
    render(): JSX.Element;
    renderButton(): JSX.Element;
    renderNativeSelect(): JSX.Element;
    renderPopup(): JSX.Element;
    renderOptionsList(options: any): any;
    renderNativeOptionsList(options: any): any;
    renderButtonContent(): {};
    renderMobileHeader(): JSX.Element;
    private handleButtonClick;
    handleButtonKeyDown: (event: any) => void;
    private handleButtonFocus;
    private handleButtonBlur;
    private handleMenuFocus;
    private handleMenuBlur;
    private handleMenuHighlightItem;
    private handleOptionCheck;
    private handleNativeOptionCheck;
    private handleClickOutside;
    private handleMenuKeyDown;
    private handleNativeFocus;
    private handleNativeBlur;
    private handleNativeClick;
    private handleMqMatchChange;
    private handlePopupCloserClick;
    private setPopupRef;
    private setMenuRef;
    /**
     * Возвращает корневой `HTMLElement` компонента.
     */
    getNode(): HTMLDivElement;
    /**
     * Устанавливает фокус на компонент.
     */
    focus(): void;
    /**
     * Убирает фокус с компонента.
     */
    blur(): void;
    /**
     * Скроллит страницу до компонента.
     */
    scrollTo(): void;
    focusOnMenu(): void;
    /**
     * @param {MenuItem} highlightedItem Выбранный в текущий момент пункт меню
     */
    private scrollToHighlightedItem;
    private toggleOpened;
    private updatePopupStyles;
    private setPopupTarget;
    private getCheckedItems;
    private getOpened;
    private getRevisedEvent;
    private getValue;
    getScrollContainer(): HTMLElement;
    private isAutoSelectRequired;
    private hasCheckedItems;
    private selectFirstOption;
    private getFirstOption;
}
declare const _default: React.ForwardRefExoticComponent<SelectProps & React.RefAttributes<Select>> & Select;
export default _default;
