import type { RuiPlacement } from './placement'; /** Whether `node` is inside the anchor or floating surface. */ export declare function popoverContains(anchor: HTMLElement | null, floating: HTMLElement | null, node: Node | null): boolean; /** Whether focus left the popover interaction tree. */ export declare function shouldDismissPopoverFocus(anchor: HTMLElement | null, floating: HTMLElement | null, relatedTarget: EventTarget | null): boolean; /** Whether a pointer event target is outside the popover interaction tree. */ export declare function shouldDismissPopoverPointer(anchor: HTMLElement | null, floating: HTMLElement | null, target: Node | null): boolean; export type PopoverControllerConfig = { getAnchor: () => HTMLElement | null; getFloating: () => HTMLElement | null; getOpen: () => boolean; getPlacement: () => RuiPlacement; gap?: number; portal?: boolean; matchAnchorWidth?: boolean; portalContainer?: ParentNode; }; /** * Headless popover lifecycle: portal mount, floating position, and teardown. */ export declare class PopoverController { private config; private cleanupFloating; private portalHandle; private floatingElement; constructor(config: PopoverControllerConfig); updateConfig(patch: Partial): void; sync(): void; contains(node: Node | null): boolean; getFloatingElement(): HTMLElement | null; teardown(): void; destroy(): void; private resolveFloating; private teardownFloating; }