/** * In-iframe annotation frame renderer — `selectionFrame`'s sibling surface. * * Same architecture and reasons as selection frames: page-coordinate * `position: absolute` nodes in a body-level container, so document scroll * translates them with zero JavaScript per scroll frame, and styling is * vanilla inline CSS because customer pages have no tailwind. * * An annotation frame is an invisible positioning box over the annotated * element carrying a numbered badge dot — the dot is the entire visual. * Unlike selection frames these rebuild wholesale on each call: re-renders * happen on set/re-measure (rare), never per scroll, so pooling buys nothing. */ export declare const ANNOTATION_CONTAINER_ID = "replo-annotation-frames"; interface AnnotationRect { x: number; y: number; width: number; height: number; } export interface AnnotationFrameSpec { id: string; pageRect: AnnotationRect; badgeCenter: { x: number; y: number; }; positioning: "absolute" | "fixed"; colorHex: string; badgeLabel: string; badgeAriaLabel: string; isActive: boolean; onBadgeClick: () => void; } /** * Style-only selection update: rebuilding the node pool mid-interaction would * race the pointer sequence and swallow the click, so the active state never * re-renders — it just retargets transforms on the existing nodes. */ export declare function setActiveAnnotationBadge(id: string | null): void; export declare function getAnnotationBadgeViewportRect(id: string): AnnotationRect | null; export declare function showAnnotationFrames({ frames, }: { frames: AnnotationFrameSpec[]; }): void; export declare function clearAnnotationFrames(): void; export {};