/**
 * Keyed reconcile for collapse/expand.
 *
 * Given the set of node ids that were visible before a toggle and the set the
 * new layout will render, classify each id as entering (new), updating
 * (persisting), or exiting (leaving). The graph uses this to keep persisted DOM
 * wrappers alive — retargeting their springs instead of destroying them — so
 * motion is continuous and interruptible.
 */
export interface NodeDiff {
    /** Ids present in the new layout but not before — animate in from the parent. */
    enter: string[];
    /** Ids present in both — reposition (and rebuild content only if changed). */
    update: string[];
    /** Ids present before but gone now — animate out, then unmount. */
    exit: string[];
}
/**
 * Diff the previous visible id set against the next one.
 *
 * @param prevIds Ids rendered by the previous pass (the live DOM wrappers).
 * @param nextIds Ids the new layout will render.
 */
export declare function diffNodes(prevIds: Iterable<string>, nextIds: Iterable<string>): NodeDiff;
/**
 * Breadth-first ring distance from a pivot node over the CURRENTLY visible
 * child adjacency. Drives the wave stagger: nodes closer to the toggled pivot
 * start moving first, so the reflow radiates outward from where the user acted.
 *
 * @param pivotId   The toggled node.
 * @param childrenOf Returns the visible child ids of a node.
 * @param ids       All ids to assign a distance to (unreached ids get 0).
 */
export declare function ringDistances(pivotId: string, childrenOf: (id: string) => string[], ids: Iterable<string>): Map<string, number>;
//# sourceMappingURL=reconcile.d.ts.map