import { type RefCallback } from "react";
import { MenuPlacement } from "@/react/editor/types";
/** 编辑器浮层可使用的锚点。 */
export type EditorFloatingOverlayAnchor = DOMRect | HTMLElement;
/** 编辑器浮层横向对齐方式。 */
export type EditorFloatingOverlayHorizontalAlign = "start" | "end";
/** 编辑器浮层纵向定位模式。 */
export type EditorFloatingOverlayVerticalMode = "outside" | "inside-top" | "inside-bottom";
/** 编辑器内容坐标系中的稳定锚点。 */
interface EditorFloatingOverlayContentAnchor {
    /** 锚点顶部内容坐标。 */
    anchorTop: number;
    /** 锚点底部内容坐标。 */
    anchorBottom: number;
    /** 锚点左侧内容坐标。 */
    anchorLeft: number;
    /** 锚点右侧内容坐标。 */
    anchorRight: number;
}
/** 编辑器浮层定位上下文。 */
export interface EditorFloatingOverlayPositionContext {
    /** 编辑器滚动容器。 */
    editorWrapper: HTMLDivElement;
    /** 锚点：DOM 节点保持动态测量，DOMRect 会转为内容坐标。 */
    anchor: HTMLElement | EditorFloatingOverlayContentAnchor;
    /** 菜单展开方向。 */
    placement: MenuPlacement;
    /** 默认展开方向。 */
    defaultPlacement: MenuPlacement;
    /** 是否锁定展开方向。 */
    lockPlacement: boolean;
    /** 横向对齐方式。 */
    horizontalAlign: EditorFloatingOverlayHorizontalAlign;
    /** 纵向定位模式。 */
    verticalMode: EditorFloatingOverlayVerticalMode;
    /** 横向偏移量。 */
    horizontalOffset: number;
    /** 纵向偏移量。 */
    verticalOffset: number;
    /** 浮层与编辑器边界的最小间距。 */
    boundaryInset: number;
    /** 是否把横向滚动量纳入内容坐标。 */
    trackScrollLeft: boolean;
    /** 首帧宽度兜底。 */
    fallbackWidth: number;
    /** 首帧高度兜底。 */
    fallbackHeight: number;
}
/** 创建编辑器浮层定位上下文的配置。 */
export interface CreateEditorFloatingOverlayPositionContextOptions {
    /** 编辑器滚动容器。 */
    editorWrapper: HTMLDivElement | null;
    /** 浮层锚点。 */
    anchor: EditorFloatingOverlayAnchor | null;
    /** 默认展开方向。 */
    defaultPlacement?: MenuPlacement;
    /** 触发翻转的高度阈值。 */
    placementThreshold?: number;
    /** 是否锁定展开方向。 */
    lockPlacement?: boolean;
    /** 横向对齐方式。 */
    horizontalAlign?: EditorFloatingOverlayHorizontalAlign;
    /** 纵向定位模式。 */
    verticalMode?: EditorFloatingOverlayVerticalMode;
    /** 横向偏移量。 */
    horizontalOffset?: number;
    /** 纵向偏移量。 */
    verticalOffset?: number;
    /** 浮层与编辑器边界的最小间距。 */
    boundaryInset?: number;
    /** 是否把横向滚动量纳入内容坐标。 */
    trackScrollLeft?: boolean;
    /** 首帧宽度兜底。 */
    fallbackWidth?: number;
    /** 首帧高度兜底。 */
    fallbackHeight?: number;
}
/** 编辑器浮层定位 Hook 配置。 */
interface UseEditorFloatingOverlayPositionOptions {
    /** 当前定位上下文。 */
    context: EditorFloatingOverlayPositionContext | null;
    /** 编辑器内 Portal 容器。 */
    portalContainer?: HTMLDivElement | null;
    /** 是否启用定位监听。 */
    enabled: boolean;
}
/** 创建稳定的编辑器浮层定位上下文。 */
export declare function createEditorFloatingOverlayPositionContext({ editorWrapper, anchor, defaultPlacement, placementThreshold, lockPlacement, horizontalAlign, verticalMode, horizontalOffset, verticalOffset, boundaryInset, trackScrollLeft, fallbackWidth, fallbackHeight, }: CreateEditorFloatingOverlayPositionContextOptions): EditorFloatingOverlayPositionContext | null;
/** 编辑器浮层命令式定位：直接写入浮层 DOM 坐标。 */
export declare function useEditorFloatingOverlayPosition({ context, portalContainer, enabled, }: UseEditorFloatingOverlayPositionOptions): {
    overlayRef: RefCallback<HTMLDivElement>;
    updatePosition: () => void;
    clearPosition: () => void;
};
export {};
