import type { SectionCanvasRequest, SectionCanvasState } from "../../_vendor/schemas/generated/selectModeIframeRpc"; export type SectionDrag = { index: number; pointerId: number; startX: number; startY: number; x: number; y: number; isActive: boolean; gap: number | null; }; type PendingMove = { moveId: string; settle: () => void; revert: () => void; }; type SectionCanvasStoreState = { canvas: SectionCanvasState | null; elementsByIndex: ReadonlyMap; hoveredIndex: number | null; drag: SectionDrag | null; pendingMove: PendingMove | null; geometryVersion: number; actions: { setCanvas: (canvas: SectionCanvasState | null) => void; resolveSections: () => Promise; handlePreviewRefresh: () => void; bumpGeometry: () => void; setHoveredIndex: (index: number | null) => void; request: (request: SectionCanvasRequest) => void; beginDrag: (input: { index: number; pointerId: number; x: number; y: number; }) => void; updateDrag: (input: { x: number; y: number; }) => void; endDrag: (input: { shouldDrop: boolean; }) => void; move: (input: { index: number; to: number; }) => void; settleMove: (input: { moveId: string; outcome: "persisted" | "failed"; }) => void; }; }; /** On-screen sections in page order, with their boxes. */ export declare function getPlacedSections(state: Pick): { section: import("../../_vendor/schemas/generated/selectModeIframeRpc").SectionCanvasSection; box: import("./optimisticSectionMove").ViewportBox; }[]; /** * The insertion points between on-screen sections: `at` is the index a new or moved section goes * before in the page's list, `y` the viewport line drawn for it. */ export declare function getSectionGaps(placed: ReturnType, sectionCount: number): { at: number; y: number; }[]; export declare const sectionCanvasStore: import("zustand/traditional").UseBoundStoreWithEqualityFn>; export declare function useSectionCanvasStore(selector: (state: SectionCanvasStoreState) => Selected): Selected; export {};