import type { HandlePosition, Position, Viewport, WorkflowNode } from "../editor";
export declare const DEFAULT_NODE_WIDTH = 368;
export declare const DEFAULT_NODE_HEIGHT = 96;
export declare const COLLAPSED_GROUP_HEIGHT = 36;
export declare const COLLAPSED_FOREACH_HEIGHT = 40;
/**
 * The height the node *actually renders at* — accounts for collapsed
 * containers whose visual height differs from `node.height`. All edge
 * geometry should go through this helper instead of reading
 * `node.height` directly.
 */
export declare function effectiveHeight(node: WorkflowNode): number;
/**
 * Compute the absolute (flow-space) centre of one of a node's handles.
 *
 * The handle's logical position (`top`/`right`/`bottom`/`left`) plus its
 * index among same-side handles determines a deterministic spread along
 * the relevant edge of the node bbox. We do NOT consult the DOM — the
 * source of truth is the node's measured (or default) dimensions.
 *
 * `total` is the count of handles on that side, `index` is this handle's
 * 0-based position among them. A single handle centres; multiple spread
 * evenly with equal margins.
 */
export declare function handleCentre(node: WorkflowNode, side: HandlePosition, index: number, total: number): Position;
/**
 * Cubic bezier path between two oriented points. The control points are
 * offset along each port's facing direction so the curve leaves and
 * enters along the port's axis (the same routing model as v1).
 */
export declare function bezierPath(start: Position, startSide: HandlePosition, end: Position, endSide: HandlePosition): {
    d: string;
    midX: number;
    midY: number;
};
/**
 * Convert a screen-space point (pixels relative to the viewport
 * container's top-left) to flow-space coordinates, given the current
 * viewport.
 */
export declare function screenToFlow(p: Position, vp: Viewport): Position;
/**
 * Inverse of `screenToFlow`.
 */
export declare function flowToScreen(p: Position, vp: Viewport): Position;
//# sourceMappingURL=geometry.d.ts.map