import * as _preact_signals_core from '@preact/signals-core';
import { FC, CSSProperties } from 'react';
import * as react_jsx_runtime from 'react/jsx-runtime';

type OverlayId = string;
type OverlayPosition = 'center' | 'top' | 'bottom' | 'left' | 'right';
type OverlayKind = 'overlay' | 'modal' | 'drawer';
interface OverlayContentProps<TData = unknown, TResult = unknown> {
    close: (result?: TResult) => void;
    data: TData;
    open: boolean;
    id: string;
}
type OverlayContent<TData = unknown, TResult = unknown> = FC<OverlayContentProps<TData, TResult>>;
interface OverlayOptions<TData = unknown, TResult = unknown> {
    id?: string;
    content: OverlayContent<TData, TResult>;
    data?: TData;
    position?: OverlayPosition;
    kind?: OverlayKind;
    title?: string;
    width?: string | number;
    height?: string | number;
    style?: CSSProperties;
    className?: string;
    onClose?: (result?: TResult) => void | Promise<void>;
    onOpen?: (id: string) => void | Promise<void>;
}
interface OverlayData<TData = unknown, TResult = unknown> extends OverlayOptions<TData, TResult> {
    id: string;
    open: boolean;
    beforeClose?: () => Promise<boolean> | boolean;
    closeTimestamp?: number;
}

declare const overlays: _preact_signals_core.Signal<OverlayData<any, any>[]>;
declare const useOverlayManager: () => {
    readonly openOverlay: <TData, TResult>(options: OverlayOptions<TData, TResult>) => Promise<TResult | undefined>;
    readonly closeAllOverlays: () => never[];
    readonly closeOverlayById: (id: string) => Promise<void>;
    readonly overlays: _preact_signals_core.Signal<OverlayData<any, any>[]>;
};

declare function OverlayContainer(): react_jsx_runtime.JSX.Element;

/**
 * When the manager tries to run an overlay with the same id
 * Function that executes before closing the overlay
 * @param beforeClose
 * @param id
 */
declare const useBeforeClose: (beforeClose: () => Promise<boolean> | boolean, id: string) => void;

export { OverlayContainer, type OverlayContent, type OverlayContentProps, type OverlayData, type OverlayId, type OverlayKind, type OverlayOptions, type OverlayPosition, overlays, useBeforeClose, useOverlayManager };
