import { DefaultLink, DefaultNode, SankeyAlignType } from './types';
export interface OptimalPositionOptions {
    width: number;
    height: number;
    /** horizontal | vertical */
    layout?: 'horizontal' | 'vertical';
    /** node thickness as passed to the Sankey component */
    nodeThickness?: number;
    /** node spacing (padding) as passed to the Sankey component */
    nodeSpacing?: number;
    /** alignment strategy as in Nivo props (only used to feed d3-sankey) */
    align?: SankeyAlignType;
    /** per-node additional gap that will be applied when resolving link collisions */
    collisionGap?: number;
    /** how much each successive intermediary node is shifted downwards */
    staggerGap?: number;
}
/**
 * Produces an initial `nodePositions` map to be used as the `initialNodePositions`
 * prop for <DraggableSankey>.  The algorithm is purposely lightweight:
 *   1. We run an internal d3-sankey layout to obtain the default coordinates.
 *   2. For every *intermediary* node (having both in- and out-going links) we add
 *      a small vertical offset (stagger) so that these nodes are shifted further
 *      down the diagram, column by column.
 *   3. We do a best-effort pass to ensure that links do not intersect unrelated
 *      nodes. For every link that spans more than one column, we push down any
 *      intermediate column node whose bounding box would overlap the link's
 *      vertical band.
 *
 * The function returns a record mapping node.id → { y }.  We don't override X
 * because the horizontal positions coming from d3-sankey are already optimal.
 */
export declare const calculateOptimalNodePositions: <N extends DefaultNode = DefaultNode, L extends DefaultLink = DefaultLink>(data: {
    nodes: readonly N[];
    links: readonly L[];
}, { width, height, layout, nodeThickness, nodeSpacing, align, collisionGap, staggerGap, }: OptimalPositionOptions) => Record<string, {
    y: number;
}>;
//# sourceMappingURL=calculateOptimalNodePositions.d.ts.map