export interface ModalHandle { open: (context?: TContext, snap?: string | number | "auto") => void; close: () => void; isOpen: boolean; getContext: () => TContext | null; getChromeHeight: () => number; subscribeOpenChange: (cb: (open: boolean) => void) => () => void; } export interface ModalControl { /** Pass to */ ref: React.RefObject | null>; /** Open modal with optional context and snap (mobile only). */ open: (context?: TContext, snap?: string | number | "auto") => void; /** Close the modal. */ close: () => void; /** Chrome height (header+footer). 0 on desktop. Useful for layout calc on mobile. */ getChromeHeight: () => number; /** Current context value. */ getContext: () => TContext | null; /** Subscribe to open/close. Returns unsubscribe. */ subscribeOpenChange: (cb: (open: boolean) => void) => () => void; /** Snapshot of open state. NOT reactive — use useModalState for re-renders. */ isOpen: boolean; } /** * Imperative control for Modal. Returns ref + convenience methods. * Pass ref to . Use open/close for imperative control. * * isOpen is NOT reactive — it's a snapshot. Use useModalState(ref) for reactive state. */ declare const useModalControl: () => { ref: import('react').RefObject | null>; open: (context?: TContext, snap?: string | number | "auto") => void; close: () => void; getContext: () => NonNullable | null; getChromeHeight: () => number; subscribeOpenChange: (cb: (open: boolean) => void) => () => void; isOpen: boolean; }; export default useModalControl; /** * Reactive open state for a Modal ref. Re-renders when modal opens/closes. * Connects via subscribeOpenChange with rAF retry for late-mounting modals. */ export declare const useModalState: (modalRef: React.RefObject | null>) => boolean;