import '../../../../assert/js/assert.js';
import '../../../../globals.js';
/**
 * ManualConstraint exists for cases where imperative-based positioning code (e.g. `node.left = otherNode.right + 5`)
 * is best for a case, and should be rerun whenever one of the nodes changes bounds.
 *
 * ManualConstraint also can handle cases where the nodes do not live in the same coordinate frame (but instead with
 * some common ancestor).
 *
 * For example:
 *
 * new ManualConstraint( ancestorNode, [ firstNode, secondNode ], ( firstProxy, secondProxy ) => {
 *   firstProxy.left = secondProxy.right + 5;
 *   secondProxy.centerY = firstProxy.centerY;
 * } );
 *
 * Notably in the callback, it uses LayoutProxy (which has the positional getters/setters of an object, and handles
 * coordinate transforms).
 *
 * See https://phetsims.github.io/scenery/doc/layout#ManualConstraint for details
 *
 * @author Jonathan Olson <jonathan.olson@colorado.edu>
 */
import IntentionalAny from '../../../../phet-core/js/types/IntentionalAny.js';
import { LayoutConstraint, LayoutProxy, Node } from '../../imports.js';
type LayoutProxyMap<T> = {
    [Property in keyof T]: LayoutProxy;
};
type LayoutCallback<T extends IntentionalAny[]> = (...args: LayoutProxyMap<T>) => void;
export default class ManualConstraint<T extends Node[]> extends LayoutConstraint {
    private readonly nodes;
    private readonly cells;
    private readonly layoutCallback;
    constructor(ancestorNode: Node, nodes: T, layoutCallback: LayoutCallback<T>);
    /**
     * (scenery-internal)
     */
    layout(): void;
    /**
     * Releases references
     */
    dispose(): void;
    static create<T extends Node[]>(ancestorNode: Node, nodes: T, layoutCallback: LayoutCallback<T>): ManualConstraint<T>;
}
export {};
//# sourceMappingURL=ManualConstraint.d.ts.map