import type { Position, WorkflowNode } from "../editor";
export interface CollisionOptions {
    /** Minimum gap (px) the dragged node must keep from each other node.
     *
     *   - `gap >= 0` — the resolver is **enabled**. `gap === 0` means
     *     "no overlap, zero buffer" (strict no-overlap). `gap > 0` enforces
     *     a buffer of that many pixels.
     *   - `gap < 0` — the resolver is **disabled** (returns the proposed
     *     position unchanged). This is the no-op sentinel used by
     *     consumers that haven't opted into magnet behaviour. */
    gap: number;
    /** Cap iterative resolutions — prevents infinite loops in pathological
     *  geometries (e.g. four nodes hugging a single corner). Default 8. */
    maxIterations?: number;
    /** Node ids that the resolver should ignore — typically the dragged
     *  node itself plus its descendants (so a parent doesn't collide with
     *  its own children) and its ancestors (so a child doesn't collide
     *  with its containing group). */
    exclude?: Set<string>;
    /** When true, only consider nodes that share the same `parentId` as
     *  the dragged node (i.e. its siblings). When false, all non-excluded
     *  nodes participate. Defaults to true — this is the "rooms" model
     *  where children of group A never collide with children of group B
     *  even if their bboxes overlap in flow space.  */
    scopeToSiblings?: boolean;
}
/**
 * Adjust a proposed (flow-space) position so the node's bbox stays at
 * least `gap` pixels away from every other (non-excluded) node's bbox.
 *
 * The function does NOT mutate the input nodes; it returns a new
 * `Position`. The caller is responsible for emitting the resulting
 * change via `onNodesChange` — collision resolution doesn't dispatch
 * anything on its own.
 */
export declare function resolveNodeCollisions(node: WorkflowNode, proposed: Position, others: WorkflowNode[], opts: CollisionOptions): Position;
//# sourceMappingURL=collision.d.ts.map