export declare function ensureStyles(root: ShadowRoot): void; /** Every `` on a map — the BIM widgets' shared universe of pickable models. */ export declare function pickFeatureLayers(map: Element | null | undefined): Element[]; interface TreeNode { /** Full prefix identifying this node — also its key in the visibility state. */ key: string; label: string; count: number; /** Every concrete `spatialPath` value at or below this node. */ values: string[]; children: Map; } /** * Distinct spatial paths -> a nested tree, with counts aggregated upward. * * Depth is NOT uniform in real models: the bridge sample mixes 1-level and * 5-level paths in one file, and a model can leave elements with no spatial * container at all (700 of the clinic's 2,626). Both are represented rather * than dropped — an element that vanishes from the tree is an element nobody * can find again. */ export declare function buildSpatialTree(counts: Map): TreeNode; /** * Writes an attribute only when it would actually change. * * These widgets re-render on the `layers`/`features` tokens and their writes * mutate layers, so an unconditional write schedules the MutationObserver → * reconcile → full parseManifest pass that produced it — on EVERY render, * even when nothing changed. `setAttribute` notifies observers even when the * value is identical, so equality has to be checked here rather than relied * on. * * It also matters for size: an isolate list or a serialized feature-styles * table spans every element and runs to tens of kilobytes, and re-parsing * that on a loop would be felt. * * Shared with ifc-clash (imported from here — the dependency already flows * that way for ensureStyles/pickFeatureLayers). */ export declare function setIfChanged(element: Element | null, name: string, value: string | null): void; export {};