export type SettleRegistry = {
    /**
     * Resolve when the surface identified by `key` next reports that its
     * open/close animation finished. Callers should only await this right after
     * actually triggering a state change; otherwise it resolves via the safety
     * timeout. Multiple awaiters on the same key are coalesced.
     */
    waitForSurfaceSettled: (key: string, opts?: {
        safetyMs?: number;
    }) => Promise<void>;
    /** Called by the animation owner when `key`'s transition/animation ends. */
    notifySettled: (key: string) => void;
};
export declare function createSettleRegistry(): SettleRegistry;
/**
 * Wait until all CSS transitions/animations currently running on `el` (and its
 * subtree) have finished, using the Web Animations API. A double-rAF start-gate
 * lets a freshly-triggered animation begin before we sample; if nothing is
 * running afterwards we treat the surface as already settled and resolve
 * immediately. `getAnimations` is feature-detected (absent in jsdom).
 */
export declare function waitForElementAnimations(el: Element | null | undefined, opts?: {
    safetyMs?: number;
}): Promise<void>;
/**
 * Like waitForElementAnimations, but resolves the element by selector AFTER the
 * start-gate. Use for portaled surfaces (e.g. Radix popovers) that only mount
 * once their open animation begins, so a query at call time would return null.
 */
export declare function waitForSelectorAnimations(selector: string, opts?: {
    safetyMs?: number;
}): Promise<void>;
