/**
 * The label layout engine. Owns node lifecycle and the per-frame pipeline:
 * a cheap dirty gate, then (only when dirty) measure → build neighbourhood →
 * warm-start → solve → handle teleports, and every animating frame ease toward
 * the solved targets and write them to the DOM. It idles (no work, no
 * invalidate) once the camera is still and every label has settled.
 */
import type { Camera } from 'three';
import type { LabelStore } from './labelStore.svelte';
import { type SolverConfig } from './types';
export interface LayoutDeps {
    camera: {
        current: Camera;
    };
    size: {
        current: {
            width: number;
            height: number;
        };
    };
    invalidate: () => void;
    labels: LabelStore;
    config?: Partial<SolverConfig>;
}
export declare function createLabelLayout(deps: LayoutDeps): {
    frame: (delta: number) => void;
};
