import type { HTMLAttributes } from 'react';
import React from 'react';
import type { Nullable } from '../../typings/utility-types.js';
import type { Priority } from '../ZIndex/index.js';
import type { FocusEventType, MouseEventType } from '../../typings/event-types.js';
import type { CommonProps } from '../CommonWrapper/index.js';
import type { TGetRootNode } from '../../lib/rootNode/index.js';
export declare const PopupNonPinnablePositions: string[];
export declare const PopupPinnablePositions: string[];
export declare const PopupPositions: readonly string[];
export declare const DefaultPosition: string;
export type PopupPositionsType = (typeof PopupPositions)[number];
export type PopupPinnablePositionsType = (typeof PopupPinnablePositions)[number];
export type ShortPopupPositionsType = 'top' | 'bottom' | 'left' | 'right';
export declare const DUMMY_LOCATION: PopupLocation;
export interface PopupHandlerProps {
    onMouseEnter?: (event: MouseEventType) => void;
    onMouseLeave?: (event: MouseEventType) => void;
    onClick?: (event: MouseEventType) => void;
    onFocus?: (event: FocusEventType) => void;
    onBlur?: (event: FocusEventType) => void;
    onOpen?: () => void;
    onClose?: () => void;
}
export interface PopupProps extends Omit<CommonProps, 'children'>, PopupHandlerProps, Pick<HTMLAttributes<HTMLDivElement>, 'id'> {
    /**
     * Ссылка (ref) на элемент или React компонент, для которого рисуется попап
     */
    anchorElement: React.ReactNode | Element;
    /**
     * Фон попапа и пина
     */
    backgroundColor?: React.CSSProperties['backgroundColor'];
    borderColor?: React.CSSProperties['borderColor'];
    children: React.ReactNode | (() => React.ReactNode);
    /**
     * Показывать ли пин
     */
    hasPin?: boolean;
    /**
     * Применять ли box-shadow на попапе. При false отключает границу на пине
     */
    hasShadow?: boolean;
    disableAnimations?: boolean;
    /**
     * Отступ попапа от элемента
     */
    margin?: number;
    maxWidth?: number | string;
    /**
     * Показан или скрыт попап
     */
    opened: boolean;
    /**
     * Смещение пина от края попапа. Край задаётся в пропе position вторым словом
     */
    pinOffset?: number;
    /**
     * Сторона пина без учёта границы.
     * Пин представляет собой равносторонний треугольник, высота от попапа
     * до "носика" пина будет соответствовать формуле (size* √3)/2
     */
    pinSize?: number;
    /**
     * смещение попапа относительно родительского элемента
     */
    popupOffset?: number;
    priority?: Priority;
    /**
     * С какой стороны показывать попап и край попапа,
     * на котором будет отображаться пин
     */
    positions?: Readonly<PopupPositionsType[]>;
    /**
     * Приоритетная позиция попапа
     */
    pos?: PopupPositionsType | ShortPopupPositionsType;
    /**
     * Явно указывает, что вложенные элементы должны быть обёрнуты в `<span/>`. <br/> Используется для корректного позиционирования тултипа при двух и более вложенных элементах.
     *
     * _Примечание_: при **двух и более** вложенных элементах обёртка будет добавлена автоматически.
     */
    useWrapper?: boolean;
    /**
     * Игнорировать ли события hover/click
     */
    ignoreHover?: boolean;
    width?: React.CSSProperties['width'];
    minWidth?: React.CSSProperties['minWidth'];
    /**
     * При очередном рендере пытаться сохранить первоначальную позицию попапа
     * (в том числе, когда он выходит за пределы экрана, но может быть проскролен в него).
     *
     * Нужен только для Tooltip. В остальных случаях позиция перестраивается автоматически.
     * @see https://github.com/skbkontur/retail-ui/pull/1195
     */
    tryPreserveFirstRenderedPosition?: boolean;
    /**
     * Включает поиск наиболее подходящей позиции попапа, если ни одна заданная позиция попапа не влезает во вьюпорт.
     * Выбирается позиция с наибольшей видимой площадью.
     */
    tryBestFallbackPosition?: boolean;
    withoutMobile?: boolean;
    /** @ignore */
    disablePortal?: boolean;
    mobileOnCloseRequest?: () => void;
    /**
     * Возвращает текущую позицию попапа
     */
    onPositionChange?: (pos: PopupPositionsType, isFullyVisible: boolean) => void;
}
interface PopupLocation {
    coordinates: {
        left: number;
        top: number;
    };
    position: PopupPositionsType;
    isFullyVisible: boolean;
}
export interface PopupState {
    location: Nullable<PopupLocation>;
}
export declare const PopupDataTids: {
    readonly root: "Popup__root";
    readonly content: "PopupContent";
    readonly contentInner: "PopupContentInner";
    readonly popupPin: "PopupPin__root";
};
export declare const PopupIds: {
    root: "Popup__root";
};
type DefaultProps = Required<Pick<PopupProps, 'popupOffset' | 'hasPin' | 'hasShadow' | 'disablePortal' | 'disableAnimations' | 'useWrapper' | 'ignoreHover' | 'width' | 'priority'>>;
export declare class Popup extends React.Component<PopupProps, PopupState> {
    static __KONTUR_REACT_UI__: string;
    static displayName: string;
    static defaultProps: DefaultProps;
    private getProps;
    static readonly defaultRootNode: null;
    state: PopupState;
    private globalObject;
    private emotion;
    private cx;
    private styles;
    private theme;
    private layoutEventsToken;
    private locationUpdateId;
    private lastPopupContentElement;
    private isMobileLayout;
    getRootNode: TGetRootNode;
    private setRootNode;
    private refForTransition;
    private hasAnchorElementListeners;
    private rootId;
    anchorElement: Nullable<Element>;
    private absoluteParent;
    componentDidMount(): void;
    static getDerivedStateFromProps(props: Readonly<PopupProps>, state: PopupState): PopupState;
    componentDidUpdate(prevProps: PopupProps, prevState: PopupState): void;
    componentWillUnmount(): void;
    render(): React.JSX.Element;
    private renderMobile;
    private renderMain;
    private renderInPortal;
    private renderWithoutPortal;
    private updateAnchorElement;
    private updateAbsoluteElement;
    private addEventListeners;
    private removeEventListeners;
    private handleMouseEnter;
    private handleMouseLeave;
    private handleClick;
    private handleFocus;
    private handleBlur;
    private calculateWidth;
    private content;
    private renderContent;
    private prepareDataVisualState;
    private resetLocation;
    private renderChildren;
    private refPopupContentElement;
    private renderPin;
    private handleLayoutEvent;
    private delayUpdateLocation;
    private cancelDelayedUpdateLocation;
    private updateLocation;
    private locationEquals;
    private getOrderedPositions;
    private getLocation;
    private tryReuseCurrentLocation;
    private tryGetFirstFullyVisibleLocation;
    private getFallbackLocation;
    private pickBestFallbackPosition;
    private evaluateFallbackCandidate;
    private pickBestAreaCandidate;
    private pickBestOverflowCandidate;
    private getPinnedPopupOffset;
    private getRelativeShift;
    private getCoordinates;
    private getPinOffset;
    private getHorizontalPosition;
    private getVerticalPosition;
}
export {};
