import { PopupCloseCases, PopupOpenCases } from "./popupElement.types";
export interface PopupListenerOptions {
    target: HTMLElement | SVGElement;
    openCase?: PopupOpenCases;
    hoverOpenTimeout?: number;
    hoverCloseTimeout?: number;
    focusDebounceMs?: number;
}
/** Listen for target according to openCase. If target removed call stopListen + don't forget to remove popup yourself;
 * @tutorial Troubleshooting/rules:
 * * To allow user close/open popup before previous action is ended provide for onOpen and onClose-
 *   callbacks results as fast as it's possible without waiting for animation */
export default class PopupListener {
    #private;
    options: PopupListenerOptions;
    onOpen: (openCase: PopupOpenCases, ev: MouseEvent | FocusEvent | null) => HTMLElement | null | Promise<HTMLElement | null>;
    onClose: (closeCase: PopupCloseCases, ev: MouseEvent | FocusEvent | KeyboardEvent | null) => boolean | Promise<boolean>;
    static $defaults: {
        openCase: PopupOpenCases;
        hoverOpenTimeout: number;
        hoverCloseTimeout: number;
    };
    constructor(options: PopupListenerOptions, onOpen: (openCase: PopupOpenCases, ev: MouseEvent | FocusEvent | null) => HTMLElement | null | Promise<HTMLElement | null>, onClose: (closeCase: PopupCloseCases, ev: MouseEvent | FocusEvent | KeyboardEvent | null) => boolean | Promise<boolean>);
    openedEl: Element | null;
    isOpening?: boolean | Promise<unknown>;
    isClosing?: boolean | Promise<unknown>;
    /** Called on open */
    open(openCase: PopupOpenCases, e: MouseEvent | FocusEvent | null): Promise<void>;
    /** Called on close */
    close(closeCase: PopupCloseCases, e: MouseEvent | FocusEvent | KeyboardEvent | null): Promise<void>;
    /** Returns focus back during the hiding */
    focusBack(relatedTarget: Element | EventTarget | {
        focus: () => void;
    } | null): void;
    /** Returns whether el is part of another  */
    includes(this: Element, el: unknown): boolean;
    /** Returns whether element if part of openedElement */
    isMe(el: unknown, openedEl?: Element | null): boolean;
    /** Single event handler */
    handleEventsDocument(e: Event): void;
    /** Single event handler */
    handleEvents(ev: Event): void;
    /** Called on init to apply eventListeners */
    listen(): void;
    /** Called to add extra events when open */
    listenOnOpen(): void;
    /** Called to remove extra events when close */
    disposeOnClose(): void;
    /** Remove all event listeners */
    stopListen(): void;
}
