type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;

type IntersectionObserverHookArgs = Omit<IntersectionObserverInit, 'root'>;
type IntersectionObserverHookRefCallbackNode = Element | null;
type IntersectionObserverHookRefCallback = (node: IntersectionObserverHookRefCallbackNode) => VoidFunction;
type IntersectionObserverHookRootRefCallbackNode = IntersectionObserverInit['root'];
type IntersectionObserverHookRootRefCallback = (node: IntersectionObserverHookRootRefCallbackNode) => VoidFunction;
type IntersectionObserverHookResult = [
    IntersectionObserverHookRefCallback,
    {
        entry: IntersectionObserverEntry | undefined;
        rootRef: IntersectionObserverHookRootRefCallback;
    }
];
declare function useIntersectionObserver(args?: IntersectionObserverHookArgs): IntersectionObserverHookResult;

type TrackVisibilityHookArgs = IntersectionObserverHookArgs & {
    once?: boolean;
};
type TrackVisibilityHookResult = [
    IntersectionObserverHookResult[0],
    IntersectionObserverHookResult[1] & {
        isVisible: boolean;
    }
];
declare function useTrackVisibility(args?: TrackVisibilityHookArgs): TrackVisibilityHookResult;

export { type IntersectionObserverHookArgs, type IntersectionObserverHookRefCallback, type IntersectionObserverHookRefCallbackNode, type IntersectionObserverHookResult, type IntersectionObserverHookRootRefCallback, type IntersectionObserverHookRootRefCallbackNode, type TrackVisibilityHookArgs, type TrackVisibilityHookResult, useIntersectionObserver, useTrackVisibility };
