import WUPBaseElement from "./baseElement";
declare const enum OpenCases {
    /** When $open() is called programmatically */
    onManualCall = 0
}
declare const enum CloseCases {
    /** When $close() is called programmatically */
    onManualCall = 0
}
declare global {
    namespace WUP.BaseModal {
        interface Options {
        }
        interface EventMap<OpenCases = any, CloseCases = any> extends WUP.Base.EventMap {
            /** Fires before opening
             * @tutorial rules
             * * can be prevented via `e.preventDefault()` */
            $willOpen: CustomEvent<{
                openCase: OpenCases;
            }>;
            /** Fires after element is opened (after animation ends) */
            $open: Event;
            /** Fires before closing
             * @tutorial rules
             * * can be prevented via `e.preventDefault()` */
            $willClose: CustomEvent<{
                closeCase: CloseCases;
            }>;
            /** Fires after element is closed (after animation ends) */
            $close: Event;
        }
        interface JSXProps extends WUP.Base.OnlyNames<Options> {
            /** @deprecated SyntheticEvent is not supported. Use ref.addEventListener('$willOpen') instead */
            onWillOpen?: never;
            /** @deprecated SyntheticEvent is not supported. Use ref.addEventListener('$open') instead */
            onOpen?: never;
            /** @deprecated SyntheticEvent is not supported. Use ref.addEventListener('$willClose') instead */
            onWillClose?: never;
            /** @deprecated SyntheticEvent is not supported. Use ref.addEventListener('$close') instead */
            onClose?: never;
        }
    }
}
/** Base modal element */
export default abstract class WUPBaseModal<TOptions extends WUP.BaseModal.Options = WUP.BaseModal.Options, Events extends WUP.BaseModal.EventMap = WUP.BaseModal.EventMap> extends WUPBaseElement<TOptions, Events> {
    #private;
    static get $styleRoot(): string;
    static get $style(): string;
    /** Returns if element is open (before show-animation started)
     * @tutorial Troubleshooting
     * * stack: $open() > `$isOpened:true` > opening > opened
     * * stack: $close() > closing > closed > `$isOpened:false`
     * * to listen to animation-end use events `$open` & `$close` OR methods `$open().then(...)` & `$close().then(... )` */
    get $isOpened(): boolean;
    /** Returns if element is opening (only if animation enabled) */
    get $isOpening(): boolean;
    /** Returns if element is closed (after hide-animation finished)
     * @tutorial Troubleshooting
     * * stack: $open() > `$isOpened:true` > opening > opened
     * * stack: $close() > closing > closed > `$isOpened:false`
     * * to listen to animation-end use events `$open` & `$close` OR methods `$open().then(...)` & `$close().then(... )` */
    get $isClosed(): boolean;
    /** Returns if element is opening (only if animation enabled) */
    get $isClosing(): boolean;
    /** Fires before opening
     * @tutorial rules
     * * can be prevented via `e.preventDefault()` */
    $onWillOpen?: (e: Events["$willOpen"]) => void;
    /** Fires after element is opened (after animation ends) */
    $onOpen?: (e: Events["$open"]) => void;
    /** Fires before closing
     * @tutorial rules
     * * can be prevented via `e.preventDefault()` */
    $onWillClose?: (e: Events["$willClose"]) => void;
    /** Fires after element is closed (after animation ends) */
    $onClose?: (e: Events["$close"]) => void;
    _whenOpen?: Promise<any>;
    /** Open element
     * @returns Promise resolved by animation-end ('true' if it finished & wasn't prevented) */
    $open(): Promise<boolean>;
    _whenClose?: Promise<boolean>;
    /** Close element
     * @returns Promise resolved by animation-end ('true' if it finished & wasn't prevented) */
    $close(): Promise<boolean>;
    protected gotReady(): void;
    /** Returns animation time defined according to styles */
    get animTime(): number;
    /** Implement extra logic on opening */
    abstract gotOpen(openCase: OpenCases | number, e: Event | null): void;
    /** Implement extra logic on closing */
    abstract gotClose(closeCase: CloseCases | number, e: Event | null, immediately?: boolean): void;
    /** Open element. @openCase as reason of open() */
    goOpen(openCase: OpenCases | number, ev: Event | null): Promise<boolean>;
    /** Hide element; @closeCase as reason of close() */
    goClose(closeCase: CloseCases | number, ev: Event | null, immediately?: boolean): Promise<boolean>;
    focus(): boolean;
    protected resetState(): void;
    protected disposeEvents(): void;
    protected dispose(): void;
}
export {};
