import type { Class_NodeBase } from './NodeBase'; import type { Class_DrawingArea } from '../types/DrawingArea'; interface Box { x: number; y: number; w: number; h: number; } /** * Contrôleur des smart guides pour UNE session de drag. Créé au drag start, * détruit (clear) au drag end. L'index des bords candidats est construit * PARESSEUSEMENT au premier mouvement (d3 émet start même sur un simple clic) * puis interrogé en O(log n) par mousemove — pas de recalcul O(n²). */ export declare class Class_SmartGuides { private _drawing_area; /** ids de TOUT ce qui bouge avec le drag (sélection + descendances de cadres liés). */ private _moved_ids; /** Les nœuds effectivement saisis (pour le hook de contrainte du modèle). */ private _dragged_nodes; private _index_x; private _index_y; /** Axes où le snap a un sens, fournis par le modèle (intersection sur la sélection). */ private _free_axes; private _d3_guides_group; constructor(drawing_area: Class_DrawingArea, moved_ids: Set, dragged_nodes: Class_NodeBase[]); /** * À appeler à chaque mousemove avec la boîte BRUTE (position de départ + * delta cumulé, sans correction — évite toute dérive du snap). Retourne la * correction {dx, dy} d'alignement (0 hors tolérance, axe contraint par le * modèle, ou snap débrayé) et dessine les guides pour la boîte corrigée. */ update(raw_box: Box, snap_enabled: boolean): { dx: number; dy: number; }; /** Fin de drag : retire la couche de guides et libère l'index. */ clear(): void; /** * Pré-indexe les bords/centres candidats (une fois par drag) : nœuds ET * conteneurs visibles, hors éléments emportés par le drag. Boîtes réelles * (géométrie résultante). Tableaux triés → requêtes dichotomiques ensuite. */ private _ensureIndex; /** * Meilleur alignement d'un axe : bords de la boîte déplacée contre bords * candidats, centre contre centres (façon draw.io — pas de bord↔centre). */ private _bestAxisMatch; /** * Couche de rendu des guides : dans le groupe des * éléments de la DrawingArea (au-dessus des nœuds/flux — ajouté en dernier), * reconstruite à chaque mousemove, retirée en fin de drag. */ private _render; /** * Un guide d'axe : ligne à la coordonnée alignée, couvrant toutes les boîtes * candidates alignées + la boîte déplacée, avec la DISTANCE (px monde) entre * la boîte déplacée et le voisin aligné le plus proche le long du guide. */ private _renderAxisGuide; } export {};