import type { App } from '../App'; import type { Node } from '../Node'; import type { Group } from '../shapes/Group'; import type { DiagramData, DiagramEdge, DiagramNode } from './types'; export { centerTextX, measureTextWidth } from './primitives'; export declare function num(props: Record, key: string, fallback: number): number; export declare function str(props: Record, key: string, fallback?: string): string; export declare function bool(props: Record, key: string, fallback?: boolean): boolean; export declare function arr(props: Record, key: string, fallback?: T[]): T[]; export declare function getDiagramState(node: Node): Record; export declare function setDiagramState(node: Node, patch: Record): void; /** Create a diagram group with metadata for JSON round-trip. */ export declare function createDiagramGroup(app: App, type: string, props: Record, extra?: Record): Group; /** Serialize a diagram node back to JSON. */ export declare function diagramToJSON(node: Node): { type: string; props: Record; }; /** Seeded PRNG for reproducible layouts. */ export declare function seededRandom(seed: number): () => number; export interface GridLayoutSpec { cols: number; cellW: number; cellH: number; paddingX: number; paddingY: number; } export declare function readCanvasSize(options: Record, fallbackW?: number, fallbackH?: number): { width: number; height: number; }; /** Compute responsive grid columns and spacing for diagram auto-layout */ export declare function resolveGridLayout(nodeCount: number, canvasW: number, canvasH: number, nodeW?: number, nodeH?: number, minPadding?: number): GridLayoutSpec; /** Auto-place diagram nodes on a grid when positions are missing */ export declare function autoLayoutNodes(nodes: Array<{ id: string; x?: number; y?: number; }>, cols?: number, cellW?: number, cellH?: number, paddingX?: number, paddingY?: number): void; /** Responsive grid auto-layout using canvas dimensions from options */ export declare function autoLayoutNodesResponsive(nodes: Array<{ id: string; x?: number; y?: number; }>, canvasW: number, canvasH: number, nodeW?: number, nodeH?: number): void; /** * Push overlapping diagram nodes apart so symbols do not stack on render. * Uses card metadata sizes when available; iterates a few times for stability. * Skips mind-map / org nested trees (call only on flat diagram node lists). */ export declare function separateOverlappingNodes(nodes: Node[], opts?: { gap?: number; iterations?: number; canvasW?: number; canvasH?: number; }): void; /** Scale and translate a diagram group to fit within canvas bounds */ export declare function fitDiagramToBounds(group: Group, canvasW: number, canvasH: number, padding?: number, options?: { allowScaleUp?: boolean; maxScaleUp?: number; }): { scale: number; offsetX: number; offsetY: number; }; /** Build a labeled node box used across diagram types. */ export declare function createNodeBox(app: App, label: string, width: number, height: number, style?: { fill?: string; stroke?: string; cornerRadius?: number; accentColor?: string; }): Group; /** Apply positions from a map to diagram node groups by diagramId. */ export declare function applyPositions(group: Group, positions: Map): void; /** Collect diagram nodes and edges from generic data. */ export declare function normalizeDiagramData(data: DiagramData): { nodes: DiagramNode[]; edges: DiagramEdge[]; };