import React from 'react';
import Type, { ValidationMap } from 'prop-types';
import { Theme } from '../cn';
/**
 * @typedef {Object} Point
 * @property {Number} left Координата по оси x
 * @property {Number} top Координата по оси y
 */
/**
 * @typedef {Object} PopupOffsetCollection
 * @property {Number} main Смещение в пикселях всплывающего окна относительно основного направления
 * @property {Number} second Смещение в пикселях всплывающего окна относительно второстепенного направления
 * @property {Number} viewport Минимально допустимое смещение в пикселях всплывающего окна от края окна браузера
 */
/**
 * @typedef {Object} PopupHash
 * @property {Array.<String>} directions Список возмножных расположений попапа
 * @property {String} bestDirection Приоритетное расположение
 * @property {Boolean} isHeightAdaptive Подстраивается ли высота попапа под край окна
 * @property {Boolean} isHeightAvailable Занимает ли попап всю возможную высоту
 * @property {Boolean} isTargetAnchor Привязан ли попап к другому элементу
 * @property {Boolean} isHaveTooltip Имеет ли попап тип "tooltip"
 * @property {Number} width Ширина попапа
 * @property {Number} height Высота попапа
 * @property {Number} contentWidth Ширина контента в попапе
 * @property {Number} contentHeight Высота контента в попапе
 * @property {PopupOffsetCollection} offset Список смещений попапа
 * @property {Point} targetPosition Координаты точки привязки попапа
 * @property {HTMLElement} targetAnchor Объект элемента, к которому привязан попап, в DOM дереве
 */
export declare type PopupDirectionsFieldType = 'anchor' | '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 PopupProps = {
    /**
     * Дополнительный класс
     */
    className?: string;
    /**
     * Идентификатор компонента в DOM
     */
    id?: string;
    /**
     * Дочерние элементы `Popup`
     */
    children?: React.ReactNode;
    /**
     * Тип попапа
     */
    type?: 'default' | 'tooltip';
    /**
     * Подстраивание высоты попапа под край окна ('adaptive'), занятие попапом всей возможной высоты ('available'), 'default'
     */
    height?: 'default' | 'available' | 'adaptive';
    /**
     * Только для target='anchor', расположение (в порядке приоритета) относительно точки открытия. Первым указывается главное направление, через дефис - второстепенное направление
     */
    directions?: readonly PopupDirectionsFieldType[];
    /**
     * Привязка компонента к другому элементу на странице, или его расположение независимо от остальных: 'anchor', 'position', 'screen'
     */
    target?: 'anchor' | 'position' | 'screen';
    /**
     * Только для target='anchor'. Смещение в пикселях всплывающего окна относительно основного направления
     */
    mainOffset?: number;
    /**
     * Только для target='anchor'. Смещение в пикселях всплывающего окна относительно второстепенного направления
     */
    secondaryOffset?: number;
    /**
     * Только для target='anchor'. Минимально допустимое смещение в пикселях всплывающего окна от края его контейнера
     */
    fitContaiterOffset?: number;
    /**
     * Управление видимостью компонента
     */
    visible?: boolean;
    /**
     * Управление выставлением модификатора для добавления внутренних отступов в стилях
     */
    padded?: boolean;
    /**
     * Элемент закреплённого заголовка для компонента
     */
    header?: React.ReactNode;
    /**
     * Размер компонента
     */
    size?: 's' | 'm' | 'l' | 'xl';
    /**
     * Тема компонента
     */
    theme?: Theme;
    /**
     * Обработчик события наведения курсора на попап
     */
    onMouseEnter?: (event?: React.MouseEvent<any>) => void;
    /**
     * Обработчик события снятия курсора с попапа
     */
    onMouseLeave?: (event?: React.MouseEvent<any>) => void;
    /**
     * Обработчик клика вне компонента
     */
    onClickOutside?: (event?: React.MouseEvent<any>) => void;
    /**
     * Минимальная ширина попапа
     */
    minWidth?: number;
    /**
     * Максимальная ширина попапа
     */
    maxWidth?: number;
    /**
     * Максимальная высота попапа
     */
    maxHeight?: number;
    /**
     * Указатель на родительский элемент
     */
    for?: string;
    /**
     * Идентификатор для систем автоматизированного тестирования
     */
    'data-test-id'?: string;
};
declare type PopupState = {
    direction: any;
    hasScrollbar: boolean;
    receivedContainer: boolean;
    styles: React.CSSProperties;
    topGradientStyles: React.CSSProperties;
    bottomGradientStyles: React.CSSProperties;
    canUseDOM: boolean;
    needRedrawAfterMount: boolean;
};
export declare const popupContextTypes: ValidationMap<unknown>;
/**
 * Компонент popup'а.
 */
export declare class Popup extends React.Component<PopupProps, PopupState> {
    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<PopupProps>;
    static contextTypes: Type.ValidationMap<unknown>;
    state: {
        direction: any;
        hasScrollbar: boolean;
        receivedContainer: boolean;
        styles: {
            top: number;
            left: number;
            height: string;
        };
        topGradientStyles: {
            width: string;
        };
        bottomGradientStyles: {
            width: string;
        };
        canUseDOM: boolean;
        needRedrawAfterMount: boolean;
    };
    private anchor;
    private clickEventBindTimeout;
    private domElemPopup;
    private domElemPopupInner;
    private domElemPopupContent;
    private isWindowClickBinded;
    private position;
    private popup;
    private inner;
    private content;
    private handleWindowResize;
    UNSAFE_componentWillMount(): void;
    componentDidMount(): void;
    UNSAFE_componentWillReceiveProps(nextProps: any, nextContext: any): void;
    componentDidUpdate(prevProps: any): void;
    componentWillUnmount(): void;
    render(): React.ReactPortal;
    private handleInnerScroll;
    private handleMouseEnter;
    private handleMouseLeave;
    private handleWindowClick;
    private handleResize;
    /**
     * Задает элемент, к которому будет привязан popup.
     * @param target Элемент, к которому будет привязан popup
     */
    setTarget(target: HTMLElement): void;
    /**
     * Задает положение popup.
     * @param left x-coordinate
     * @param top y-coordinate
     */
    setPosition(left: number, top: number): void;
    /**
     * Возвращает внутренний DOM узел.
     */
    getInnerNode(): HTMLElement;
    /**
     * Возвращает контейнер, в котором отрендерится попап.
     */
    private getRenderContainer;
    /**
     * Возвращает контейнер, внутрь которого надо вписать элемент.
     */
    private getPositioningContainer;
    /**
     * Возвращает `true`, если контейнер, в котором должен быть отрисован
     * `Popup` уже находится в DOM. Для `Popup` без кастомного контейнера
     * роль контейнера выполняет `document.body` и этот для них этот метод
     * всегда вернете `true`.
     */
    private isContainerReady;
    /**
     * Возвращает `true`, если все необходимые для расчета положения `Popup`
     * внешние props заданы.
     */
    isPropsToPositionCorrect(): boolean;
    private redraw;
    private ensureClickEvent;
    private getDrawingCss;
    private getMinWidth;
    private getMaxWidth;
    private getMaxHeight;
    /**
     * Get collection of popup properties.
     *
     */
    private getPopupHash;
    private setGradientStyles;
    /**
     * Обновляет overflow у html. Нужно чтобы в полноэкранном режиме не скроллился документ
     * @param willComponentUnmount указывает на то, что функция вызывается при размонтировании компонента
     */
    private updateDocumentOverflow;
}
declare const _default: React.ForwardRefExoticComponent<PopupProps & React.RefAttributes<Popup>> & Popup;
export default _default;
