diff --git a/README.md b/README.md index fd687c1ca..e606305ce 100644 --- a/README.md +++ b/README.md @@ -185,6 +185,7 @@ Quelques tests legacy sont connus comme cassés — voir la mémoire projet et - [`docs/STATUS.md`](docs/STATUS.md) — état réel par module - [`docs/DEV_SETUP.md`](docs/DEV_SETUP.md) — tâches d'administration (worktrees, build) +- [`docs/EXECUTION_LOOP_FLAGS.md`](docs/EXECUTION_LOOP_FLAGS.md) — flags C1 vision-aware (`enable_ui_detection`, `enable_ocr`, `analyze_timeout_ms`, `window_info_provider`) - [`docs/VISION_RPA_INTELLIGENT.md`](docs/VISION_RPA_INTELLIGENT.md) — cahier des charges - [`docs/PLAN_ACTEUR_V1.md`](docs/PLAN_ACTEUR_V1.md) — architecture 3 niveaux (Macro / Méso / Micro) - [`docs/CONFORMITE_AI_ACT.md`](docs/CONFORMITE_AI_ACT.md) — journalisation, floutage, rétention diff --git a/agent_chat/autonomous_planner.py b/agent_chat/autonomous_planner.py index d8748137c..3f47e1222 100644 --- a/agent_chat/autonomous_planner.py +++ b/agent_chat/autonomous_planner.py @@ -147,8 +147,10 @@ class AutonomousPlanner: """Initialise le client VLM pour analyse intelligente.""" if VLM_AVAILABLE and OllamaClient: try: - self._vlm_client = OllamaClient(model="qwen2.5vl:7b") - logger.info("VLM client initialized (qwen2.5vl:7b)") + from core.detection.vlm_config import get_vlm_model + _planner_vlm = get_vlm_model() + self._vlm_client = OllamaClient(model=_planner_vlm) + logger.info("VLM client initialized (%s)", _planner_vlm) except Exception as e: logger.warning(f"Could not initialize VLM client: {e}") self._vlm_client = None diff --git a/agent_v0/agent_v1/vision/capturer.py b/agent_v0/agent_v1/vision/capturer.py index 196103233..2ef6f6c37 100644 --- a/agent_v0/agent_v1/vision/capturer.py +++ b/agent_v0/agent_v1/vision/capturer.py @@ -2,12 +2,20 @@ """ Gestionnaire de vision avancé pour Agent V1. Optimisé pour le streaming fibre avec détection de changement. + +Captures disponibles : +- Plein écran (full) : contexte global 1920x1080+ +- Crop ciblé (crop) : 80x80 autour du clic (apprentissage VLM) +- Fenêtre active (window) : image isolée de la fenêtre + métadonnées + (titre, rect, coordonnées clic relatives) — cross-platform """ import os import time import logging import hashlib +import platform +from typing import Any, Dict, Optional from PIL import Image, ImageFilter, ImageStat import mss from ..config import TARGETED_CROP_SIZE, SCREENSHOT_QUALITY, BLUR_SENSITIVE @@ -15,6 +23,9 @@ from .blur_sensitive import blur_sensitive_regions logger = logging.getLogger(__name__) +# OS courant (détecté une seule fois) +_SYSTEM = platform.system() + class VisionCapturer: def __init__(self, session_dir: str): self.session_dir = session_dir @@ -27,13 +38,16 @@ class VisionCapturer: """ Capture l'écran complet. Si force=False, vérifie d'abord si l'écran a changé. + + Enrichit les métadonnées avec le titre de la fenêtre active + (utile pour le contextualisation des heartbeats côté serveur). """ try: with mss.mss() as sct: monitor = sct.monitors[1] sct_img = sct.grab(monitor) img = Image.frombytes("RGB", sct_img.size, sct_img.bgra, "raw", "BGRX") - + # Détection de changement (pour Heartbeat) if not force: current_hash = self._compute_quick_hash(img) @@ -52,8 +66,24 @@ class VisionCapturer: logger.error(f"Erreur Context Capture: {e}") return "" + def get_active_window_title(self) -> str: + """Retourne le titre de la fenêtre active (pour enrichir les heartbeats). + + Fallback gracieux : retourne une chaîne vide si indisponible. + """ + try: + from ..window_info_crossplatform import get_active_window_info + info = get_active_window_info() + return info.get("title", "") + except Exception: + return "" + def capture_dual(self, x: int, y: int, screenshot_id: str, anonymize=False) -> dict: - """Capture duale (Full + Crop) systématique (forcée car liée à une action).""" + """Capture triple (Full + Crop + Fenêtre active) systématique. + + La fenêtre active est un AJOUT — en cas d'échec, le full + crop + sont toujours retournés (fallback gracieux). + """ try: with mss.mss() as sct: full_path = os.path.join(self.shots_dir, f"{screenshot_id}_full.png") @@ -67,7 +97,7 @@ class VisionCapturer: left = max(0, x - w // 2) top = max(0, y - h // 2) crop_img = img.crop((left, top, left + w, top + h)) - + if anonymize: crop_img = crop_img.filter(ImageFilter.GaussianBlur(radius=4)) @@ -82,11 +112,130 @@ class VisionCapturer: # Mise à jour du hash pour le prochain heartbeat self.last_img_hash = self._compute_quick_hash(img) - return {"full": full_path, "crop": crop_path} + result = {"full": full_path, "crop": crop_path} + + # --- Capture de la fenêtre active --- + # Ajout non-bloquant : enrichit le résultat avec l'image + # de la fenêtre seule + métadonnées (titre, rect, clic relatif) + window_info = self.capture_active_window(x, y, screenshot_id, full_img=img) + if window_info: + result["window_capture"] = window_info + + return result except Exception as e: logger.error(f"Erreur Dual Capture: {e}") return {} + def capture_active_window( + self, + x: int, + y: int, + screenshot_id: str, + full_img: Optional[Image.Image] = None, + ) -> Optional[Dict[str, Any]]: + """Capture l'image de la fenêtre active seule + métadonnées. + + Stratégie : + 1. Obtenir le rectangle de la fenêtre via l'API OS (pywin32 / xdotool / Quartz) + 2. Cropper depuis le screenshot plein écran (plus fiable que PrintWindow) + 3. Calculer les coordonnées du clic relatives à la fenêtre + + Args: + x, y: coordonnées du clic en pixels écran + screenshot_id: identifiant pour le nom de fichier + full_img: screenshot plein écran déjà capturé (optionnel, évite une + double capture si appelé depuis capture_dual) + + Returns: + Dict avec window_image, window_title, window_rect, click_in_window, + window_size — ou None si la fenêtre est introuvable. + """ + try: + from ..window_info_crossplatform import get_active_window_rect + + rect_info = get_active_window_rect() + if not rect_info: + logger.debug("Fenêtre active introuvable — skip capture fenêtre") + return None + + win_rect = rect_info["rect"] # [left, top, right, bottom] + win_left, win_top, win_right, win_bottom = win_rect + win_w, win_h = rect_info["size"] # [width, height] + title = rect_info.get("title", "unknown_window") + app_name = rect_info.get("app_name", "unknown_app") + + # Ignorer les fenêtres trop petites (barres de tâches, popups système) + if win_w < 50 or win_h < 50: + logger.debug(f"Fenêtre trop petite ({win_w}x{win_h}) — skip") + return None + + # Coordonnées du clic relatives à la fenêtre + click_rel_x = x - win_left + click_rel_y = y - win_top + + # Si le clic est en dehors de la fenêtre, on le signale mais on continue + click_inside = (0 <= click_rel_x <= win_w and 0 <= click_rel_y <= win_h) + + # --- Crop de la fenêtre depuis le plein écran --- + if full_img is None: + # Pas de screenshot fourni — en capturer un (cas standalone) + try: + with mss.mss() as sct: + monitor = sct.monitors[1] + sct_img = sct.grab(monitor) + full_img = Image.frombytes( + "RGB", sct_img.size, sct_img.bgra, "raw", "BGRX" + ) + except Exception as e: + logger.error(f"Erreur capture plein écran pour fenêtre : {e}") + return None + + # Borner le crop aux limites de l'image plein écran + img_w, img_h = full_img.size + crop_left = max(0, win_left) + crop_top = max(0, win_top) + crop_right = min(img_w, win_right) + crop_bottom = min(img_h, win_bottom) + + if crop_right <= crop_left or crop_bottom <= crop_top: + logger.debug("Fenêtre hors écran — skip capture fenêtre") + return None + + window_img = full_img.crop((crop_left, crop_top, crop_right, crop_bottom)) + + # Floutage conformité AI Act + if BLUR_SENSITIVE: + blur_sensitive_regions(window_img) + + # Sauvegarde + window_path = os.path.join( + self.shots_dir, f"{screenshot_id}_window.png" + ) + window_img.save(window_path, "PNG", quality=SCREENSHOT_QUALITY) + + result = { + "window_image": window_path, + "window_title": title, + "app_name": app_name, + "window_rect": win_rect, + "window_size": [win_w, win_h], + "click_in_window": [click_rel_x, click_rel_y], + "click_inside_window": click_inside, + } + + logger.debug( + f"Fenêtre capturée : {title} ({win_w}x{win_h}) — " + f"clic relatif ({click_rel_x}, {click_rel_y})" + ) + return result + + except ImportError as e: + logger.debug(f"Module fenêtre indisponible : {e}") + return None + except Exception as e: + logger.error(f"Erreur capture fenêtre active : {e}") + return None + def _compute_quick_hash(self, img: Image) -> str: """Calcule un hash rapide basé sur une vignette réduite pour détecter les changements.""" # On réduit l'image à 64x64 pour comparer les masses de couleurs (très rapide) diff --git a/agent_v0/agent_v1/window_info_crossplatform.py b/agent_v0/agent_v1/window_info_crossplatform.py index ba059a3fc..85caed8d1 100644 --- a/agent_v0/agent_v1/window_info_crossplatform.py +++ b/agent_v0/agent_v1/window_info_crossplatform.py @@ -17,7 +17,7 @@ from __future__ import annotations import platform import subprocess -from typing import Dict, Optional +from typing import Any, Dict, Optional def _run_cmd(cmd: list[str]) -> Optional[str]: @@ -36,11 +36,11 @@ def get_active_window_info() -> Dict[str, str]: "title": "...", "app_name": "..." } - + Détecte automatiquement l'OS et utilise la méthode appropriée. """ system = platform.system() - + if system == "Linux": return _get_window_info_linux() elif system == "Windows": @@ -51,6 +51,32 @@ def get_active_window_info() -> Dict[str, str]: return {"title": "unknown_window", "app_name": "unknown_app"} +def get_active_window_rect() -> Optional[Dict[str, Any]]: + """ + Renvoie le rectangle de la fenêtre active : + { + "title": "...", + "app_name": "...", + "rect": [left, top, right, bottom], + "position": [left, top], + "size": [width, height], + "hwnd": int # Windows uniquement + } + + Retourne None si la fenêtre est introuvable ou minimisée. + Détecte automatiquement l'OS et utilise la méthode appropriée. + """ + system = platform.system() + + if system == "Windows": + return _get_window_rect_windows() + elif system == "Linux": + return _get_window_rect_linux() + elif system == "Darwin": + return _get_window_rect_macos() + return None + + def _get_window_info_linux() -> Dict[str, str]: """ Linux: utilise xdotool (X11) @@ -178,6 +204,163 @@ def _get_window_info_macos() -> Dict[str, str]: } +def _get_window_rect_windows() -> Optional[Dict[str, Any]]: + """ + Windows : utilise pywin32 pour obtenir le rectangle de la fenêtre active. + + Retourne None si la fenêtre est minimisée (icônifiée) ou si pywin32 manque. + """ + try: + import win32gui + import win32process + import psutil + + hwnd = win32gui.GetForegroundWindow() + if not hwnd: + return None + + # Ignorer les fenêtres minimisées (pas de contenu visible) + if win32gui.IsIconic(hwnd): + return None + + title = win32gui.GetWindowText(hwnd) or "unknown_window" + + # Rectangle de la fenêtre (coordonnées écran absolues) + left, top, right, bottom = win32gui.GetWindowRect(hwnd) + width = right - left + height = bottom - top + + # Ignorer les fenêtres de taille nulle ou absurde + if width <= 0 or height <= 0: + return None + + # Nom du processus + _, pid = win32process.GetWindowThreadProcessId(hwnd) + try: + app_name = psutil.Process(pid).name() + except Exception: + app_name = "unknown_app" + + return { + "title": title, + "app_name": app_name, + "rect": [left, top, right, bottom], + "position": [left, top], + "size": [width, height], + "hwnd": hwnd, + } + + except ImportError: + return None + except Exception: + return None + + +def _get_window_rect_linux() -> Optional[Dict[str, Any]]: + """ + Linux (X11) : utilise xdotool + xwininfo pour obtenir le rectangle. + + Nécessite : sudo apt-get install xdotool x11-utils + """ + try: + # Identifiant de la fenêtre active + wid = _run_cmd(["xdotool", "getactivewindow"]) + if not wid: + return None + + title = _run_cmd(["xdotool", "getactivewindow", "getwindowname"]) or "unknown_window" + pid_str = _run_cmd(["xdotool", "getactivewindow", "getwindowpid"]) + app_name = "unknown_app" + if pid_str: + app_name = _run_cmd(["ps", "-p", pid_str.strip(), "-o", "comm="]) or "unknown_app" + + # Géométrie via xdotool --shell (position + taille) + geom_raw = _run_cmd(["xdotool", "getwindowgeometry", "--shell", wid]) + if not geom_raw: + return None + + vals: Dict[str, int] = {} + for line in geom_raw.strip().splitlines(): + if "=" in line: + k, v = line.split("=", 1) + try: + vals[k.strip()] = int(v.strip()) + except ValueError: + pass + + if not {"X", "Y", "WIDTH", "HEIGHT"} <= vals.keys(): + return None + + x, y = vals["X"], vals["Y"] + w, h = vals["WIDTH"], vals["HEIGHT"] + + return { + "title": title, + "app_name": app_name, + "rect": [x, y, x + w, y + h], + "position": [x, y], + "size": [w, h], + } + + except Exception: + return None + + +def _get_window_rect_macos() -> Optional[Dict[str, Any]]: + """ + macOS : utilise Quartz (CGWindowListCopyWindowInfo) pour obtenir le rectangle. + + Nécessite : pip install pyobjc-framework-Quartz + """ + try: + from AppKit import NSWorkspace + from Quartz import ( + CGWindowListCopyWindowInfo, + kCGWindowListOptionOnScreenOnly, + kCGNullWindowID, + ) + + active_app = NSWorkspace.sharedWorkspace().activeApplication() + app_name = active_app.get("NSApplicationName", "unknown_app") + + window_list = CGWindowListCopyWindowInfo( + kCGWindowListOptionOnScreenOnly, kCGNullWindowID + ) + + for window in window_list: + owner_name = window.get("kCGWindowOwnerName", "") + if owner_name != app_name: + continue + + bounds = window.get("kCGWindowBounds") + if not bounds: + continue + + x = int(bounds.get("X", 0)) + y = int(bounds.get("Y", 0)) + w = int(bounds.get("Width", 0)) + h = int(bounds.get("Height", 0)) + if w <= 0 or h <= 0: + continue + + title = window.get("kCGWindowName", "unknown_window") or "unknown_window" + + return { + "title": title, + "app_name": app_name, + "rect": [x, y, x + w, y + h], + "position": [x, y], + "size": [w, h], + } + + except ImportError: + return None + except Exception: + return None + + return None + + # Test rapide if __name__ == "__main__": import time @@ -185,8 +368,13 @@ if __name__ == "__main__": print(f"OS détecté: {platform.system()}") print("\nTest de capture fenêtre active (5 secondes)...") print("Changez de fenêtre pour tester!\n") - + for i in range(5): info = get_active_window_info() + rect = get_active_window_rect() print(f"[{i+1}] App: {info['app_name']:20s} | Title: {info['title']}") + if rect: + print(f" Rect: {rect['rect']} | Size: {rect['size']}") + else: + print(" Rect: non disponible") time.sleep(1) diff --git a/core/execution/llm_actions.py b/core/execution/llm_actions.py index aa77a0d93..9912a4e83 100644 --- a/core/execution/llm_actions.py +++ b/core/execution/llm_actions.py @@ -40,12 +40,16 @@ class LLMActionHandler: def __init__( self, ollama_endpoint: str = "http://localhost:11434", - model: str = "qwen3-vl:8b", + model: str = None, temperature: float = 0.1, timeout: int = 120, ): self.endpoint = ollama_endpoint.rstrip("/") - self.model = model + if model is not None: + self.model = model + else: + from core.detection.vlm_config import get_vlm_model + self.model = get_vlm_model() self.temperature = temperature self.timeout = timeout diff --git a/core/extraction/field_extractor.py b/core/extraction/field_extractor.py index a627334c2..6c70b47f8 100644 --- a/core/extraction/field_extractor.py +++ b/core/extraction/field_extractor.py @@ -22,7 +22,7 @@ logger = logging.getLogger(__name__) # Configuration Ollama (coherente avec le reste du projet) OLLAMA_DEFAULT_URL = os.environ.get("OLLAMA_URL", "http://localhost:11434") -OLLAMA_DEFAULT_MODEL = os.environ.get("VLM_MODEL", "qwen3-vl:8b") +OLLAMA_DEFAULT_MODEL = os.environ.get("RPA_VLM_MODEL", os.environ.get("VLM_MODEL", "gemma4:e4b")) class FieldExtractor: diff --git a/core/gpu/__init__.py b/core/gpu/__init__.py index 7c0085d6a..eafe8c342 100644 --- a/core/gpu/__init__.py +++ b/core/gpu/__init__.py @@ -2,7 +2,7 @@ GPU Resource Management Module for RPA Vision V3 This module provides dynamic GPU resource allocation between ML models: -- Ollama VLM (qwen3-vl:8b) for UI classification +- Ollama VLM (gemma4:e4b par défaut, configurable via RPA_VLM_MODEL) for UI classification - CLIP (ViT-B-32) for embedding matching The GPUResourceManager optimizes VRAM usage by: diff --git a/core/gpu/gpu_resource_manager.py b/core/gpu/gpu_resource_manager.py index 2f88c405b..e28e7d817 100644 --- a/core/gpu/gpu_resource_manager.py +++ b/core/gpu/gpu_resource_manager.py @@ -2,7 +2,7 @@ GPU Resource Manager - Central orchestrator for GPU resource allocation Manages dynamic allocation of GPU resources between: -- Ollama VLM (qwen3-vl:8b) - ~10.5 GB VRAM for UI classification +- Ollama VLM (gemma4:e4b par défaut) - ~10 GB VRAM for UI classification - CLIP (ViT-B-32) - ~500 MB VRAM for embedding matching Optimizes VRAM usage based on execution mode: @@ -12,13 +12,14 @@ Optimizes VRAM usage based on execution mode: """ import asyncio +import contextlib import logging import threading import time from dataclasses import dataclass, field from datetime import datetime from enum import Enum -from typing import Any, Callable, Dict, List, Optional +from typing import Any, Callable, Dict, Iterator, List, Optional logger = logging.getLogger(__name__) @@ -53,7 +54,7 @@ class VRAMInfo: class GPUResourceConfig: """Configuration for GPU resource management.""" ollama_endpoint: str = "http://localhost:11434" - vlm_model: str = "qwen3-vl:8b" + vlm_model: str = "gemma4:e4b" clip_model: str = "ViT-B-32" idle_timeout_seconds: int = 300 # 5 minutes vram_threshold_for_clip_gpu_mb: int = 1024 # 1 GB @@ -126,6 +127,12 @@ class GPUResourceManager: # Operation queue for sequential processing self._operation_queue: asyncio.Queue = asyncio.Queue() self._operation_lock = asyncio.Lock() + + # Lock d'inférence synchrone : sérialise les appels GPU concurrents + # (ScreenAnalyzer.analyze, UIDetector, CLIP.encode) entre + # ExecutionLoop et stream_processor pour éviter la saturation VRAM + # sur RTX 5070 (12 Go). Un seul analyze à la fois sur le GPU. + self._inference_lock = threading.Lock() # Event callbacks self._on_resource_changed: List[Callable[[ResourceChangedEvent], None]] = [] @@ -207,7 +214,45 @@ class GPUResourceManager: def get_execution_mode(self) -> ExecutionMode: """Get the current execution mode.""" return self._execution_mode - + + # ========================================================================= + # Inference serialization (sync) + # ========================================================================= + + @contextlib.contextmanager + def acquire_inference(self, timeout: Optional[float] = None) -> Iterator[bool]: + """ + Context manager synchrone pour sérialiser les inférences GPU. + + Garantit qu'un seul appel d'inférence (ScreenAnalyzer.analyze, + UIDetector.detect, CLIP.encode…) tourne à la fois sur le GPU. + Évite la saturation VRAM quand ExecutionLoop et stream_processor + appellent analyze() simultanément sur une RTX 5070 (12 Go). + + Args: + timeout: Délai max d'attente (secondes). None = bloquant. + + Yields: + True si le lock est acquis, False en cas de timeout. + + Example: + >>> with gpu_manager.acquire_inference(timeout=30.0) as acquired: + ... if not acquired: + ... logger.warning("GPU lock timeout") + ... state = analyzer.analyze(path) + """ + if timeout is None: + self._inference_lock.acquire() + acquired = True + else: + acquired = self._inference_lock.acquire(timeout=timeout) + + try: + yield acquired + finally: + if acquired: + self._inference_lock.release() + # ========================================================================= # VLM Management # ========================================================================= diff --git a/core/gpu/ollama_manager.py b/core/gpu/ollama_manager.py index b9a26ffd2..8b39e5dc3 100644 --- a/core/gpu/ollama_manager.py +++ b/core/gpu/ollama_manager.py @@ -32,7 +32,7 @@ class OllamaManager: def __init__( self, endpoint: str = "http://localhost:11434", - model: str = "qwen3-vl:8b", + model: str = "gemma4:e4b", default_keep_alive: str = "5m" ): """ diff --git a/data/training/workflows/demo_calculator.json b/data/training/workflows/demo_calculator.json deleted file mode 100644 index 087fd44d7..000000000 --- a/data/training/workflows/demo_calculator.json +++ /dev/null @@ -1,100 +0,0 @@ -{ - "workflow_id": "demo_calculator", - "name": "Demo - Calculatrice", - "description": "Ouvre la calculatrice et effectue un calcul simple", - "version": "1.0.0", - "created_at": "2024-11-29T10:00:00", - "updated_at": "2024-11-29T10:00:00", - "learning_state": "OBSERVATION", - "execution_count": 0, - "entry_nodes": ["start"], - "end_nodes": ["end"], - "nodes": [ - { - "node_id": "start", - "name": "Desktop", - "description": "Écran de départ", - "template": { - "title_pattern": ".*" - }, - "is_entry": true, - "is_end": false, - "metadata": {} - }, - { - "node_id": "calc_open", - "name": "Calculatrice ouverte", - "description": "La calculatrice est visible", - "template": { - "title_pattern": ".*(calc|gnome-calculator).*" - }, - "is_entry": false, - "is_end": false, - "metadata": {} - }, - { - "node_id": "end", - "name": "Calcul effectué", - "description": "Le calcul est affiché", - "template": { - "title_pattern": ".*" - }, - "is_entry": false, - "is_end": true, - "metadata": {} - } - ], - "edges": [ - { - "edge_id": "open_calc", - "source_node": "start", - "target_node": "calc_open", - "action": { - "type": "compound", - "target": { - "by_role": null, - "selection_policy": "first" - }, - "parameters": { - "steps": [ - {"type": "key_press", "key": "super"}, - {"type": "wait", "duration_ms": 500}, - {"type": "text_input", "text": "calculator"}, - {"type": "key_press", "key": "Return"} - ] - } - }, - "constraints": { - "timeout_ms": 5000 - }, - "confidence_threshold": 0.7 - }, - { - "edge_id": "do_calc", - "source_node": "calc_open", - "target_node": "end", - "action": { - "type": "text_input", - "target": { - "by_role": "button", - "selection_policy": "first" - }, - "parameters": { - "text": "${expression}=", - "defaults": { - "expression": "2+2" - } - } - }, - "constraints": { - "timeout_ms": 3000 - }, - "confidence_threshold": 0.8 - } - ], - "metadata": { - "author": "RPA Vision V3", - "tags": ["demo", "calculator"], - "difficulty": "easy" - } -} diff --git a/deploy/systemd/rpa-streaming.service b/deploy/systemd/rpa-streaming.service new file mode 100644 index 000000000..4d6610a7d --- /dev/null +++ b/deploy/systemd/rpa-streaming.service @@ -0,0 +1,39 @@ +[Unit] +Description=RPA Vision V3 - Streaming Server (FastAPI, port 5005) +Documentation=https://lea.labs.laurinebazin.design +After=network-online.target +Wants=network-online.target + +[Service] +Type=simple + +# ---- Runtime ---- +User=dom +Group=dom +WorkingDirectory=/home/dom/ai/rpa_vision_v3 +EnvironmentFile=/home/dom/ai/rpa_vision_v3/.env.local +Environment="PYTHONUNBUFFERED=1" +Environment="RPA_SERVICE_NAME=rpa-streaming" + +# Lancement via le module Python (même commande que svc.sh) +ExecStart=/home/dom/ai/rpa_vision_v3/.venv/bin/python3 -m agent_v0.server_v1.api_stream + +# ---- Resilience ---- +Restart=on-failure +RestartSec=5 +TimeoutStopSec=30 +# Envoyer SIGTERM d'abord, puis SIGKILL après TimeoutStopSec +KillMode=mixed +KillSignal=SIGTERM + +# ---- Hardening (raisonnable pour un poste de dev/prod) ---- +NoNewPrivileges=true +PrivateTmp=true + +# Logs -> journald +StandardOutput=journal +StandardError=journal +SyslogIdentifier=rpa-streaming + +[Install] +WantedBy=multi-user.target diff --git a/deploy/systemd/rpa-vision-v3-api.service b/deploy/systemd/rpa-vision-v3-api.service index 6a4d5c4b3..6b1512d92 100644 --- a/deploy/systemd/rpa-vision-v3-api.service +++ b/deploy/systemd/rpa-vision-v3-api.service @@ -7,32 +7,29 @@ Wants=network-online.target Type=simple # ---- Runtime ---- -User=rpa -Group=rpa -WorkingDirectory=/opt/rpa_vision_v3/server -EnvironmentFile=/etc/rpa_vision_v3/rpa_vision_v3.env +User=dom +Group=dom +WorkingDirectory=/home/dom/ai/rpa_vision_v3 +EnvironmentFile=/home/dom/ai/rpa_vision_v3/.env.local Environment="PYTHONUNBUFFERED=1" Environment="ENVIRONMENT=production" Environment="RPA_SERVICE_NAME=rpa-vision-v3-api" -# Sécurité : valide les secrets (exit !=0 => systemd restart) -ExecStart=/opt/rpa_vision_v3/venv_v3/bin/python api_upload.py +ExecStart=/home/dom/ai/rpa_vision_v3/.venv/bin/python3 server/api_upload.py # ---- Resilience ---- Restart=on-failure RestartSec=3 TimeoutStopSec=30 -# ---- Hardening (raisonnable pour un MVP) ---- +# ---- Hardening ---- NoNewPrivileges=true PrivateTmp=true -ProtectSystem=strict -ProtectHome=true -ReadWritePaths=/opt/rpa_vision_v3/data /opt/rpa_vision_v3/logs # Logs -> journald StandardOutput=journal StandardError=journal +SyslogIdentifier=rpa-vision-v3-api [Install] -WantedBy=multi-user.target \ No newline at end of file +WantedBy=multi-user.target diff --git a/deploy/systemd/rpa-vision-v3-artifact-retention.service b/deploy/systemd/rpa-vision-v3-artifact-retention.service index 78d23fab9..36da9b388 100644 --- a/deploy/systemd/rpa-vision-v3-artifact-retention.service +++ b/deploy/systemd/rpa-vision-v3-artifact-retention.service @@ -3,8 +3,8 @@ Description=RPA Vision V3 - Artifact retention / rotation [Service] Type=oneshot -User=rpa -Group=rpa -WorkingDirectory=/opt/rpa_vision_v3 -EnvironmentFile=/etc/rpa_vision_v3/rpa_vision_v3.env -ExecStart=/opt/rpa_vision_v3/venv_v3/bin/python -m core.system.artifact_retention \ No newline at end of file +User=dom +Group=dom +WorkingDirectory=/home/dom/ai/rpa_vision_v3 +EnvironmentFile=/home/dom/ai/rpa_vision_v3/.env.local +ExecStart=/home/dom/ai/rpa_vision_v3/.venv/bin/python3 -m core.system.artifact_retention diff --git a/deploy/systemd/rpa-vision-v3-dashboard.service b/deploy/systemd/rpa-vision-v3-dashboard.service index 8cda40239..c844eace1 100644 --- a/deploy/systemd/rpa-vision-v3-dashboard.service +++ b/deploy/systemd/rpa-vision-v3-dashboard.service @@ -5,14 +5,14 @@ Wants=network-online.target [Service] Type=simple -User=rpa -Group=rpa -WorkingDirectory=/opt/rpa_vision_v3 -EnvironmentFile=/etc/rpa_vision_v3/rpa_vision_v3.env +User=dom +Group=dom +WorkingDirectory=/home/dom/ai/rpa_vision_v3 +EnvironmentFile=/home/dom/ai/rpa_vision_v3/.env.local Environment="PYTHONUNBUFFERED=1" Environment="ENVIRONMENT=production" Environment="RPA_SERVICE_NAME=rpa-vision-v3-dashboard" -ExecStart=/opt/rpa_vision_v3/venv_v3/bin/python web_dashboard/app.py +ExecStart=/home/dom/ai/rpa_vision_v3/.venv/bin/python3 web_dashboard/app.py Restart=on-failure RestartSec=3 @@ -20,12 +20,10 @@ TimeoutStopSec=30 NoNewPrivileges=true PrivateTmp=true -ProtectSystem=strict -ProtectHome=true -ReadWritePaths=/opt/rpa_vision_v3/data /opt/rpa_vision_v3/logs StandardOutput=journal StandardError=journal +SyslogIdentifier=rpa-vision-v3-dashboard [Install] -WantedBy=multi-user.target \ No newline at end of file +WantedBy=multi-user.target diff --git a/deploy/systemd/rpa-vision-v3-healthcheck.service b/deploy/systemd/rpa-vision-v3-healthcheck.service index a54793408..bad626403 100644 --- a/deploy/systemd/rpa-vision-v3-healthcheck.service +++ b/deploy/systemd/rpa-vision-v3-healthcheck.service @@ -8,9 +8,9 @@ OnFailure=rpa-vision-v3-recover.service [Service] Type=oneshot -WorkingDirectory=/opt/rpa_vision_v3 -EnvironmentFile=/etc/rpa_vision_v3/rpa_vision_v3.env -ExecStart=/opt/rpa_vision_v3/server/healthcheck.sh +WorkingDirectory=/home/dom/ai/rpa_vision_v3 +EnvironmentFile=/home/dom/ai/rpa_vision_v3/.env.local +ExecStart=/home/dom/ai/rpa_vision_v3/server/healthcheck.sh [Install] -WantedBy=multi-user.target \ No newline at end of file +WantedBy=multi-user.target diff --git a/deploy/systemd/rpa-vision-v3-recover.service b/deploy/systemd/rpa-vision-v3-recover.service index b2fb3b0c1..930b5f81a 100644 --- a/deploy/systemd/rpa-vision-v3-recover.service +++ b/deploy/systemd/rpa-vision-v3-recover.service @@ -5,4 +5,4 @@ Description=RPA Vision V3 - Recover stack (restart services) Type=oneshot # Important: nécessite root pour systemctl User=root -ExecStart=/bin/bash -lc 'systemctl restart rpa-vision-v3-api.service rpa-vision-v3-dashboard.service rpa-vision-v3-worker.service || true' \ No newline at end of file +ExecStart=/bin/bash -lc 'systemctl restart rpa-streaming.service rpa-vision-v3-api.service rpa-vision-v3-dashboard.service rpa-vision-v3-worker.service || true' diff --git a/deploy/systemd/rpa-vision-v3-worker.service b/deploy/systemd/rpa-vision-v3-worker.service index 403e3358d..b09545c3a 100644 --- a/deploy/systemd/rpa-vision-v3-worker.service +++ b/deploy/systemd/rpa-vision-v3-worker.service @@ -5,12 +5,12 @@ Wants=network-online.target [Service] Type=simple -User=rpa -Group=rpa -WorkingDirectory=/opt/rpa_vision_v3/server -EnvironmentFile=/etc/rpa_vision_v3/rpa_vision_v3.env +User=dom +Group=dom +WorkingDirectory=/home/dom/ai/rpa_vision_v3 +EnvironmentFile=/home/dom/ai/rpa_vision_v3/.env.local Environment="PYTHONUNBUFFERED=1" -ExecStart=/opt/rpa_vision_v3/venv_v3/bin/python worker_daemon.py +ExecStart=/home/dom/ai/rpa_vision_v3/.venv/bin/python3 server/worker_daemon.py Restart=on-failure RestartSec=3 @@ -18,12 +18,10 @@ TimeoutStopSec=60 NoNewPrivileges=true PrivateTmp=true -ProtectSystem=strict -ProtectHome=true -ReadWritePaths=/opt/rpa_vision_v3/data /opt/rpa_vision_v3/logs StandardOutput=journal StandardError=journal +SyslogIdentifier=rpa-vision-v3-worker [Install] -WantedBy=multi-user.target \ No newline at end of file +WantedBy=multi-user.target diff --git a/deploy/systemd/rpa_vision_v3.env.example b/deploy/systemd/rpa_vision_v3.env.example index 9d9a409f9..9fde201ad 100644 --- a/deploy/systemd/rpa_vision_v3.env.example +++ b/deploy/systemd/rpa_vision_v3.env.example @@ -1,4 +1,11 @@ -# /etc/rpa_vision_v3/rpa_vision_v3.env +# /home/dom/ai/rpa_vision_v3/.env.local +# Chargé par tous les services systemd via EnvironmentFile= +# +# IMPORTANT : format systemd EnvironmentFile +# - Pas de "export" devant les variables +# - Pas de guillemets autour des valeurs (sauf si espaces) +# - Commentaires avec # +# - Une variable par ligne : CLE=valeur # --- Secrets (OBLIGATOIRES en prod) --- ENCRYPTION_PASSWORD=CHANGE_ME @@ -7,33 +14,45 @@ SECRET_KEY=CHANGE_ME # --- Runtime --- ENVIRONMENT=production -# --- Fiche #24 - Observabilité --- -# Label Prometheus (surcouche). En prod, les unités systemd posent déjà une valeur par service. -# RPA_SERVICE_NAME=rpa-vision-v3 +# --- Token API fixe (streaming server + agent) --- +# Générer avec : python3 -c "import secrets; print(secrets.token_hex(32))" +# OBLIGATOIRE : si vide en prod, le serveur de streaming refuse de démarrer +# (fail-closed P0-C). Pour désactiver l'auth en dev local : RPA_AUTH_DISABLED=true +RPA_API_TOKEN=CHANGE_ME -# Worker mode: +# --- Auth dashboard Flask (port 5001, Fix P0-A) --- +# HTTP Basic Auth obligatoire sur tous les endpoints sauf healthchecks. +# OBLIGATOIRE en prod. Pour désactiver en dev : DASHBOARD_AUTH_DISABLED=true +DASHBOARD_USER=lea +DASHBOARD_PASSWORD=CHANGE_ME + +# --- Worker mode --- # thread -> worker intégré à l'API # external -> worker dans rpa-vision-v3-worker.service (recommandé prod) # disabled -> API upload only RPA_PROCESSING_WORKER=external -# Ports (healthcheck.sh les utilise) +# --- Ports (healthcheck.sh les utilise) --- RPA_API_HOST=127.0.0.1 RPA_API_PORT=8000 RPA_DASHBOARD_HOST=127.0.0.1 RPA_DASHBOARD_PORT=5001 RPA_CHECK_DASHBOARD=1 -# Worker heartbeat (si worker external) +# --- Worker heartbeat --- RPA_WORKER_HEARTBEAT_PATH=data/runtime/health/worker_heartbeat.json RPA_WORKER_HEARTBEAT_MAX_AGE_S=60 -# Retention / rotation +# --- Retention / rotation --- RPA_DATA_DIR=data RPA_RETENTION_FAILURE_CASES_DAYS=14 RPA_RETENTION_ARCHIVE_FAILURE_CASES=true RPA_RETENTION_WATCHDOG_DAYS=7 RPA_RETENTION_GUARD_REPORTS_DAYS=30 -# Healthcheck - disque -RPA_MIN_FREE_MB=1024 \ No newline at end of file +# --- Healthcheck - disque --- +RPA_MIN_FREE_MB=1024 + +# --- VLM (modèle de vision local) --- +RPA_VLM_MODEL=qwen3-vl:8b +VLM_MODEL=qwen3-vl:8b diff --git a/docs/AUDIT_20260404.md b/docs/AUDIT_20260404.md new file mode 100644 index 000000000..62ee84ead --- /dev/null +++ b/docs/AUDIT_20260404.md @@ -0,0 +1,897 @@ +# Audit Complet — RPA Vision V3 + +**Date** : 4 avril 2026 +**Auditeur** : Claude Sonnet 4.6 + 5 agents d'exploration spécialisés +**Périmètre** : Projet complet (code source, tests, sécurité, déploiement, qualité) +**Environnement** : Ubuntu 24.04, Python 3.12.3, NVIDIA RTX 5070 (12 Go VRAM) + +--- + +## Table des matières + +1. [Synthèse exécutive](#1-synthèse-exécutive) +2. [Métriques clés](#2-métriques-clés) +3. [Architecture](#3-architecture) +4. [Modules core — Analyse détaillée](#4-modules-core--analyse-détaillée) +5. [Composants web](#5-composants-web) +6. [Agent V0/V1 — Streaming](#6-agent-v0v1--streaming) +7. [Tests](#7-tests) +8. [Sécurité](#8-sécurité) +9. [Déploiement & Infrastructure](#9-déploiement--infrastructure) +10. [Qualité du code](#10-qualité-du-code) +11. [Performances](#11-performances) +12. [Gestion des dépendances](#12-gestion-des-dépendances) +13. [Documentation](#13-documentation) +14. [Espace disque](#14-espace-disque) +15. [Points forts](#15-points-forts) +16. [Points faibles & Risques](#16-points-faibles--risques) +17. [Recommandations](#17-recommandations) +18. [Score global](#18-score-global) + +--- + +## 1. Synthèse exécutive + +RPA Vision V3 est un système d'automatisation RPA 100% basé sur la vision (pas d'accessibilité, pas de sélecteurs DOM). Il utilise CLIP, FAISS, Ollama (VLM local), SomEngine (YOLO + docTR) et le template matching pour identifier et interagir avec les éléments d'interface. + +**État** : Phase 0 complète, Phase 1 (streaming agent) en stabilisation. +**Maturité** : Prototype avancé / pré-production. +**Risque principal** : Tokens de production hardcodés dans le code source. + +Le projet est fonctionnel : le replay visuel fonctionne sur Windows, le VWB permet de construire des workflows, le dashboard de monitoring est opérationnel. Cependant, la dette technique s'accumule (fichiers monolithiques, 47 Go de venvs dupliqués, code mort) et des failles de sécurité critiques doivent être corrigées avant toute mise en production. + +--- + +## 2. Métriques clés + +### Volume de code + +| Métrique | Valeur | +|----------|--------| +| Fichiers Python (hors venvs/archives) | 1 094 | +| Lignes de code source | 190 382 | +| Lignes de tests | 63 114 | +| Lignes TypeScript/JavaScript (frontend) | 39 868 (103 fichiers) | +| **Total lignes de code** | **~293 000** | +| Ratio tests/source | 33,2% | +| Commits | 123 | +| Contributeur unique | Dom | +| Période de développement | 7 jan → 4 avril 2026 (88 jours) | + +### Répartition du code source par module + +| Module | Lignes | % du total | +|--------|--------|------------| +| `core/` | 74 555 | 39,2% | +| `visual_workflow_builder/` | 45 830 | 24,1% | +| `agent_v0/` | 23 637 | 12,4% | +| `scripts/` | 16 525 | 8,7% | +| `deploy/` | 7 097 | 3,7% | +| `agent_chat/` | 6 937 | 3,6% | +| `examples/` | 4 510 | 2,4% | +| `server/` | 2 897 | 1,5% | +| `web_dashboard/` | 2 430 | 1,3% | +| Autres (cli, gui, i18n, etc.) | 5 964 | 3,1% | + +### Sous-modules core/ (top 10 par taille) + +| Sous-module | Lignes | Rôle | +|-------------|--------|------| +| `execution/` | 12 503 | Exécution d'actions, DAG, target resolver | +| `visual/` | 5 493 | Screen analyzer, SomEngine, visual matching | +| `analytics/` | 5 230 | Métriques, rapports, statistiques | +| `workflow/` | 4 328 | Gestion workflows, scheduler | +| `detection/` | 4 202 | UI detector, Ollama client, VLM config | +| `models/` | 3 492 | Modèles de données (workflow graph, etc.) | +| `security/` | 3 365 | API tokens, rate limiting, audit trail | +| `embedding/` | 2 914 | CLIP embedder, FAISS manager | +| `system/` | 2 862 | Safety switch, auto-heal, hooks | +| `corrections/` | 2 780 | Corrections BBOX, sniper mode | + +--- + +## 3. Architecture + +### Architecture 5 couches + +``` +RawSession → ScreenState → UIElement → StateEmbedding → WorkflowGraph + (1) (2) (3) (4) (5) +``` + +1. **RawSession** : Capture brute (screenshots + événements souris/clavier) +2. **ScreenState** : État d'écran analysé (éléments détectés, OCR) +3. **UIElement** : Éléments d'interface identifiés (boutons, champs, menus) +4. **StateEmbedding** : Vecteurs CLIP/FAISS pour recherche similaire +5. **WorkflowGraph** : Graphe de workflow exécutable + +### Services (8 services, gérés par `svc.sh`) + +| Port | Service | Type | Framework | +|------|---------|------|-----------| +| 8000 | API Server (upload/processing) | required | FastAPI | +| 5001 | Web Dashboard | required | Flask + SocketIO | +| 5002 | VWB Backend | required | Flask + SQLAlchemy | +| 5003 | Monitoring | optional | Flask | +| 5004 | Agent Chat | optional | Flask + SocketIO | +| 5005 | Streaming Server (Agent V1) | optional | FastAPI | +| 5099 | Worker (polling) | optional | Python script | +| 3002 | VWB Frontend | required | React 19 + Vite | + +### Points d'entrée + +| Fichier | Rôle | +|---------|------| +| `run.sh` | Chef d'orchestre — lance les composants selon les flags | +| `svc.sh` | Gestionnaire de services (systemd + legacy PID) | +| `cli.py` | CLI interactif (660 lignes) | +| `services.conf` | Source de vérité des ports et commandes | + +### Diagramme de flux principal + +``` +[Agent V1 Windows] + ↓ (capture screenshots + events) + ↓ HTTP POST /upload_batch +[Streaming Server :5005] + ↓ stream_processor.py + ↓ (ScreenAnalyzer → CLIP → FAISS → GraphBuilder) +[Core Pipeline] + ↓ build_replay() → resolve_target() + ↓ (SomEngine → VLM grounding → template matching) +[Replay Engine] + ↓ HTTP → Agent V1 + ↓ executor.py +[Agent V1 Windows] + ↓ PyAutoGUI (Bézier mouse + char-by-char typing) +``` + +--- + +## 4. Modules core — Analyse détaillée + +### 4.1 Détection (`core/detection/` — 10 fichiers, 4 202 lignes) + +| Fichier | Lignes | Rôle | +|---------|--------|------| +| `ui_detector.py` | ~800 | Détecteur principal (CLIP + template matching) | +| `ollama_client.py` | ~600 | Client Ollama pour VLM (gemma4:e4b) | +| `vlm_config.py` | ~200 | Configuration VLM (modèle, endpoint) | +| `screen_analyzer.py` | ~500 | Analyse complète d'un screenshot | +| `som_engine.py` | ~315 | Set-of-Mark (YOLO + docTR), singleton thread-safe | +| `owl_detector.py` | ~300 | OWL-ViT v2 pour détection zero-shot | +| `template_matcher.py` | ~400 | Template matching OpenCV | + +**Stratégie de résolution** (cascade) : +1. **Grounding VLM** (Qwen2.5-VL GPU) — pour éléments avec texte OCR +2. **Template matching** (OpenCV) — pour icônes sans texte +3. **SomEngine + VLM** — fallback multi-étapes + +**Imports lourds** : `torch`, `transformers`, `open_clip_torch`, `cv2`, `PIL` + +### 4.2 Exécution (`core/execution/` — 15 fichiers, 12 503 lignes) + +**Fichiers critiques** : + +| Fichier | Lignes | Rôle | +|---------|--------|------| +| `target_resolver.py` | 3 495 | Résolution multi-stratégie de cibles | +| `execution_loop.py` | 1 361 | Boucle principale d'exécution | +| `action_executor.py` | 1 171 | Exécuteur d'actions individuelles | +| `dag_executor.py` | ~800 | Exécution de DAG (workflows parallèles) | +| `llm_actions.py` | ~600 | Actions LLM (analyse, traduction, extraction) | +| `memory_cache.py` | 1 059 | Cache mémoire pour optimisation | + +**⚠️ `target_resolver.py`** est le fichier le plus complexe du core. Il implémente 5+ stratégies de résolution : texte OCR, ancrage visuel, template matching, SomEngine, VLM grounding. À surveiller pour la maintenabilité. + +**⚠️ `dag_executor.py:532`** utilise `eval()` pour évaluer des conditions de workflow : +```python +result = bool(eval(condition, {"__builtins__": {}}, eval_context)) +``` +Le `__builtins__: {}` limite les risques mais ne les élimine pas (contournement possible via `type.__subclasses__`). + +### 4.3 GPU (`core/gpu/` — 6 fichiers, 1 735 lignes) + +| Fichier | Rôle | +|---------|------| +| `gpu_resource_manager.py` | Orchestrateur GPU (modes RECORDING/AUTOPILOT/IDLE) | +| `ollama_manager.py` | Gestion cycle de vie modèles Ollama (async) | +| `clip_manager.py` | Gestion modèle CLIP (lazy load, GPU↔CPU) | + +**Architecture GPU** : +- Mode **RECORDING** : VLM sur GPU, CLIP sur CPU +- Mode **AUTOPILOT** : VLM déchargé, CLIP sur GPU +- Seuil VRAM CLIP : 1 024 Mo +- Timeout inactivité : 300s + +### 4.4 Authentification (`core/auth/` — 5 fichiers, 1 223 lignes) + +| Fichier | Rôle | +|---------|------| +| `credential_vault.py` | Coffre-fort chiffré (Fernet AES + PBKDF2 600k itérations) | +| `totp_generator.py` | TOTP RFC 6238 (30s, 6 digits) | +| `auth_handler.py` | Orchestration authentification multi-facteur | + +**⚠️ Fallback non sécurisé** : si `cryptography` n'est pas installé, le vault utilise un simple encodage base64. + +### 4.5 Fédération (`core/federation/` — 3 fichiers, 1 339 lignes) + +Export/import de LearningPacks anonymisés entre instances. Merge FAISS global. Endpoints REST dédiés. + +### 4.6 Graph Builder (`core/graph/` — 4 fichiers, 1 949 lignes) + +Construit le WorkflowGraph à partir des sessions d'enregistrement. `graph_builder.py` (1 616 lignes) accepte `precomputed_states` pour skip ScreenAnalyzer. + +### 4.7 Autres modules notables + +| Module | Fichiers | Lignes | Rôle | +|--------|----------|--------|------| +| `healing/` | 13 | 2 343 | Auto-correction, learning packs | +| `monitoring/` | 8 | 1 967 | Triggers, chain manager, scheduler | +| `security/` | 10 | 3 365 | API tokens, rate limiting, audit trail | +| `pipeline/` | 4 | 1 695 | Pipeline de traitement principal | +| `training/` | 6 | 1 999 | Entraînement et adaptation | +| `analytics/` | 25 | 5 230 | Reporting, métriques, dashboard data | + +--- + +## 5. Composants web + +### 5.1 Visual Workflow Builder (VWB) + +**Backend** (`visual_workflow_builder/backend/`) : +- Framework : Flask + SQLAlchemy + Flask-SocketIO +- Base de données : `workflows.db` (SQLite) +- Routes principales : `catalog_routes_v2_vlm.py` (2 836 lignes — **monolithique**) +- API v3 : `dag_execute.py` (1 058 lignes), `execute.py` (1 173 lignes) +- VLM Provider : `vlm_provider.py` — interface Ollama pour détection visuelle +- Actions disponibles : 15+ catégories (data, intelligence, navigation, validation, vision_ui) + +**Frontend** : +- Framework : React 19 + TypeScript + MUI 7 + Redux Toolkit +- Flow editor : `@xyflow/react` v12 +- WebSocket : `socket.io-client` +- 103 fichiers TS/TSX (39 868 lignes) +- **⚠️ 2 dossiers frontend** : `frontend/` (1,3 Go avec node_modules) et `frontend_v4/` (79 Mo) + +### 5.2 Web Dashboard (`web_dashboard/`) + +- Framework : Flask + SocketIO +- Fichier unique : `app.py` (2 430 lignes — **monolithique**) +- 65 routes Flask +- Fonctionnalités : monitoring sessions, replay, métriques, proxy streaming +- **⚠️ `cors_allowed_origins="*"`** — pas de restriction CORS + +### 5.3 Agent Chat (`agent_chat/`) + +- Framework : Flask + SocketIO (6 937 lignes, 8 fichiers) +- `app.py` (2 570 lignes — **monolithique**) +- `autonomous_planner.py` — planification autonome de workflows +- Interface conversationnelle pour le pilotage RPA + +--- + +## 6. Agent V0/V1 — Streaming + +### 6.1 Client Agent V1 (`agent_v0/agent_v1/`) + +Déployé sur la machine Windows cible. Léger, sans GPU. + +| Fichier | Rôle | +|---------|------| +| `main.py` | Point d'entrée, configuration | +| `core/executor.py` | Exécution actions (PyAutoGUI, Bézier, char-by-char) | +| `vision/capturer.py` | Capture screenshots (mss) | +| `network/streamer.py` | Streaming vers serveur (HTTP batch upload) | +| `ui/notifications.py` | Notifications utilisateur | +| `window_info_crossplatform.py` | Info fenêtre active (Windows/Linux) | + +### 6.2 Serveur Streaming (`agent_v0/server_v1/`) + +Tourne sur le serveur avec GPU (RTX 5070). + +| Fichier | Lignes | Rôle | +|---------|--------|------| +| `api_stream.py` | **5 612** | API FastAPI (27 endpoints) + replay + résolution + admin | +| `stream_processor.py` | **4 656** | Orchestrateur central (analyse, CLIP, FAISS, graph) | +| `live_session_manager.py` | ~600 | Gestion sessions en mémoire | +| `worker_stream.py` | ~400 | Worker polling + API directe | +| `replay_failure_logger.py` | ~200 | Logger d'échecs replay | +| `vm_controller.py` | ~150 | Contrôle VM (virsh) | + +**⚠️ `api_stream.py` et `stream_processor.py`** totalisent **10 268 lignes** à eux deux. C'est le fichier le plus urgent à découper. + +--- + +## 7. Tests + +### 7.1 Vue d'ensemble + +| Métrique | Valeur | +|----------|--------| +| Tests collectés (hors property) | 1 463 | +| Tests passants | **1 401** | +| Tests échoués | **9** | +| Tests skippés | 43 | +| Tests xfailed | 4 | +| Tests xpassed | 1 | +| Durée totale | 318s (~5min18) | +| **Taux de succès** | **95,8%** (hors skips : 99,4%) | + +### 7.2 Répartition des fichiers de test + +| Catégorie | Fichiers | Rôle | +|-----------|----------|------| +| `unit/` | 70 | Tests unitaires isolés | +| `integration/` | 47 | Tests d'intégration (services, API) | +| `smoke/` | 1 | Smoke test E2E minimal | +| `performance/` | 1 | Benchmarks | +| `property/` | 7 | Tests basés sur propriétés (Hypothesis) — **CASSÉS** | +| Racine `tests/` | 10 | Tests E2E pipeline, correction packs, coaching | +| `utils/` | 1 | Utilitaires de test | + +### 7.3 Tests en échec (9 tests) + +| Test | Raison | +|------|--------| +| `test_diagnostic_actions_manquantes_vwb` (×3) | Actions VWB manquantes dans le catalogue | +| `test_fiche11_multi_anchor_constraints` (×1) | Déterminisme tie-breaking non garanti | +| `test_vwb_actions_09jan2026` (×5) | Mock executor obsolète | + +### 7.4 Tests non collectables (erreurs de collection) + +| Fichier | Erreur | +|---------|--------| +| `tests/property/*.py` (7 fichiers) | Imports cassés (modules supprimés/renommés) | +| `tests/integration/test_visual_rpa_checkpoint.py` | Import `VisualMetadata` inexistant | + +### 7.5 Couverture par module core + +| Module | Couverture | Module | Couverture | +|--------|-----------|--------|-----------| +| `models/` | Excellente (129 imports) | `execution/` | Excellente (50 imports) | +| `workflow/` | Excellente (49 imports) | `capture/` | Bonne (29 imports) | +| `visual/` | Bonne (21 imports) | `detection/` | Bonne (19 imports) | +| `embedding/` | Bonne (18 imports) | `pipeline/` | Bonne (23 imports) | +| `healing/` | Modérée (10 imports) | `analytics/` | Modérée (11 imports) | +| `auth/` | Faible (3 imports) | `security/` | Très faible (1 import) | +| `gpu/` | Très faible (2 imports) | `extraction/` | Très faible (2 imports) | +| **`supervision/`** | **AUCUNE** | **`matching/`** | **AUCUNE** | +| **`variants/`** | **AUCUNE** | | | + +3 modules sur 31 n'ont **aucun test** : `supervision`, `matching`, `variants`. + +### 7.5 Configuration pytest + +```ini +testpaths = tests +addopts = -q --tb=short --strict-markers +markers = unit, integration, performance, slow, smoke, fiche1..fiche10 +filterwarnings = ignore::DeprecationWarning +``` + +**⚠️ Le Makefile pointe vers `venv_v3/bin/pytest`** au lieu de `.venv/bin/pytest` (le venv actif). + +### 7.7 Marqueurs pytest sous-utilisés + +6 marqueurs `fiche` sur 10 sont réellement utilisés (fiche4, fiche6, fiche7, fiche8, fiche9, fiche10). Les marqueurs fiche1, fiche2, fiche3, fiche5 sont déclarés mais jamais appliqués à aucun test. + +--- + +## 8. Sécurité + +### 8.1 Vulnérabilités CRITIQUES + +#### 🔴 Clés API cloud en clair dans `.env.local` + +**Fichier** : `.env.local` (gitignored mais sur disque) + +Le fichier contient en clair : +- `ANTHROPIC_API_KEY=sk-ant-api03-...` (clé Anthropic complète) +- `OPENAI_API_KEY=sk-proj-...` (clé OpenAI complète) +- `GOOGLE_API_KEY=AIzaSy...` (clé Google complète) +- `DEEPSEEK_API_KEY=3d7b...` (clé Deepseek complète) +- `ENCRYPTION_PASSWORD`, `SECRET_KEY`, `RPA_TOKEN_ADMIN`, `AUTOHEAL_ADMIN_TOKEN`, `RPA_API_TOKEN` + +**Impact** : Si le disque est compromis ou si le fichier fuite (backup, copie), toutes les clés cloud sont exposées. Les clés Anthropic/OpenAI ont un coût financier direct. + +**Remédiation** : +- Révoquer et régénérer toutes les clés cloud immédiatement +- Utiliser un gestionnaire de secrets (Vault, systèmes de credentials) +- A minima, permissions `chmod 600` et propriétaire `dom:dom` uniquement + +#### 🔴 Tokens de production hardcodés + +**Fichier** : `core/security/api_tokens.py:93-94` + +```python +# Temporary fix: Add production tokens directly +prod_admin_token = "73cf0db73f9a5064e79afebba96c85338be65cc2060b9c1d42c3ea5dd7d4e490" +prod_readonly_token = "7eea1de415cc69c02381ce09ff63aeebf3e1d9b476d54aa6730ba9de849e3dc6" +``` + +Ces tokens **admin** sont dans le code source, visibles dans git. Ils donnent un accès complet à l'API de streaming (port 5005) exposé sur Internet via `lea.labs.laurinebazin.design`. + +**Impact** : Un attaquant peut prendre le contrôle total de l'agent RPA et exécuter des actions arbitraires sur la machine cible. + +**Remédiation immédiate** : Révoquer ces tokens, les déplacer dans `.env`, régénérer. + +#### 🔴 `eval()` dans le DAG executor + +**Fichier** : `core/execution/dag_executor.py:532` + +```python +result = bool(eval(condition, {"__builtins__": {}}, eval_context)) +``` + +Même avec `__builtins__: {}`, `eval()` est contournable via introspection Python. Si `condition` provient d'une entrée utilisateur (workflow JSON), c'est une injection de code. + +**Remédiation** : Remplacer par un parser AST sécurisé ou une grammaire restreinte. + +#### 🔴 Clé de chiffrement par défaut + +**Fichier** : `core/security/api_tokens.py:80` + +```python +self.secret_key = os.getenv("TOKEN_SECRET_KEY", "dev-token-secret-change-in-production") +``` + +En production sans la variable d'environnement, la clé de signature des tokens est connue. + +### 8.2 Vulnérabilités HAUTES + +#### 🟠 Désérialisation `pickle.load()` non sécurisée + +**Fichiers** : +- `core/embedding/faiss_manager.py:517,534` +- `core/visual/visual_embedding_manager.py` + +```python +with open(metadata_path, 'rb') as f: + pickle.load(f) # Pas de restriction +``` + +`pickle.load()` sans restrictions permet l'exécution de code arbitraire si un fichier `.pkl` est compromis (fichier metadata FAISS). Si un attaquant peut placer un fichier `.pkl` malveillant dans `data/embeddings/`, il obtient une exécution de code. + +**Remédiation** : Migrer vers JSON/msgpack pour les métadonnées, ou valider l'intégrité des fichiers avec HMAC. + +#### 🟠 `shell=True` dans subprocess (11 occurrences) + +**Fichier** : `agent_v0/server_v1/vm_controller.py` (10 occurrences) + +```python +subprocess.run(f"virsh start {self.domain_name}", shell=True, check=True) +``` + +Si `domain_name` est contrôlé par l'utilisateur, c'est une injection de commandes. + +**Autres occurrences** : +- `web_dashboard/app.py:1851` — `lsof -ti :{port} | xargs -r kill` +- `visual_workflow_builder/backend/catalog_routes_v2_vlm.py:2181` — `os.system('echo ...')` + +#### 🟠 `os.system()` avec variables non sanitisées + +- `agent_v0/agent_v1/ui/smart_tray.py:557` — `os.system(f'xdg-open "{sessions_path}"')` + +Si `sessions_path` contient des guillemets ou des caractères shell, injection possible. + +#### 🟠 CORS permissif + +- `web_dashboard/app.py:41` — `cors_allowed_origins="*"` (accepte toutes les origines) +- Le streaming server a une liste blanche configurable (mieux) + +#### 🟠 Logs contenant des tokens partiels + +**Fichier** : `core/security/api_tokens.py:73-76` + +```python +logger.info(f"RPA_TOKEN_ADMIN value: {admin_token[:8]}...") +``` + +Les 8 premiers caractères du token sont loggés. Insuffisant pour une compromission directe mais réduit l'entropie. + +### 8.3 Vulnérabilités MOYENNES + +| Problème | Fichiers | Impact | +|----------|----------|--------| +| `bare except:` (69 occurrences) | Tout le projet | Masque les erreurs, empêche le debugging | +| `except Exception:` (191 occurrences) | Tout le projet | Trop large, capture des erreurs inattendues | +| Fallback base64 dans credential vault | `core/auth/credential_vault.py` | Pas de chiffrement réel sans `cryptography` | +| Bearer token fixe (pas de rotation) | `core/security/api_tokens.py` | Token compromis = accès permanent | +| Logs partiels de tokens (8 premiers chars) | `core/security/api_tokens.py:73-76` | Réduit l'entropie | +| Variables globales VLM non thread-safe | `core/detection/vlm_config.py` | Race condition possible | + +### 8.4 Points positifs sécurité + +- Credential Vault avec Fernet AES + PBKDF2 (600k itérations, conforme OWASP 2023) +- TOTP RFC 6238 pour 2FA +- Rate limiting configurable +- Audit trail (retention 180 jours) +- Floutage des données sensibles dans les replays +- HTTPS via Let's Encrypt en production +- Bearer token obligatoire sur les endpoints exposés + +--- + +## 9. Déploiement & Infrastructure + +### 9.1 Gestion des services + +- **`svc.sh`** : Gestionnaire centralisé (systemd + fallback PID files) +- **`services.conf`** : Source de vérité (8 services, ports, commandes) +- **7 services systemd** dans `deploy/systemd/` (user-level) + +### 9.2 Packaging Windows + +- `deploy/build_package.sh` : Vérifie 26 fichiers requis +- Package "Léa" pour collaborateurs non-techniques +- Auto-stop enregistrement (1h max, notification à 50min) +- DPI awareness (SetProcessDpiAwareness(2)) + +### 9.3 Exposition Internet + +| URL | Service | Auth | +|-----|---------|------| +| `lea.labs.laurinebazin.design` | Streaming :5005 | Bearer token | +| `vwb.labs.laurinebazin.design` | VWB frontend :3002 | HTTP Basic (lea/Medecin2026!) | + +Reverse proxy : NPM (Nginx Proxy Manager) via Docker. + +### 9.4 Duplication dans deploy/ + +Le dossier `deploy/build/Lea/` contient une **copie complète** de l'agent V1 (executor.py, chat_window.py, etc.) qui **diverge** du code source : +- `executor.py` : 1 576 lignes (deploy) vs 1 653 lignes (source) — manque le `NotificationManager` +- `TARGETED_CROP_SIZE` : 400×400 (deploy) vs 80×80 (source) + +--- + +## 10. Qualité du code + +### 10.1 Fichiers monolithiques (> 2 000 lignes) + +| Fichier | Lignes | Responsabilités mélangées | +|---------|--------|---------------------------| +| `api_stream.py` | 5 612 | API + replay + résolution + admin + healthcheck | +| `stream_processor.py` | 4 656 | Orchestration + nettoyage + replay builder + enrichissement | +| `target_resolver.py` | 3 495 | 5+ stratégies de résolution mélangées | +| `catalog_routes_v2_vlm.py` | 2 836 | Routes API + logique VLM + actions | +| `agent_chat/app.py` | 2 570 | Serveur Flask + logique chat + WebSocket | +| `web_dashboard/app.py` | 2 430 | Dashboard + 65 routes + proxy | + +### 10.2 Debug print() en production + +| Zone | Nombre de `print()` | +|------|---------------------| +| `visual_workflow_builder/` | ~1 500 | +| `scripts/` | ~800 | +| `examples/` | ~600 | +| `core/` | ~500 | +| `agent_v0/` | ~400 | +| `deploy/` | ~300 | +| `agent_chat/` | ~150 | +| `cli.py` | 130 | +| **Total** | **~4 350** | + +La majorité provient de scripts de démonstration/diagnostic, mais ~500 sont dans le core et ~400 dans l'agent, utilisés en production. + +### 10.3 TODO / FIXME / HACK + +**50 marqueurs** dans le code actif (hors venvs) : + +| Fichier | Nombre | Exemple | +|---------|--------|---------| +| `stream_processor.py` | 12 | Nettoyage, refactoring, edge cases | +| `auto_heal_manager.py` | 4 | Logique de récupération | +| `cli.py` | 3 | Fonctionnalités manquantes | +| `api_stream.py` | 3 | Optimisations pending | + +### 10.4 Cohérence du code + +#### Bug réel : `_MODIFIER_ONLY_KEYS` divergent + +```python +# core/graph/graph_builder.py — 12 entrées +_MODIFIER_ONLY_KEYS = { + "ctrl", "ctrl_l", "ctrl_r", + "alt", "alt_l", "alt_r", + "shift", "shift_l", "shift_r", + "win", "cmd", "cmd_l", "cmd_r", + "meta", "super", "super_l", "super_r", +} + +# agent_v0/server_v1/stream_processor.py — 20 entrées +_MODIFIER_ONLY_KEYS = { + "ctrl", "ctrl_l", "ctrl_r", "control", "control_l", "control_r", + "alt", "alt_l", "alt_r", "alt_gr", + "shift", "shift_l", "shift_r", + "win", "win_l", "win_r", "cmd", "cmd_l", "cmd_r", + "meta", "meta_l", "meta_r", "super", "super_l", "super_r", +} +``` + +Le `graph_builder.py` ne reconnaît pas `control`, `control_l`, `control_r`, `alt_gr`, `win_l`, `win_r`, `meta_l`, `meta_r` comme des modificateurs. Cela peut causer des actions fantômes dans les workflows construits à partir des sessions enregistrées sur Windows. + +### 10.5 Imports circulaires + +**Aucun import circulaire détecté** entre les sous-modules de `core/`. C'est un point positif qui témoigne d'une bonne architecture en couches. + +### 10.6 Code mort + +- `_a_trier/` : **561 Mo**, 261 fichiers Python orphelins non triés +- `archives/` : 21 Mo de code archivé +- `scripts/` : 39 fichiers (16 525 lignes) de scripts de diagnostic/validation datés de janvier 2026, probablement obsolètes +- `examples/` : 29 fichiers de démonstration, certains avec des imports cassés +- 2 frontends VWB (`frontend/` 1,3 Go et `frontend_v4/` 79 Mo) +- `visual_workflow_builder/backend/app_lightweight.py` (1 451 lignes) et `app_catalogue_simple.py` (1 370 lignes) — alternatives apparemment non utilisées + +--- + +## 11. Performances + +### 11.1 Performances mesurées (31 mars 2026) + +| Méthode | Précision | Vitesse | Usage | +|---------|-----------|---------|-------| +| Template matching 80×80 | dist=0.000 (parfait) | 0,1s | Icônes sans texte | +| Grounding Qwen2.5-VL GPU | dist<0.04 (exact) | 2-5s | Éléments avec texte OCR | +| SomEngine CPU (build_replay) | 80% détection | 1,4s | Enrichissement enregistrement | + +### 11.2 Replay E2E Windows (meilleur résultat) + +- 19/20 actions correctes (Word ouvert, texte tapé, document enregistré) +- 0 retries +- Temps moyen : 2,4s/clic +- Point faible : icônes sans texte OCR sur écrans différents + +### 11.3 Tests (durée d'exécution) + +- 1 457 tests en ~318s (5min18) avec `-m "not slow"` +- 6 tests marqués `@slow` (GPU-dépendants) + +--- + +## 12. Gestion des dépendances + +### 12.1 requirements.txt principal + +176 dépendances pinnées, incluant : + +| Catégorie | Packages clés | +|-----------|--------------| +| ML/IA | `torch==2.9.1`, `transformers==4.57.3`, `open_clip_torch==3.2.0`, `timm==1.0.24` | +| Vision | `opencv-python==4.12.0.88`, `pillow==12.1.0`, `python-doctr==1.0.1` | +| Recherche | `faiss-cpu==1.13.2`, `scikit-learn==1.8.0` | +| Web | `fastapi==0.128.0`, `Flask==3.0.0`, `uvicorn==0.40.0` | +| Automatisation | `PyAutoGUI==0.9.54`, `pynput==1.8.1`, `mss==10.1.0` | +| GUI | `PyQt5==5.15.11` | +| Sécurité | `cryptography==46.0.3` | +| NVIDIA | `nvidia-cublas-cu12`, `nvidia-cudnn-cu12`, etc. (CUDA 12.8) | + +### 12.2 Fichiers requirements multiples + +7 fichiers `requirements*.txt` (hors archives) pour différents sous-projets. Risque de désynchronisation. + +### 12.3 setup.py minimal + +```python +install_requires=["numpy", "pillow", "faiss-cpu", "scikit-learn", "open_clip_torch"] +``` + +Ne reflète pas les dépendances réelles (manque torch, transformers, fastapi, flask, etc.). Le `setup.py` est vestigial. + +### 12.4 Pas de pyproject.toml + +Le projet utilise `setup.py` + `pytest.ini` au lieu du standard moderne `pyproject.toml`. Pas de linter configuré (ruff, black, mypy ne sont pas dans la CI). + +--- + +## 13. Documentation + +### 13.1 Volume + +- **136 fichiers** dans `docs/` (dont ~100 rapports de sessions/corrections de janvier 2026) +- Documentation structurée dans `docs/reference/`, `docs/specs/`, `docs/fiches/`, `docs/guides/` +- `docs/README.md` — index bien organisé + +### 13.2 Documents clés + +| Document | Contenu | +|----------|---------| +| `docs/reference/ARCHITECTURE_VISION_COMPLETE.md` | Architecture 5 couches complète | +| `docs/specs/requirements.md` | 15 requirements, 89 critères d'acceptation | +| `docs/specs/design.md` | Design détaillé, 20 correctness properties | +| `docs/specs/tasks.md` | Plan d'implémentation 13 phases, 60+ tâches | +| `docs/CONFORMITE_AI_ACT.md` | Conformité Règlement IA européen | +| `docs/PLAYBOOK_DSI_RSSI.md` | Playbook pour DSI/RSSI | +| `docs/DOSSIER_COMMISSAIRE_AUX_APPORTS.md` | Dossier d'évaluation financière | + +### 13.3 Points d'attention + +- ~100 fichiers de rapports de sessions datés (janvier 2026) polluent le dossier `docs/` +- Pas de documentation API auto-générée (Swagger/OpenAPI non configuré malgré FastAPI) +- Pas de CONTRIBUTING.md ou CHANGELOG.md formels +- Les commentaires dans le code sont en français (cohérent avec la convention du projet) + +--- + +## 14. Espace disque + +### 14.1 Taille totale : 61 Go + +| Élément | Taille | % | +|---------|--------|---| +| `.venv/` (principal) | 9,0 Go | 14,8% | +| `visual_workflow_builder/backend/venv` | 8,3 Go | 13,6% | +| `venv_v3/` (legacy) | 7,8 Go | 12,8% | +| `venv/` (legacy) | 7,5 Go | 12,3% | +| `visual_workflow_builder/venv` | 7,3 Go | 12,0% | +| `agent_v0/.venv` | 7,1 Go | 11,6% | +| **Total venvs** | **47,0 Go** | **77,0%** | +| `data/` | 3,2 Go | 5,2% | +| `frontend/node_modules` | 1,3 Go | 2,1% | +| `.git/` | 633 Mo | 1,0% | +| `_a_trier/` | 561 Mo | 0,9% | +| `models/` | 511 Mo | 0,8% | +| Code source + docs + reste | ~400 Mo | 0,7% | + +### 14.2 Venvs dupliqués — problème critique + +**6 environnements virtuels** pour un seul projet, totalisant **47 Go**. Chacun contient probablement PyTorch (~2 Go), transformers, etc. en doublon. + +**Venvs actifs** : +- `.venv/` — principal (utilisé par pytest, svc.sh) +- `visual_workflow_builder/backend/venv` — backend VWB + +**Venvs probablement inutiles** : +- `venv/` — ancien, probablement jamais nettoyé +- `venv_v3/` — ancien (référencé dans le Makefile mais plus utilisé) +- `visual_workflow_builder/venv` — probablement remplacé par `backend/venv` +- `agent_v0/.venv` — l'agent V1 est déployé séparément sur Windows + +**Recommandation** : Supprimer les venvs inutilisés pour gagner ~30 Go. + +--- + +## 15. Points forts + +1. **Architecture 5 couches claire** : Séparation nette des responsabilités, 30 sous-modules core sans imports circulaires +2. **100% vision** : Approche unique et cohérente, pas de raccourcis (accessibility API, DOM selectors) +3. **Suite de tests conséquente** : 1 463 tests, 95,8% de succès, couverture des modules critiques +4. **SomEngine bien conçu** : 315 lignes, singleton thread-safe, lazy loading, documentation +5. **Gestion GPU sophistiquée** : Modes RECORDING/AUTOPILOT, arbitrage VRAM automatique +6. **Sécurité crypto solide** : Fernet AES + PBKDF2 600k, TOTP RFC 6238 +7. **Conformité réglementaire** : Rétention 180j, floutage, audit trail, dossier AI Act +8. **Packaging Windows robuste** : Vérification des 26 fichiers, auto-stop, DPI awareness +9. **Anti-détection** : Bézier mouse movement + frappe caractère par caractère +10. **Commits conventionnels** : Préfixes `feat:/fix:/refactor:/chore:` respectés +11. **Infrastructure as Code** : systemd services, svc.sh, services.conf +12. **Cascade de résolution intelligente** : VLM → template matching → SomEngine (fail-safe) + +--- + +## 16. Points faibles & Risques + +### 16.1 Risques critiques (P0) + +| # | Risque | Impact | Fichier | +|---|--------|--------|---------| +| 1 | **Clés API cloud en clair** (Anthropic, OpenAI, Google, Deepseek) | Compromission financière + accès APIs | `.env.local` | +| 2 | Tokens admin hardcodés dans le code | Compromission complète de l'API exposée sur Internet | `core/security/api_tokens.py:93-94` | +| 3 | `eval()` sur conditions workflow | Injection de code arbitraire | `core/execution/dag_executor.py:532` | +| 4 | Clé de signature par défaut | Forge de tokens en production | `core/security/api_tokens.py:80` | + +### 16.2 Risques hauts (P1) + +| # | Risque | Impact | +|---|--------|--------| +| 5 | `pickle.load()` sans restrictions | Exécution de code via fichiers `.pkl` malveillants | +| 6 | 11 `subprocess(shell=True)` avec variables | Injection de commandes | +| 7 | `_MODIFIER_ONLY_KEYS` divergent entre modules | Actions fantômes dans les workflows | +| 8 | Executor dupliqué et divergent (source vs deploy) | Comportement différent en prod | +| 9 | 36+ fichiers modifiés non commités | Perte de travail potentielle | + +### 16.3 Risques moyens (P2) + +| # | Risque | Impact | +|---|--------|--------| +| 8 | Fichiers monolithiques (api_stream.py : 5 612 lignes) | Maintenabilité, risque de régression | +| 9 | 47 Go de venvs (77% de l'espace disque) | Espace disque, confusion | +| 10 | 4 350 print() en production | Pas de logging structuré, debug en prod | +| 11 | 69 bare except:, 191 except Exception: | Erreurs masquées | +| 12 | 7 tests property cassés | Fausse couverture | +| 13 | Makefile pointe vers mauvais venv | DX cassée | +| 14 | `setup.py` ne reflète pas les vraies dépendances | Installation cassée | +| 15 | CORS `*` sur le dashboard | Pas de restriction cross-origin | + +### 16.4 Dette technique (P3) + +| # | Problème | Volume | +|---|----------|--------| +| 16 | `_a_trier/` non trié | 561 Mo, 261 fichiers Python | +| 17 | Scripts de diagnostic datés (jan 2026) | 39 fichiers, 16 525 lignes | +| 18 | 2 frontends VWB | 1,3 Go vs 79 Mo | +| 19 | ~100 rapports de sessions dans docs/ | Pollution documentation | +| 20 | 50 TODO/FIXME dans le code actif | Travail non terminé | +| 21 | Pas de CI/CD (linter, tests automatiques) | Qualité non vérifiée automatiquement | +| 22 | Pas de pyproject.toml | Configuration fragmentée | + +--- + +## 17. Recommandations + +### Immédiat (cette semaine) — Sécurité & Risque de perte + +| # | Action | Effort | Impact | +|---|--------|--------|--------| +| 1 | **Révoquer toutes les clés API cloud** (Anthropic, OpenAI, Google, Deepseek dans `.env.local`) et régénérer | 1h | 🔴 Critique | +| 2 | **Supprimer les tokens hardcodés** de `api_tokens.py`, les charger uniquement depuis `.env` | 30min | 🔴 Critique | +| 3 | **Remplacer `eval()` par `ast.literal_eval`** ou un parser restreint | 2h | 🔴 Critique | +| 4 | **Commiter les 36+ fichiers modifiés** ou les stasher | 15min | 🔴 Perte de travail | +| 5 | **Supprimer la clé par défaut** dans `TOKEN_SECRET_KEY` | 15min | 🔴 Critique | +| 6 | **Corriger `cors_allowed_origins="*"`** dans web_dashboard | 10min | 🟠 Haut | + +### Court terme (1-2 semaines) — Cohérence & Hygiène + +| # | Action | Effort | Impact | +|---|--------|--------|--------| +| 7 | Unifier `_MODIFIER_ONLY_KEYS` dans un module partagé | 1h | 🟠 Bug réel | +| 8 | Corriger le Makefile (`venv_v3` → `.venv`) | 5min | 🟡 DX | +| 9 | Supprimer les 4 venvs inutilisés (~30 Go) | 10min | 🟡 Espace | +| 10 | Remplacer `subprocess(shell=True)` par des listes d'arguments | 2h | 🟠 Injection | +| 11 | Remplacer `pickle.load()` par JSON/msgpack dans faiss_manager | 2h | 🟠 Sécurité | +| 12 | Supprimer la copie divergente dans `deploy/build/Lea/` | 1h | 🟠 Cohérence | +| 13 | Corriger les 9 tests en échec | 4h | 🟡 Qualité | + +### Moyen terme (1-2 mois) — Maintenabilité + +| # | Action | Effort | Impact | +|---|--------|--------|--------| +| 12 | Découper `api_stream.py` (5 612L) en 4+ modules | 2j | 🟡 Maintenabilité | +| 13 | Découper `stream_processor.py` (4 656L) | 2j | 🟡 Maintenabilité | +| 14 | Remplacer les `print()` par `logging` (core + agent) | 1j | 🟡 Observabilité | +| 15 | Nettoyer `_a_trier/` (561 Mo) | 2h | 🟡 Hygiène | +| 16 | Supprimer/archiver les scripts de diagnostic de jan 2026 | 1h | 🟡 Hygiène | +| 17 | Migrer vers `pyproject.toml` | 2h | 🟡 Standards | +| 18 | Configurer CI (ruff + pytest + pre-commit) | 4h | 🟡 Qualité | +| 19 | Activer Swagger/OpenAPI pour FastAPI | 1h | 🟡 Documentation | +| 20 | Réparer ou supprimer les 7 tests property | 4h | 🟡 Couverture | + +### Long terme (3+ mois) — Scalabilité + +| # | Action | Effort | +|---|--------|--------| +| 21 | Containeriser avec Docker (multi-stage builds) | +| 22 | Implémenter la rotation de tokens API | +| 23 | Ajouter des health checks automatisés pour chaque service | +| 24 | Mettre en place un pipeline CI/CD complet (build → test → deploy) | +| 25 | Implémenter le monitoring Prometheus/Grafana | + +--- + +## 18. Score global + +| Axe | Note | Commentaire | +|-----|------|-------------| +| **Fonctionnalité** | 8/10 | Pipeline complet, replay fonctionnel, VWB opérationnel | +| **Architecture** | 7/10 | 5 couches bien séparées, mais fichiers monolithiques | +| **Tests** | 7/10 | 1 463 tests, 95,8% succès, mais property tests cassés | +| **Sécurité** | 2/10 | Clés API cloud en clair + tokens hardcodés + eval() + pickle + shell=True | +| **Cohérence** | 5/10 | Duplication code, venvs multiples, divergences | +| **Dette technique** | 4/10 | 4 350 print(), 561 Mo non trié, fichiers géants | +| **Documentation** | 6/10 | Bonne structure mais polluée par les rapports de session | +| **Déploiement** | 6/10 | systemd + svc.sh fonctionnels, mais pas de CI/CD | +| **Performance** | 8/10 | 2,4s/clic, cascade intelligente, GPU bien géré | +| **DX (Developer Experience)** | 5/10 | Makefile cassé, venvs confus, pas de linter | +| **Global** | **5,7/10** | Solide fonctionnellement, sécurité et housekeeping urgents | + +### Verdict + +RPA Vision V3 est un projet ambitieux et techniquement impressionnant dans sa vision (100% basé sur la vision, pas de sélecteurs). Le pipeline fonctionne, le replay est opérationnel, et l'architecture 5 couches est bien pensée. + +Cependant, **la mise en production est bloquée** par les failles de sécurité critiques (tokens hardcodés, eval(), clé par défaut). Les actions P0 doivent être traitées **avant toute exposition supplémentaire sur Internet**. + +La dette technique (fichiers monolithiques, 47 Go de venvs, 4 350 print()) ne bloque pas le fonctionnement mais ralentira significativement le développement futur. Un sprint de nettoyage de 1-2 semaines apporterait un ROI important. + +--- + +*Généré le 4 avril 2026 par Claude Sonnet 4.6 — Audit multi-agents (5 agents parallèles : architecture, core, tests, web, sécurité)* diff --git a/docs/CHALLENGE_PLANS_16AVRIL.md b/docs/CHALLENGE_PLANS_16AVRIL.md new file mode 100644 index 000000000..13da367c1 --- /dev/null +++ b/docs/CHALLENGE_PLANS_16AVRIL.md @@ -0,0 +1,291 @@ +# Challenge des plans d'action — Dashboard & VWB + +_16 avril 2026 — critique transversale des deux plans du 15 avril, avant exécution._ +_Lecture ciblée : 10 minutes. Aucune modification de code. Ton direct._ + +--- + +## Section 0 — Verdict global + +Les deux plans sont **globalement justes**, bien structurés, honnêtes sur la dette. Mais : +- **Le plan Dashboard** sous-estime le couplage avec l'audit trail backend (risque cascading), et pousse un onglet Audit un peu trop ambitieux pour un POC qui démarre dans 2 semaines. +- **Le plan VWB** a une bonne hiérarchie mais **deux erreurs factuelles** (B5 vise le mauvais frontend, et la "bibliothèque qui s'efface" peut avoir une cause simple non explorée) et rate une priorité réelle : **le backup automatique des workflows n'existe pas**. +- **Aucun des deux plans ne parle à l'autre** — ils pourraient se contredire sur correction_packs et sur l'audit. + +Recommandation : exécuter VWB quick wins en priorité (impact immédiat pour Dom), puis Dashboard cleanup, puis audit MVP. PAS l'onglet Audit "DSI-ready complet" avant le POC Anouste. + +--- + +## Section 1 — Dashboard : ce qui tient, ce qui ne tient pas + +### 1.1. Ce qu'on valide tel quel + +- **Retirer onglet 🧪 Tests (B1)** — correct, la RCE implicite via pytest subprocess est réelle, à éjecter sans regret. +- **Retirer onglet ⚡ Exécution (B4)** — la logique Agent V1 a déprécié l'ancien SocketIO `subscribe_execution`, plus personne ne regarde ça. +- **Retirer pages auxiliaires `/chat`, `/gestures`, `/streaming`, `/extractions`** — doublons morts. Bonne décision. +- **Section E (non-décisions)** — tout est juste : pas de React, pas de SSO, pas de WebSocket Audit. Sagesse YAGNI. + +### 1.2. Ce qu'on ajuste + +**B2 — Retirer onglet 🧠 Apprentissage** +Le plan dit "10 min". Challenge : l'onglet affiche `statCorpusSize` qui est peut-être câblé ailleurs (conftest, training worker, etc.). Avant de retirer, vérifier qu'aucun autre consommateur (jobs, scripts) ne dépend de ces routes. Budget réaliste : **20-30 min** pour grep + vérifier, pas 10. + +**B5 — Retirer onglet 📊 Vue d'ensemble** +"30 min" pour retirer + "fusionner un mini-résumé (4 KPIs) en tête de Services" — la fusion n'est pas gratuite. Si Dom veut garder les 4 KPIs, compter **1 h** (déplacement + CSS + test). Si on retire franc et net sans fusion, alors **15 min**. Trancher maintenant. + +**Estimation onglet Audit MVP (0.75 j)** +C'est réaliste **à condition** que le proxy Flask `/api/audit/*` → 5005 soit vraiment du copy-paste du pattern `/api/streaming/*`. Mais le plan omet : +- Côté streaming server, le token `RPA_API_TOKEN` est requis → le dashboard doit le propager (fait par le pattern `/api/streaming` mais pas mentionné dans le plan Audit). +- Le volume de données est surestimé : "1 800 entrées aujourd'hui" **faux** — 18 entrées aujourd'hui dans `audit_2026-04-15.jsonl`, 430 le jour de test du 13 avril. Le volume réel est faible, la pagination serveur n'est pas critique pour le POC. + +**Rapport PDF DSI (0.5 j)** +Sous-estimé. ReportLab/WeasyPrint sur une page A4 avec tableau + signature d'intégrité, c'est plutôt **1 j**, à cause du templating, de la gestion des polices, du tableau qui déborde, des caractères accentués (French), et surtout du hash chain (voir 1.3). + +**Signature d'intégrité journalière (SHA-256)** +Le plan dit "20 lignes". Réaliste côté code, mais il faut : +- décider quand la clôture journalière a lieu (minuit UTC ? heure locale ?), +- stocker les hashes quelque part (fichier `.sig` ? table `audit_signatures` ?), +- rejouer la vérification facilement (`python -m tools.verify_audit YYYY-MM-DD`). +Compter **0.5 j** honnête, pas 0.25. + +### 1.3. Ce qu'on retire du plan + +**Alerting seuil d'échecs (0.5 j en Sprint 3)** +Pourquoi on le sort : le dashboard est un outil interne déjà bien chargé. Un "badge rouge si >N échecs/h" sans destinataire email configuré = gadget visuel. Si un jour il y a un vrai besoin RSSI, ça passe par n8n (déjà dans le stack) ou Prometheus alerting. **Ne pas le coder ici.** + +**Widgets graphiques (camembert + courbe 7j)** +Pas avant validation MVP par un vrai DSI. Le tableau + filtres + export CSV suffisent pour 90 % des cas d'usage. Les graphiques, c'est du polish, à faire après retour client. + +### 1.4. Ce qu'on ajoute + +**Backup BDD workflows VWB dans l'onglet Sauvegardes** +Aujourd'hui `/api/backup/*` côté dashboard ne touche probablement pas à `visual_workflow_builder/backend/instance/workflows.db`. Or c'est là que vivent les 3 workflows réels de Dom. À vérifier et intégrer au cron backup. **Critique pour le POC.** + +**Lien explicite Dashboard → VWB** +Si on retire les onglets "Workflows" et "Corrections", il faut un bouton "Ouvrir VWB" visible. Le plan le mentionne en passant dans "Services" mais ne le tranche pas. À préciser. + +**Health check streaming server** +L'onglet Streaming affiche les sessions, mais pas le statut du serveur 5005. Si le serveur tombe, Dom voit l'iframe vide sans message clair. Ajouter un check explicite côté dashboard. + +--- + +## Section 2 — VWB : ce qui tient, ce qui ne tient pas + +### 2.1. Ce qu'on valide tel quel + +- **B2 (Unnamed Workflow)** — 20 min, impact immédiat, bon. +- **B3 (supprimer vwb_v3.db fantôme)** — 15 min, risque réel identifié. Oui. +- **B4 (double logging)** — confirmé dans les logs (chaque ligne présente 2×), 15 min, fait. +- **B6 (nettoyer fichiers parasites)** — hygiène, 10 min. +- **B7 (run.sh clarification)** — 20 min, évite que Dom et nous lancions le mauvais frontend. +- **Sections D et E (non-décisions)** — toutes justifiées. + +### 2.2. Ce qu'on ajuste + +**B1 — Migrer sessionStorage → localStorage** +Challenge fort : le plan dit "30 min → résout le bug principal". Je ne suis pas convaincu que `sessionStorage` soit la **seule** cause du bug "la bibliothèque s'efface tout le temps". Hypothèses alternatives à tester **avant** de coder : +1. L'utilisateur ouvre un nouvel onglet (vrai effacement sessionStorage, OK). +2. Un StrictMode React qui double-mount et écrase le state. +3. Un `setCaptureLibrary([])` appelé par erreur dans un `useEffect` sans dépendance. +4. Une exception silencieuse qui reset l'état (QuotaExceededError de sessionStorage si > 5 Mo de base64 PNG). + +**Le plan saute direct à la solution sans diagnostic.** Avant de migrer, **reproduire le bug 2 minutes avec la console ouverte** pour voir *quand* il se déclenche. Si c'est un quota, localStorage ne sauvera rien (même limite). **Ne pas coder avant de comprendre.** + +Sous réserve que ce soit bien sessionStorage, la migration localStorage est bonne, mais : +- clé `captureLibrary_v3` : bien de ne PAS migrer les deux anciennes clés automatiquement (laisser Dom perdre l'historique mauvais, repartir propre). +- cap 200 captures : OK mais thumbnails JPEG 200×150 q=0.7 au lieu de PNG base64 **impératif** sinon on fait sauter le quota en 15 captures. + +Budget réaliste : **1 h** (diagnostic 15 min + migration 30 min + compression thumbnail 15 min). + +**B5 — Supprimer 404 /api/correction-packs/stats** +**Erreur factuelle dans le plan** : B5 dit que l'appel vient de `frontend/src/hooks/useCorrectionPacks.ts` (legacy). Confirmé par grep. Mais le plan n'explique pas **pourquoi on voit ces 404 aujourd'hui alors que seul frontend_v4 tourne**. Deux possibilités : +1. Un onglet legacy resté ouvert dans le navigateur — triviale. +2. Un proxy dashboard appelle la route — à vérifier. + +Si c'est (1), fermer l'onglet suffit, pas besoin de stubber. Si c'est (2), stubber. Mais **avant de coder, regarder qui appelle**. Budget : **10 min d'enquête + 10 min de fix éventuel**. + +**C1 — Finaliser flux Import Léa → review → replay (1 j)** +Sous-estimé. Le plan liste 4 actions, dont "Bouton 'Valider et exécuter' qui passe `review_status='approved'` puis lance le replay via `/execute`". Mais : +- Le `/execute` VWB utilise l'IRBuilder local, pas le replay server Agent V1 (port 5005). Divergence d'exécution. +- Le flux "replay" réussi du 13 avril passe par Agent V1, pas par VWB. Le bouton "Valider et exécuter" dans VWB va donc **exécuter avec un autre moteur** que celui qui a produit le workflow. +- Question non résolue : si Dom valide un workflow importé et que l'exécution VWB échoue, alors qu'Agent V1 l'avait réussi, c'est quoi la vérité ? + +Budget réaliste : **2 j**, avec obligation de clarifier "qui exécute quoi" avant de coder le bouton. + +**C5 — Lier step ↔ screenshot source (2 j)** +C'est la vraie valeur. Le plan dit que les workflows Léa "contiennent déjà des `screenshot_hash` dans leurs nodes (à vérifier dans notepad_enriched.json)". Le "à vérifier" est critique. Si ce n'est pas le cas, il faut **d'abord modifier le format d'export Léa** avant de toucher VWB, ce qui triple la durée. **Prérequis à lever avant de s'engager sur cet item.** + +### 2.3. Ce qu'on retire du plan + +**C4 — Consolider les 3 app*.py (1 j)** +Pas avant le POC. Zero impact utilisateur, risque de régression sur le seul endpoint VLM de `app_lightweight.py`. On garde en backlog "quand bande passante". Le plan le met en semaine 3+, correct, mais le listing en quick win serait une tentation. + +**C2 — Persister bibliothèque serveur (1.5 j)** +Si B1 fait vraiment son job avec localStorage + compression thumbnails, le serveur n'est pas nécessaire pour le POC. **Ne démarrer C2 que si B1 échoue en usage réel.** Le plan le dit ("si B1 montre ses limites"), mais ne le chiffre pas comme optionnel dans la roadmap — le sortir explicitement. + +### 2.4. Ce qu'on ajoute + +**Backup quotidien de `workflows.db`** +Le plan le liste dans "Risques" mais ne le met pas comme action. C'est la seule BDD qui contient le travail manuel de Dom. **1 ligne dans `backup_ssd.sh`** (ou cron local). Critique avant POC. **15 min.** + +**Versionnement simple des workflows** +Aucun des 2 plans n'en parle. Scénario : Dom modifie un workflow importé, casse quelque chose, veut revenir en arrière. SQLAlchemy n'a pas de versioning natif. Proposition minimale : à chaque `PUT /api/v3/workflow/`, dumper le JSON avant modification dans `data/vwb/workflow_history//.json`. **30 min**, zero dépendance, ROI fort. + +**Nom clair du projet dans la liste VWB** +Si Dom importe 28 workflows du poste DESKTOP-58D5CAC, il va se noyer. Ajouter un filtre par machine + status (pending_review / approved / rejected) dans `WorkflowList.tsx`. **45 min**, grande valeur UX. + +--- + +## Section 3 — Vision système transverse + +### 3.1. Dépendances oubliées entre les deux plans + +**Audit trail parle à VWB ?** +Le plan Dashboard mentionne `workflow_id` et `workflow_name` dans les colonnes Audit. Or : +- Côté Agent V1, le `workflow_id` est celui du JSON disque. +- Côté VWB, les workflows ont un `id` SQLAlchemy distinct. +- Quand un workflow est importé dans VWB (source='learned_import'), le mapping entre les deux IDs n'est pas explicite. + +Conséquence : un DSI qui filtre "workflow = X" dans l'Audit risque de ne pas retrouver le workflow correspondant dans VWB. **À clarifier** avant le sprint Audit MVP. + +**Correction packs : 2 plans, 2 décisions contradictoires** +- Plan Dashboard : "supprimer onglet Corrections, les packs sont gérés dans VWB." +- Plan VWB section E3 : "Ne PAS porter CorrectionPacksDashboard sur le v4 — fermer proprement correction_packs." + +Les deux disent "on ne fait plus de correction packs ici", mais personne ne dit **où ils vivent maintenant**. Si la réponse est "plus nulle part", il faut archiver proprement les données historiques (packs déjà produits) et le déclarer explicitement. + +**Frontend legacy partagé ?** +Le 404 `/api/correction-packs/stats` vient du frontend legacy VWB. Mais il ne serait pas impossible qu'un iframe du dashboard (onglet Corrections) l'ait aussi chargé. Si on retire l'onglet Dashboard **avant** de retirer le frontend legacy VWB, on ne supprime qu'une moitié du problème. + +### 3.2. Ordre d'attaque recommandé + +**VWB quick wins AVANT Dashboard cleanup.** Raisons : +1. Dom utilise VWB quotidiennement, le bug captures le bloque tout de suite. +2. VWB a des erreurs factuelles à résoudre en amont (diagnostic B1, source des 404). +3. Un Dashboard cleanup, ça se fait en 1 push, le VWB nécessite diagnostic → étaler. + +### 3.3. Points d'intégration critiques + +- **Token RPA_API_TOKEN** — doit être propagé Dashboard → streaming 5005 (audit) et VWB → streaming 5005 (replay). Fragile si Dom modifie `.env`. **Ajouter un check au démarrage.** +- **Base `workflows.db`** — partagée entre backend VWB et (potentiellement) Agent V1. Vérifier qu'aucune écriture concurrente n'existe (locks SQLite). +- **Volumes `data/audit/` et `data/training/sessions/`** — doivent être dans le backup quotidien. À vérifier dans `backup_ssd.sh`. + +--- + +## Section 4 — Ce qui n'est pas dans les plans mais devrait y être + +Par ordre de priorité pour le POC Anouste : + +1. **Backup quotidien de `workflows.db` et `data/audit/`** + Aujourd'hui un seul backup du 23/01 dans `backend/instance/backups/`. Si un disque meurt, Dom perd ses 3 workflows de démo + 10 jours d'audit. **Bloquant POC.** 15 min. + +2. **Versionnement basique des workflows VWB** + Snapshot à chaque PUT. 30 min. Zero dépendance. Fort ROI dès le 2e client. + +3. **Mode dégradé "streaming server indisponible"** + Aujourd'hui si port 5005 tombe, VWB et Dashboard affichent des erreurs cryptiques. Ajouter un badge "Streaming KO — Léa en pause" partout. 1 h. + +4. **Isolation multi-client** + Le jour où Anouste + un second client tournent sur la même instance, il n'y a aucune séparation (BDD, audit, sessions). Avant le POC DGX, décider : 1 instance par client ou tag `client_id` partout ? À trancher avec Dom **avant** de coder l'onglet Audit (sinon on refait le schéma). + +5. **Observabilité unifiée** + Prometheus existe côté dashboard (`/metrics`), mais pas côté VWB ni streaming server. Pour un hôpital, "pourquoi c'est lent aujourd'hui" = question fréquente. Ajouter 3 métriques clés (replay_duration_ms, vlm_call_ms, faiss_search_ms) exposées en Prometheus sur les 3 services. 2 h. + +6. **Documentation d'installation POC** + Ni DEV_SETUP.md ni README n'expliquent comment déployer l'ensemble chez un client. `run.sh --full` suppose l'environnement Dom. Pour Anouste il faut une procédure, sinon c'est Dom qui installe à la main. 2 h. + +7. **Anonymisation des logs pour export** + Si un DSI exporte le CSV Audit, il récupère `user_name = "Marie Dupont"`. Fine pour un audit interne, problématique pour une démo publique. Prévoir un flag `--anonymize` sur l'export. 30 min. + +8. **Concurrence dashboard** + Aucune protection : 2 onglets ouverts = 2 actions possibles en parallèle. Pour le POC mono-utilisateur ça passe, à tracer pour multi-TIM. + +--- + +## Section 5 — Roadmap recommandée révisée (4 jours) + +**Contexte** : POC Anouste dans ~2 semaines. DGX pas encore arrivé. Fenêtre technique ouverte mais finie. + +### Jour 1 (4 h) — Sécuriser le quotidien de Dom + +- VWB B3 (vwb_v3.db fantôme) : 15 min +- VWB B4 (double logging) : 15 min +- VWB B6 (fichiers parasites) : 10 min +- VWB B7 (run.sh) : 20 min +- **NOUVEAU** — backup quotidien `workflows.db` + `data/audit/` : 15 min +- VWB B2 (Unnamed Workflow) : 20 min +- **Diagnostic B1** (bibliothèque captures, pas de code) : 30 min +- VWB B1 (localStorage + thumbnails JPEG) : 1 h +- Reste : commit + test manuel + pause café. + +**Sortie** : Dom ne perd plus ses captures, ses workflows sont sauvegardés, les logs sont lisibles. + +### Jour 2 (4-6 h) — Dashboard cleanup + audit MVP backend + +- Dashboard B1→B6 (retirer 5 onglets + pages mortes) : 2 h +- **NOUVEAU** — vérifier proxy `workflow_id` VWB ↔ Audit : 30 min +- Dashboard — onglet Audit MVP (proxy + tableau + filtres + export CSV) : 3 h +- **NON** : pas de PDF, pas de patient_ref_hash, pas d'alerting, pas de graphiques. + +**Sortie** : dashboard à 9 onglets propres, onglet Audit fonctionnel pour démo POC. + +### Jour 3 (4-6 h) — Flux Léa → VWB → replay (C1) + +- Diagnostic source des 404 correction-packs/stats : 15 min, fix si nécessaire +- **NOUVEAU** — versionnage workflows VWB (snapshot avant PUT) : 30 min +- **NOUVEAU** — filtre machine + status dans WorkflowList : 45 min +- C1 étape 1 : vérifier `pendingReviewCount` + banner : 1 h +- C1 étape 2 : warnings visuels sur steps importés : 1 h +- C1 étape 3 : bouton "Valider et exécuter" **avec clarification** qui exécute (Agent V1 ou VWB) : 2 h + +**Sortie** : Dom peut importer un workflow Léa, voir les étapes floues, corriger, relancer. + +### Jour 4 (4 h) — Hardening POC Anouste + +- **NOUVEAU** — mode dégradé streaming KO (3 services) : 1 h +- **NOUVEAU** — 3 métriques Prometheus sur VWB + streaming : 2 h +- **NOUVEAU** — doc installation POC (README_DEPLOY_POC.md) : 1 h + +**Sortie** : POC déployable chez Anouste, observable, résilient aux pannes. + +### Ce qu'on garde en backlog (pas avant POC) + +- VWB C3 (retirer frontend legacy), C4 (consolider app*.py), C5 (screenshot source par step), C2 (captures serveur) +- Dashboard Sprint 3 complet (PDF DSI, patient_ref_hash, signature intégrité, widgets, alerting) +- Dashboard Sprint 4 (améliorations Services, Sessions, Logs, Config) + +--- + +## Section 6 — Risques à surveiller pendant l'exécution + +| # | Risque | Probabilité | Impact | Mitigation | +|---|---|---|---|---| +| R1 | B1 localStorage ne résout pas le vrai bug (cause racine différente) | Moyenne | Moyen | Diagnostic avant code. 15 min budgétées. | +| R2 | Suppression d'un onglet Dashboard casse un script externe qui appelait la route | Faible | Moyen | Grep workspace complet avant suppression. `n8n`, `agent_chat`, `core` peuvent consommer. | +| R3 | Proxy dashboard→streaming 5005 échoue sur token RPA_API_TOKEN | Moyenne | Moyen | Reproduire le pattern `/api/streaming/*` à la lettre. Tester avec `curl` direct avant UI. | +| R4 | Workflow importé non rejouable (format Léa incompatible bridge) | Moyenne | Fort | Tester C1 sur le workflow `notepad_enriched.json` en premier. Si KO, pivoter sur C5 avant C1. | +| R5 | `workflow_id` Audit ≠ `id` VWB → filtre DSI casse | Forte | Faible (hors POC) | Documenter dans l'export CSV : "workflow_id = source disque, voir VWB pour UI". Fix propre post-POC. | +| R6 | Backup `workflows.db` oublié, crash disque avant POC | Faible | Critique | Backup manuel aujourd'hui, automatisation demain. | +| R7 | Cleanup Dashboard supprime une route consommée par Agent V1 | Faible | Fort | Routes retirées : `/api/automation/*`, `/api/tests/*`, `/api/gestures`, `/api/chat/*`. Grep avant. | +| R8 | Onglet Audit "demi-fonctionnel" montré à Anouste produit plus de méfiance que rien | Moyenne | Fort | MVP uniquement (tableau + filtres + CSV). Pas de widgets creux. | +| R9 | Régression frontend v4 après suppression legacy (C3 reporté, donc risque faible immédiat) | Faible | Moyen | C3 **pas en roadmap 4 jours**. Post-POC. | +| R10 | Exécution VWB diverge de replay Agent V1 → incohérence démo | Forte | Fort | Clarifier quel moteur exécute en bouton "Valider et exécuter". Préférer Agent V1 via appel 5005. | +| R11 | AI Act / RGPD — absence de patient_ref_hash repérée par DSI Anouste | Faible (POC early) | Moyen | Documenter la limitation dans DOSSIER_COMMISSAIRE_AUX_APPORTS. Planifier Sprint 3 post-POC. | +| R12 | 2 personnes éditent workflows.db simultanément (Dom + un TIM pendant démo) | Faible (POC mono) | Fort | SQLite verrou exclusif = erreur propre. Documenter "VWB mono-utilisateur pour l'instant". | + +--- + +## Résumé exécutif pour Dom + +1. **Commence par VWB B3+B4+B6+B7+backup (1 h 30)** — hygiène, zéro risque, gains immédiats. +2. **Puis diagnostic B1 AVANT de coder** — 15 min pour éviter de coder une fausse solution. +3. **Dashboard cleanup + Audit MVP (1 journée)** — retire les onglets morts, ajoute l'onglet Audit minimal. Pas de PDF ni d'alerting avant retour client. +4. **Flux C1 (1 journée)** — la vraie valeur visible de ton idée "importer Léa, corriger". +5. **Hardening POC (demi-journée)** — backups, métriques, doc deploy. Sinon le POC Anouste sera douloureux. +6. **Tout le reste (C2, C3, C4, C5, Dashboard Sprint 3-4) : après POC.** + +Les deux plans sont solides. Ils manquent juste de **connexions entre eux** et sous-estiment **le hardening POC**. Ce document les relie et priorise pour la fenêtre de 2 semaines avant Anouste. + +--- + +_Fin du challenge — 16 avril 2026._ diff --git a/docs/DOSSIER_COMMISSAIRE_AUX_APPORTS.md b/docs/DOSSIER_COMMISSAIRE_AUX_APPORTS.md new file mode 100644 index 000000000..055080ba8 --- /dev/null +++ b/docs/DOSSIER_COMMISSAIRE_AUX_APPORTS.md @@ -0,0 +1,658 @@ +# Dossier de Présentation Technique — Apport en Nature + +## Logiciel RPA Vision V3 + +**Document destiné au Commissaire aux Apports** + +--- + +| | | +|---|---| +| **Projet** | RPA Vision V3 — Plateforme d'automatisation intelligente par vision | +| **Auteur principal** | Dom — Architecte / Expert principal | +| **Profil** | 32 ans d'expérience en informatique de pointe (sécurité, IA, infrastructure, robotique, direction de projet, industrialisation) | +| **Historique du projet** | Premier jet il y a ~5 ans (V1). Version actuelle (V3) développée sur ~12 mois (préparation + développement actif) | +| **Date du présent document** | 25 février 2026 | +| **Nature de l'apport** | Logiciel, code source, propriété intellectuelle associée | + +--- + +## Table des matières + +1. [Résumé exécutif](#1-résumé-exécutif) +2. [Description fonctionnelle](#2-description-fonctionnelle) +3. [Architecture technique](#3-architecture-technique) +4. [Stack technologique](#4-stack-technologique) +5. [Métriques de développement](#5-métriques-de-développement) +6. [Fonctionnalités clés et innovations](#6-fonctionnalités-clés-et-innovations) +7. [État d'avancement](#7-état-davancement) +8. [Positionnement concurrentiel](#8-positionnement-concurrentiel) +9. [Marché adressable](#9-marché-adressable) +10. [Inventaire des dépendances open-source et licences](#10-inventaire-des-dépendances-open-source-et-licences) +11. [Éléments de valorisation](#11-éléments-de-valorisation) + +--- + +## 1. Résumé exécutif + +**RPA Vision V3** est une plateforme d'automatisation robotisée des processus (RPA) de nouvelle génération. Contrairement aux solutions existantes (UiPath, Automation Anywhere, Blue Prism) qui reposent sur des sélecteurs HTML/UI fragiles, RPA Vision V3 utilise la **vision par ordinateur et l'intelligence artificielle multimodale** pour comprendre sémantiquement les interfaces utilisateur. + +Cette approche résout un problème fondamental du marché RPA : **40 % des robots échouent** lorsque les interfaces changent, et **30 % du marché entreprise** (environnements Citrix/VDI, mainframes, systèmes air-gapped) reste inaccessible aux solutions conventionnelles. + +Le logiciel est le fruit d'un travail intensif de conception, développement et intégration mené par l'auteur principal, combinant expertise en intelligence artificielle, vision par ordinateur et ingénierie logicielle. + +--- + +## 2. Description fonctionnelle + +### Problème résolu + +Les solutions RPA traditionnelles présentent trois faiblesses majeures : + +- **Fragilité** — Les sélecteurs CSS/XPath cassent dès qu'une interface est mise à jour, entraînant 60 à 70 % des budgets RPA en maintenance +- **Inaccessibilité** — Les environnements Citrix/VDI, mainframes legacy et systèmes air-gapped (défense, santé) restent hors de portée +- **Rigidité** — Aucune capacité d'adaptation autonome aux changements d'interface + +### Solution apportée + +RPA Vision V3 automatise les processus métier en : + +- **Voyant l'écran** comme un humain (aucun sélecteur, aucune coordonnée fixe) +- **Comprenant sémantiquement** les éléments d'interface (bouton, champ de texte, menu, etc.) +- **S'auto-réparant** lorsqu'une interface change (4 stratégies de récupération) +- **Apprenant continuellement** des exécutions passées pour améliorer sa fiabilité +- **Fonctionnant en local** (aucune donnée envoyée dans le cloud — conformité RGPD/défense) + +### Composants fonctionnels + +| Composant | Rôle | +|-----------|------| +| **Visual Workflow Builder (VWB)** | Interface web de conception visuelle de workflows (drag & drop) | +| **Moteur d'exécution** | Exécute les workflows avec gestion d'erreurs et auto-réparation | +| **Agent de capture** | Capture cross-plateforme des événements et screenshots | +| **Moteur de détection UI** | Détection hybride des éléments d'interface (IA + vision classique) | +| **Système d'embeddings** | Empreintes multimodales des états d'écran (FAISS, CLIP) | +| **Système d'apprentissage** | Apprentissage progressif et détection de dérive | +| **Dashboard de monitoring** | Tableau de bord temps réel des exécutions et analytics | +| **Catalogue d'actions** | 24+ actions prêtes à l'emploi (clic, saisie, navigation, OCR, IA, etc.) | + +--- + +## 3. Architecture technique + +### Architecture en 5 couches + +``` +Couche 0 : RawSession — Capture brute (événements + screenshots) + ↓ +Couche 1 : ScreenState — Analyse multi-modale (4 niveaux d'abstraction) + ↓ +Couche 2 : UIElement Detection — Détection sémantique des éléments UI + ↓ +Couche 3 : State Embedding — Fusion multimodale (empreinte digitale d'écran) + ↓ +Couche 4 : Workflow Graph — Graphe de nœuds + apprentissage +``` + +### Structure du projet + +``` +rpa_vision_v3/ +├── core/ # Moteur IA (192 fichiers Python) +│ ├── analytics/ # Collecte et reporting d'analytics +│ ├── capture/ # Capture d'écran et d'événements +│ ├── detection/ # Détection UI hybride (OWL-v2 + OpenCV + VLM) +│ ├── embedding/ # Embeddings CLIP, FAISS, fusion multimodale +│ ├── execution/ # Exécution des actions et robustesse +│ ├── healing/ # Auto-réparation (4 stratégies) +│ ├── learning/ # Apprentissage continu +│ ├── matching/ # Matching hiérarchique +│ ├── monitoring/ # Métriques et ordonnancement +│ ├── security/ # Audit, tokens, validation +│ ├── system/ # Circuit breaker, auto-heal manager +│ └── training/ # Entraînement offline +│ +├── visual_workflow_builder/ # Application web full-stack +│ ├── frontend_v4/ # React 18 + TypeScript + Vite +│ └── backend/ # Flask + SocketIO + SQLAlchemy +│ ├── actions/ # Catalogue de 24+ actions +│ ├── api/ # Endpoints REST et WebSocket +│ ├── contracts/ # Contrats d'interface +│ └── services/ # Services métier (OCR, détection, etc.) +│ +├── agent_v0/ # Agent de capture cross-plateforme +├── server/ # API de traitement (FastAPI) +├── web_dashboard/ # Dashboard de monitoring +├── gui/ # Interface desktop (PyQt5) +├── models/ # Modèles IA pré-entraînés +└── tests/ # Suite de tests +``` + +--- + +## 4. Stack technologique + +### Intelligence artificielle et Machine Learning + +| Technologie | Rôle | Licence | +|-------------|------|---------| +| PyTorch 2.x | Framework de deep learning | BSD-3-Clause | +| OpenCLIP (ViT-B-32) | Embeddings vision-langage (512 dimensions) | MIT | +| FAISS | Recherche vectorielle (1M+ embeddings, <100ms) | MIT / BSD-3-Clause | +| Qwen3-VL 8B (via Ollama) | Modèle de vision-langage local | Apache-2.0 | +| OWL-v2 | Détection d'objets zero-shot | Apache-2.0 | +| HuggingFace Transformers | Pipeline de modèles IA | Apache-2.0 | +| docTR (Mindee) | OCR (reconnaissance de caractères) | Apache-2.0 | + +### Vision par ordinateur + +| Technologie | Rôle | Licence | +|-------------|------|---------| +| OpenCV 4.x | Traitement d'image | Apache-2.0 | +| Pillow | Manipulation d'images | MIT-CMU | +| MSS | Capture d'écran rapide | MIT | + +### Backend + +| Technologie | Rôle | Licence | +|-------------|------|---------| +| Python 3.12 | Langage principal | PSF | +| Flask 3.0 | Framework web (VWB) | BSD | +| FastAPI | API de traitement (serveur) | MIT | +| Flask-SocketIO | Communication temps réel | MIT | +| SQLAlchemy 2.0 | ORM base de données | MIT | +| Redis | Cache et files d'attente | MIT | +| Pydantic | Validation de données | MIT | + +### Frontend + +| Technologie | Rôle | Licence | +|-------------|------|---------| +| React 18 | Framework UI | MIT | +| TypeScript 5.x | Typage statique | Apache-2.0 | +| Vite 5 | Build tool | MIT | +| @xyflow/react 12 | Graphes visuels de workflows | MIT | + +### Sécurité et infrastructure + +| Technologie | Rôle | Licence | +|-------------|------|---------| +| AES-256-GCM | Chiffrement des sessions | (standard cryptographique) | +| Authentification par tokens | Contrôle d'accès | Développement interne | +| Audit JSONL | Journalisation sécurisée | Développement interne | + +--- + +## 5. Métriques de développement + +### Volume de code source (hors dépendances, hors tests) + +| Composant | Fichiers | Lignes de code | Langage | +|-----------|----------|----------------|---------| +| Core (moteur IA) | 192 | ~63 800 | Python | +| VWB Backend | 115 | ~42 100 | Python | +| VWB Frontend | 24 | ~6 260 | TypeScript/React | +| Server API | 8 | ~2 900 | Python | +| Agent V0 | 25 | ~7 700 | Python | +| Tests | 177 | ~66 900 | Python | +| **Total** | **~541** | **~189 660** | | + +### Historique de développement + +Le logiciel RPA Vision V3 est le résultat de **trois itérations majeures** sur une période de 5 ans : + +| Version | Période | Rôle | +|---------|---------|------| +| **V1** (premier jet) | ~2021 | Preuve de concept — exploration de l'approche vision pour le RPA | +| **V2** (évolution) | 2022-2024 | Prototypage avancé — validation des choix architecturaux | +| **V3** (version actuelle) | mars 2025 — février 2026 | Développement complet — architecture 5 couches, production-ready | + +**Dépôt git V3** (code source livré) : + +| Métrique | Valeur | +|----------|--------| +| Nombre de commits | 52 | +| Premier commit V3 | 7 janvier 2026 | +| Dernier commit | 18 février 2026 | +| Contributeur principal | Dom | +| Insertions totales (git) | ~479 000 lignes | + +> **Note** : Le dépôt git ne reflète que la phase finale de codage de la V3. Le travail de conception, de R&D et les itérations V1/V2 qui ont fondé l'architecture ne figurent pas dans l'historique de commits mais constituent une part essentielle de la valeur intellectuelle du projet. + +### Effort réel de développement + +| Phase | Durée | Intensité | Heures estimées | +|-------|-------|-----------|-----------------| +| R&D initiale / V1 et V2 (~5 ans) | ~3 ans cumulés | Variable | Non quantifié — valeur de savoir-faire accumulé | +| Travail préparatoire V3 (conception, veille, architecture) | ~4 mois | ~6 h/jour | ~530 h | +| Développement actif V3 | ~8 mois | ~10-12 h/jour | ~1 760 à 2 100 h | +| **Total effort V3** | **~12 mois** | | **~2 300 à 2 600 h** | + +### Profil de l'auteur + +- **58 ans**, 32 ans d'expérience en informatique de pointe +- Spécialisations : sécurité, intelligence artificielle (tous niveaux), infrastructure, robotique +- Capacité démontrée à créer des systèmes from scratch, du POC au MVP puis à l'industrialisation +- Direction d'entreprise, direction de projet, développement +- Créateur d'un framework de gestion de projets faisant appel aux nouvelles technologies +- Profil équivalent marché : **Architecte / Expert principal IA** — TJM de référence : 1 200 €/jour + +--- + +## 6. Fonctionnalités clés et innovations + +### 6.1 Fusion multimodale d'états d'écran + +Chaque état d'écran est résumé en une empreinte vectorielle combinant 4 modalités : +- 50 % Image (screenshot complet via CLIP) +- 30 % Texte (texte détecté) +- 10 % Titre (fenêtre active) +- 10 % UI (éléments détectés) + +**Performance** : 0,02 ms par embedding (contrainte : <100 ms) — **500x** plus rapide que le standard. + +### 6.2 Auto-réparation en 4 stratégies + +Lorsqu'un élément d'interface n'est plus trouvé, le système applique en cascade : + +1. **Variantes sémantiques** — Essai de variations visuelles/textuelles +2. **Fallback spatial** — Recherche dans le voisinage +3. **Adaptation temporelle** — Ajustement des temps d'attente +4. **Transformation de format** — Transformation des données d'entrée + +Taux de récupération : >95 % des erreurs transitoires, en <30 secondes. + +### 6.3 Apprentissage progressif + +``` +OBSERVATION (5+ exécutions) + ↓ +COACHING (10+ assistances, >90 % de succès) + ↓ +AUTO_CANDIDATE (20+ exécutions, >95 % de succès) + ↓ +AUTO_CONFIRMED (validation utilisateur) +``` + +Le système détecte automatiquement les dérives d'interface et crée des variantes. + +### 6.4 Détection UI hybride + +Combine trois approches complémentaires : +- **OWL-v2** : Détection zero-shot (aucun entraînement nécessaire) +- **OpenCV** : Techniques de vision classique +- **VLM (Qwen3-VL)** : Compréhension sémantique via modèle de vision-langage + +Détecte 10+ types d'éléments UI avec rôles sémantiques (primary_action, form_input, etc.). + +### 6.5 Circuit breaker et résilience + +Système de disjoncteur à 5 états (RUNNING, DEGRADED, QUARANTINED, PAUSED, ROLLBACK) inspiré des patterns de production enterprise, avec journalisation d'audit complète. + +### 6.6 Exécution 100 % locale + +Aucune dépendance cloud. Tous les modèles IA tournent en local (GPU), garantissant la conformité RGPD et l'utilisation en environnements classifiés/air-gapped. + +--- + +## 7. État d'avancement + +### Phases complétées (10/13 — 77 %) + +| Phase | Description | Statut | +|-------|-------------|--------| +| 1-2 | Fondations + Embeddings FAISS | Terminé | +| 4-6 | Détection UI + Graphes Workflow + Exécution | Terminé | +| 7-8 | Système d'apprentissage + Entraînement | Terminé | +| 10-12 | Gestion GPU + Performance + Monitoring | Terminé | + +### Phases restantes (3/13 — 23 %) + +| Phase | Description | Statut | +|-------|-------------|--------| +| 3 | Checkpoint final (tests de stockage) | En cours | +| 9 | Visual Workflow Builder (90 % → 100 %) | En cours | +| 13 | Tests end-to-end + Documentation finale | À faire | + +### Composants prêts pour la production + +- Agent de capture cross-plateforme avec chiffrement AES-256 +- Pipeline de traitement serveur + dashboard web +- Système d'analytics et monitoring temps réel +- Auto-réparation et adaptation automatique + +--- + +## 8. Positionnement concurrentiel + +### Comparaison avec les solutions existantes + +| Critère | UiPath / AA / BluePrism | RPA Vision V3 | +|---------|------------------------|---------------| +| Méthode de détection | Sélecteurs CSS/XPath | Vision par IA | +| Robustesse aux changements UI | Faible (cassure fréquente) | Forte (auto-réparation) | +| Environnements Citrix/VDI | Support limité/payant | Natif | +| Mainframes / Legacy | Non supporté | Supporté | +| Systèmes air-gapped | Non | Oui (100 % local) | +| Apprentissage autonome | Non | Oui (4 niveaux) | +| Coût de maintenance | 60-70 % du budget | Réduit par auto-réparation | +| Cloud requis | Souvent | Jamais | + +### Avance technologique estimée + +- **2 à 3 ans** d'avance sur l'approche vision-native par rapport aux acteurs traditionnels +- Architecture conçue dès le départ pour la vision (pas un ajout a posteriori) +- Score de moat technique : **85/100** (analyse détaillée disponible) + +--- + +## 9. Marché adressable + +### Segments cibles (sous-servis par les solutions existantes) + +| Segment | Taille estimée | Problème | +|---------|---------------|----------| +| Citrix / VDI | 3,9 Mds $ | Interfaces sans DOM accessible | +| Legacy / Mainframe | 2,6 Mds $ | Aucun sélecteur disponible | +| Défense / Air-gapped | 1,3 Mds $ | Exigence 100 % local, pas de cloud | +| Santé (RGPD) | 1,8 Mds $ | Données sensibles, conformité stricte | +| **Total adressable** | **~9,6 Mds $** | | + +### Marché RPA global + +- **2024** : 13 milliards $ — **2030** : 30 milliards $ (CAGR 15 %) +- La transition vers l'IA/vision est un mouvement de fond du secteur + +--- + +## 10. Inventaire des dépendances open-source et licences + +Le logiciel RPA Vision V3 est un **développement propriétaire original** qui s'appuie sur des bibliothèques open-source. La propriété intellectuelle réside dans : +- L'architecture 5 couches et sa conception +- Les algorithmes de fusion multimodale +- Le système d'auto-réparation en 4 stratégies +- Le système d'apprentissage progressif +- Le catalogue d'actions et l'intégration complète +- Le Visual Workflow Builder + +### 10.1 Dépendances Python directes (requirements.txt) + +| Package | Version | Licence | Usage | +|---------|---------|---------|-------| +| numpy | 2.2.x | BSD | Calcul numérique | +| torch | 2.9+ | BSD-3-Clause | Deep learning | +| torchvision | 0.24+ | BSD | Utilitaires vision | +| transformers | 4.57+ | Apache-2.0 | Modèles HuggingFace | +| open_clip_torch | 3.2.x | MIT | Embeddings CLIP | +| faiss-cpu | 1.13.x | MIT / BSD-3-Clause | Recherche vectorielle | +| Pillow | 12.x | MIT-CMU | Manipulation d'images | +| PyQt5 | 5.15.x | **GPL v3** | Interface desktop (GUI) | +| requests | 2.32.x | Apache-2.0 | Requêtes HTTP | +| scikit-learn | 1.7.x | BSD-3-Clause | Machine learning classique | +| opencv-python | 4.12.x | Apache-2.0 | Vision par ordinateur | +| mss | 10.1.x | MIT | Capture d'écran | +| python-doctr | 1.0.x | Apache-2.0 | OCR (reconnaissance de texte) | +| pytest | 9.x | MIT | Tests unitaires | +| hypothesis | 6.x | MPL-2.0 | Tests property-based | + +### 10.2 Dépendances VWB Backend + +| Package | Version | Licence | Usage | +|---------|---------|---------|-------| +| Flask | 3.0.x | BSD | Framework web | +| Flask-SocketIO | 5.3.x | MIT | WebSocket temps réel | +| Flask-CORS | 4.0.x | MIT | Cross-origin | +| SQLAlchemy | 2.0.x | MIT | ORM base de données | +| Flask-SQLAlchemy | 3.1.x | BSD-3-Clause | Intégration Flask/SQLAlchemy | +| marshmallow | 3.20.x | MIT | Sérialisation | +| redis | 5.0.x | MIT | Cache | +| pydantic | 2.5.x | MIT | Validation de données | +| jsonschema | 4.20.x | MIT | Validation JSON | +| python-dotenv | 1.0.x | BSD-3-Clause | Variables d'environnement | +| black | 23.x | MIT | Formatage de code | +| flake8 | 6.x | MIT | Linting | +| mypy | 1.7.x | MIT | Vérification de types | + +### 10.3 Dépendances Server (FastAPI) + +| Package | Version | Licence | Usage | +|---------|---------|---------|-------| +| fastapi | 0.115+ | MIT | API REST | +| uvicorn | 0.30+ | BSD-3-Clause | Serveur ASGI | +| python-multipart | 0.0.6+ | Apache-2.0 | Upload de fichiers | +| cryptography | 41+ | Apache-2.0 / BSD-3-Clause | Chiffrement AES-256 | + +### 10.4 Dépendances JavaScript/Frontend (package.json) + +| Package | Version | Licence | Usage | +|---------|---------|---------|-------| +| react | 18.3.x | MIT | Framework UI | +| react-dom | 18.3.x | MIT | Rendu DOM | +| @xyflow/react | 12.10.x | MIT | Éditeur visuel de graphes | +| typescript | 5.x | Apache-2.0 | Typage statique | +| vite | 5.x | MIT | Build tool | +| @vitejs/plugin-react | 4.x | MIT | Plugin React pour Vite | +| @mui/material | 7.x | MIT | Composants UI Material Design | +| @reduxjs/toolkit | 2.x | MIT | Gestion d'état | +| axios | 1.x | MIT | Client HTTP | +| socket.io-client | 4.x | MIT | WebSocket client | + +### 10.5 Dépendances transitives notables + +| Package | Licence | Catégorie | +|---------|---------|-----------| +| huggingface-hub | Apache-2.0 | IA / téléchargement de modèles | +| safetensors | Apache-2.0 | Sérialisation de modèles | +| tokenizers | Apache-2.0 | Tokenisation NLP | +| timm | Apache-2.0 | Modèles de vision | +| scipy | BSD | Calcul scientifique | +| networkx | BSD | Manipulation de graphes | +| tqdm | MIT / MPL-2.0 | Barres de progression | +| protobuf | BSD-3-Clause | Sérialisation de données | +| PyYAML | MIT | Parsing YAML | +| certifi | MPL-2.0 | Certificats SSL | + +### 10.6 Bibliothèques NVIDIA CUDA (15 packages) + +| Package | Licence | +|---------|---------| +| nvidia-cublas-cu12, nvidia-cuda-cupti-cu12, nvidia-cuda-nvrtc-cu12, nvidia-cuda-runtime-cu12, nvidia-cudnn-cu12, nvidia-cufft-cu12, nvidia-cufile-cu12, nvidia-curand-cu12, nvidia-cusolver-cu12, nvidia-cusparse-cu12, nvidia-cusparselt-cu12, nvidia-nccl-cu12, nvidia-nvjitlink-cu12, nvidia-nvshmem-cu12, nvidia-nvtx-cu12 | **NVIDIA Proprietary** (usage gratuit, redistribution encadrée) | + +### 10.7 Synthèse des licences + +| Type de licence | Nombre de packages | Compatibilité commerciale | +|----------------|-------------------|--------------------------| +| MIT | ~40 | Permissive — usage commercial libre | +| Apache-2.0 | ~18 | Permissive — usage commercial libre | +| BSD / BSD-3-Clause | ~22 | Permissive — usage commercial libre | +| MPL-2.0 | 2 | Permissive (fichier par fichier) | +| **GPL v3** | **1 (PyQt5)** | **Copyleft — voir note ci-dessous** | +| LGPL v3 | 1 (PyQt5-Qt5) | Copyleft faible | +| NVIDIA Proprietary | 15 | Gratuit, redistribution encadrée | + +### 10.8 Notes de conformité + +1. **PyQt5 (GPL v3)** — Utilisé uniquement pour l'interface desktop optionnelle (`gui/`, 3 fichiers). L'application principale (Visual Workflow Builder) utilise React et n'est pas concernée. Option : migration vers PySide6 (LGPL) ou licence commerciale Qt si distribution du composant GUI. + +2. **NVIDIA CUDA** — Les bibliothèques CUDA sont propriétaires mais gratuites. Leur usage est conforme aux conditions de la licence NVIDIA pour le développement et le déploiement. + +3. **Majorité permissive** — Plus de 80 % des dépendances utilisent des licences permissives (MIT, Apache-2.0, BSD), pleinement compatibles avec un usage commercial et une distribution propriétaire. + +4. **Code propriétaire** — L'intégralité du code source développé spécifiquement pour RPA Vision V3 (architecture, algorithmes, intégrations) est propriétaire et constitue l'essentiel de la valeur de l'apport. + +--- + +## 11. Éléments de valorisation + +### 11.1 Coût de développement réel (méthode des coûts historiques) + +Investissement effectivement consenti par l'auteur pour la version 3 : + +| Poste | Calcul | Montant | +|-------|--------|---------| +| Travail préparatoire (conception, veille, architecture) | ~530 h × 150 €/h (TJM 1 200 € ÷ 8h) | 79 500 € | +| Développement actif V3 | ~2 100 h × 150 €/h | 315 000 € | +| **Sous-total main-d'œuvre V3** | **~2 630 h** | **394 500 €** | +| Matériel — station de travail (AMD Ryzen 9, 128 Go RAM, RTX 5070) | | 3 000 € | +| Matériel — Jetson Nano (tests embarqués) | | 400 € | +| Coûts IA (API, modèles, inférence) | | 200 € | +| **Total coût historique V3** | | **~398 100 €** | + +> **Note** : Ce calcul ne valorise pas les ~3 ans de R&D cumulés sur les versions 1 et 2, qui ont directement alimenté la conception de la V3 (choix d'architecture, sélection des modèles IA, retours d'expérience). Ce savoir-faire accumulé est inclus dans la valeur de l'apport mais non chiffré séparément. + +### 11.2 Coût de reproduction par un tiers (méthode recommandée) + +Le coût de reproduction estime l'investissement qu'une entreprise tierce devrait consentir pour développer un logiciel **fonctionnellement équivalent** en partant de zéro, sans bénéficier des 5 ans d'itérations V1/V2. + +#### Scénario A — Profil unique équivalent (improbable) + +| Poste | Calcul | Montant | +|-------|--------|---------| +| Architecte IA senior multi-compétences | 2 630 h × 150 €/h | 394 500 € | + +> Ce scénario suppose l'existence d'un profil aussi polyvalent (IA + full-stack + sécurité + infra + vision). Ce type de profil est extrêmement rare sur le marché. + +#### Scénario B — Équipe spécialisée (réaliste) + +Une entreprise devrait constituer une équipe de 3-4 personnes sur 12 à 18 mois : + +| Poste | Durée | TJM | Montant | +|-------|-------|-----|---------| +| Lead architect / Chef de projet IA | 12 mois × 22 j | 1 200 €/j | 316 800 € | +| Ingénieur ML / Vision par ordinateur | 10 mois × 22 j | 900 €/j | 198 000 € | +| Développeur full-stack senior (React + Python) | 10 mois × 22 j | 700 €/j | 154 000 € | +| DevOps / Infra GPU (temps partiel) | 4 mois × 22 j | 650 €/j | 57 200 € | +| **Sous-total main-d'œuvre** | | | **726 000 €** | +| Matériel et infrastructure (GPU, serveurs de dev) | | | 5 000 € | +| Coûts IA (API, modèles, calcul) | | | 2 000 € | +| Marge d'incertitude technique (+15 %) | | | 109 950 € | +| **Total coût de reproduction** | | | **~843 000 €** | + +> **Justification de la marge** : Un tiers ne bénéficierait pas des retours d'expérience des V1/V2 et devrait absorber des cycles de recherche supplémentaires (choix de modèles, benchmarks, impasses techniques). + +#### Synthèse des valorisations + +| Méthode | Montant | Commentaire | +|---------|---------|-------------| +| Coût historique (V3 seule) | ~398 000 € | Plancher — ne valorise pas la R&D V1/V2 | +| Reproduction par un tiers (équipe) | ~843 000 € | Estimation réaliste — inclut marge d'incertitude | +| **Fourchette de valorisation recommandée** | **400 000 € — 850 000 €** | Selon la méthode retenue par le commissaire | + +### 11.3 Actifs incorporels composant l'apport + +| Actif | Description | Quantification | +|-------|-------------|---------------| +| **Code source propriétaire** | Moteur IA, VWB, Agent, Server, Dashboard | ~190 000 lignes (Python, TypeScript) | +| **Architecture logicielle** | Conception originale 5 couches, documentation | 14 modules architecturaux | +| **Algorithmes propriétaires** | Fusion multimodale, auto-réparation 4 stratégies, apprentissage progressif 4 niveaux | Développements originaux | +| **Catalogue d'actions** | Actions prêtes à l'emploi pour l'automatisation | 24+ actions | +| **Suite de tests** | Tests unitaires, intégration, property-based | ~67 000 lignes | +| **Savoir-faire accumulé** | 5 ans d'itérations (V1 → V3), intégration de modèles IA en pipeline local | Non quantifiable — valeur intrinsèque | +| **Documentation technique** | Architecture, API, guides, spécifications | Corpus documentaire complet | + +### 11.3 Comparables marché + +| Solution | Valorisation | CA / ARR | Source | +|----------|-------------|----------|--------| +| **UiPath** (NYSE: PATH) | ~8,8 Mds $ (capitalisation déc. 2025) | CA : 1,43 Md $ / ARR : 1,67 Md $ (FY2025) | [UiPath IR — FY2025 Results](https://ir.uipath.com/news/detail/381/uipath-reports-fourth-quarter-and-full-year-fiscal-2025-financial-results) | +| **Automation Anywhere** | 6,8 Mds $ (Series D, oct. 2025) | Non divulgué (privé) | [Tracxn — AA Funding](https://tracxn.com/d/companies/automation-anywhere/__tre2zh_F5voAIrD5MmsvheJ0drmtTXyaT3m8-w_KaZ0/funding-and-investors) | +| **SS&C Blue Prism** | 1,6 Md $ (acquisition par SS&C, 2022) | ~211 M$ (post-acquisition) | [SS&C Blue Prism Acquisition](https://info.ssctech.com/blue-prism-acquisition) | +| **Sema4.ai** (ex-Robocorp) | 30,5 M$ levés (2024) | Early stage | [Sema4.ai — PR Newswire](https://www.prnewswire.com/news-releases/sema4-ai-raises-30-5-million-to-bring-open-source-powered-ai-to-mission-critical-enterprise-work-302047158.html) | + +**Contexte** : UiPath, Automation Anywhere et SS&C Blue Prism sont identifiés comme « Leaders » dans le [Gartner Magic Quadrant for RPA 2025](https://www.gartner.com/en/documents/6632834) (publié juin 2025, 7e année consécutive pour les trois). RPA Vision V3 se positionne dans le segment des solutions IA-natives pour RPA, avec une approche différenciante (vision pure, 100 % local) ciblant les segments inaccessibles aux leaders actuels. + +--- + +## 12. Références et sources + +### 12.1 Marché RPA — Taille et prévisions + +| Source | Donnée | Lien | +|--------|--------|------| +| **Grand View Research** | Marché RPA mondial : 4,68 Mds $ (2025) → 35,84 Mds $ (2033), CAGR 29,0 % | [Grand View Research — RPA Market](https://www.grandviewresearch.com/industry-analysis/robotic-process-automation-rpa-market) | +| **Precedence Research** | Marché RPA : 28,31 Mds $ (2025) → 247,34 Mds $ (2035), CAGR 24,2 % | [Precedence Research — RPA Market](https://www.precedenceresearch.com/robotic-process-automation-market) | +| **Gartner** | Marché RPA : 3,79 Mds $ (2024) → 30,85 Mds $ (2030), CAGR 43,9 % | [Gartner — Market Share Analysis RPA 2024](https://www.gartner.com/en/documents/6842834) | +| **Statista** | Prévision marché RPA mondial jusqu'en 2030 | [Statista — RPA Market Size](https://www.statista.com/statistics/1259903/robotic-process-automation-market-size-worldwide/) | + +> **Note** : Les écarts entre sources reflètent des périmètres de définition différents (RPA strict vs. hyperautomation). Le consensus est un CAGR de 24 à 44 % selon le périmètre. + +### 12.2 Produits concurrents — Données financières + +| Acteur | Donnée | Source | +|--------|--------|--------| +| **UiPath** — CA FY2025 : 1,43 Md $, croissance +9 %, ARR 1,67 Md $, 2 292 clients >100k$ ARR | [UiPath — Q4 & FY2025 Results](https://ir.uipath.com/news/detail/381/uipath-reports-fourth-quarter-and-full-year-fiscal-2025-financial-results) | +| **UiPath** — Capitalisation boursière ~8,8 Mds $ (déc. 2025) | [MacroTrends — UiPath Market Cap](https://www.macrotrends.net/stocks/charts/PATH/uipath/market-cap) | +| **Automation Anywhere** — Série D : 290 M$ levés, valorisation 6,8 Mds $ (oct. 2025), total levé : 840 M$ | [Tracxn — AA Funding](https://tracxn.com/d/companies/automation-anywhere/__tre2zh_F5voAIrD5MmsvheJ0drmtTXyaT3m8-w_KaZ0/funding-and-investors) | +| **SS&C Blue Prism** — Acquis par SS&C Technologies pour 1,6 Md $ (mars 2022) | [SS&C — Blue Prism Acquisition](https://info.ssctech.com/blue-prism-acquisition) | +| **Sema4.ai** (acquéreur de Robocorp) — 30,5 M$ levés, Robocorp acquis janv. 2024 | [PR Newswire — Sema4.ai](https://www.prnewswire.com/news-releases/sema4-ai-raises-30-5-million-to-bring-open-source-powered-ai-to-mission-critical-enterprise-work-302047158.html) | + +### 12.3 Analystes et classements sectoriels + +| Source | Donnée | Lien | +|--------|--------|------| +| **Gartner Magic Quadrant for RPA 2025** | Leaders : UiPath, Automation Anywhere, SS&C Blue Prism (7e année consécutive). 13 éditeurs évalués. | [Gartner — MQ RPA 2025](https://www.gartner.com/en/documents/6632834) | +| **UiPath** — Communiqué leader MQ 2025 | Reconnu leader pour la 7e année, meilleur score « Ability to Execute » | [UiPath — MQ 2025 Press Release](https://ir.uipath.com/news/detail/400/uipath-recognized-as-a-leader-in-the-2025-gartner-magic-quadrant-for-robotic-process-automation) | + +### 12.4 Problématique du marché — Fragilité et échecs RPA + +| Source | Donnée | Lien | +|--------|--------|------| +| **Ernst & Young** | 30 à 50 % des projets RPA échouent initialement | [Flobotics — RPA Statistics](https://flobotics.io/blog/rpa-statistics/) | +| **Blueprint Software** | Le coût de licence ne représente que 25-30 % du coût total RPA ; la maintenance et le support représentent 15-20 % de l'investissement initial par an | [Blueprint — RPA Cost](https://www.blueprintsys.com/blog/rpa/how-much-does-robotic-process-automation-really-cost) | +| **Blueprint Software** | Les bots cassent régulièrement lors de changements d'interface (break-fix cycles) ; la maintenance est le premier poste de coût récurrent | [Blueprint — Reduce RPA Maintenance](https://www.blueprintsys.com/blog/rpa/reduce-rising-costs-rpa-maintenance-and-support) | +| **Worksoft** | La fragilité des bots face aux changements UI est le principal défi technique du RPA (« bot fragility ») | [Worksoft — Solving Bot Fragility](https://www.worksoft.com/corporate-blog/solving-bot-fragility-with-change-resilient-rpa) | +| **Deloitte** | Enquête mondiale sur l'adoption RPA : 62 % citent l'intégration comme barrière principale, 55 % le manque de compétences | [Deloitte — Global RPA Survey](https://www2.deloitte.com/us/en/pages/operations/articles/global-robotic-process-automation-report.html) | + +### 12.5 Problématique Citrix/VDI — Marché sous-servi + +| Source | Donnée | Lien | +|--------|--------|------| +| **PwC India** | Livre blanc : « Robotic Process Automation in a Virtual Environment » — les environnements VDI ne fournissent aucun objet DOM exploitable, l'automatisation repose uniquement sur la reconnaissance d'image | [PwC — RPA in Virtual Environment (PDF)](https://www.pwc.in/assets/pdfs/publications/2018/robotic-process-automation-in-a-virtual-environment.pdf) | +| **Accelirate** | « Challenges of RPA in Citrix Environment » — absence totale d'Object IDs, le bot ne voit qu'une image pixel | [Accelirate — RPA & Citrix](https://www.accelirate.com/challenges-of-rpa-in-citrix-environment/) | +| **Ultima (IA Connect)** | Solution spécialisée RPA pour Citrix/VDI — confirme le besoin non couvert par les plateformes standard | [Ultima — IA Connect for Citrix](https://ultima.com/ia-connect/) | +| **Leapwork** | « Overcoming Common Citrix Automation Challenges » — les outils RPA classiques échouent en environnement Citrix | [Leapwork — Citrix Challenges](https://www.leapwork.com/blog/overcoming-common-citrix-automation-challenges-with-the-right-tool) | + +### 12.6 Technologies IA utilisées — Publications et documentation + +| Technologie | Référence | +|-------------|-----------| +| **CLIP** (OpenAI, 2021) | Radford et al., « Learning Transferable Visual Models From Natural Language Supervision » — [arXiv:2103.00020](https://arxiv.org/abs/2103.00020) | +| **FAISS** (Meta AI) | Johnson et al., « Billion-scale similarity search with GPUs » — [arXiv:1702.08734](https://arxiv.org/abs/1702.08734) | +| **OWL-v2** (Google, 2023) | Minderer et al., « Scaling Open-Vocabulary Object Detection » — [arXiv:2306.09683](https://arxiv.org/abs/2306.09683) | +| **docTR** (Mindee) | OCR open-source — [GitHub: mindee/doctr](https://github.com/mindee/doctr) | +| **Qwen2.5-VL** (Alibaba) | Modèle vision-langage — [HuggingFace: Qwen](https://huggingface.co/Qwen) | +| **PyTorch** (Meta AI) | Framework de deep learning — [pytorch.org](https://pytorch.org/) | +| **OpenCV** | Bibliothèque de vision par ordinateur — [opencv.org](https://opencv.org/) | + +--- + +## Annexes + +### A. Liste des modules du moteur Core (192 fichiers) + +Les modules couvrent : analytics, capture, detection, embedding, execution, graph, healing, learning, matching, models, monitoring, security, system, training. + +### B. Catalogue des 24 actions VWB + +Vision UI (14) : click_anchor, type_text, screenshot_evidence, extract_text, hover, drag_drop, select_option, scroll, wait_element, verify_element, double_click, right_click, keyboard_shortcut, focus_element + +Navigation (2) : navigate_to_url, browser_back + +Data (2) : download_to_folder, extraire_tableau + +Database (3) : save_data, load_data, db_manager + +Validation (2) : verify_element_exists, verify_text_content + +Intelligence (1) : analyze_with_ai + +### C. Références documentaires internes + +- `ARCHITECTURE_VISION_COMPLETE.md` — Architecture complète 5 couches +- `PITCH_INVESTISSEURS_RPA_VISION_V3.md` — Pitch investisseurs +- `ANALYSE_MOAT_RPA_VISION_V3.md` — Analyse concurrentielle détaillée +- `QUICK_START.md` — Guide de démarrage rapide + +--- + +*Document généré le 25 février 2026 — RPA Vision V3* diff --git a/docs/EXECUTION_LOOP_FLAGS.md b/docs/EXECUTION_LOOP_FLAGS.md new file mode 100644 index 000000000..f89c638ae --- /dev/null +++ b/docs/EXECUTION_LOOP_FLAGS.md @@ -0,0 +1,192 @@ +# Flags d'exécution vision-aware (C1) — ExecutionLoop + +> Introduit dans la série de correctifs **C1** (avril 2026). +> Référence code : [`core/execution/execution_loop.py`](../core/execution/execution_loop.py) (classe `ExecutionLoop`, constructeur lignes ~177-237). + +Cette page décrit les quatre flags ajoutés à `ExecutionLoop` pour piloter +finement la construction de `ScreenState` pendant le replay. Ils permettent de +dégrader volontairement le pipeline de perception quand un composant est en +panne ou quand on veut gagner de la latence. + +## Contexte + +Depuis C1, chaque itération de la boucle d'exécution construit un +`ScreenState` enrichi via `ScreenAnalyzer` (OCR + détection UI + embedding), +avec un cache perceptuel pour éviter de recalculer deux fois sur le même +screenshot. + +Cela coûte cher (~200 ms – 2 s selon la machine). Les flags ci-dessous +permettent de désactiver ou contraindre ces étapes. + +Le `StepResult` expose désormais : + +| Champ | Type | Sens | +|---|---|---| +| `ocr_ms` | float | Temps OCR pour ce step | +| `ui_ms` | float | Temps détection UI pour ce step | +| `analyze_ms` | float | Temps total analyse ScreenState | +| `total_ms` | float | Temps total du step (alias `duration_ms`) | +| `cache_hit` | bool | True si le ScreenState vient du cache perceptuel | +| `degraded` | bool | True si on est retombé en mode dégradé | + +Ces champs remontent automatiquement dans le module analytics +(table SQLite `step_metrics`, voir +[`core/analytics/storage/timeseries_store.py`](../core/analytics/storage/timeseries_store.py)). + +## Flags + +### `enable_ui_detection: bool = True` + +Active/désactive la détection UI (YOLO + SomEngine + VLM de grounding). + +**Pourquoi le désactiver** : +- Le serveur VLM (Ollama) est down ou surchargé +- On cible un workflow très simple où seul l'OCR suffit +- On debugge un problème de détection et on veut isoler la cause + +**Impact performance** : gain ~100-1500 ms par step selon modèle VLM. + +**Exemple** : + +```python +from core.execution.execution_loop import ExecutionLoop, ExecutionMode + +loop = ExecutionLoop( + pipeline=pipeline, + enable_ui_detection=False, # VLM down → on coupe la détection UI +) +loop.start(workflow_id="wf_notepad", mode=ExecutionMode.AUTOMATIC) +``` + +### `enable_ocr: bool = True` + +Active/désactive l'OCR (Tesseract/docTR). + +**Pourquoi le désactiver** : +- Gains de performance sur un workflow piloté uniquement par templates/embeddings +- Environnement CPU-only où l'OCR est trop lent +- Les textes ne sont pas utilisés par la stratégie de matching + +**Impact performance** : gain ~80-500 ms par step. + +**Exemple** : + +```python +loop = ExecutionLoop( + pipeline=pipeline, + enable_ocr=False, +) +``` + +> Note : si `enable_ui_detection=False` **et** `enable_ocr=False`, la boucle +> renvoie un `ScreenState` stub (sans texte ni éléments) et force +> `degraded=True`. Le matching retombera sur les embeddings CLIP seuls. + +### `analyze_timeout_ms: int = 8000` + +Seuil soft en millisecondes au-delà duquel on considère que l'analyse a été +trop lente et on bascule **tous les steps suivants** en mode dégradé +(pas de recalcul OCR/UI, réutilisation du cache ou stub direct). + +**Pourquoi le modifier** : +- Machines lentes (CPU, VM, Citrix) → augmenter à `15000` ou `20000` +- Serveurs dédiés GPU → réduire à `3000` pour détecter plus tôt +- Tests / profiling → utiliser `999999` pour désactiver le basculement + +**Exemple** : + +```python +loop = ExecutionLoop( + pipeline=pipeline, + analyze_timeout_ms=15000, # environnement lent (RDP/Citrix) +) +``` + +Le mode dégradé est porté par `ExecutionLoop._degraded_mode` et affiché dans +`StepResult.degraded`. Voir +[`_build_screen_state`](../core/execution/execution_loop.py) (~ligne 920). + +### `window_info_provider: Optional[Callable[[], Optional[Dict]]] = None` + +Callable renvoyant un `dict` décrivant la fenêtre active. Par défaut, la +boucle appelle `screen_capturer.get_active_window()`. + +**Pourquoi fournir un provider custom** : +- **Citrix / RDP** : le client Windows local voit un seul process (le client + Citrix). L'info de fenêtre utile vient de l'agent distant, on doit donc la + passer explicitement. +- **Environnements headless** : pas de gestionnaire de fenêtres natif. +- **Tests** : injecter une fenêtre mockée sans toucher au capturer. + +**Format attendu du dict** (au minimum) : + +```python +{ + "title": str, # Titre de la fenêtre + "app_name": str, # Nom de l'application + # champs optionnels utilisés par ScreenAnalyzer + "x": int, "y": int, "width": int, "height": int, +} +``` + +**Exemple Citrix** : + +```python +def citrix_window_info(): + # L'agent dans la session Citrix distante publie ces infos + # (par ex. via un fichier partagé ou une websocket) + return remote_agent.get_current_window_info() + +loop = ExecutionLoop( + pipeline=pipeline, + window_info_provider=citrix_window_info, +) +``` + +## Combinaisons recommandées + +| Cas d'usage | Flags | +|---|---| +| Production standard (GPU local) | `enable_ui_detection=True, enable_ocr=True, analyze_timeout_ms=8000` (défaut) | +| VLM down — mode fallback | `enable_ui_detection=False, enable_ocr=True` | +| Machine lente / VM | `analyze_timeout_ms=15000` | +| Citrix / RDP | `window_info_provider=` + valeurs par défaut | +| Benchmark CLIP-only | `enable_ui_detection=False, enable_ocr=False` | + +## Remontée analytics + +Les timings et flags dégradés persistent dans la table SQLite +`step_metrics` (colonnes `ocr_ms`, `ui_ms`, `analyze_ms`, `total_ms`, +`cache_hit`, `degraded`) via +[`AnalyticsExecutionIntegration.on_step_result`](../core/analytics/integration/execution_integration.py). + +Exemple de requête d'analyse : + +```sql +-- Steps avec OCR lent (>300 ms) +SELECT node_id, action_type, ocr_ms, analyze_ms +FROM step_metrics +WHERE ocr_ms > 300 +ORDER BY ocr_ms DESC; + +-- Taux de cache hit par workflow +SELECT workflow_id, + SUM(cache_hit) * 1.0 / COUNT(*) AS cache_hit_ratio +FROM step_metrics +GROUP BY workflow_id; + +-- Steps ayant basculé en mode dégradé +SELECT execution_id, node_id, analyze_ms +FROM step_metrics +WHERE degraded = 1 +ORDER BY started_at DESC; +``` + +## Voir aussi + +- [`core/execution/execution_loop.py`](../core/execution/execution_loop.py) — implémentation +- [`core/pipeline/screen_analyzer.py`](../core/pipeline/screen_analyzer.py) — pipeline d'analyse +- [`core/pipeline/screen_state_cache.py`](../core/pipeline/screen_state_cache.py) — cache perceptuel +- [`tests/unit/test_execution_loop_vision_aware.py`](../tests/unit/test_execution_loop_vision_aware.py) — tests C1 +- [`tests/unit/test_analytics_vision_metrics.py`](../tests/unit/test_analytics_vision_metrics.py) — tests analytics C1 +- [docs/STATUS.md](STATUS.md) — état général du projet diff --git a/docs/PLAN_ACTION_DASHBOARD.md b/docs/PLAN_ACTION_DASHBOARD.md new file mode 100644 index 000000000..8eda368fd --- /dev/null +++ b/docs/PLAN_ACTION_DASHBOARD.md @@ -0,0 +1,267 @@ +# Plan d'action — Dashboard Web RPA Vision V3 + +_Date : 2026-04-15 — périmètre : `web_dashboard/` (port 5001). Auteur : audit technique (lecture seule, aucune modif de code)._ + +Objectifs : +1. faire le ménage dans un dashboard qui a grossi par sédimentation, +2. préparer l'onglet **Audit & Traçabilité** attendu par les clients (AI Act / RGPD), +3. donner à Dom une roadmap actionnable et priorisée. + +--- + +## Section A — Inventaire + +Le dashboard a aujourd'hui **14 onglets** déclarés dans `web_dashboard/templates/index.html` (3 455 lignes) plus des pages auxiliaires (`chat.html`, `gestures.html`, `extractions.html`, `streaming.html`). Le backend Flask (`web_dashboard/app.py`, 2 665 lignes) expose **~65 routes HTTP** + 4 events SocketIO. + +| # | Onglet (label UI) | Routes backend principales | État | MAJ estimée | Utile ? | +|---|---|---|---|---|---| +| 1 | 🎛️ Services | `/api/services*`, `/api/version*` | **OK** — fonctionne, utilisé quotidiennement | avril 2026 | **oui, cœur** | +| 2 | 📊 Vue d'ensemble | `/api/system/status`, SocketIO | **OK partiel** — `statTests` et `statExecution` remplis par legacy | mars 2026 | doublonne avec Services | +| 3 | ⚡ Exécution | `/api/automation/*`, SocketIO `subscribe_execution` | **Douteux** — branché sur le moteur v1 core, pas sur Agent V1 streaming (5005). Le replay réel passe par VWB ou `/api/v1/traces/stream/replay*` | janv. 2026 | **non en l'état** — obsolète face au flux replay actuel | +| 4 | 🔄 Workflows | `/api/workflows*`, `/api/chains*`, `/api/triggers*` | **OK liste**, exécution via `/api/workflows//execute` redondante avec VWB et Agent V1 | janv.-mars 2026 | partiel — la liste oui, l'exécution non | +| 5 | 📦 Sessions | `/api/agent/sessions*` | **OK** — affiche bien les sessions dans `data/training/sessions/` | avril 2026 | **oui** mais se recoupe avec le cleaner (5006) | +| 6 | 📈 Performance | `/api/system/performance`, `/api/system/faiss/test`, `/metrics` | **OK** — FAISS + Prometheus + cache hit | mars 2026 | **oui, utile debug/benchmark** | +| 7 | 📡 Streaming | proxy vers `http://localhost:5005/api/v1/traces/stream/*` | **OK** — lecture seule, bonne visibilité live sessions | mars 2026 | **oui, cœur Agent V1** | +| 8 | 📄 Logs | `/api/logs`, `/api/logs/download` | **OK minimaliste** — lit `logs/*.log`, pas de filtre/tail | nov. 2025 | utile ponctuel, pourrait disparaître si Audit bien fait | +| 9 | 🧪 Tests | `/api/tests*` (subprocess `pytest`) | **Cassé en prod** — pytest non dispo sur cible packagée, timeout 120s bloque l'UI, **aucun droit d'exécuter pytest depuis une UI exposée sur Internet** | mars 2026 | **NON — à retirer** | +| 10 | 💾 Sauvegardes | `/api/backup/*` | **OK** — exports fonctionnels | janv. 2026 | **oui**, valeur clairement réglementaire | +| 11 | 🔧 Corrections (packs) | routes ailleurs (VWB / API core) — onglet affiche des stats | **Cassé** — `refreshCorrectionPacks` appelle une route qui n'existe plus côté dashboard, données via VWB | févr. 2026 | à supprimer côté dashboard, garder côté VWB | +| 12 | 🧠 Apprentissage | idem : placeholders `statCorpusSize`, charts Chart.js non alimentés | **Cassé/placeholder** — aucune route backend ne nourrit les 4 stat-cards ni les 2 canvas | janv. 2026 | **NON — à retirer ou refaire sérieusement** | +| 13 | 🔧 Configuration | `/api/config*`, `/api/config/ollama-models`, `/api/config/test-connection` | **OK** — édition ports/modèles/DB/sécurité/logs | avril 2026 | **oui** (utile admin) | +| 14 | 🧹 Nettoyage | iframe → `http://localhost:5006` | **OK** — ajouté hier, dépend du service session_cleaner | avril 2026 | **oui** | + +Pages auxiliaires (templates séparés, non liées aux onglets) : + +| Page | Route | État | Verdict | +|---|---|---|---| +| `/chat` | `chat.html` + `/api/chat/*` | **OK expérimental** — utilisé en dev | doublonne Agent Chat (5004), à supprimer ici | +| `/gestures` | `gestures.html` + `/api/gestures` | **Mort** — aucune donnée, concept abandonné | **à supprimer** | +| `/extractions` | `extractions.html` + `/api/extractions*` | **Douteux** — fonctionnalité concurrente au plan Data Extraction prévu via VWB | à geler/archiver | +| `/streaming` | `streaming.html` | **Doublon** — remplacé par l'onglet Streaming intégré dans `index.html` | **à supprimer** | + +SocketIO : 4 events (`connect`, `disconnect`, `subscribe_execution`, `get_performance`). Seul `connect/disconnect` sert aujourd'hui — le reste alimente l'onglet Exécution qui va disparaître. + +--- + +## Section B — À virer (cleanup) + +Dans cet ordre, à faire en un seul coup (effort total estimé : **2 à 3 heures**). + +1. **Onglet 🧪 Tests** (lignes 67, 499-517 de `index.html` ; routes 1006-1094 de `app.py`) + - Pourquoi : exécuter `pytest` depuis une UI auth Basic exposée sur Internet est une RCE déguisée. Et ça plante en prod. Les tests se lancent en CLI. + - Effort : 20 min. + +2. **Onglet 🧠 Apprentissage** (lignes 70, 665-720) + - Pourquoi : placeholders, aucune route backend, induit le client en erreur. + - Alternative : soit on le refait proprement dans l'onglet **Audit & Traçabilité** (stats globales sur trace d'exécution), soit on l'enlève. + - Effort : 10 min (retrait). + +3. **Onglet 🔧 Corrections** (lignes 69, 603-664) + - Pourquoi : les correction packs sont gérés dans VWB, pas ici. L'onglet affiche des cartes qui ne se remplissent plus. Ajouter un simple bouton "Ouvrir VWB" dans l'onglet Services suffit. + - Effort : 10 min. + +4. **Onglet ⚡ Exécution** (lignes 61, 197-233) + - Pourquoi : branché sur l'ancien moteur core via SocketIO `subscribe_execution`. Aujourd'hui le replay passe par l'Agent V1 et VWB. L'onglet Streaming couvre déjà le live. + - Effort : 15 min (retrait + supprimer les 4 routes `/api/automation/*`). + +5. **Onglet 📊 Vue d'ensemble** (lignes 60, 162-194) + - Pourquoi : 4 stat-cards dupliquées depuis Services + Sessions + Workflows. Un `perfChart` qui duplique ce qui est dans Performance. + - Alternative : fusionner un mini-résumé (4 KPIs) en tête de l'onglet Services, ce qui fait gagner un clic. Puis supprimer l'onglet. + - Effort : 30 min. + +6. **Pages auxiliaires `/chat`, `/gestures`, `/streaming`, `/extractions`** + - Pourquoi : concurrence avec services dédiés (Agent Chat 5004, VWB, plan Data Extraction) ou fonctionnalités mortes (gestures). + - Effort : 15 min (supprimer templates + routes Flask). + +7. **Code mort résiduel** + - `execution_state`, `performance_metrics` (globales module) : utiles uniquement si Exécution / Overview subsistent. + - `chain_manager`, `trigger_manager`, `automation_scheduler` : à évaluer, probablement à garder côté moteur mais retirer l'UI. + - Effort : 30 min. + +**Résultat visé** : de 14 onglets à **8 onglets** (Services, Sessions, Performance, Streaming, Logs, Sauvegardes, Config, Nettoyage) **+ 1 nouveau** (Audit). Soit **9 onglets utiles et alimentés**. + +--- + +## Section C — À garder mais améliorer + +Par priorité. + +1. **🎛️ Services** — ajouter un bandeau "santé globale" (somme du statut des 6 services critiques + streaming server + session cleaner) et rapatrier les 4 stat-cards de "Vue d'ensemble" en tête. Effort : **1 h**. + +2. **📦 Sessions** — ajouter un filtre par statut (pending/processing/completed/failed — la donnée existe déjà dans `PROCESSING_STATUS_FILE`). Ajouter un bouton "Voir dans le cleaner" qui ouvre l'onglet Nettoyage pré-filtré sur la session. Effort : **1 h**. + +3. **📄 Logs** — passer en lecture "tail -f" WebSocket plutôt que polling d'un fichier entier. Filtrer par niveau (INFO/WARN/ERROR) côté serveur. Effort : **2 h**. Faible priorité : une fois l'onglet Audit en place, 90 % de l'usage métier disparaît. + +4. **📈 Performance** — la section FAISS est bonne. Retirer les deux graphiques Chart.js `cacheChart` et `faissChart` : ils se redessinent toutes les 5s avec un tableau vide au reload, c'est du bruit visuel. Effort : **20 min**. + +5. **🔧 Configuration** — documenter dans un tooltip chaque champ (DASHBOARD_PASSWORD, RPA_API_TOKEN, etc.) et signaler clairement les secrets. Ajouter un bouton "Recharger les modèles Ollama" déjà présent mais discret. Effort : **1 h**. + +Aucune amélioration pour Streaming, Sauvegardes, Nettoyage : ils sont récents et suffisants. + +--- + +## Section D — Nouvel onglet "⚖️ Audit & Traçabilité" + +### Ce que l'utilisateur voit + +Une table paginée des actions Léa, précédée de filtres, avec export CSV. + +**Bandeau haut** — 4 KPIs aujourd'hui : + +- Actions totales (24 h) +- Taux de succès global +- Nombre de TIMs actifs +- Applications cibles touchées + +**Zone de filtres** (ligne horizontale) : + +- Période (preset : Aujourd'hui / 7j / 30j / personnalisée via deux date pickers) +- Collaborateur (dropdown peuplé via `/api/v1/audit/summary` → `by_user`) +- Application métier (dropdown, peuplé via le champ `target_app` des entrées) +- Type d'action (click, type, key_combo, wait) +- Résultat (success / failed / recovered / skipped) +- Mode d'exécution (autonomous / assisted / shadow) +- Workflow (dropdown si < 50, sinon champ texte) +- Recherche libre (matche `action_detail`) + +**Boutons d'action** (à droite du bandeau) : + +- 📥 Exporter CSV (respecte les filtres courants) +- 📄 Rapport PDF pour DSI (génération simple, voir ci-dessous) +- 🔄 Actualiser + +**Tableau principal** (colonnes dans cet ordre) : + +| Colonne | Source `AuditEntry` | Remarque | +|---|---|---| +| Horodatage | `timestamp` | affichage local `HH:mm:ss · JJ/MM` | +| Collaborateur | `user_name` ou fallback `user_id` | | +| Poste | `machine_id` | utile multi-sites | +| Application | `target_app` | DPI, Orbis, DxCare, navigateur… | +| Action | `action_type` + badge | icône par type | +| Détail | `action_detail` | tronqué à 80 car., tooltip complet | +| Mode | `execution_mode` | badge coloré | +| Résultat | `result` | vert/rouge/orange | +| Récup. | `recovery_action` | uniquement si `result != success` | +| Durée | `duration_ms` | ms → s si > 1 s | +| Workflow | `workflow_name` ou `workflow_id` tronqué | lien vers détail workflow | + +Ligne cliquable → panneau latéral avec le JSON complet (+ `critic_result`, `resolution_method`, session_id, action_id). Ce panneau sert aux audits techniques. + +**Pagination** serveur (limit 100, offset) — le backend `/api/v1/audit/history` gère déjà. + +**Widgets complémentaires** (en dessous du tableau) : + +- Camembert "répartition par application" (utile DSI pour visualiser le périmètre Léa) +- Courbe "taux d'échec sur 7 j" (seuil d'alerte ajustable) +- Liste "Top 10 échecs récents" — pour qu'un TIM/RSSI identifie vite les workflows à retoucher + +### Sources de données — ce qui existe déjà + +Tout le backend est **déjà là** côté streaming server (port 5005) : + +- Module `agent_v0/server_v1/audit_trail.py` — `AuditTrail` avec `record()`, `query()`, `get_summary()`, `export_csv()`. +- Endpoints FastAPI déjà en place : + - `GET /api/v1/audit/history` — historique filtrable paginé + - `GET /api/v1/audit/summary?date=YYYY-MM-DD` — résumé du jour + - `GET /api/v1/audit/export` — export CSV +- Données réelles présentes dans `data/audit/audit_YYYY-MM-DD.jsonl` (7 fichiers, ~500 ko sur les 10 derniers jours, ~1 800 entrées aujourd'hui). + +### Ce qu'il manque + +1. **Proxy Flask côté dashboard (5001 → 5005)** — sur le modèle de `/api/streaming/` qui existe déjà (`app.py:2505`). Coût : ~30 lignes. +2. **Template HTML + JS** — nouvel onglet dans `index.html`, ~300 lignes. Pas de framework : réutiliser le style et Chart.js existant. +3. **Champ patient pseudonymisé** : actuellement **pas présent** dans `AuditEntry`. Décision nécessaire : + - Option A (recommandée) : ajouter un champ optionnel `patient_ref_hash` (SHA-256 tronqué du n° patient), alimenté quand Léa extrait ou saisit un identifiant patient. Coût : ajout d'un champ dataclass + propagation dans 2-3 endroits au niveau exécuteur. + - Option B : n'en pas mettre pour le POC Anouste, préciser dans la doc DSI. +4. **Rapport PDF DSI** — simple template ReportLab ou WeasyPrint, une page A4 avec en-tête (client, période, nombre d'actions, signature hash des logs source pour intégrité), puis le tableau filtré. Coût : ~150 lignes + 1 dép. + +### Effort estimé + +| Lot | Jours·homme | +|---|---| +| Proxy Flask + nouvel onglet (MVP : tableau + filtres + export CSV) | **0.5** | +| Widgets graphiques (camembert + courbe 7j) | 0.25 | +| Rapport PDF DSI | 0.5 | +| Champ `patient_ref_hash` (option A) | 0.5 | +| Alerting (si > N échecs consécutifs sur 1 h → badge rouge + email optionnel) | 0.5 | +| **Total MVP (sans PDF ni patient)** | **0.75 j** | +| **Total version "complète DSI-ready"** | **~2.25 j** | + +### Réglementaire — ce qui est adressé + +- **AI Act, article 12 — "Record-keeping"** : les systèmes d'IA à haut risque doivent **automatiquement enregistrer** les événements pertinents. L'onglet rend visibles et exportables les logs qui existent déjà côté serveur. Respect du critère _traçabilité permanente_. +- **AI Act, article 14 — "Human oversight"** : le champ `execution_mode` (`shadow/assisted/autonomous`) documente le niveau de supervision humaine pour chaque action. +- **RGPD, article 30 — registre des traitements** : champ `target_app` + `domain` permettent de produire un inventaire des traitements par application métier. +- **RGPD, article 32 — intégrité** : ajouter un hash SHA-256 du fichier JSONL signé à la clôture journalière (coût marginal, 20 lignes) garantit la non-falsification. +- **RGPD, article 33 — notification de violation** : l'alerting (> N échecs sur fenêtre glissante) est la brique technique qui permet à un RSSI d'être notifié. + +### Exemple concret — "un DSI hospitalier demande un audit" + +**Scénario** : le DSI du CH d'Auch veut montrer à son directeur que Léa n'a jamais validé seule une codification CIM-10 sur le patient X pendant la semaine 15. + +1. Il ouvre le dashboard → onglet Audit. +2. Filtre : période = 2026-04-06 → 2026-04-12, application = `DxCare`, action = `click`. +3. Il saisit dans la recherche libre le hash pseudo du patient (fourni par le TIM responsable). +4. Il voit 3 lignes, toutes en mode `assisted`, toutes avec `user_name = "Marie Dupont"`. +5. Il clique sur "📄 Rapport PDF DSI" → reçoit un PDF d'une page avec les 3 lignes, la signature d'intégrité, le tampon Léa, la période. +6. Il remonte ça à sa direction. Dossier clos en 4 minutes. + +C'est exactement le cas d'usage qui manque aujourd'hui et qui fera la différence en appel d'offres CHU. + +--- + +## Section E — Non-décisions (ce qu'on ne fait pas) + +- **Dashboard mobile / responsive** : le dashboard est un outil admin, pas un produit grand public. Les TIMs n'en ont pas besoin sur téléphone. **Non.** +- **Multi-thème (clair/sombre)** : sombre tout le temps. **Non.** +- **Internationalisation du dashboard** : tout est en français, cible FR. i18n prévu côté produit Léa, pas côté dashboard admin. **Non pour 2026.** +- **Refonte complète en framework (React/Vue)** : le HTML vanilla + Chart.js tient la route. Une refonte coûterait 2 semaines pour zéro gain utilisateur. **Non.** +- **Authentification OAuth / SSO** : HTTP Basic suffit sur usage interne. SSO hôpital = chantier en soi, ne pas le mélanger avec ce cleanup. **Pas maintenant.** +- **Temps réel sur l'onglet Audit** : le polling toutes les 30 s est largement suffisant. WebSocket = complexité inutile ici. **Non.** + +--- + +## Section F — Roadmap recommandée + +Ordre **non négociable** : on fait le ménage **avant** d'ajouter du neuf. Un onglet Audit brillant au milieu d'un dashboard bruité envoie un signal d'amateurisme. + +### Sprint 1 — Cleanup (0.5 jour) + +- Section B points 1 à 7 (retirer Tests, Apprentissage, Corrections, Exécution, Vue d'ensemble, pages mortes, code orphelin). +- **Livrable** : dashboard à 8 onglets fonctionnels, zéro placeholder, zéro 404 silencieuse. +- **Critère de sortie** : un client invité voit l'interface sans jamais tomber sur une page vide ou une erreur JS. + +### Sprint 2 — Onglet Audit MVP (0.75 jour) + +- Proxy Flask `/api/audit/*` → `http://localhost:5005/api/v1/audit/*` (réutilise le pattern `/api/streaming/`). +- Nouvel onglet "⚖️ Audit & Traçabilité" : bandeau 4 KPIs + filtres + tableau paginé + export CSV. +- **Livrable** : un DSI peut filtrer, visualiser, exporter. +- **Critère de sortie** : scénario CH Auch (voir Section D) exécutable en < 5 min par un utilisateur non technique. + +### Sprint 3 — Audit complet DSI-ready (1.5 jour, à chaud si appel d'offres) + +- Rapport PDF DSI. +- Champ `patient_ref_hash` dans `AuditEntry` + propagation executor. +- Signature d'intégrité journalière (hash du JSONL en clôture). +- Widgets graphiques (camembert + courbe 7 j). +- Alerting seuil d'échecs. +- **Livrable** : conformité démontrable AI Act art. 12 + 14 + RGPD art. 30 + 32. + +### Sprint 4 — Améliorations ciblées (1 à 2 jours, au fil de l'eau) + +- Section C (santé globale Services, filtres Sessions, tail logs WebSocket, retrait graphiques vides Performance, tooltips Config). +- À faire **seulement** quand un TIM ou un DSI remonte un manque précis, pas en préventif. + +--- + +## Annexe — Justification du cleanup + +Pourquoi on supprime plutôt qu'on "met en veille" ? + +1. Chaque onglet coûte en maintenance (CSS, JS, tests manuels, support client). +2. Chaque route Flask morte est une surface d'attaque (surtout `/api/tests/run` qui exécute `pytest` en subprocess). +3. Chaque placeholder visuel dégrade la perception client : "pourquoi il y a un onglet 🧠 Apprentissage qui n'affiche rien ?" +4. Git garde tout. Aucune donnée n'est perdue. Revert possible. + +Principe général : **moins de surface, plus de valeur**. Un dashboard de 9 onglets pleins bat un dashboard de 14 onglets dont 5 creux, tous les jours. diff --git a/docs/PLAN_ACTION_MARS_2026.md b/docs/PLAN_ACTION_MARS_2026.md new file mode 100644 index 000000000..75a7c5109 --- /dev/null +++ b/docs/PLAN_ACTION_MARS_2026.md @@ -0,0 +1,194 @@ +# Plan d'action RPA Vision V3 — Mars 2026 + +**Date** : 10 mars 2026 +**Auteur** : Dom + Claude +**Statut** : En cours de validation + +--- + +## Diagnostic du projet + +### Objectif du projet + +Système RPA **100% basé sur la vision** (pas de sélecteurs DOM/accessibility) capable d'**apprendre par observation** des workflows utilisateur et de les rejouer de manière autonome. + +**Philosophie** : "Observer → Comprendre → Apprendre → Agir" + +**Cas d'usage cible** : milieu médical (facturation T2A, logiciels hospitaliers type HIS) — applications legacy sans API. + +**Progression d'apprentissage** : OBSERVATION → COACHING → AUTO_CANDIDATE → AUTO_CONFIRMED + +### Architecture 5 couches + +``` +Couche 0: RawSession — Capturer clics/clavier/screenshots +Couche 1: ScreenState — Analyser l'écran (image + texte + UI + contexte métier) +Couche 2: UIElement — Détecter boutons/champs/tableaux sémantiquement +Couche 3: StateEmbedding — Créer un "fingerprint" fusionné de l'état d'écran +Couche 4: WorkflowGraph — Modéliser en graphe (nodes = écrans, edges = actions) +``` + +### Etat réel du code vs la vision documentée + +| Composant | Statut | Notes | +|---|---|---| +| Modèles de données (5 couches) | **Complet** | Dataclasses/Pydantic bien structurées | +| Pipeline de détection UI (OWL-v2 + OpenCV + VLM) | **Fonctionnel** | | +| Embedding multi-modal (CLIP + FAISS) | **Fonctionnel** | BUG: composant texte toujours None | +| Learning States (4 niveaux + transitions) | **Implémenté** | | +| ActionExecutor + TargetResolver | **Très complet** | ~2800 lignes, multi-stratégie | +| ExecutionLoop multi-modes | **Implémenté** | | +| Self-healing (4 stratégies) | **Implémenté** | | +| GraphBuilder (RawSession → Workflow) | **Partiel** | Clustering OK, templates incomplets | +| Capture d'événements (clavier/souris) | **Absent du core** | Délégué à agent_v0 (séparé) | +| Construction auto des 4 niveaux ScreenState | **Absent** | OCR jamais peuplé | +| Visual Workflow Builder (éditeur web) | **Fonctionnel** | React + Flask, 20+ composants | + +### Enrichissements documentés (8 concepts) + +| # | Concept | Statut code | +|---|---|---| +| 1 | Grammaire du temps (épisodes) | Partiel — boost temporel, pas de patterns | +| 2 | Marquage du bruit | Manquant — implicite dans DBSCAN, non persisté | +| 3 | Layout signature | Implémenté — `screen_signature.py` | +| 4 | Identité stable | Partiel — target_memory, pas de StableIdentity formelle | +| 5 | Actionnabilité (scores) | Partiel — `is_interactable` bool, pas de score numérique | +| 6 | Versioning des espaces | Implémenté — PrototypeVersion | +| 7 | Variables métier | Partiel — champ présent, intégration non automatisée | +| 8 | Noeuds d'erreur | Manquant — pas de ErrorNode dans le graphe | + +### Problèmes identifiés + +#### Bug critique silencieux +`core/embedding/state_embedding_builder.py` accède à `detected_texts` (avec 's') alors que le champ réel s'appelle `detected_text`. Le composant texte de l'embedding (30% du poids) est **toujours None**. La qualité du matching est silencieusement dégradée. + +#### Pipeline end-to-end non bouclé +La chaîne complète "observer un utilisateur → construire un workflow → le rejouer" n'est pas opérationnelle. La capture d'événements est dans agent_v0 (séparé), le GraphBuilder laisse des TODOs dans les templates, l'OCR ne peuple jamais le ScreenState. + +#### Dette technique massive +- ~660K lignes Python, ~25 000 fichiers +- Centaines de scripts one-shot (classés dans `_a_trier/`) +- 3 frontends VWB abandonnés (classés dans `_a_trier/`) +- agent_v0 de 7.9 Go +- Ratio signal/bruit faible + +#### Dispersion de l'effort +Beaucoup de modules sophistiqués (coaching, analytics, monitoring, sécurité, i18n, training, précision) développés en parallèle, mais la boucle fondamentale n'est pas fiable. + +--- + +## Programme d'action + +### Phase 0 — Stabiliser les fondations (1-2 semaines) + +**Objectif : un pipeline minimal qui tourne de A à Z** + +- [x] **P0-1** Corriger le bug `detected_texts` → `detected_text` dans `state_embedding_builder.py` +- [x] **P0-2** Intégrer la capture d'événements dans le core (`core/capture/event_listener.py` — pynput) +- [x] **P0-3** Implémenter le Screen Analyzer (`core/pipeline/screen_analyzer.py` — ScreenState complet 4 niveaux) +- [x] **P0-4** Compléter le GraphBuilder — `_create_screen_template()` + alignement modèles + fix import circulaire +- [x] **P0-5** Test E2E (`tests/test_pipeline_e2e.py` — 20 tests, pipeline validé avec embeddings mock) + +**Critère de succès** : une démo qui enregistre un workflow simple et le rejoue correctement. + +### Phase 1 — Valider sur un cas réel (2-3 semaines) + +**Objectif : prouver que ça fonctionne sur un vrai logiciel** + +**Prérequis (complétés) :** +- [x] SessionRecorder (`core/capture/session_recorder.py`) — orchestre EventListener + ScreenCapturer +- [x] Script CLI (`scripts/record_and_build.py`) — record / build / full / list +- [x] Fix `_extract_node_vector` dans WorkflowPipeline (support metadata prototypes) +- [x] Nettoyage code mort dans `execute_workflow_step` +- [x] Validation pipeline sur session réelle (66 screenshots → 1 node "Calculatrice") + +**Tâches :** +- [ ] **P1-1** Choisir un workflow simple sur une application réelle (ex : 3 boutons + 1 saisie) +- [ ] **P1-2** Enregistrer 5 sessions de ce workflow (`python scripts/record_and_build.py record`) +- [ ] **P1-3** Vérifier que le GraphBuilder crée un workflow cohérent (`python scripts/record_and_build.py build`) +- [ ] **P1-4** Passer en COACHING → valider les suggestions +- [ ] **P1-5** Passer en AUTO_CANDIDATE → vérifier l'exécution supervisée +- [ ] **P1-6** Mesurer : précision matching, taux succès, temps exécution + +**Critère de succès** : taux de succès > 80% en mode AUTO_CANDIDATE sur le workflow choisi. + +### Phase 2 — Consolider le core (3-4 semaines) + +**Objectif : fiabilité et robustesse** + +- [ ] **P2-1** Implémenter les enrichissements manquants prioritaires : noeuds d'erreur, identité stable formelle, score d'actionnabilité +- [ ] **P2-2** Tests d'intégration sur le pipeline complet +- [ ] **P2-3** Nettoyage `_a_trier/` — décider quoi garder/supprimer/archiver +- [ ] **P2-4** Documentation code core (modules clés uniquement) + +**Critère de succès** : couverture de tests > 60% sur le pipeline core, zéro bug silencieux connu. + +### Phase 3 — Produit utilisable (4-6 semaines) + +**Objectif : le VWB comme outil complet** + +- [ ] **P3-1** Intégrer le pipeline core dans le VWB (aligner les services VWB sur core/) +- [ ] **P3-2** Supprimer l'ancien frontend VWB (garder uniquement frontend_v4) +- [ ] **P3-3** Workflow complet dans le VWB : enregistrer → éditer → tester → déployer +- [ ] **P3-4** Mode démo pour présentation (prospects/investisseurs) + +**Critère de succès** : un utilisateur non technique peut enregistrer et rejouer un workflow via le VWB. + +### Ce qu'on ne fait PAS maintenant + +- Ajouter de nouvelles fonctionnalités (analytics avancé, coaching amélioré, multi-écran) +- Refactorer la structure des 28 sous-modules +- Migrer vers un autre framework web +- Développer agent_v1 tant que le pipeline core n'est pas bouclé + +--- + +## Métriques de suivi + +| Métrique | Cible Phase 0 | Cible Phase 1 | Cible Phase 3 | +|---|---|---|---| +| Pipeline end-to-end fonctionnel | Oui (cas simple) | Oui (cas réel) | Oui (multi-cas) | +| Taux de succès AUTO_CANDIDATE | N/A | > 80% | > 90% | +| Temps enregistrement → workflow | < 5 min | < 5 min | < 2 min | +| Bugs silencieux connus | 0 | 0 | 0 | +| Couverture tests pipeline | Smoke test | > 40% | > 60% | + +--- + +## Fichiers clés à connaître + +### Core — Modèles +- `core/models/raw_session.py` — RawSession, Event, Screenshot +- `core/models/screen_state.py` — ScreenState (4 niveaux) +- `core/models/ui_element.py` — UIElement, BBox, VisualFeatures +- `core/models/state_embedding.py` — StateEmbedding, EmbeddingComponent +- `core/models/workflow_graph.py` — Workflow, WorkflowNode, WorkflowEdge, LearningState + +### Core — Pipeline +- `core/capture/screen_capturer.py` — Capture screenshots (mss) +- `core/detection/ui_detector.py` — Pipeline OWL-v2 + OpenCV + VLM +- `core/embedding/state_embedding_builder.py` — Construction StateEmbedding (**BUG ligne ~216**) +- `core/embedding/clip_embedder.py` — OpenCLIP ViT-B-32 +- `core/embedding/faiss_manager.py` — Index FAISS +- `core/graph/graph_builder.py` — RawSession → Workflow (DBSCAN, **TODOs templates**) + +### Core — Exécution +- `core/execution/action_executor.py` — Exécution des actions +- `core/execution/target_resolver.py` — Résolution multi-stratégie (~2800 lignes) +- `core/execution/execution_loop.py` — Orchestration des modes +- `core/healing/healing_engine.py` — Self-healing (4 stratégies) +- `core/learning/learning_manager.py` — Machine à états d'apprentissage + +### Points d'entrée +- `run.sh` — Chef d'orchestre (--full, --gui, --server, etc.) +- `Makefile` — Tests (make test, make test-fast, make check) +- `visual_workflow_builder/run_v4.sh` — VWB frontend_v4 + +### Documentation de référence +- `docs/reference/ARCHITECTURE_VISION_COMPLETE.md` — Architecture 5 couches +- `docs/reference/ARCHITECTURE_ENRICHISSEMENTS.md` — 8 enrichissements +- `docs/PLAN_ACTION_MARS_2026.md` — Ce fichier + +--- + +**Priorité absolue : Phase 0 — Boucler le pipeline end-to-end.** diff --git a/docs/PLAN_ACTION_VWB.md b/docs/PLAN_ACTION_VWB.md new file mode 100644 index 000000000..86750c6ef --- /dev/null +++ b/docs/PLAN_ACTION_VWB.md @@ -0,0 +1,273 @@ +# Plan d'action VWB — 13 avril 2026 + +Audit ciblé du **Visual Workflow Builder** (`visual_workflow_builder/`) — backend Flask port 5002, frontend React+Vite port 3002 — suite aux retours flous de Dom : « la bibliothèque s'efface tout le temps » + idée d'importer les workflows Léa pour les corriger. + +--- + +## Section A — État des lieux + +### Stack réelle en production (PIDs live) + +- **Backend 5002** → `backend/app.py` (Flask complet, blueprints v3, SQLAlchemy) — **c'est celui qui sert le VWB** +- **Backend 5003** → `backend/app_lightweight.py` (serveur HTTP natif fallback, 1451 lignes, mode quasi-inutile aujourd'hui) +- **Frontend 3002** → `frontend_v4/` (Vite + React 18, `@xyflow/react`, TypeScript) — actif +- **BDD utilisée** → `backend/instance/workflows.db` (via `.env DATABASE_URL=sqlite:///workflows.db`) — **3 workflows** dedans (« Classement de dossier », « bloc notes », « Onlyoffice »), tous `source='manual'`, aucun `review_status` +- **BDD fantôme** → `backend/instance/vwb_v3.db` (schema identique, **0 workflows**) — zombie de `app.py` ligne 47 (`'sqlite:///vwb_v3.db'` en défaut) + +### Ce qui marche bien + +- **API v3** est complète et propre : 44 routes réparties (`session`, `workflow`, `capture`, `execute`, `match`, `review`, `learned_workflows`, `dag_execute`). Modèles SQLAlchemy avec champs review (`source`, `review_status`, `review_feedback`, `reviewed_at`). +- **Pont Léa ↔ VWB déjà implémenté et câblé** : + - Backend : `api_v3/learned_workflows.py` (459 l.) + `services/learned_workflow_bridge.py` (604 l.) + - Frontend : `services/api.ts` expose `getLearnedWorkflows`, `importLearnedWorkflow`, `exportForLea` ; `components/WorkflowSelector.tsx` charge et propose d'importer les workflows non-importés + - Endpoints fonctionnels : logs du 15 avril montrent `GET /api/v3/learned-workflows?os=linux → 200` +- **Système de review** : composants `ReviewModal.tsx`, `WorkflowValidation.tsx`, `WorkflowManagerModal.tsx` + backend `api_v3/review.py` prêt. Un workflow importé arrive en `review_status='pending_review'`. +- Tests backend localisés : `backend/tests/` (test_models.py, test_coaching_api.py). Workflow CRUD complet. +- Logs rotatifs propres (`backend/logs/vwb.log`, 5 MB × 3). + +### Ce qui est cassé / douteux + +1. **BUG CRITIQUE — Bibliothèque de captures qui s'efface** + Fichier : `frontend_v4/src/components/CaptureLibrary.tsx` lignes 25-62 + - Stockage dans **`sessionStorage`** (clé `captureLibrary_v2`) → purgé à chaque fermeture d'onglet ou redémarrage du navigateur + - Cap arbitraire à **50 captures** max (`slice(0, 49)`) + - Les captures sont des base64 PNG → sessionStorage ne tient pas plus de quelques dizaines de Mo au total + - C'est très probablement **le bug** que Dom décrit + +2. **BUG — Deux composants concurrents pour la même bibliothèque** + - `CaptureLibrary.tsx` écrit dans `sessionStorage['captureLibrary_v2']` + - `CapturePanel.tsx` lignes 51-62 écrit dans `sessionStorage['captureLibrary']` (ancienne clé, jamais migrée à l'envers) + - Résultat : deux listes de captures tenues en parallèle, désynchronisées, invisibles l'une pour l'autre + +3. **Base fantôme `vwb_v3.db`** + - `app.py` l.47 : `'sqlite:///vwb_v3.db'` en défaut + - Si un jour `.env` n'est pas chargé (ex : systemd mal configuré), le VWB passe silencieusement sur l'autre BDD **vide** et Dom voit ses workflows disparaître + - Dette : deux fichiers `instance/` (`backend/instance/` et `visual_workflow_builder/instance/`) créent de la confusion + +4. **404 en prod — `/api/correction-packs/stats`** + - Logs récents : deux 404 à chaque chargement + - La route n'existe pas côté backend, elle est appelée par le **frontend legacy** (`frontend/src/hooks/useCorrectionPacks.ts`) + - Dom voit sans doute des erreurs CORS/404 dans la console réseau selon quel frontend il ouvre + +5. **Double logging (tous les logs en double)** + - `app.py` attache un handler au **root logger** + Flask attache le sien → chaque ligne loguée deux fois + - Bruit dans les logs, rend le debug plus dur + +6. **Confusion run.sh vs run_v4.sh** + - `run.sh` lance frontend legacy port 3000 (via webpack react-scripts) + app.py + - `run_v4.sh` lance frontend_v4 port 3002 + app.py + - Les deux coexistent, Dom peut cliquer sur l'un ou l'autre sans savoir + - `launch.sh` mentionné dans le README **n'existe pas** (README obsolète) + +7. **Workflow « Unnamed Workflow »** + - Les JSON Léa ont souvent `"name": "Unnamed Workflow"` (cf. `notepad_enriched.json`) + - L'import les reprend tel quel — la liste du VWB devient illisible vite + +8. **Tests d'intégration VWB datent de janvier** + - `tests/integration/test_vwb_*.py` : 6 fichiers + - `tests/property/test_vwb_frontend_v2_*` : 14 fichiers — ciblent `frontend/` (v2), pas `frontend_v4/` + - Aucun test cible le pont learned_workflows → pas de garde-fou pour C2 + +### Dette technique identifiable + +- **3 backends Flask** (`app.py`, `app_lightweight.py`, `app_catalogue_simple.py`) pour 403 + 1451 + 1370 lignes = 3224 lignes. Un seul tourne. +- **2 frontends** (`frontend/` = react-scripts v2, `frontend_v4/` = Vite v4) avec duplication partielle des composants — seul le v4 est vivant +- **2 bases SQLite** nommées différemment, schéma identique +- **`catalog_routes.py.backup_20260122_163105`** (127 Ko) traîne dans le repo +- Screenshots `.screenshot2026-*.png` (8 fichiers × ~220 Ko) traînent à la racine backend +- Migrations Alembic présentes mais **un seul fichier** (`001_initial_schema.py`) alors que le schéma a évolué (`review_status` ajouté après) + +--- + +## Section B — Quick wins (< 1 jour chacun) + +Classés par ratio impact/effort décroissant : + +### B1. 🔥 Migrer la bibliothèque de captures de `sessionStorage` vers `localStorage` +**Effort** : 30 min +**Impact** : résout le bug principal rapporté par Dom +- Remplacer `sessionStorage.*` par `localStorage.*` dans `CaptureLibrary.tsx` et `CapturePanel.tsx` +- Unifier sur une seule clé `captureLibrary_v3` (migration ascendante depuis les deux anciennes) +- Augmenter le cap à 200 captures + ajouter un bouton « vider la bibliothèque » +- Attention : `localStorage` plafonne ~5 Mo, les PNG base64 saturent vite — **meilleure option** : persister côté backend via `/api/v3/capture/library` (ajout d'une petite table) et ne garder que des IDs+thumbnails en localStorage + +### B2. 🔥 Renommer le fichier « Unnamed Workflow » à l'import +**Effort** : 20 min +**Impact** : moyen (lisibilité immédiate dans la liste) +- `api_v3/learned_workflows.py` l.210 : si `wf_meta["name"] == "Unnamed Workflow"` → `f"Appris {datetime:%d/%m %H:%M}"` +- Idem exposer ce nom dans `WorkflowSelector.tsx` ligne 120 quand on affiche la liste learned + +### B3. Supprimer la BDD fantôme +**Effort** : 15 min +**Impact** : élimine un foot-gun discret +- Modifier `app.py` l.47 : défaut `'sqlite:///workflows.db'` (aligné sur `.env`) +- Supprimer `backend/instance/vwb_v3.db` + `visual_workflow_builder/instance/workflows.db` (vestige) +- Documenter dans le `.env.example` le chemin absolu recommandé + +### B4. Corriger le double logging +**Effort** : 15 min +**Impact** : faible (quality-of-life debug) +- `app.py` l.40 : remplacer `logging.getLogger().addHandler(...)` par `app.logger.addHandler(...)` et `logging.getLogger('werkzeug').addHandler(...)`, puis `propagate = False` + +### B5. Supprimer le 404 `/api/correction-packs/stats` +**Effort** : 20 min +**Impact** : faible (erreurs dans la console navigateur) +- Option A (propre) : stubber la route dans `api/correction_packs.py` qui retourne `{"success": true, "stats": {"total": 0}}` +- Option B : retirer l'appel côté `frontend/src/hooks/useCorrectionPacks.ts` ligne 229 +- Option B préférable si le frontend legacy est condamné (voir E1) + +### B6. Nettoyer les fichiers parasites +**Effort** : 10 min +**Impact** : cosmétique + réduire la confusion +- Supprimer `backend/catalog_routes.py.backup_20260122_163105` (127 Ko) +- Supprimer les 8 screenshots `.screenshot2026-*.png` à la racine backend +- `.gitignore` : ajouter `*.screenshot*.png`, `*.backup_*` + +### B7. Clarifier run.sh +**Effort** : 20 min +**Impact** : moyen (Dom et moi perdons du temps sur quel frontend lancer) +- Renommer `run.sh` → `run_legacy.sh` avec bandeau warning +- Mettre à jour `README.md` du VWB pour refléter `run_v4.sh` comme canonique +- Supprimer la mention `launch.sh` qui n'existe pas + +**Total Quick Wins : ~2h30 de dev** pour résoudre la douleur principale + 4 dettes visibles. + +--- + +## Section C — Chantiers moyens (1-3 jours) + +### C1. Finaliser le flux « Import Léa → review VWB → replay » +**Effort** : 1 jour +**Contexte** : toute la plomberie existe (backend+frontend), mais la boucle n'est pas testée end-to-end depuis le premier replay réussi du 13 avril. Actuellement `source='learned_import'` déclenche bien `review_status='pending_review'`, mais : +- Le frontend n'a **pas de banner** « ⚠ 2 workflows importés en attente de review » visible au démarrage (il y a bien un `pendingReviewCount` dans `App.tsx` mais je n'ai pas vérifié son affichage) +- Quand Dom ouvre un workflow en `pending_review`, aucun indicateur visuel sur les étapes automatiquement générées par le bridge (ex: warning sur les `compound` décomposés, warning sur les `by_position` convertis en `x_pct/y_pct`) +- Pas de bouton « rejouer le workflow tel quel sans review » pour tester vite + +**Actions** : +1. Vérifier l'affichage `pendingReviewCount` dans le header + ajouter un badge coloré +2. Dans `StepNode.tsx`, afficher un ⚠️ quand `step.parameters.compound_steps` existe ou quand `metadata.core_edge_id` manque d'info +3. Exposer les `warnings` retournés par l'import dans un panneau dépliant sur le workflow importé +4. Bouton « Valider et exécuter » qui passe `review_status='approved'` puis lance le replay via `/execute` + +### C2. Persister la bibliothèque de captures côté serveur +**Effort** : 1,5 jour +**Contexte** : extension de B1 si on veut une bibliothèque réellement persistante et partagée entre sessions/machines +- Nouvelle table `captures_library(id, screenshot_b64, timestamp, label, favorite, workflow_id NULL)` +- Endpoints `GET/POST/DELETE /api/v3/captures/library` +- `CaptureLibrary.tsx` : fetch initial + mutations, plus de localStorage +- Bonus : associer une capture à un step (fav pour référence future) + +### C3. Unifier les deux frontends — retirer `frontend/` (legacy) +**Effort** : 2 jours (avec vérif de non-régression) +**Contexte** : `frontend/` (v2 React 19 + MUI + Redux) n'est plus maintenu, `frontend_v4/` (Vite + xyflow) est la cible. 14 tests `tests/property/test_vwb_frontend_v2_*` pointent vers le v2. +- Auditer ce que le v4 ne fait pas encore (CorrectionPacksDashboard, CoachingPanel, etc.) → décider si on porte ou si on abandonne +- Archiver `frontend/` dans `_archives/` ou le supprimer +- Désactiver `run.sh` ou le refaire pointer sur v4 +- Porter ou supprimer les tests `test_vwb_frontend_v2_*` + +### C4. Consolider les 3 `app*.py` +**Effort** : 1 jour +**Contexte** : `app.py` est le seul utilisé pour le VWB. `app_lightweight.py` sert uniquement à l'endpoint catalogue VLM sur 5003 (un seul endpoint utile). `app_catalogue_simple.py` n'est plus référencé. +- Supprimer `app_catalogue_simple.py` +- Déplacer le seul endpoint utile de `app_lightweight.py` dans `app.py` + retirer le port 5003 de `services.conf` +- Supprimer `app_lightweight.py` +- Gain : -2800 lignes, un seul point d'entrée + +### C5. Lier étape VWB ↔ screenshot source du workflow Léa +**Effort** : 2 jours +**Contexte** : actuellement quand on importe un workflow Léa, les steps sont **des actions sans contexte visuel**. Pour pouvoir « corriger visuellement » (idée Dom), il faut que chaque step affiche : +- Le screenshot `from_node` (état avant l'action) +- Le screenshot `to_node` (état après) +- Les bbox cliquées (target) +- Les workflows Léa contiennent déjà des `screenshot_hash` dans leurs nodes (à vérifier dans `notepad_enriched.json`) +- Modifier `convert_learned_to_vwb_steps` pour persister les screenshots en tant que `VisualAnchor` + `anchor_id` sur le step +- Enrichir `StepNode.tsx` pour afficher la vignette + +**Note** : c'est ce qui donne du sens à l'idée de Dom. Sans ça, l'import Léa→VWB donne des étapes abstraites « click(x=42%, y=68%) » que personne ne peut corriger visuellement. + +--- + +## Section D — Chantiers lourds (>1 semaine) + +### D1. Refonte du stockage workflow : un seul format canonique +**Effort** : 1-2 semaines +**Justification** : aujourd'hui on a 2 formats (core JSON de Léa vs SQLite VWB) avec un bridge. Le bridge perd de l'information (ex: `compound` décomposé, metadata core/screenshots abandonnés en route). À chaque nouvelle feature du core (C2 aujourd'hui, grounding, extraction, etc.) il faut mettre à jour le bridge. + +**Proposition** : VWB stocke directement le format core JSON (ou un surset strict). Les « steps » VWB deviennent une **vue dérivée** du graphe core, pas une copie. Les corrections humaines modifient le JSON core. + +**À faire seulement si** l'import Léa→VWB devient un flux majeur et que le bridge montre ses limites. Pour l'instant, le bridge fait le job. + +### D2. Mode collaboratif / multi-utilisateurs +**Effort** : 2-3 semaines +**Justification** : aucune pour aujourd'hui. Dom est seul à utiliser le VWB. À garder dans le coin de la tête pour quand les premiers clients testeront. + +--- + +## Section E — Non-décisions + +Choses qu'on **ne fera pas**, pour se prémunir des tentations. + +### E1. Ne PAS réécrire le frontend en v5 +Pourquoi : le v4 Vite+xyflow est récent (mars 2026), propre, bien structuré. Pas de raison architecturale. La migration v3→v4 a déjà coûté cher (cf. nombreux `CORRECTION_TYPESCRIPT_*.md` en janvier). + +### E2. Ne PAS unifier `instance/*.db` en PostgreSQL +Pourquoi : SQLite convient pour un outil desktop mono-utilisateur. PostgreSQL ajoute une dépendance runtime sans valeur tangible tant qu'on est seul. Le `.env` mentionne déjà l'option, gardée pour plus tard. + +### E3. Ne PAS porter CorrectionPacksDashboard sur le v4 +Pourquoi : la fonctionnalité « correction packs » est en doublon conceptuel avec le nouveau flux `review_status` + `learned_workflow_bridge`. Autant fermer proprement correction_packs (C4 bis) plutôt que le migrer. + +### E4. Ne PAS rajouter de tests property pour le v4 tout de suite +Pourquoi : 14 tests `test_vwb_frontend_v2_*` existent déjà et ne tournent plus (pointent vers le v2). Avant de recréer des tests property, il faut décider si on garde le v2 ou pas (C3). Refaire 14 tests pour les jeter dans 2 semaines = gâchis. + +### E5. Ne PAS implémenter le mode WebSocket realtime pour le VWB +Pourquoi : le polling actuel (500 ms dans `App.tsx`) suffit pour l'usage. WebSocket existe déjà (`socketio`) mais n'est câblé nulle part dans le v4. On peut l'ajouter quand une vraie feature le demande (ex: collaborative editing = E1/D2 → pas maintenant). + +--- + +## Section F — Recommandation d'ordre + +**Semaine 1 — quick wins utilisateur (jour J)** +1. B1 — localStorage pour CaptureLibrary (30 min) → résout le bug principal +2. B2 — nom lisible à l'import (20 min) → la liste devient utilisable +3. B3 — supprimer BDD fantôme (15 min) → évite un bug futur +4. B6 — nettoyer les fichiers parasites (10 min) → hygiène +5. B7 — clarifier run.sh (20 min) → moins de confusion + +Total : ~2h de dev pour un retour utilisateur net dès demain. + +**Semaine 1 — chantier moyen utile (jours J+1 à J+3)** +6. C1 — finaliser le flux « Import Léa → review → replay ». C'est la VALEUR DIRECTE de l'idée de Dom : « importer les workflows Léa pour les corriger visuellement ». + +**Semaine 2 — étendre la valeur (si C1 tient la route)** +7. C5 — lier step ↔ screenshot source. C'est ce qui transforme le VWB en **vrai outil de correction visuelle**. Sans ça, l'import Léa est abstrait. + +**Semaine 3+ — consolidation (quand bande passante)** +8. C3 — retirer frontend legacy (gain de clarté) +9. C4 — consolider les 3 `app*.py` (gain dette) +10. C2 — bibliothèque captures serveur (si B1 montre ses limites) + +**Justification globale** : +- **Les 2h de quick wins** donnent à Dom une expérience visible et immédiate (bibliothèque qui ne s'efface plus, liste lisible, moins de bruit). +- **C1** capitalise sur l'investissement existant (le pont Léa/VWB est déjà codé à 80%, il faut juste finir le dernier kilomètre — les warnings visuels et le bouton « valider et exécuter »). +- **C5** est le vrai game-changer pour l'idée de Dom, mais ne vaut le coup que si C1 a confirmé que le flux globalement fonctionne. Si C1 révèle que le bridge perd trop d'info, on saute direct à D1 (refonte). +- **C3/C4** sont de la dette : on s'en occupe quand on a quelqu'un sous la main pour pas ralentir les features. + +**À éviter** : commencer par C3 ou C4 (dette) parce qu'aucun impact utilisateur visible → pas de ROI court terme. + +--- + +## Risques identifiés + +- **Backup BDD** : `backend/instance/backups/` contient un seul backup du 23/01. Aucune rotation automatique. Risque de perte : 3 workflows seulement mais ce sont ceux de Dom → ajouter un backup quotidien via `backup_ssd.sh` (déjà existant à la racine `~/ai/`). +- **`localStorage` quota** : B1 seul ne suffira pas à long terme. Prévoir C2 si Dom fait plus de 50-100 captures en PNG base64. +- **Modèle `Workflow` sans cascade sur source='learned_import'** : si Dom supprime un workflow importé, rien ne met à jour le JSON core sur disque → divergence. Acceptable tant que l'import est monodirectionnel (disque → VWB) mais à surveiller. + +--- + +## Métriques de succès + +- Bibliothèque persiste après reload navigateur : testable manuellement en 30 s +- Liste de workflows ne contient plus « Unnamed Workflow » : testable via SQL +- Un workflow Léa importé a un badge « à réviser » visible, et le bouton « Valider et exécuter » le fait tourner sans quitter le VWB +- 0 warning 404 dans `backend/logs/vwb.log` après B5 +- `run_v4.sh` unique script documenté dans README diff --git a/docs/PLAN_TEST_HUMAIN_16AVRIL.md b/docs/PLAN_TEST_HUMAIN_16AVRIL.md new file mode 100644 index 000000000..34d2e371a --- /dev/null +++ b/docs/PLAN_TEST_HUMAIN_16AVRIL.md @@ -0,0 +1,566 @@ +# Plan de test humain — 16 avril 2026 matin + +**Cible** : valider le nouveau ZIP Léa (Lea_v1.0.0.zip reconstruit avec C2 + enrichissement UI + fail-safe UAC + enrollment fleet) sur la VM Windows 11. + +**Durée estimée** : 45 min si tout passe, 1h30 si un test bloque. +**Principe général** : tests du plus simple au plus complexe. Ne pas sauter d'étape, chaque test dépend du précédent. + +--- + +## Section 1 — Pré-requis (checklist 5 min) + +### 1.1 — Côté serveur Linux (poste Dom) + +Ouvrir un terminal et vérifier dans l'ordre : + +```bash +cd /home/dom/ai/rpa_vision_v3 + +# 1) Services up (systemd user) +./svc.sh status + +# On doit voir actifs au minimum : +# streaming (5005) — OBLIGATOIRE +# dashboard (5001) — OBLIGATOIRE +# api (8000) — utile mais pas bloquant +# vwb-backend (5002), vwb-frontend (3002) — pour regarder les workflows enrichis + +# 2) Ollama tourne avec le modèle VLM attendu +curl -s http://localhost:11434/api/tags | grep -E "gemma4|ui-tars|qwen" | head -5 + +# 3) Token API effectif (doit correspondre à celui de config.txt sur la VM) +grep -E "^RPA_API_TOKEN" .env .env.local 2>/dev/null | head -2 +# Attendu : 86031addb338e449fccdb1a983f61807aec15d42d482b9c7748ad607dc23caab + +# 4) Endpoint streaming répond +curl -s http://localhost:5005/health | head +# Attendu : {"status":"ok",...} + +# 5) Dashboard répond (401 attendu sans auth — c'est la preuve que l'auth est active) +curl -sI http://localhost:5001/ | head -3 +# Attendu : HTTP/1.1 401 Unauthorized + WWW-Authenticate: Basic + +# 6) Endpoint fleet accessible (sans auth — c'est un endpoint API_TOKEN) +curl -s http://localhost:5005/api/v1/agents/fleet | head -200 +# Attendu : JSON avec active/uninstalled/total_active/total_uninstalled +``` + +**Si un service est down** : `./svc.sh start ` puis `./svc.sh logs ` pour vérifier. + +### 1.2 — Accès exposé Internet (à tester depuis la VM) + +- `https://lea.labs.laurinebazin.design/health` → doit renvoyer 200 OK (proxy NPM → streaming 5005) +- `https://vwb.labs.laurinebazin.design/` → challenge auth Basic `lea` / `Medecin2026!` + +### 1.3 — Côté VM Windows + +- VM démarrée, session Windows 11 ouverte (compte local, pas domaine) +- Accès RDP ou console (Spice) fonctionnel +- Internet OK sur la VM : ouvrir Edge, faire `https://lea.labs.laurinebazin.design/health`, doit renvoyer `ok` +- **Si aucune instance Léa précédente installée** : rien à faire. +- **Si une instance Léa précédente est déjà installée** : noter le chemin (`C:\rpa_vision\` ou `C:\Lea\`) et **conserver `config.txt`** à portée de main pour restaurer le token. + +### 1.4 — Fichiers à avoir sous la main + +Sur le poste Dom, dans `~/ai/rpa_vision_v3/deploy/` : + +- `Lea_v1.0.0.zip` (ZIP fraîchement reconstruit — vérifier la date : `ls -la deploy/Lea_v1.0.0.zip`) +- `lea_package/config.txt` (référence si on veut vérifier le contenu attendu) +- `lea_package/LISEZMOI.txt` (pour référence utilisateur) + +**Commande utile** pour vérifier la fraîcheur du ZIP : +```bash +ls -la /home/dom/ai/rpa_vision_v3/deploy/Lea_v1.0.0.zip +unzip -l /home/dom/ai/rpa_vision_v3/deploy/Lea_v1.0.0.zip | head -20 +``` + +--- + +## Section 2 — Déploiement du nouveau ZIP sur la VM (10 min) + +### 2.1 — Transférer le ZIP sur la VM + +**Option A — Drag & drop VirtualBox/VMware** : déposer `Lea_v1.0.0.zip` dans `C:\Users\\Downloads\`. + +**Option B — scp (si SSH actif sur la VM)** : +```bash +scp /home/dom/ai/rpa_vision_v3/deploy/Lea_v1.0.0.zip user@192.168.x.x:/C:/Users//Downloads/ +``` + +**Option C — navigateur** : depuis la VM, aller sur `https://vwb.labs.laurinebazin.design/downloads/Lea_v1.0.0.zip` (si exposé — sinon utiliser A ou B). + +### 2.2 — Arrêter l'instance Léa existante (si présente) + +Sur la VM, ouvrir un terminal PowerShell ou cmd : + +```cmd +:: Chercher le lock de l'ancienne instance +type C:\rpa_vision\lea_agent.lock +:: Si un PID apparaît, le tuer proprement : +taskkill /F /PID + +:: Vérifier qu'aucun pythonw.exe Lea ne tourne plus +tasklist | findstr pythonw +``` + +Ne JAMAIS faire `taskkill /F /IM pythonw.exe` (tuerait Jupyter, Anaconda, etc.). + +### 2.3 — Sauvegarder l'ancien config.txt + +```cmd +copy C:\rpa_vision\config.txt C:\Users\\Desktop\config.txt.backup +``` + +### 2.4 — Extraire le nouveau ZIP + +```cmd +:: Renommer l'ancien dossier (rollback si besoin) +ren C:\rpa_vision C:\rpa_vision_old_16avril + +:: Extraire le ZIP via l'explorateur (clic droit → Extraire tout → C:\rpa_vision) +:: OU via PowerShell : +powershell -command "Expand-Archive -Path C:\Users\\Downloads\Lea_v1.0.0.zip -DestinationPath C:\rpa_vision -Force" +``` + +### 2.5 — Restaurer le token dans config.txt + +Ouvrir `C:\rpa_vision\config.txt` dans Notepad et vérifier : + +``` +RPA_SERVER_URL=https://lea.labs.laurinebazin.design/api/v1 +RPA_API_TOKEN=86031addb338e449fccdb1a983f61807aec15d42d482b9c7748ad607dc23caab +RPA_SERVER_HOST=lea.labs.laurinebazin.design +RPA_BLUR_SENSITIVE=false +``` + +**Important** : le token doit correspondre à celui du serveur (cf. Section 1.1 étape 3). + +### 2.6 — Premier lancement + +Double-cliquer sur `C:\rpa_vision\install.bat` (si premier déploiement — crée `.venv`). + +Puis lancer `C:\rpa_vision\Lea.bat`. Une console s'ouvre 3 secondes, puis une icône apparaît dans la zone de notification Windows (près de l'horloge). + +**Preuve que ça tourne** : +- Fichier `C:\rpa_vision\lea_agent.lock` contient un PID +- `tasklist | findstr pythonw` retourne au moins une ligne + +Si rien n'apparaît, voir Section 4 (diagnostic). + +--- + +## Section 3 — Tests fonctionnels (ordre important) + +### Test 1 — Baseline + streaming + enrollment (objectifs 1, 2, 8) + +**Pré-conditions** : Léa vient de démarrer sur la VM, icône visible dans systray. + +**Actions** : +1. Côté Dom, lancer un watch sur les logs streaming : + ```bash + ./svc.sh logs streaming -f + ``` +2. Côté VM, clic droit sur l'icône Léa → "Apprenez-moi une tâche" (ou équivalent dans le menu). +3. Faire une action triviale : ouvrir le menu Démarrer, taper `notepad`, valider. +4. Clic droit sur Léa → "C'est terminé". + +**Observations attendues** côté serveur : +- `[STREAM] register session_id=...` dès le démarrage +- `[STREAM] event ...` pour chaque click/touche +- `[STREAM] image ...` pour chaque screenshot (un par action) +- `[FLEET] Agent enrolé (created) : machine_id=...` au premier lancement uniquement + +**Critères de succès** : +- La session apparaît dans : + ```bash + curl -s http://localhost:5005/api/v1/traces/stream/sessions | python3 -m json.tool | head -40 + ``` +- L'agent apparaît dans `/fleet` : + ```bash + curl -s http://localhost:5005/api/v1/agents/fleet | python3 -m json.tool + ``` + → `total_active >= 1`, avec `machine_id`, `hostname`, `version`, `enrolled_at` récent. + +**Critères d'échec** : +- Aucun log streaming → voir Section 4 lignes "Token invalide" / "Agent ne démarre pas" +- Événements reçus mais pas d'image → voir Section 4 "images non streamées" + +--- + +### Test 2 — Auth dashboard (objectif 7) + +**Pré-conditions** : dashboard service up (cf. 1.1). + +**Actions depuis la VM** : +1. Ouvrir `https://vwb.labs.laurinebazin.design/` → challenge Basic Auth → saisir `lea` / `Medecin2026!` +2. Ouvrir le dashboard local (si exposé) ou tester en direct depuis Dom : + ```bash + curl -s -u lea:changeme-dashboard-Medecin2026! http://localhost:5001/ | head -20 + ``` + +**Critère de succès** : page HTML renvoyée (pas de 401). + +**Critère d'échec** : 401 persistant → vérifier `DASHBOARD_PASSWORD` dans l'env systemd : +```bash +systemctl --user show rpa-vision-v3-dashboard | grep DASHBOARD_PASSWORD +``` + +--- + +### Test 3 — Enrichissement UI côté serveur (objectif 3, C2) + +**Pré-conditions** : Test 1 exécuté, session créée et finalisée. + +**Actions** : +```bash +# Récupérer l'ID de la dernière session +SESS=$(curl -s http://localhost:5005/api/v1/traces/stream/sessions | \ + python3 -c "import json,sys; d=json.load(sys.stdin); print(d[-1]['session_id'])") +echo "Session : $SESS" + +# Récupérer la session détaillée (doit contenir les ScreenStates enrichis) +curl -s "http://localhost:5005/api/v1/traces/stream/session/$SESS" \ + | python3 -m json.tool > /tmp/sess_16avril.json +wc -l /tmp/sess_16avril.json +``` + +**Vérifier le contenu des ScreenStates persistés** : +```bash +# Les ScreenStates JSON sont sauvegardés sous data/screen_states// +find /home/dom/ai/rpa_vision_v3/data/screen_states -name "state_*.json" -newer /tmp/sess_16avril.json -type f 2>/dev/null | head -5 + +# Pour un fichier donné, vérifier ui_elements ET detected_text non vides +LAST_STATE=$(find /home/dom/ai/rpa_vision_v3/data/screen_states -name "state_*.json" -type f -printf '%T@ %p\n' | sort -n | tail -1 | awk '{print $2}') +python3 -c " +import json +d = json.load(open('$LAST_STATE')) +print('ui_elements count:', len(d.get('ui_elements', []))) +print('detected_text len:', len(d.get('detected_text', ''))) +print('sample ui_element:', d.get('ui_elements', [{}])[0] if d.get('ui_elements') else 'NONE') +" +``` + +**Critères de succès** : +- `ui_elements count >= 3` sur un écran normal (Notepad ouvert ~5-15 éléments) +- `detected_text len > 20` (le texte OCR doit contenir des mots lisibles) +- Au moins un `ui_element` avec un `role` rempli (`button`, `textbox`, `menu`, etc.) + +**Critère d'échec** : `ui_elements count == 0` partout → C2 ne tourne pas côté serveur. Vérifier logs `./svc.sh logs streaming | grep -iE "detect|ocr|screen_analyzer"`. + +--- + +### Test 4 — Target resolution (objectifs 4, C1 + Lot E) + +**Pré-conditions** : une session Test 1 réussie, avec au moins 2-3 actions. + +**Actions** — demander un replay via l'endpoint : +```bash +curl -s -X POST http://localhost:5005/api/v1/traces/stream/replay \ + -H "Authorization: Bearer 86031addb338e449fccdb1a983f61807aec15d42d482b9c7748ad607dc23caab" \ + -H "Content-Type: application/json" \ + -d "{\"session_id\": \"$SESS\", \"mode\": \"dry_run\"}" \ + | python3 -m json.tool > /tmp/replay_plan.json +``` + +**Vérifications** : +```bash +# Le plan doit contenir des TargetSpec avec by_role / by_text, pas juste des coordonnées +grep -E "\"by_role\"|\"by_text\"" /tmp/replay_plan.json | head -10 +grep -E "\"unknown_element\"" /tmp/replay_plan.json | wc -l +``` + +**Critères de succès** : +- Au moins 50% des `TargetSpec` ont un `by_role` OU un `by_text` non null +- Moins de 20% des cibles sont marquées `unknown_element` + +**Critère d'échec** : 100% `unknown_element` → target_resolver ne lit pas les `ui_elements`. Relire logs streaming pour erreurs d'import. + +--- + +### Test 5 — Cache context-aware (objectif 5, Lot D) + +**But** : s'assurer que deux workflows différents sur le même écran ne partagent pas le cache de target resolution. + +**Actions** (simplifié — pas de test unitaire ici, juste observation) : +1. Côté VM, enregistrer une session 1 : ouvrir Bloc-notes, cliquer sur menu "Fichier" → "Nouveau". +2. Arrêter l'enregistrement ("C'est terminé"). +3. Redémarrer un enregistrement (session 2) : même écran Bloc-notes, mais cliquer "Fichier" → "Enregistrer". +4. Arrêter. + +**Vérifications côté serveur** : +```bash +./svc.sh logs streaming | grep -iE "cache_key|cache hit|context_hints" | tail -20 +``` + +**Critère de succès** : les `cache_key` des deux sessions diffèrent même si le ScreenState est similaire (le `context_hints` dans la clé fait la différence). + +**Critère d'échec** : même `cache_key`, même résultat → bug Lot D. Pas bloquant pour la démo mais à noter. + +--- + +### Test 6 — Fail-safe UAC (objectif 6, P0-D) + +**But** : un popup UAC bloque le replay proprement. + +**Actions** : +1. Côté VM, lancer un replay d'une session existante (Test 4 ci-dessus). +2. **Pendant l'exécution**, faire clic droit sur un `.exe` nécessitant élévation → "Exécuter en tant qu'administrateur" → le popup UAC apparaît. +3. **Ne pas cliquer** sur le UAC. + +**Observations attendues** : +- Côté VM : Léa arrête toute action (pas de clic sur UAC) +- Côté serveur, logs : + ```bash + ./svc.sh logs streaming | grep -iE "UAC|CredUI|SmartScreen|paused_need_help" | tail -5 + ``` + → messages du type `paused_need_help` ou `élévation de privilèges (UAC) détectée` + +**Critère de succès** : +- Aucun clic envoyé sur la fenêtre UAC +- Le replay passe en `status: paused_need_help` +- Un appel `curl .../replay/` montre bien ce statut + +**Critère d'échec critique** : Léa clique sur "Oui" / "Non" de l'UAC → **arrêter immédiatement les tests**, c'est une régression de sécurité. + +**Cleanup** : fermer manuellement le popup UAC (clic sur Non). + +--- + +### Test 7 — Blur PII côté serveur (objectif 9) + +**But** : vérifier que les screenshots contenant des noms/mails sont bien floutés côté serveur. + +**Actions côté VM** : +1. Ouvrir Bloc-notes, écrire : + ``` + Patient : Jean Dupont + Né le 12/03/1980 + Tél : 06 12 34 56 78 + Email : jean.dupont@test.fr + ``` +2. Lancer un enregistrement court via le menu Léa. +3. Faire 2-3 clics dans Bloc-notes (scroll, sélection). +4. Arrêter. + +**Vérifications côté serveur** : +```bash +# Chercher les paires _raw / _blurred dans la session +SESS_DIR=$(find /home/dom/ai/rpa_vision_v3/data -type d -name "$SESS*" 2>/dev/null | head -1) +ls -la "$SESS_DIR"/*.png 2>/dev/null | grep -E "_blurred|_raw" | head -10 + +# Comparer les tailles — le _blurred doit exister +find /home/dom/ai/rpa_vision_v3/data -name "*_blurred.png" -newer /tmp/sess_16avril.json 2>/dev/null | head -5 +``` + +**Critères de succès** : +- Au moins un fichier `*_blurred.png` présent pour cette session +- Ouvert dans un viewer, les zones "Jean Dupont", "06 12 34...", "jean.dupont@..." sont floutées/boxées +- Le fichier `*_raw.png` reste net (destiné à l'entraînement) + +**Critère d'échec** : aucun `_blurred.png` généré → module `core/anonymisation/pii_blur.py` pas appelé. Vérifier les logs avec `grep -i "pii_blur\|anonymisation"`. + +--- + +### Test 8 — Logs d'audit (objectif 10) + +**Actions** : +```bash +# Vérifier que le fichier JSONL du jour existe et se remplit +ls -la /home/dom/ai/rpa_vision_v3/data/audit/audit_2026-04-16.jsonl +tail -5 /home/dom/ai/rpa_vision_v3/data/audit/audit_2026-04-16.jsonl | python3 -m json.tool + +# Endpoint d'audit (API_TOKEN requis si sécurisé — ici en dev) +curl -s "http://localhost:5005/api/v1/audit/history?limit=5" \ + | python3 -m json.tool | head -60 + +# Summary du jour +curl -s "http://localhost:5005/api/v1/audit/summary?date=2026-04-16" \ + | python3 -m json.tool +``` + +**Critères de succès** : +- Fichier `audit_2026-04-16.jsonl` existe +- Chaque ligne contient `timestamp`, `session_id`, `action_id`, `machine_id`, `action_type`, `result` +- Le `machine_id` correspond à la VM (pas "Unknown") + +**Critère d'échec** : fichier inexistant → `AuditTrail` pas initialisé. Vérifier logs streaming au démarrage. + +--- + +### Test 9 (bonus si temps) — Replay E2E complet sur Bloc-notes + +**But** : valider la chaîne complète apprentissage → replay réussi. + +**Actions** : +1. Sur la VM, enregistrer : ouvrir Bloc-notes depuis le menu Démarrer → taper "Hello Lea 16 avril" → Fichier → Enregistrer sous → Bureau → Nom "test_lea.txt" → Enregistrer. +2. Arrêter l'enregistrement. +3. Fermer Bloc-notes et supprimer le fichier créé. +4. Lancer le replay depuis le menu Léa (ou via API curl Test 4 sans `dry_run`). + +**Critères de succès** : +- Bloc-notes s'ouvre tout seul +- Le texte est tapé (attention AZERTY : si c'est Qwerty côté VM, possible que "Lea" sorte en "Léq" — noter mais pas bloquant) +- Le fichier `test_lea.txt` est créé sur le Bureau +- Statut replay final : `completed` + +--- + +## Section 4 — Diagnostic rapide + +| # | Symptôme | Cause probable | Comment vérifier | Fix rapide | +|---|----------|----------------|------------------|------------| +| 1 | Léa ne démarre pas (pas d'icône systray) | `.venv` absent ou install interrompue | `dir C:\rpa_vision\.venv\Scripts\python.exe` | Relancer `install.bat` | +| 2 | Léa démarre puis crash (console ferme) | Erreur Python au boot | Lancer à la main : `C:\rpa_vision\.venv\Scripts\python.exe C:\rpa_vision\run_agent_v1.py` → lire la stack trace | Selon l'erreur : check deps, check `config.txt`, check `RPA_SERVER_URL` | +| 3 | Agent tourne mais rien n'arrive côté serveur | Mauvais `RPA_SERVER_URL` / firewall / DNS | Sur la VM : `curl https://lea.labs.laurinebazin.design/health` | Corriger URL dans `config.txt`, relancer `Lea.bat` | +| 4 | 401 Unauthorized côté serveur | Token différent entre VM et serveur | `grep RPA_API_TOKEN C:\rpa_vision\config.txt` vs `grep RPA_API_TOKEN /home/dom/ai/rpa_vision_v3/.env.local` | Aligner les deux, relancer `Lea.bat` et `./svc.sh restart streaming` | +| 5 | Popup UAC → Léa clique dessus | **RÉGRESSION CRITIQUE** | Voir logs `grep -i UAC` côté serveur | **Arrêter le test**, remonter à Dom | +| 6 | `total_active == 0` dans /fleet | Enrollment jamais déclenché ou échoué | Logs streaming : `grep FLEET` | Vérifier que le build contient `agent_registry.py` côté client + relancer | +| 7 | `ui_elements = []` dans les ScreenStates | C2 pas appelé ou Ollama down | `curl http://localhost:11434/api/tags` + logs streaming `grep -i detector` | Relancer Ollama : `systemctl --user restart ollama` | +| 8 | `by_role`/`by_text` tous null | TargetSpecBuilder ne lit pas les UIElements | Logs streaming `grep -i target_spec` | Bug code — noter et passer au test suivant | +| 9 | Aucun `_blurred.png` | `pii_blur.py` pas appelé | Logs : `grep -i "blur\|anonymisation"` | Vérifier que les imports côté serveur passent | +| 10 | Replay planté sans erreur claire | Session incomplète, pas de workflow compilé | `curl .../workflow/compile` en direct | Re-enregistrer une nouvelle session plus courte | + +### Commandes debug utiles (à garder sous la main) + +```bash +# État global +./svc.sh status +./status.sh + +# Logs live streaming +./svc.sh logs streaming -f + +# Dernière session streamée +curl -s http://localhost:5005/api/v1/traces/stream/sessions | python3 -m json.tool | tail -30 + +# Dernier screenshot reçu (ordre décroissant) +ls -lt /home/dom/ai/rpa_vision_v3/data/streaming_sessions/*.json | head -3 + +# Audit du jour +tail -f /home/dom/ai/rpa_vision_v3/data/audit/audit_2026-04-16.jsonl + +# Base fleet +sqlite3 /home/dom/ai/rpa_vision_v3/data/databases/rpa_data.db \ + "SELECT machine_id, user_name, hostname, version, status, enrolled_at FROM enrolled_agents;" +``` + +--- + +## Section 5 — Grille d'observation C2 (enrichissement UI) + +### Comment vérifier concrètement que C2 fonctionne + +**Niveau 1 — ScreenState persisté** : +```bash +LAST_STATE=$(find /home/dom/ai/rpa_vision_v3/data/screen_states -name "state_*.json" -type f -printf '%T@ %p\n' 2>/dev/null | sort -n | tail -1 | awk '{print $2}') + +python3 < /tmp/wf.json + +# Compter les TargetSpec qualitatifs +python3 <<'EOF' +import json +d = json.load(open("/tmp/wf.json")) +nodes = d.get("nodes", []) +total = len(nodes) +with_role = sum(1 for n in nodes if (n.get("target_spec") or {}).get("by_role")) +with_text = sum(1 for n in nodes if (n.get("target_spec") or {}).get("by_text")) +unknown = sum(1 for n in nodes if (n.get("target_spec") or {}).get("by_role") in (None, "unknown_element")) +print(f"Total nodes : {total}") +print(f"With by_role : {with_role} ({100*with_role/max(total,1):.0f}%)") +print(f"With by_text : {with_text} ({100*with_text/max(total,1):.0f}%)") +print(f"Unknown : {unknown} ({100*unknown/max(total,1):.0f}%)") +EOF +``` + +**Exemple de TargetSpec attendu (succès C2)** : +```json +{ + "by_role": "button", + "by_text": "Enregistrer", + "by_position": {"x": 0.52, "y": 0.89}, + "context_hints": {"near_text": "Nom du fichier"} +} +``` + +**Exemple de TargetSpec dégradé (C2 ne tourne pas)** : +```json +{ + "by_role": "unknown_element", + "by_text": null, + "by_position": {"x": 1024, "y": 768} +} +``` + +--- + +## Section 6 — Ce qu'on veut éviter + +1. **Ne pas lancer deux instances Léa en même temps sur la VM** — le lock PID suffit normalement, mais vérifier manuellement : une seule ligne `pythonw` dans `tasklist`. +2. **Ne pas exposer le dashboard sur Internet pendant les tests** — rester sur `http://localhost:5001/` côté Dom. Le VWB exposé est OK (auth Basic), le dashboard non. +3. **Ne jamais tester avec des données patient réelles** — c'est un POC. Utiliser uniquement des noms/codes de test ("Jean Dupont", "TestPatient01", etc.). +4. **Ne pas interrompre un replay en cours avec Ctrl+C dans la console** — utiliser le menu Léa "Stop" pour arrêt propre (sinon le lock reste et il faut le tuer à la main). +5. **Ne pas modifier `config.txt` pendant que Léa tourne** — la config est lue au démarrage uniquement. Redémarrer après modif. +6. **Ne pas supprimer `C:\rpa_vision_old_16avril\`** avant d'avoir validé que la nouvelle version marche (rollback possible). +7. **Ne pas cliquer sur le popup UAC pendant le Test 6** — c'est le but du test, le laisser apparaître et attendre que Léa s'arrête. +8. **Ne pas toucher aux services systemd côté Dom pendant qu'un test tourne** — attendre la fin du test avant `./svc.sh restart`. +9. **Ne pas déployer le ZIP sur la VM "prod"** — uniquement VM de test. Ce build contient des fonctionnalités non validées. +10. **Ne pas committer le contenu de `data/audit/` ou `data/screen_states/`** — ce sont des données de test locales (screenshots + PII éventuelles). + +--- + +## Annexe — URLs et chemins de référence + +| Ressource | URL / chemin | +|-----------|--------------| +| Streaming API (local) | http://localhost:5005 | +| Streaming API (Internet) | https://lea.labs.laurinebazin.design | +| Dashboard (local) | http://localhost:5001 (Basic auth `lea` / `changeme-dashboard-Medecin2026!` ou env `DASHBOARD_PASSWORD`) | +| VWB (Internet) | https://vwb.labs.laurinebazin.design (Basic auth `lea` / `Medecin2026!`) | +| Token API | `86031addb338e449fccdb1a983f61807aec15d42d482b9c7748ad607dc23caab` | +| ZIP client | `/home/dom/ai/rpa_vision_v3/deploy/Lea_v1.0.0.zip` | +| Sessions streaming | `/home/dom/ai/rpa_vision_v3/data/streaming_sessions/` | +| ScreenStates persistés | `/home/dom/ai/rpa_vision_v3/data/screen_states/YYYY-MM-DD/` | +| Audit logs | `/home/dom/ai/rpa_vision_v3/data/audit/audit_YYYY-MM-DD.jsonl` | +| Base fleet SQLite | `/home/dom/ai/rpa_vision_v3/data/databases/rpa_data.db` (table `enrolled_agents`) | +| Logs services | `./svc.sh logs ` ou `/home/dom/ai/rpa_vision_v3/logs/` | + +--- + +## Checklist finale (à cocher au fur et à mesure) + +- [ ] 1.1 — Services Linux up +- [ ] 1.2 — Endpoints Internet OK +- [ ] 1.3 — VM prête, internet OK +- [ ] 2.x — ZIP déployé, Léa démarre +- [ ] Test 1 — Streaming + enrollment OK +- [ ] Test 2 — Auth dashboard OK +- [ ] Test 3 — ScreenStates enrichis (C2) +- [ ] Test 4 — TargetSpec qualitatifs (C1 + Lot E) +- [ ] Test 5 — Cache context-aware (Lot D) +- [ ] Test 6 — Fail-safe UAC (P0-D) +- [ ] Test 7 — Blur PII serveur +- [ ] Test 8 — Logs audit +- [ ] Test 9 (bonus) — Replay E2E Bloc-notes + +Bonne session ! En cas de blocage, revenir à la Section 4 avant de plonger dans le code. diff --git a/docs/POC_ANOUST_PAS.md b/docs/POC_ANOUST_PAS.md new file mode 100644 index 000000000..5852d370e --- /dev/null +++ b/docs/POC_ANOUST_PAS.md @@ -0,0 +1,293 @@ +# Plan d'Assurance Sécurité (PAS) + +**Logiciel** : Léa — RPA Vision V3 +**Version** : 3.x +**Date** : 14 avril 2026 +**Client** : Clinique Anoust (psychiatrie) +**Objet** : Extraction automatisée de dossiers patients 2024-2025 + constitution d'un Entrepôt de Données de Santé (EDS) + +--- + +## I. Introduction et cadre réglementaire + +### 1.1 Finalité du système + +Léa est un système RPA (Robotic Process Automation) basé sur la vision, déployé **intégralement en local** sur l'infrastructure de l'établissement. Sa finalité est **exclusivement administrative** : +- Extraction automatisée de données depuis le DPI (OSIRIS) +- Structuration et anonymisation des données extraites +- Alimentation d'un Entrepôt de Données de Santé (EDS) + +Le système ne prend **aucune décision clinique**. Il reproduit les gestes d'un opérateur humain naviguant dans les écrans du DPI. + +**Lettre de Non-Qualification** : Léa n'est pas un dispositif médical au sens du Règlement (UE) 2017/745. Une lettre de non-qualification est fournie. + +### 1.2 Réglementation applicable + +| Texte | Applicabilité | Obligations clés | +|-------|--------------|------------------| +| **RGPD** (art. 9) | Données de santé mentale = catégorie spéciale | AIPD obligatoire, DPO, base légale art. 6.1.e ou 6.1.f | +| **Référentiel CNIL EDS** (2021-118) | Entrepôt de données de santé | Déclaration de conformité ou autorisation individuelle | +| **AI Act** (Règlement UE 2024/1689) | Système IA en contexte de santé | Évaluation du niveau de risque (art. 6(3)), documentation écrite | +| **NIS2** (transposition FR juillet 2026) | Établissement de santé = entité importante | Notification incidents 24h, plan de gestion risques cyber | +| **HDS** (L.1111-8 CSP) | **Dispensé si on-premise** | Le déploiement sur l'infrastructure de la clinique ne nécessite pas de certification HDS | +| **PGSSI-S** | Données de santé à caractère personnel | Conformité au palier minimal des référentiels ANS | +| **Programme CaRE** | Établissements de santé | BIA pour services critiques (échéance juin 2026) | + +### 1.3 Spécificités psychiatrie + +- Les **notes personnelles du psychiatre** (hypothèses, réflexions non formalisées) sont **exclues du périmètre d'extraction** (art. R4127-45 CSP) +- Anonymisation renforcée : risque de re-identification élevé en psychiatrie (pathologies rares, situations uniques) +- Secret médical renforcé (art. 226-13 Code pénal) + +### 1.4 AI Act — Évaluation du niveau de risque + +Léa invoque l'exception de l'art. 6(3) du AI Act : +- **(a)** Tâche procédurale étroite : extraction de champs depuis des écrans +- **(d)** Tâche préparatoire : alimentation d'un EDS pour analyse humaine ultérieure +- Aucune décision clinique automatisée +- Supervision humaine permanente (mode supervisé) + +Cette évaluation est documentée conformément à l'art. 6(4). + +--- + +## II. Architecture et déploiement + +### 2.1 Principe : déploiement 100% local + +``` +┌─────────────────────────────────────────────────────────┐ +│ RÉSEAU CLINIQUE ANOUST │ +│ │ +│ ┌──────────┐ ┌──────────────────────────────┐ │ +│ │ Poste │ │ SERVEUR LÉA (VM/bare) │ │ +│ │ DPI │◄───────►│ │ │ +│ │ (OSIRIS) │ écran │ - Moteur RPA (extraction) │ │ +│ └──────────┘ │ - Pipeline anonymisation │ │ +│ │ - EDS (PostgreSQL + OMOP) │ │ +│ │ - Dashboard (monitoring) │ │ +│ └──────────────────────────────┘ │ +│ │ +│ ⛔ AUCUNE CONNEXION INTERNET SORTANTE │ +│ ⛔ AUCUNE DONNÉE NE QUITTE L'ÉTABLISSEMENT │ +└─────────────────────────────────────────────────────────┘ +``` + +### 2.2 Prérequis infrastructure — à fournir par la clinique + +| Élément | Spécification | Notes | +|---------|--------------|-------| +| **VM ou serveur dédié** | 8 vCPU, 32 Go RAM, 500 Go SSD minimum | GPU optionnel (accélère l'OCR mais pas requis) | +| **OS** | Ubuntu Server 22.04 LTS ou 24.04 LTS | L'établissement gère les MAJ de sécurité OS | +| **Adresse IP fixe** | 1 IP sur le VLAN santé | Pour le serveur Léa | +| **VLAN** | VLAN dédié ou VLAN santé existant | Isolation réseau des données patients | +| **Accès réseau au DPI** | Connectivité vers le poste/serveur OSIRIS | Léa navigue dans l'interface comme un utilisateur | +| **Accès SSH** | Port 22, limité à 1 IP source (notre maintenance) | Ou VPN site-to-site | +| **DNS interne** | Résolution des noms internes | Si OSIRIS est accessible par nom | +| **Compte utilisateur DPI** | Compte OSIRIS dédié "Léa" (lecture seule) | Avec les droits d'accès aux dossiers du périmètre | +| **Sauvegarde** | Intégration au plan de sauvegarde de l'établissement | VM snapshots ou backup du volume données | +| **Certificat TLS** | Certificat interne pour HTTPS (ou auto-signé) | Pour le dashboard de monitoring | + +### 2.3 Ports et services + +| Port | Protocole | Direction | Usage | Sécurité | +|------|-----------|-----------|-------|----------| +| **443** | HTTPS/TLS | Interne uniquement | Dashboard monitoring + consultation logs | Authentification forte (AD/LDAP clinique) | +| **22** | SSH | Entrant, 1 IP source | Maintenance par nos équipes uniquement | Clé SSH, pas de mot de passe. IP source unique | +| **5432** | TCP | Localhost uniquement | PostgreSQL (EDS) | Écoute 127.0.0.1 uniquement, pas d'accès réseau | + +**Ports bloqués** : tout le reste. Aucun port ouvert vers Internet. + +### 2.4 Règles de firewall (ufw) + +```bash +# Politique par défaut : tout bloquer +ufw default deny incoming +ufw default deny outgoing + +# SSH maintenance (IP source unique fournie par la clinique) +ufw allow from to any port 22 proto tcp + +# HTTPS dashboard (VLAN interne uniquement) +ufw allow from to any port 443 proto tcp + +# DNS interne (si nécessaire) +ufw allow out to port 53 + +# Bloquer explicitement Internet +ufw deny out to 0.0.0.0/0 +``` + +### 2.5 Hardening serveur + +- Service RPA sous **compte non-root** à privilèges limités (`lea-svc`) +- **Chiffrement intégral** du disque (LUKS) — protection PI et données +- AppArmor activé avec profil dédié +- Fail2ban sur SSH +- Logs système centralisés (journald) +- Pas de serveur X / interface graphique sur le serveur + +--- + +## III. Sécurité des données et anonymisation + +### 3.1 Cycle de vie des données + +``` +Écran DPI (OSIRIS) + │ + ▼ capture en RAM uniquement +Extraction RPA + │ + ▼ destruction immédiate des captures écran +Données structurées brutes (RAM) + │ + ▼ pipeline anonymisation +Données pseudonymisées + │ + ▼ chargement +EDS (PostgreSQL, disque chiffré LUKS) + │ + ▼ requêtage +Dashboard (lecture seule, HTTPS) +``` + +### 3.2 Traitement des captures d'écran + +- Les images sont traitées **en RAM uniquement** +- **Destruction immédiate** après analyse (pas de stockage sur disque) +- Aucune capture d'écran dans les logs +- Les traces d'audit ne contiennent que des **métadonnées** (horodatage, action, résultat), jamais de contenu patient + +### 3.3 Pipeline d'anonymisation + +| Étape | Technologie | Fonction | +|-------|-------------|----------| +| NER (détection entités) | **EDS-NLP** (AP-HP, open source) | Détection noms, dates, lieux, numéros dans le texte clinique français | +| Dé-identification | Remplacement systématique | Noms → pseudonymes, dates → décalage cohérent, lieux → généralisés | +| Validation | Échantillonnage + relecture clinicien | Contrôle qualité sur un échantillon de dossiers | +| Exécution | **ONNX Runtime (CPU)** | Pas de GPU requis, pas de dépendance cloud | + +**Exclusions automatiques** : +- Notes personnelles du psychiatre (détection par métadonnées OSIRIS) +- Données d'identification directe (NIR, IPP) jamais stockées dans l'EDS + +### 3.4 Entrepôt de Données de Santé (EDS) + +| Aspect | Détail | +|--------|--------| +| **SGBD** | PostgreSQL 15+ | +| **Modèle de données** | OMOP CDM v5.4 (standard Health Data Hub) | +| **Chiffrement au repos** | LUKS (disque) + TDE PostgreSQL optionnel | +| **Chiffrement en transit** | TLS 1.3 pour toute connexion | +| **Accès** | Localhost uniquement (pas d'accès réseau direct) | +| **Sauvegarde** | Intégrée au plan de backup de l'établissement | +| **Rétention** | Selon politique de l'établissement (max 20 ans, R.1112-7 CSP) | + +--- + +## IV. Traçabilité et audit + +### 4.1 Journal d'audit (RPA traçable) + +Toutes les actions du robot sont enregistrées : + +| Donnée enregistrée | Exemple | +|-------------------|---------| +| Horodatage | `2026-04-14T09:32:15+02:00` | +| Action | `extraction_dossier`, `navigation_ecran`, `saisie_champ` | +| Résultat | `succès`, `échec`, `pause_supervisée` | +| Utilisateur superviseur | `dr.martin` (via AD) | +| Session ID | `sess_20260414_a3f2b1` | +| Durée | `2.3s` | + +**Ce qui n'est JAMAIS enregistré** : contenu patient, captures d'écran, données de santé. + +### 4.2 Consultation des logs + +- Accès via **dashboard web sécurisé** (HTTPS/443) +- Authentification via l'annuaire de l'établissement (AD/LDAP) +- **Lecture seule** — aucun accès direct aux fichiers du serveur +- Rétention des logs : 1 an (configurable) + +### 4.3 Supervision humaine (AI Act) + +- Léa fonctionne en **mode supervisé** : un opérateur peut interrompre, corriger ou stopper le système à tout moment +- En cas d'échec d'une action, Léa se met en **pause** et attend l'intervention humaine (pas de retry aveugle) +- Toutes les interventions humaines sont tracées + +--- + +## V. Sécurité du code et des modèles IA + +### 5.1 Gouvernance du modèle IA + +- **Entraînement en vase clos** : le modèle apprend exclusivement sur les données d'activité interne, sans export +- **Aucune donnée ni modèle transmis à l'extérieur** +- **Intégrité du modèle** : chaque version est signée numériquement — l'application vérifie la signature au démarrage +- **Modèles VLM** : exécutés localement via Ollama (pas d'API cloud) + +### 5.2 Supply chain logicielle + +- **SBOM** (Software Bill of Materials) : liste complète des composants open source fournie +- Engagement à patcher les vulnérabilités connues (CVE) sous 30 jours (critique) / 90 jours (autres) +- Dépendances auditées : PyTorch, ONNX Runtime, PostgreSQL, Flask, FastAPI + +### 5.3 Protection de la propriété intellectuelle + +Le serveur est traité comme une **"Boîte Noire"** : +- L'établissement n'a pas accès au code source ni aux modèles +- Consultation des logs uniquement via l'interface web (lecture seule) +- Pas d'accès direct au système de fichiers + +--- + +## VI. Maintenance et gestion des incidents + +### 6.1 Maintenance + +| Aspect | Détail | +|--------|--------| +| **Accès** | SSH, limité à 1 IP source, clé SSH uniquement | +| **Intervenant** | Exclusivement nos équipes certifiées | +| **Fenêtre** | En dehors des heures d'extraction (nuit/week-end) | +| **Mises à jour** | Planifiées, testées en pré-production, validées par le DSI | +| **SLA** | Intervention sous 4h (critique) / 24h (normal) | + +### 6.2 Gestion des incidents de sécurité + +Conformément à **NIS2** (transposition FR juillet 2026) : + +| Délai | Action | +|-------|--------| +| **< 1h** | Détection et containment (isolement du serveur si nécessaire) | +| **< 24h** | Notification à l'établissement + ANSSI si incident significatif | +| **< 72h** | Notification CNIL si violation de données personnelles | +| **< 30j** | Rapport d'incident complet | + +### 6.3 Plan de continuité + +- En cas de panne Léa : **aucun impact sur le DPI** — le robot n'écrit rien dans OSIRIS +- L'extraction peut être reprise là où elle s'est arrêtée (sessions persistantes) +- Les données déjà chargées dans l'EDS restent accessibles + +--- + +## VII. Checklist de conformité + +### À réaliser avant le démarrage du POC + +| # | Action | Responsable | Statut | +|---|--------|------------|--------| +| 1 | Désigner le DPO (si pas déjà fait) | Clinique | ☐ | +| 2 | Réaliser l'AIPD (Analyse d'Impact) | Conjoint (nous + DPO) | ☐ | +| 3 | Valider la base légale (mission intérêt public ou intérêt légitime) | DPO + direction | ☐ | +| 4 | Déclaration CNIL (conformité référentiel EDS ou autorisation) | DPO | ☐ | +| 5 | Créer le compte OSIRIS dédié "Léa" (lecture seule) | DSI | ☐ | +| 6 | Provisionner la VM (specs §II.2) | DSI | ☐ | +| 7 | Configurer le réseau (VLAN, IP, firewall §II.4) | DSI | ☐ | +| 8 | Configurer l'accès SSH maintenance (1 IP source) | DSI | ☐ | +| 9 | Intégrer la VM au plan de sauvegarde | DSI | ☐ | +| 10 | Signer l'accord de confidentialité | Les deux parties | ☐ | +| 11 | Valider le périmètre des dossiers avec le médecin DIM | Clinique | ☐ | +| 12 | Documenter l'évaluation AI Act art. 6(3) | Nous | ☐ | diff --git a/docs/POC_ANOUST_QUESTIONS_DSI.md b/docs/POC_ANOUST_QUESTIONS_DSI.md new file mode 100644 index 000000000..84d72a635 --- /dev/null +++ b/docs/POC_ANOUST_QUESTIONS_DSI.md @@ -0,0 +1,130 @@ +# Questions pour le DSI — Clinique Anoust +## Rendez-vous du 14 avril 2026 + +--- + +## A. DPI et système d'information + +| # | Question | Pourquoi c'est important | Notes | +|---|----------|-------------------------|-------| +| 1 | **Quel logiciel DPI utilisez-vous ?** (Cariatides, Cortexte, Osiris, Hopital Manager, Mediboard, autre ?) | Détermine toute l'approche d'extraction et les connecteurs possibles | | +| 2 | **Quelle version ?** Depuis quand déployé ? | Les anciennes versions ont moins d'API | | +| 3 | **Quelle base de données sous-jacente ?** (Oracle, SQL Server, PostgreSQL ?) | Si accès direct possible, c'est un plan B en parallèle de Léa | | +| 4 | **L'éditeur propose-t-il des API ou exports programmés ?** | Alternative ou complément au RPA | | +| 5 | **Y a-t-il un contrat de support interdisant l'accès direct à la BDD ?** | Risque contractuel à évaluer | | +| 6 | **Quels modules DPI sont déployés ?** (prescription, observations, agenda, urgences, RIM-P ?) | Périmètre de données disponibles | | +| 7 | **Le RIM-P est-il géré par le DPI ou un outil tiers ?** | Le RIM-P est notre point d'entrée le plus rapide | | +| 8 | **Des mises à jour DPI sont-elles prévues ?** | Risque de casser les parcours Léa pendant le POC | | + +--- + +## B. Infrastructure technique + +| # | Question | Pourquoi c'est important | Notes | +|---|----------|-------------------------|-------| +| 9 | **Infrastructure serveurs ?** (on-premise, cloud privé, hybride, infogéré ?) | Si on-premise → dispense HDS. Si tiers → certification HDS obligatoire | | +| 10 | **Quel hyperviseur ?** (VMware, Proxmox, Hyper-V ?) | Pour provisionner la VM du POC | | +| 11 | **Pouvez-vous provisionner une VM dédiée POC ?** (idéal : 8 vCPU, 32 Go RAM, 500 Go SSD) | Hébergement EDS + Léa serveur | | +| 12 | **Quel OS serveur ?** (Ubuntu, RHEL, Windows Server ?) | Compatibilité stack technique | | +| 13 | **Architecture réseau ?** VLAN santé isolé ? DMZ ? | Isolation nécessaire pour l'EDS | | +| 14 | **Accès VPN ou bastion pour maintenance à distance ?** | Interventions sans déplacement | | +| 15 | **Politique de backup ?** (fréquence, rétention, stockage) | Protection des données EDS | | +| 16 | **Bande passante réseau interne ?** (Gigabit ? 10G ?) | Performance extraction | | + +--- + +## C. Volumétrie et données + +| # | Question | Pourquoi c'est important | Notes | +|---|----------|-------------------------|-------| +| 17 | **Combien de patients en file active annuelle ?** | Dimensionnement EDS | | +| 18 | **Volume total de dossiers 2024-2025 à traiter ?** | Estimation charge de travail Léa | | +| 19 | **Types de documents dans les dossiers ?** (CR hospitalisation, observations infirmières, courriers, prescriptions, résultats labo ?) | Périmètre d'extraction | | +| 20 | **Volume estimé de texte libre par patient ?** (observations, entretiens) | La psy a beaucoup de texte → impact anonymisation | | +| 21 | **Les données RIM-P / PMSI sont-elles exportables ?** Format ? Qui gère ? | Point d'entrée le plus rapide pour le POC | | +| 22 | **Y a-t-il des données structurées codées ?** (CIM-10, EDGAR, CSARR ?) | Qualité de base pour l'EDS | | + +--- + +## D. Sécurité et conformité + +| # | Question | Pourquoi c'est important | Notes | +|---|----------|-------------------------|-------| +| 23 | **Avez-vous un DPO ?** Qui ? Interne ou externe ? | Obligatoire. Interlocuteur clé pour l'AIPD | | +| 24 | **Existe-t-il une PSSI ?** (Politique de Sécurité des SI) | Cadre à respecter | | +| 25 | **Avez-vous un RSSI ?** | Interlocuteur sécurité | | +| 26 | **Quel niveau de certification ?** (HOP'EN, ISO 27001 ?) | Maturité sécurité | | +| 27 | **Chiffrement en place ?** (au repos, en transit) | Prérequis EDS | | +| 28 | **Gestion des accès ?** (AD, LDAP, SSO ?) | Intégration authentification | | +| 29 | **Programme CaRE : où en êtes-vous ?** (BIA fait ? Plans de continuité ?) | Échéance juin 2026 | | +| 30 | **Conformité Ségur du Numérique : quels référentiels implémentés ?** | Maturité interopérabilité | | + +--- + +## E. Gouvernance et organisation + +| # | Question | Pourquoi c'est important | Notes | +|---|----------|-------------------------|-------| +| 31 | **Y a-t-il un médecin DIM motivé et disponible ?** | **Facteur n°1 de succès** — sans DIM, le POC échoue | | +| 32 | **La CME est-elle informée / favorable ?** | Gouvernance médicale | | +| 33 | **Y a-t-il déjà des projets de recherche sur les données patients ?** | Si oui, formalités CNIL déjà en place | | +| 34 | **Base légale envisagée pour l'EDS ?** (mission d'intérêt public, intérêt légitime ?) | Détermine la procédure CNIL | | +| 35 | **La clinique participe-t-elle au service public hospitalier ?** (convention ARS ?) | Si oui → mission d'intérêt public → référentiel CNIL EDS applicable | | +| 36 | **Quel est le positionnement de la direction sur l'innovation ?** | Soutien stratégique | | + +--- + +## F. Budget, timeline et ambition + +| # | Question | Pourquoi c'est important | Notes | +|---|----------|-------------------------|-------| +| 37 | **Budget disponible pour le POC ?** (matériel, prestation, jours/homme) | Cadrage financier | | +| 38 | **Timeline souhaitée ?** (notre estimation : 3 mois) | Aligner les attentes | | +| 39 | **Ressources mobilisables ?** (DIM dédié, admin sys, médecin référent) | Charge côté clinique | | +| 40 | **Financements identifiés ?** (AAP ARS, DGOS, ANR, programme CaRE ?) | Possibilité de co-financement | | +| 41 | **Ambition post-POC ?** (production, extension, publication, multi-sites ?) | Dimensionner la suite | | +| 42 | **D'autres établissements du groupe sont-ils intéressés ?** | Potentiel de déploiement | | + +--- + +## G. Points d'attention à aborder (nous) + +### Ce que nous devons expliquer au DSI + +1. **Léa est 100% locale** — aucune donnée ne quitte le réseau. Pas de cloud, pas d'API externe. Argument massue en psychiatrie. + +2. **Supervision humaine permanente** — Léa n'est pas autonome, elle apprend sous supervision d'un humain. Conforme AI Act. + +3. **Anonymisation intégrée** — le pipeline dé-identifie AVANT tout stockage dans l'EDS. On ne stocke jamais de données nominatives dans l'EDS de recherche. + +4. **Notes personnelles du psychiatre** — nous sommes conscients de cette particularité légale et l'avons intégrée dans la conception (exclusion automatique). + +5. **OMOP CDM** — standard international du Health Data Hub. L'EDS sera nativement interopérable si la clinique souhaite participer à des projets de recherche nationaux. + +6. **Open source** — pas de coût de licence. Le coût est 100% en temps humain et infrastructure. + +### Points à valider absolument avant de partir + +- [ ] Le DPI utilisé (nom + version) +- [ ] La base légale pour l'EDS (mission d'intérêt public ou pas) +- [ ] La disponibilité d'un médecin DIM +- [ ] La capacité à provisionner une VM +- [ ] L'accord de principe pour un accès au DPI (même en lecture écran) +- [ ] Le calendrier de la prochaine étape + +--- + +## H. Checklist de conformité EDS (référentiel CNIL 2021-118) + +Pour référence — à parcourir avec le DPO : + +- [ ] Finalité déterminée de l'EDS +- [ ] Base légale identifiée (art. 6 + art. 9 RGPD) +- [ ] AIPD réalisée +- [ ] Information des patients +- [ ] Exercice des droits (accès, rectification, opposition) +- [ ] Mesures de sécurité (chiffrement, accès, audit trail) +- [ ] Pseudonymisation des données +- [ ] Gouvernance (comité, responsable, charte d'accès) +- [ ] Durée de conservation définie +- [ ] Procédure pour les réutilisations (recherche) diff --git a/docs/STATUS.md b/docs/STATUS.md index dbaea54b9..9e8a6e371 100644 --- a/docs/STATUS.md +++ b/docs/STATUS.md @@ -32,6 +32,7 @@ Les fonctionnalités ci-dessous sont documentées sans minimiser les limites. | Embedding & FAISS (`core/embedding/`) | alpha | CLIP ViT-B/32 + index Flat, pas testé à grande échelle | | Workflow Graph (`core/graph/`) | alpha | Construction depuis sessions, matching heuristique | | Replay E2E (`agent_v0/server_v1/api_stream.py`) | alpha | Premier succès le 13 avril 2026 sur Notepad, asymétries strict/legacy connues | +| ExecutionLoop vision-aware (C1) | alpha | ScreenState enrichi + cache perceptuel + flags `enable_ui_detection`/`enable_ocr`/`analyze_timeout_ms`/`window_info_provider` — voir [EXECUTION_LOOP_FLAGS.md](EXECUTION_LOOP_FLAGS.md) | | Mode apprentissage supervisé | alpha | Pause sur échec répété, demande d'intervention humaine | | TargetMemoryStore (Phase 1 apprentissage) | alpha | Schéma SQLite en place, DB vide jusqu'au premier replay complet | | Grounding visuel (UI-TARS, gemma4, qwen3-vl) | alpha | Switch de modèle via `.env` (`RPA_VLM_MODEL`) | @@ -43,7 +44,7 @@ Les fonctionnalités ci-dessous sont documentées sans minimiser les limites. | Federation (`core/federation/`) | alpha | Export/import de LearningPacks, pas de test terrain | | GPU Resource Manager (`core/gpu/`) | alpha | Gestion Ollama + warmup modèles, code utilisé mais peu testé | | Self-healing / recovery | en cours | Heuristiques présentes, comportement global non stabilisé | -| Analytics / reporting | en cours | Prototype, pas de frontend finalisé | +| Analytics / reporting | en cours | Prototype, pas de frontend finalisé. SQLite `step_metrics` étendue avec timings vision-aware C1 (`ocr_ms`, `ui_ms`, `analyze_ms`, `cache_hit`, `degraded`). | | Tests end-to-end | en cours | 1 replay E2E réussi, 56 tests d'intégration verts hors cas connus | | Deploy Windows (`deploy/build_package.sh`) | opérationnel | Produit `Lea_v.zip`, vérification des fichiers requis | | Conformité AI Act (journalisation, floutage, rétention logs) | alpha | Mécanismes en place, audit formel non fait | diff --git a/docs/SYNTHESE_11AVRIL_MATIN.md b/docs/SYNTHESE_11AVRIL_MATIN.md new file mode 100644 index 000000000..dd2dfb8e6 --- /dev/null +++ b/docs/SYNTHESE_11AVRIL_MATIN.md @@ -0,0 +1,336 @@ +# Synthèse — 11 avril 2026 (préparée pendant ton absence) + +Ce document résume ce qui s'est passé pendant ton absence. Lecture : ~10 minutes. + +## 🎯 À lire en premier (60 secondes) + +**Score global guardian : 6.8/10** — direction bonne, 5 commits du jour propres sans régression, mais **3 points critiques** à adresser. + +### Les 3 actions à faire en rentrant (ordre de priorité) + +1. **🔴 P0 — Committer `replay_failure_logger.py`** (fichier utilisé partout mais pas tracké git, un fresh clone ne démarre plus). 15 minutes. Bloquant absolu. Guardian item C1. +2. **🔴 P0 — Corriger l'asymétrie `Fenêtre incorrecte` strict → pause apprentissage** (même pattern que `no_screen_change strict` du commit `7cc03f6f1`, mais sur une autre branche). 1-2h. C'est exactement le bug qui a cassé ton test chirurgical ce matin (tu vas voir la timeline dans Partie 1). Guardian item C2. +3. **🔴 P1 — Premier replay Notepad E2E réussi pour activer Phase 1 apprentissage**. La DB `data/learning/target_memory.db` est **vide** (0 entrée). La greffe est câblée mais Léa n'a pas encore appris une seule fois en conditions réelles. Tu pourras l'activer dès que #2 est fait. Guardian item E4. + +### Les 3 choses à savoir absolument + +- **Test chirurgical** : échec propre au premier clic parce que Bloc-notes n'était plus au premier plan sur la VM (focus perdu). La chaîne stricte a fait exactement son job de protection (3 retries puis stop), mais elle est retombée dans la branche retry+stop legacy au lieu de la pause d'apprentissage. **C'est la preuve vivante du bug #2 ci-dessus.** +- **VWB est un piège** pour le nettoyage de workflows — bug DB runtime + bridge Léa→VWB qui perd 90% de l'info. **Recommandation agent VWB** : écrire un petit outil dédié (200 lignes, 1 jour) plutôt que réparer VWB (4-5 jours). Détails en Partie 4. +- **Code agent en 3 copies divergentes** : source à jour, deploy copy très en retard (sans UIA), worktree migration sans `replay_failure_logger.py`. Merger le worktree EN L'ÉTAT casserait le démarrage. C4 du guardian. + +### Ce qui va vraiment bien 🟢 + +- Les 5 commits de la journée (`b92cb9db0`, `f82753deb`, `9188bd7df`, `a21f1ea9f`, `7cc03f6f1`) sont tous propres, bien documentés, testés et sans régression +- L'instrumentation `[REPLAY]` permet un debug multi-étages lisible +- La Phase 1 apprentissage est une greffe minimale et non-intrusive (exactement comme prévu dans le plan) +- Le fix de C (`7cc03f6f1`) montre la rigueur post-correction : re-lecture des feedbacks mémoire, pas de rustine +- Tests E2E + unit (hors VWB) toujours verts : 56/56 + +Le détail complet ci-dessous, partie par partie. + +--- + +## Partie 1 — Résultat du test chirurgical + +### Protocole +- Replay `replay_free_3935cd0b` lancé sur la session `sess_20260411T084629_2d588e` +- 3 actions injectées : click `Fichier` → wait 800ms → click `Enregistrer` +- Chaque click en mode `success_strict=True`, `expected_before='test.txt – Bloc-notes'` +- Les gardes B (score + drift) et C (pause apprentissage) sont en place + +### Timeline +``` +09:31:09 DISPATCH test_chir_1_fichier (click Fichier) +09:31:11 REPORT success=False error="Fenêtre incorrecte: 'Program Manager' (attendu: 'test.txt – Bloc-notes')" +09:31:11 VERIFY final_success=False +09:31:11 DISPATCH retry1 +09:31:12 REPORT success=False error="Fenêtre incorrecte: 'Program Manager' ..." (identique) +09:31:13 DISPATCH wait_retry (2s) +09:31:16 DISPATCH retry2 +09:31:17 REPORT success=False error="Fenêtre incorrecte: 'Program Manager' ..." (identique) +09:31:18 DISPATCH retry3 +09:31:19 REPORT success=False error="Fenêtre incorrecte: 'Program Manager' ..." (identique) +09:31:19 Replay échoué à test_chir_1_fichier_retry3 après 3 retries: status=error +``` + +### Analyse critique + +**Ce qui a BIEN fonctionné** (à conserver) : +- `_validate_match_context` côté agent Windows : a détecté le mismatch de fenêtre active (`Program Manager` vs `test.txt – Bloc-notes`) +- **Pas de clic dans le vide** : la pré-vérif stricte refuse de cliquer quand la fenêtre active n'est pas celle attendue, exactement comme prévu +- Instrumentation `[REPLAY]` parfaitement lisible : chaque étape, chaque erreur, chaque retry +- Retry automatique × 3 avec wait interleaved + +**Ce qui a MAL fonctionné** (à corriger) : + +1. **`Bloc-notes` n'était plus au premier plan** quand le test a démarré. La fenêtre active sur la VM était `Program Manager` (= le bureau Windows). Hypothèses : + - Tu as fermé Bloc-notes avant de partir + - Un événement Windows a volé le focus (notification, chat Léa, etc.) + - Bloc-notes était minimisé + +2. **L'erreur `Fenêtre incorrecte` en mode strict retombe dans la branche retry+stop** (réflexe RPA classique), **pas** dans la pause apprentissage. C'est une **incohérence** avec le correctif C que j'ai fait pour `no_screen_change` : les deux devraient avoir le même traitement. + +### Ce qu'il aurait fallu faire + +Dans `api_stream.py`, la branche qui traite l'erreur `Fenêtre incorrecte` devrait : +- En mode **strict** : `status = "paused_need_help"` avec `pause_message = "Je m'attendais à voir 'test.txt – Bloc-notes' mais je vois 'Program Manager'. Peux-tu me montrer la bonne fenêtre ?"` → queue intacte, attente d'intervention humaine +- En mode **legacy** (non strict) : retry × 3 puis continue (comportement actuel) + +C'est **symétrique** au correctif C (`no_screen_change strict → pause apprentissage`). À faire dans un prochain commit. + +### Ce que ça valide quand même + +Malgré l'échec sur un problème environnemental (focus perdu), **la chaîne stricte complète fonctionne** : +- Pré-vérif stricte ✅ +- Retry automatique ✅ +- Arrêt propre après retries ✅ +- Instrumentation lisible ✅ +- Pas de clic "aveugle" dans le désordre ✅ + +On a juste besoin d'aligner le traitement d'erreur sur la philosophie d'apprentissage. + +--- + +## Partie 2 — Dettes techniques connues (pré-audit) + +En attendant le rapport du project-quality-guardian, voici ce que je sais déjà : + +### Dettes hautes (connues et documentées) + +1. **`agent_v0/deploy/windows_client/agent_v1/core/executor.py`** : 1302 lignes de divergence non committée avec le dev copy. Risque à chaque nouveau packaging Windows. +2. **Module `replay_failure_logger.py`** : importé dans `api_stream.py` mais PAS tracké dans git. Bug pré-existant signalé par le subagent VWB tout à l'heure. À vérifier : soit le fichier existe sur disque (ignoré par gitignore), soit l'import est cassé silencieusement. +3. **Migration `agent_v0/` → top-level** : non mergée, dans un worktree (`.claude/worktrees/agent-a0ebc90f/`). Trois commits prêts mais en attente de ton review. +4. **`visual_workflow_builder/backend/instance/workflows.db`** : modifié non committé depuis le début de la session. Probablement des données de test. +5. **`live_session_manager.py`** : modifié non committé. Dans l'état initial de la session, devrait être committé séparément ou ignoré. + +### Dettes moyennes + +6. **`_a_trier/`** : dossier de code/scripts à trier, jamais nettoyé. Grande taille, pollue les grep. +7. **`archives/`** : ancien code archivé dans le dépôt. Grossit le repo. +8. **Phase 1 apprentissage activable mais non testée en conditions réelles** : `TargetMemoryStore` est branché mais aucune session n'a encore déclenché un `memory_record_success` ni un `memory_lookup HIT`. Attend le premier replay complet qui réussit. +9. **Agent Windows dev vs deploy vs build/Lea/** : trois copies parallèles du code agent, avec divergences possibles à chaque modification. + +### Dettes basses + +10. **Clics parasites d'arrêt d'enregistrement** : systématiquement capturés dans les sessions (clic sur systray, icône Léa, bouton Arrêter). À filtrer côté captor (ex: ignorer les N dernières secondes, ou tout clic sur fenêtre Léa). +11. **Phrases types non externalisées** : `pause_message`, `error_description`, etc. sont hardcodées dans le code. Doivent passer en JSON/YAML i18n-ready. +12. **Service `worker` (port 5099)** : toujours inactif. Le worker VLM qui compile les sessions en workflows n'est pas lancé. Résultat : les sessions enregistrées ne sont jamais compilées automatiquement en ExecutionPlan. + +--- + +## Partie 3 — Ce que j'ai fait pendant ton absence (commits) + +Aucun commit pendant ton absence. Juste : +- Lancement du test chirurgical (échec propre comme analysé) +- Lancement de 2 agents d'audit en background +- Création de ce document de synthèse + +--- + +## Partie 4 — Résultat des agents d'audit + +### Audit projet global — **TERMINÉ** ✅ + +**Score global** : **6.8/10** — direction technique bonne, 5 commits du jour propres et sans régression, mais **incohérence philosophique non corrigée** + dette de cohérence multi-copies. + +#### 🔴 Les 3 choses à savoir en rentrant (synthèse exécutive du guardian) + +1. **Phase 1 apprentissage est techniquement branchée MAIS `data/learning/target_memory.db` est VIDE (0 entrée).** Aucun replay n'a encore survécu au post-cond strict pour cristalliser. Ça veut dire que **tu n'as pas encore vu Léa apprendre**, tu as juste câblé l'apprentissage. Le premier replay qui passe en entier déclenchera la boucle. + +2. **Asymétrie strict pré-vérif vs post-vérif** (gros point) : le fix `7cc03f6f1` corrige `no_screen_change strict → paused_need_help`, mais **la branche `Fenêtre incorrecte` en pré-vérif strict retombe toujours en retry+stop legacy**. C'est une **violation directe de `feedback_failure_is_learning.md` sur un chemin différent**. Même pattern, même oubli. C'est exactement ce qui a cassé ton test chirurgical ce matin. + +3. **Trois copies divergentes du code agent** : + - `agent_v0/agent_v1/` (source à jour avec UIA, grounding, policy, recovery) + - `agent_v0/deploy/windows_client/agent_v1/` (1303 lignes non committées, **sans `uia_helper.py`**) + - `.claude/worktrees/agent-a0ebc90f/` (migration top-level, **sans `replay_failure_logger.py`**) + + Tout packaging Windows depuis la deploy copy manque UIA + tous les fix du 10-11 avril. Si tu merges le worktree EN L'ÉTAT, ça casse le démarrage serveur. + +#### Cohérence vision / implémentation + +5 principes directeurs de la mémoire : +| # | Principe | Statut | Remarque | +|---|---|---|---| +| A1 | 100% visuel (pas de raccourcis inventés) | ✅ Respecté | Grep OK côté replay V4 | +| A2 | LLM 100% local (Ollama) | ⚠️ **Violé dans VWB** | `vlm_provider.py` priorise OpenAI/Gemini/Anthropic avant Ollama, 3 clés cloud dans `.env.local` | +| A3 | Léa n'est pas une boîte à clic | ⚠️ Partiel | Infra en place mais DB vide + asymétrie pré-vérif | +| A4 | Échec = apprentissage, pas arrêt | ⚠️ Partiel | Fix `no_screen_change` OK, pas `Fenêtre incorrecte` | +| A5 | Citrix / 100% vision | ✅ Cohérent | UIA est accélérateur local VM, cascade visuelle reste le core | + +**Violation critique découverte** : `visual_workflow_builder/backend/vlm_provider.py` ligne 53-72 — la classe `VisionHub` priorise `OpenAI (gpt-4o) → Gemini → Anthropic → Ollama en dernier`. Importé par `app.py:165`. **Un client déployé avec les mêmes clés d'env enverrait ses écrans médicaux à OpenAI.** Grave. + +#### État des fonctionnalités (14 fonctions) + +| # | Fonctionnalité | Statut | Preuve | +|---|---|---|---| +| B1 | Agent V1 streaming (capture Windows) | ✅ OK | `executor.py` 2177L, /replay/next pollé | +| B2 | Streaming server `api_stream.py` | ✅ OK | 4401L, rpa-streaming active running | +| B3 | SomEngine (YOLO + docTR + VLM) | ✅ OK (dormant dans cascade) | `_resolve_by_som` défini mais appelé seulement en V4 resolve_order | +| B4 | Resolve cascade (OCR/template/VLM/grounding/SoM) | ✅ OK | `_resolve_target_sync:1530` | +| B5 | Contrôle strict étapes (title_match) | ⚠️ OK post, **incohérent pré** | Cf point #2 ci-dessus | +| B6 | UIA local (lea_uia.exe) | ⚠️ **OK source, ABSENT deploy** | `deploy/windows_client/.../core/` n'a pas `uia_helper.py` | +| B7 | TargetMemoryStore Phase 1 | ⚠️ Greffe OK, **DB vide** | `SELECT COUNT(*) FROM target_memory` → 0 | +| B8 | Instrumentation `[REPLAY]` | ✅ OK | 13 logs structurés | +| B9 | Garde qualité résolution | ✅ OK | 7 tests unitaires inline | +| B10 | `no_screen_change strict → pause` | ✅ OK | commit `7cc03f6f1` | +| B11 | VWB | ⚠️ Audit séparé — BROKEN en écriture | Voir section VWB ci-dessous | +| B12 | Fédération (`core/federation/`) | ✅ Import OK, non testée | | +| B13 | Module auth (`core/auth/`) | ✅ Partiellement branché | | +| B14 | Workers systemd | ⚠️ Mixte | streaming/agent-chat/api OK, dashboard inactive, worker 5099 NOT LISTENING, healthcheck failed | + +#### Dettes techniques — 20 items priorisés (rapport complet) + +**🔴 Priorité haute** (5 items) : + +| # | Lieu | Nature | Effort | +|---|---|---|---| +| **C1** | `agent_v0/server_v1/replay_failure_logger.py` | **Fichier ni tracké ni gitignoré**, importé à `api_stream.py:29`. **Un `git clone` ne peut plus démarrer le serveur.** | < 15 min (git add) | +| **C2** | `api_stream.py` branche `Fenêtre incorrecte` | Asymétrie avec fix `7cc03f6f1` — bloquer avec `paused_need_help` au lieu de retry+stop | 1-2h | +| **C3** | `deploy/windows_client/agent_v1/core/executor.py` | 1303 insertions non committées, manque `uia_helper.py` + `grounding.py` + `policy.py` + `recovery.py` | Demi-journée | +| **C4** | `.claude/worktrees/agent-a0ebc90f/` | Worktree ne contient pas `replay_failure_logger.py` → merge cassera l'import | 1-2h | +| **C5** | `tests/unit/test_som_integration.py::test_resolve_success` | Mock cassé par refactoring, cible `api_stream._get_som_engine_api` au lieu de `resolve_engine.*` | 30 min | + +**🟡 Priorité moyenne** (7 items) : + +- **C6** : `vlm_provider.py` cloud-first (violation A2) — 1-2h +- **C7** : `live_session_manager.py` 118 lignes non committées (code propre utile) — 30 min +- **C8** : Worker port 5099 inactif (sessions jamais compilées en ExecutionPlan) — 1-2h +- **C9** : Services systemd healthcheck + artifact-retention failed — 30 min +- **C10** : Scaffold vide `agent_v1/` top-level — < 15 min +- **C11** : 22 fichiers en `M` non committés (diffus) — demi-journée triage +- **C12** : `core/detection/vlm_config.py` non tracké — 10 min + +**🟢 Priorité basse** (8 items) : + +- **C13** : `_a_trier/` 561 Mo + `visual_workflow_builder/_a_trier/` 7.6 Go +- **C14** : 2 venvs VWB → 15.6 Go disque +- **C15** : `core/execution/target_resolver.py` (3495L V3 dormant) +- **C16** : README.md obsolète (décembre 2024) +- **C17** : `web_dashboard/app.py.bak_20260304_2225` +- **C18** : `archives/` 21 Mo committé dans le repo +- **C19** : 53 TODO/FIXME/HACK dans Python +- **C20** : `data/training/live_sessions/` 5.1 Go sans rotation + +#### Régressions potentielles depuis le matin + +**Aucune nouvelle régression** introduite par les 5 commits du jour. L'incohérence `Fenêtre incorrecte` est **pré-existante** (branche legacy qui aurait dû être corrigée en même temps). Guardian a vérifié les 4 branches de `/replay/result` (lignes 3090-3330) — elles s'enchaînent proprement, pas d'interaction non triviale entre D1-D5. + +#### Recommandations priorisées du guardian + +| # | Priorité | Action | Effort | Justification vision | +|---|---|---|---|---| +| **E1** | **P0** | Committer `replay_failure_logger.py` | < 15 min | Empêche tout fresh clone/deploiement | +| **E2** | **P0** | Corriger asymétrie `Fenêtre incorrecte` → `paused_need_help` | 1-2h | Respect `feedback_failure_is_learning.md` + débloque test chirurgical | +| **E3** | **P1** | Sync deploy copy avec source + ajouter uia_helper/grounding/policy/recovery | Demi-journée | Sans ça Léa n'a pas accès à ses propres progrès sur VM | +| **E4** | **P1** | **Premier replay E2E réussi** pour activer Phase 1 (Notepad propre, 2 fois, vérifier target_memory.db) | 1-2h | **Seule façon de prouver que Léa apprend vraiment** | +| **E5** | **P1** | Décider du sort du worktree (compléter ou refaire) | 1-2h | Éviter dette multi-copies | +| **E6** | **P2** | Gater `vlm_provider.py` derrière env var (violation 100% local) | 1-2h | Respect `feedback_local_only.md` | +| **E7** | **P2** | Relancer worker 5099 + vérifier compilation sessions | 1-2h | Pipeline apprentissage cassé en bout | +| **E8** | **P2** | Committer `live_session_manager.py` | 30 min | Dette git | +| **E9** | **P3** | Réparer test_som_integration | 30 min | Suite unit verte | +| **E10** | **P3** | Nettoyer 2 venvs VWB | 30 min | 15.6 Go disque | + +### Audit VWB — **TERMINÉ** ✅ + +**TL;DR : VWB est un piège pour notre besoin. Recommandation = Option A (petit outil dédié 1 jour).** + +#### État global +Partiellement fonctionnel en **lecture**, **CASSÉ en écriture** (bug runtime trivial), et **gravement amputé en contenu** (bridge Léa→VWB perd 90% de l'information). Le scaffolding est là, la chaîne end-to-end ne fonctionne pas. + +#### Bug bloquant immédiat +Le processus 1800738 (vwb-backend:5002) tient un handle sur une version **supprimée** de `workflows.db` (6 file descriptors sur `(deleted)`). Toute écriture → `sqlite3.OperationalError: attempt to write a readonly database`. Un `systemctl --user restart rpa-vwb-backend` règle ce point — mais les vrais problèmes restent. + +#### Ambiguïtés structurelles (dette) +| Problème | Impact | +|---|---| +| `frontend/` (vieux, inactif) vs `frontend_v4/` (actif) | Confusion à chaque lecture code | +| `app.py` (5002, avec api_v3) vs `app_lightweight.py` (5003, SANS api_v3) | Deux backends parallèles | +| `db/models.py` (legacy) vs `instance/workflows.db` SQLAlchemy (api_v3) | **Deux DB parallèles** — workflows visibles ici ≠ workflows visibles là | + +#### Ce qui marche côté code (vérifié) +- `GET /api/v3/learned-workflows` : liste 126 workflows Léa sur disque +- Routes CRUD Step : add/update/delete/reorder (existent backend + client TS) +- PropertiesPanel 1415 lignes — édite délais, texte, direction, hover_duration +- UI drag-and-drop ajout step via tool palette → React Flow +- `POST /api/v3/execute-windows` : proxy vers streaming server, fonctionnel + +#### Ce qui manque (critique pour le nettoyage) + +1. **Import compound = coquille vide** : 95% des edges Léa sont des actions `type: compound` avec 10-40 sous-étapes (clic + waits + text_input lettre par lettre). Le bridge crée **UN seul step VWB** pour toute la compound → *"Impossible de nettoyer ce qu'on ne voit pas"* +2. **Pas d'auth VWB → streaming server** : `requests.get(...)` sans header Authorization, donc `streaming_server_available: false`. VWB ne voit que les workflows déjà compilés (max 4 avril), pas les sessions récentes +3. **Pas de screenshots attachés** : les `shots/*.png` de session ne sont jamais liés aux steps importés +4. **Pas de réordonnancement UI** : `reorderSteps` existe backend + client, mais **aucun composant React ne l'appelle** +5. **Édition target_spec absente** : PropertiesPanel n'a **aucun champ** `x_pct`, `y_pct`, `target_role`, `target_text`, `vlm_description`. Impossible de corriger un faux positif +6. **Pas d'ingestion raw events** : `live_events.jsonl`, `build_replay_from_raw_events`, `execution_plan_to_actions` ne sont pas importés dans VWB +7. **Pas de liste "sessions récentes"** : aucun endpoint VWB qui liste les `sess_*` sur disque +8. **Zéro test** sur le pont Léa ↔ VWB + +#### Effort de réparation estimé + +| Item | Effort | +|---|---| +| Restart service (fix DB readonly) | 5 min | +| Ajouter auth Bearer VWB → :5005 | 30 min | +| Décomposer actions compound en N steps VWB | **1 jour** | +| Attacher screenshots aux steps | **1 jour** | +| Édition target_spec dans PropertiesPanel | 0.5 jour | +| Drag-to-reorder UI | 0.5 jour | +| Endpoint `/live-sessions` + importer raw | **1-2 jours** | +| Tests minimal | 0.5 jour | +| **Total** | **4-5 jours** | + +Et encore, **on hériterait de la dette** (deux DB, deux backends, zéro test, frontend abandonné). + +#### Recommandation — 3 options + +**Option A (recommandée) — Outil dédié léger, 1 jour** ⭐ +Écrire un petit Flask (200 lignes) qui : +1. Liste les sessions `live_sessions/*/sess_*` sur disque +2. Charge `live_events.jsonl` via `build_replay_from_raw_events` (existe déjà dans `stream_processor.py:1279`) +3. Affiche la liste linéaire des actions + screenshots `shots/` correspondants +4. Checkbox "supprimer cette étape" + édition texte simple +5. Re-sérialise et POST vers `/api/v1/traces/stream/replay/raw` + +**Évite toute la complexité VWB** et cible exactement le besoin : "supprimer 3 clics parasites et relancer". + +**Option B — Réparer VWB minimalement (2 jours)** — restart + auth + décomposer compound. Hérite de toute la dette UX. + +**Option C — Abandonner VWB** — suggéré par l'accumulation de dette (126 workflows "pending_review", zéro test sur le pont, deux backends, frontend abandonné) + +**Vote de l'agent VWB** : *"Option A. Le besoin réel est 'supprimer 3 clics parasites et relancer' — c'est 30 secondes d'UX, pas un Visual Workflow Builder."* + +**Mon vote aussi** : **A**. Parce que ça sert directement notre prochain test replay. B prend plus de temps qu'il ne nous fait gagner. C laisse la dette pourrir. + +--- + +## Partie 5 — Actions recommandées quand tu rentres + +Par ordre de priorité : + +### P0 — À faire dans les 10 premières minutes de ton retour + +1. **Vérifier sur la VM** que Bloc-notes est bien fermé (ou pas), et si possible ce qui a volé le focus +2. **Lire la partie 1** de cette synthèse (résultat test chirurgical) +3. **Lire les rapports des 2 agents** (sections 4) + +### P1 — À discuter avec moi + +4. **Corriger l'incohérence `Fenêtre incorrecte strict → pause apprentissage`** (même pattern que C) +5. **Décider** : on continue à stabiliser le replay avec des tests manuels, OU on passe à l'intégration d'OS-Atlas-Base-7B comme grounder, OU on attaque VWB comme outil de correction ? +6. **Externaliser les phrases types** en JSON i18n (petit commit) + +### P2 — Plus tard dans la journée + +7. Merger la migration `agent_v0/` → top-level (worktree déjà prêt) +8. Investiguer le fichier `replay_failure_logger.py` (importé, pas tracké) +9. Démarrer le worker VLM pour que les sessions soient compilées en workflows + +### P3 — Semaine prochaine + +10. Nettoyer `_a_trier/` et `archives/` +11. Sync de l'agent deploy copy avec le dev +12. Implémenter le filtre "ignore clics de fin d'enregistrement" côté captor + +--- + +*Document généré automatiquement pendant l'absence de Dom. Sera mis à jour avec les rapports des agents d'audit.* diff --git a/tests/unit/test_dashboard_routes.py b/tests/unit/test_dashboard_routes.py index 4dbd18d21..813cafee4 100644 --- a/tests/unit/test_dashboard_routes.py +++ b/tests/unit/test_dashboard_routes.py @@ -46,7 +46,6 @@ class TestDashboardRoutes: data = resp.get_json() assert 'sessions_count' in data assert 'workflows_count' in data - assert 'tests' in data def test_system_performance(self, client): """L'API system/performance retourne les metriques.""" @@ -54,7 +53,6 @@ class TestDashboardRoutes: assert resp.status_code == 200 data = resp.get_json() assert 'faiss' in data - assert 'metrics' in data def test_version(self, client): """L'API version retourne la version actuelle.""" @@ -126,13 +124,10 @@ class TestDashboardRoutes: data = resp.get_json() assert 'sessions' in data - def test_tests_list(self, client): - """L'API tests retourne la liste des tests.""" + def test_tests_list_removed(self, client): + """L'API /api/tests a été retirée (RCE via subprocess).""" resp = client.get('/api/tests') - assert resp.status_code == 200 - data = resp.get_json() - assert 'tests' in data - assert 'total' in data + assert resp.status_code == 404 def test_logs(self, client): """L'API logs retourne les logs.""" @@ -155,10 +150,10 @@ class TestDashboardRoutes: data = resp.get_json() assert 'triggers' in data - def test_automation_status(self, client): - """L'API automation/status retourne le statut.""" + def test_automation_status_removed(self, client): + """L'API /api/automation/status a été retirée.""" resp = client.get('/api/automation/status') - assert resp.status_code == 200 + assert resp.status_code == 404 def test_metrics_endpoint(self, client): """L'endpoint Prometheus /metrics fonctionne.""" @@ -171,151 +166,47 @@ class TestDashboardRoutes: assert resp.status_code == 404 or resp.status_code == 405 -class TestGesturesRoutes: - """Tests des routes du catalogue de gestes.""" +class TestRemovedRoutes: + """Vérifie que les routes supprimées retournent 404.""" - def test_gestures_page_renders(self, client): - """La page /gestures se rend correctement.""" + def test_gestures_page_removed(self, client): + """La page /gestures a été retirée.""" resp = client.get('/gestures') - assert resp.status_code == 200 - assert b'Gestes Primitifs' in resp.data + assert resp.status_code == 404 - def test_gestures_page_has_categories(self, client): - """La page /gestures affiche les catégories de gestes.""" - resp = client.get('/gestures') - assert resp.status_code == 200 - # Vérifier qu'au moins une catégorie est présente - assert b'windows' in resp.data or b'chrome' in resp.data - - def test_gestures_page_has_shortcuts(self, client): - """La page /gestures affiche les raccourcis clavier.""" - resp = client.get('/gestures') - assert resp.status_code == 200 - assert b'Ctrl' in resp.data or b'Alt' in resp.data - - def test_api_gestures(self, client): - """L'API /api/gestures retourne les gestes en JSON.""" + def test_api_gestures_removed(self, client): + """L'API /api/gestures a été retirée.""" resp = client.get('/api/gestures') - assert resp.status_code == 200 - data = resp.get_json() - assert 'gestures' in data - assert 'total' in data - assert 'categories' in data - assert data['total'] > 0 - assert isinstance(data['gestures'], list) - assert len(data['gestures']) == data['total'] + assert resp.status_code == 404 - def test_api_gestures_structure(self, client): - """Chaque geste a les champs requis.""" - resp = client.get('/api/gestures') - data = resp.get_json() - for gesture in data['gestures']: - assert 'name' in gesture - assert 'category' in gesture - assert 'description' in gesture - - def test_api_gestures_categories(self, client): - """Les catégories sont bien structurées.""" - resp = client.get('/api/gestures') - data = resp.get_json() - categories = data['categories'] - assert len(categories) >= 4 # windows, chrome, edition, system au minimum - for cat in categories: - assert 'id' in cat - assert 'name' in cat - assert 'count' in cat - assert cat['count'] > 0 - - -class TestStreamingRoutes: - """Tests des routes streaming.""" - - def test_streaming_page_renders(self, client): - """La page /streaming se rend correctement.""" + def test_streaming_page_removed(self, client): + """La page /streaming a été retirée.""" resp = client.get('/streaming') - assert resp.status_code == 200 - assert b'Streaming' in resp.data + assert resp.status_code == 404 - def test_streaming_page_has_stats_section(self, client): - """La page /streaming contient les sections de stats.""" - resp = client.get('/streaming') - assert resp.status_code == 200 - assert b'Sessions actives' in resp.data - assert b'Serveur streaming' in resp.data + def test_extractions_page_removed(self, client): + """La page /extractions a été retirée.""" + resp = client.get('/extractions') + assert resp.status_code == 404 - def test_api_streaming_status(self, client): - """L'API /api/streaming/status retourne un résultat (même si serveur offline).""" - resp = client.get('/api/streaming/status') - # Le serveur streaming peut ne pas être lancé (502) ou répondre (200) - assert resp.status_code in (200, 502) + def test_api_extractions_removed(self, client): + """L'API /api/extractions a été retirée.""" + resp = client.get('/api/extractions') + assert resp.status_code == 404 + + def test_chat_page_removed(self, client): + """La page /chat a été retirée.""" + resp = client.get('/chat') + assert resp.status_code == 404 + + +class TestFleetProxy: + """Tests du proxy fleet (requiert serveur streaming, donc 502 attendu).""" + + def test_fleet_list_proxy(self, client): + """Le proxy /api/fleet/fleet retourne 200, 401 ou 502 (serveur offline/auth).""" + resp = client.get('/api/fleet/fleet') + # 200 = ok, 401 = streaming server rejette le token, 502 = serveur offline + assert resp.status_code in (200, 401, 502) data = resp.get_json() assert isinstance(data, dict) - - -class TestExtractionsRoutes: - """Tests des routes extractions.""" - - def test_extractions_page_renders(self, client): - """La page /extractions se rend correctement.""" - resp = client.get('/extractions') - assert resp.status_code == 200 - assert b'Extractions' in resp.data - - def test_extractions_page_module_unavailable(self, client): - """La page /extractions affiche un message si le module n'est pas disponible.""" - resp = client.get('/extractions') - assert resp.status_code == 200 - # Le module core.extraction n'existe pas, on doit voir le message - assert b'non disponible' in resp.data or b'Module' in resp.data - - def test_api_extractions(self, client): - """L'API /api/extractions retourne un résultat valide.""" - resp = client.get('/api/extractions') - assert resp.status_code == 200 - data = resp.get_json() - assert 'available' in data - assert 'extractions' in data - assert isinstance(data['extractions'], list) - - def test_api_extractions_module_status(self, client): - """L'API /api/extractions indique si le module est disponible.""" - resp = client.get('/api/extractions') - data = resp.get_json() - # Le module n'existe pas dans ce contexte - assert data['available'] is False - assert 'message' in data - - def test_api_extraction_export_no_module(self, client): - """L'export CSV retourne 501 si le module n'est pas disponible.""" - resp = client.get('/api/extractions/test-id/export?format=csv') - assert resp.status_code == 501 - data = resp.get_json() - assert 'error' in data - - -class TestNavigationLinks: - """Tests de la navigation entre pages.""" - - def test_index_has_gestures_link(self, client): - """La page d'accueil contient un lien vers /gestures.""" - resp = client.get('/') - assert resp.status_code == 200 - assert b'/gestures' in resp.data - - def test_index_has_streaming_link(self, client): - """La page d'accueil contient un lien vers /streaming.""" - resp = client.get('/') - assert resp.status_code == 200 - assert b'/streaming' in resp.data - - def test_index_has_extractions_link(self, client): - """La page d'accueil contient un lien vers /extractions.""" - resp = client.get('/') - assert resp.status_code == 200 - assert b'/extractions' in resp.data - - def test_gestures_has_back_link(self, client): - """La page gestures contient un lien retour vers le dashboard.""" - resp = client.get('/gestures') - assert resp.status_code == 200 - assert b'href="/"' in resp.data or b"href='/'" in resp.data diff --git a/tests/unit/test_env_setup.py b/tests/unit/test_env_setup.py new file mode 100644 index 000000000..0f748cfae --- /dev/null +++ b/tests/unit/test_env_setup.py @@ -0,0 +1,610 @@ +# tests/unit/test_env_setup.py +""" +Tests unitaires pour la phase de setup environnement (pré-replay). + +Vérifie que les fonctions d'extraction d'apps et de génération +d'actions de setup 100% visuelles fonctionnent correctement. +""" +import pytest +import sys +from pathlib import Path + +# Ajouter le répertoire racine au path pour l'import +ROOT = Path(__file__).parent.parent.parent +sys.path.insert(0, str(ROOT)) + +from agent_v0.server_v1.api_stream import ( + _extract_required_apps_from_events, + _extract_required_apps_from_workflow, + _resolve_launch_command, + _infer_app_from_window_titles, + _generate_setup_actions, + _get_visual_search_info, + _APP_LAUNCH_COMMANDS, + _APP_VISUAL_SEARCH, + _SETUP_IGNORE_APPS, +) + + +# ========================================================================= +# Tests pour _resolve_launch_command +# ========================================================================= + +class TestResolveLaunchCommand: + """Tests pour la résolution des commandes de lancement.""" + + def test_known_app(self): + """Les apps connues retournent la bonne commande.""" + assert _resolve_launch_command("Notepad.exe") == "notepad" + assert _resolve_launch_command("notepad.exe") == "notepad" + + def test_known_app_case_insensitive(self): + """Le mapping est insensible à la casse.""" + assert _resolve_launch_command("NOTEPAD.EXE") == "notepad" + assert _resolve_launch_command("Chrome.exe") == "chrome" + + def test_unknown_app_strips_exe(self): + """Les apps inconnues utilisent le nom sans .exe.""" + assert _resolve_launch_command("MonApp.exe") == "MonApp" + assert _resolve_launch_command("customtool.exe") == "customtool" + + def test_no_exe_extension(self): + """Les noms sans .exe sont retournés tels quels.""" + assert _resolve_launch_command("notepad") == "notepad" + + def test_all_mapped_apps(self): + """Toutes les apps du mapping sont résolvables.""" + for app_name, expected_cmd in _APP_LAUNCH_COMMANDS.items(): + assert _resolve_launch_command(app_name) == expected_cmd + + +# ========================================================================= +# Tests pour _get_visual_search_info +# ========================================================================= + +class TestGetVisualSearchInfo: + """Tests pour la résolution des infos de recherche visuelle.""" + + def test_known_app_notepad(self): + """Notepad retourne les infos visuelles françaises.""" + info = _get_visual_search_info("Notepad.exe") + assert info["search_text"] == "Bloc-notes" + assert info["display_name"] == "Bloc-notes" + assert "Bloc-notes" in info["vlm_description"] + + def test_known_app_calc(self): + """Calculatrice retourne les infos visuelles françaises.""" + info = _get_visual_search_info("calc.exe") + assert info["search_text"] == "Calculatrice" + + def test_known_app_word(self): + """Word retourne les infos visuelles.""" + info = _get_visual_search_info("winword.exe") + assert info["search_text"] == "Word" + assert info["display_name"] == "Microsoft Word" + + def test_case_insensitive(self): + """Le mapping est insensible à la casse.""" + info = _get_visual_search_info("NOTEPAD.EXE") + assert info["search_text"] == "Bloc-notes" + + def test_unknown_app_fallback(self): + """Une app inconnue utilise le nom sans .exe comme fallback.""" + info = _get_visual_search_info("MonApp.exe") + assert info["search_text"] == "MonApp" + assert info["display_name"] == "MonApp" + assert "MonApp" in info["vlm_description"] + + def test_unknown_app_no_exe(self): + """Une app sans .exe utilise le nom tel quel.""" + info = _get_visual_search_info("myapp") + assert info["search_text"] == "myapp" + + def test_all_visual_apps_have_required_keys(self): + """Toutes les apps du mapping visuel ont les clés requises.""" + for app_name, info in _APP_VISUAL_SEARCH.items(): + assert "search_text" in info, f"{app_name} manque search_text" + assert "display_name" in info, f"{app_name} manque display_name" + assert "vlm_description" in info, f"{app_name} manque vlm_description" + + +# ========================================================================= +# Tests pour _infer_app_from_window_titles +# ========================================================================= + +class TestInferAppFromWindowTitles: + """Tests pour l'inférence d'app depuis les titres de fenêtres.""" + + def test_notepad_french(self): + """Détecte Notepad depuis un titre français.""" + app, cmd, title = _infer_app_from_window_titles(["Sans titre – Bloc-notes"]) + assert app == "Notepad.exe" + assert cmd == "notepad" + assert title == "Sans titre – Bloc-notes" + + def test_notepad_english(self): + """Détecte Notepad depuis un titre anglais.""" + app, cmd, title = _infer_app_from_window_titles(["Untitled - Notepad"]) + assert app == "Notepad.exe" + assert cmd == "notepad" + + def test_word(self): + """Détecte Word.""" + app, cmd, _ = _infer_app_from_window_titles(["Document1 - Word"]) + assert app == "winword.exe" + assert cmd == "winword" + + def test_excel(self): + """Détecte Excel.""" + app, cmd, _ = _infer_app_from_window_titles(["Classeur1 - Excel"]) + assert app == "excel.exe" + assert cmd == "excel" + + def test_chrome(self): + """Détecte Chrome.""" + app, cmd, _ = _infer_app_from_window_titles(["Google - Chrome"]) + assert app == "chrome.exe" + assert cmd == "chrome" + + def test_explorer_ignored(self): + """Explorer est ignoré (app système).""" + app, cmd, _ = _infer_app_from_window_titles(["Explorateur de fichiers"]) + assert app == "" + assert cmd == "" + + def test_unknown_title(self): + """Un titre inconnu retourne des chaînes vides.""" + app, cmd, _ = _infer_app_from_window_titles(["Ma Super App Custom"]) + assert app == "" + assert cmd == "" + + def test_empty_list(self): + """Une liste vide retourne des chaînes vides.""" + app, cmd, _ = _infer_app_from_window_titles([]) + assert app == "" + assert cmd == "" + + def test_first_match_wins(self): + """Le premier titre reconnu est utilisé.""" + app, cmd, title = _infer_app_from_window_titles([ + "Rechercher", # Pas reconnu + "*test – Bloc-notes", # Notepad + "Document1 - Excel", # Excel (pas utilisé car Notepad est trouvé avant) + ]) + assert app == "Notepad.exe" + assert title == "*test – Bloc-notes" + + def test_returns_matched_title(self): + """Le titre matché est celui de l'app, pas le premier de la liste.""" + app, cmd, title = _infer_app_from_window_titles([ + "Rechercher", # Pas reconnu + "Sans titre – Bloc-notes", # Notepad → ce titre + ]) + assert title == "Sans titre – Bloc-notes" + + +# ========================================================================= +# Tests pour _extract_required_apps_from_events +# ========================================================================= + +class TestExtractRequiredAppsFromEvents: + """Tests pour l'extraction d'apps depuis les événements bruts.""" + + def _make_events(self, focus_changes): + """Helper : créer des événements bruts à partir de changements de focus.""" + events = [] + for from_info, to_info in focus_changes: + events.append({ + "session_id": "test_sess", + "event": { + "type": "window_focus_change", + "from": from_info, + "to": to_info, + }, + }) + return events + + def test_notepad_session(self): + """Détecte Notepad comme app principale.""" + events = self._make_events([ + (None, {"app_name": "explorer.exe", "title": "Explorateur"}), + ({"app_name": "explorer.exe"}, {"app_name": "SearchHost.exe", "title": "Rechercher"}), + ({"app_name": "SearchHost.exe"}, {"app_name": "Notepad.exe", "title": "Bloc-notes"}), + ({"app_name": "Notepad.exe"}, {"app_name": "Notepad.exe", "title": "Sans titre – Bloc-notes"}), + ({"app_name": "Notepad.exe"}, {"app_name": "Notepad.exe", "title": "*test – Bloc-notes"}), + ]) + + result = _extract_required_apps_from_events(events) + assert result["primary_app"] == "Notepad.exe" + assert result["primary_launch_cmd"] == "notepad" + # Le premier app hors ignorées est Notepad + assert result["first_window_title"] == "Bloc-notes" + + def test_empty_events(self): + """Pas d'événements → dict vide.""" + assert _extract_required_apps_from_events([]) == {} + + def test_only_system_apps(self): + """Que des apps système → dict vide.""" + events = self._make_events([ + (None, {"app_name": "explorer.exe", "title": "Bureau"}), + (None, {"app_name": "SearchHost.exe", "title": "Rechercher"}), + ]) + assert _extract_required_apps_from_events(events) == {} + + def test_multiple_apps_picks_most_frequent(self): + """L'app la plus fréquente (hors système) est choisie.""" + events = self._make_events([ + (None, {"app_name": "Notepad.exe", "title": "Bloc-notes"}), + (None, {"app_name": "calc.exe", "title": "Calculatrice"}), + (None, {"app_name": "calc.exe", "title": "Calculatrice"}), + (None, {"app_name": "calc.exe", "title": "Calculatrice"}), + ]) + result = _extract_required_apps_from_events(events) + assert result["primary_app"] == "calc.exe" + assert result["primary_launch_cmd"] == "calc" + + +# ========================================================================= +# Tests pour _extract_required_apps_from_workflow +# ========================================================================= + +class TestExtractRequiredAppsFromWorkflow: + """Tests pour l'extraction d'apps depuis un workflow structuré.""" + + def test_workflow_dict_with_notepad(self): + """Détecte Notepad depuis un workflow dict.""" + workflow = { + "nodes": [ + { + "node_id": "node_000", + "template": { + "window": { + "title_pattern": "Sans titre – Bloc-notes", + "title_contains": "Bloc-notes", + }, + }, + }, + ], + "edges": [], + "metadata": { + "source_session_id": "sess_test", + "machine_id": "DESKTOP-TEST", + }, + } + result = _extract_required_apps_from_workflow(workflow) + assert result["primary_app"] == "Notepad.exe" + assert result["primary_launch_cmd"] == "notepad" + + def test_workflow_no_recognizable_titles(self): + """Workflow sans titres reconnaissables → dict vide.""" + workflow = { + "nodes": [ + { + "node_id": "node_000", + "template": { + "window": {"title_pattern": "Rechercher"}, + }, + }, + ], + "edges": [], + "metadata": {}, + } + result = _extract_required_apps_from_workflow(workflow) + assert result == {} + + def test_empty_workflow(self): + """Workflow vide → dict vide.""" + assert _extract_required_apps_from_workflow({"nodes": [], "edges": []}) == {} + assert _extract_required_apps_from_workflow({}) == {} + + +# ========================================================================= +# Tests pour _generate_setup_actions — 100% visuel +# ========================================================================= + +class TestGenerateSetupActions: + """Tests pour la génération des actions de setup 100% visuelles.""" + + def test_notepad_setup_visual(self): + """Génère les bonnes actions visuelles pour lancer Notepad.""" + app_info = { + "primary_app": "Notepad.exe", + "primary_launch_cmd": "notepad", + "first_window_title": "Sans titre – Bloc-notes", + } + actions = _generate_setup_actions(app_info) + + # 9 actions : click_start, wait, click_search, wait, type, wait, click_result, wait, verify + assert len(actions) == 9 + + # Étape 1 : clic visuel sur le bouton Démarrer + assert actions[0]["type"] == "click" + assert actions[0]["visual_mode"] is True + assert actions[0]["target_spec"]["by_role"] == "start_button" + assert actions[0]["target_spec"]["by_text"] == "Démarrer" + + # Étape 2 : attente menu Démarrer + assert actions[1]["type"] == "wait" + assert actions[1]["duration_ms"] == 1000 + + # Étape 3 : clic visuel sur la barre de recherche + assert actions[2]["type"] == "click" + assert actions[2]["visual_mode"] is True + assert actions[2]["target_spec"]["by_role"] == "search_box" + + # Étape 4 : attente barre de recherche active + assert actions[3]["type"] == "wait" + assert actions[3]["duration_ms"] == 500 + + # Étape 5 : taper le nom visuel français + assert actions[4]["type"] == "type" + assert actions[4]["text"] == "Bloc-notes" + + # Étape 6 : attente résultats + assert actions[5]["type"] == "wait" + assert actions[5]["duration_ms"] == 1200 + + # Étape 7 : clic visuel sur le résultat + assert actions[6]["type"] == "click" + assert actions[6]["visual_mode"] is True + assert actions[6]["target_spec"]["by_text"] == "Bloc-notes" + assert actions[6]["target_spec"]["by_role"] == "app_icon" + + # Étape 8 : attente lancement (app légère = 2000ms) + assert actions[7]["type"] == "wait" + assert actions[7]["duration_ms"] == 2000 + + # Étape 9 : vérification visuelle + assert actions[8]["type"] == "verify_screen" + assert actions[8]["_expected_title"] == "Sans titre – Bloc-notes" + + # Toutes les actions sont marquées comme phase setup + for action in actions: + assert action.get("_setup_phase") is True + + def test_no_key_combo_in_setup(self): + """AUCUNE action key_combo ne doit être générée dans le setup.""" + app_info = { + "primary_app": "Notepad.exe", + "primary_launch_cmd": "notepad", + "first_window_title": "Bloc-notes", + } + actions = _generate_setup_actions(app_info) + key_combos = [a for a in actions if a["type"] == "key_combo"] + assert key_combos == [], ( + "Le setup 100% visuel ne doit JAMAIS contenir de key_combo. " + f"Trouvé : {key_combos}" + ) + + def test_all_clicks_are_visual(self): + """Tous les clics du setup doivent avoir visual_mode=True et un target_spec.""" + app_info = { + "primary_app": "Notepad.exe", + "primary_launch_cmd": "notepad", + "first_window_title": "Bloc-notes", + } + actions = _generate_setup_actions(app_info) + clicks = [a for a in actions if a["type"] == "click"] + assert len(clicks) >= 3 # Démarrer, recherche, résultat + + for click in clicks: + assert click.get("visual_mode") is True, ( + f"Clic {click.get('action_id')} n'a pas visual_mode=True" + ) + assert click.get("target_spec"), ( + f"Clic {click.get('action_id')} n'a pas de target_spec" + ) + # Chaque target_spec doit avoir by_text et by_role + spec = click["target_spec"] + assert "by_text" in spec, f"target_spec sans by_text : {spec}" + assert "by_role" in spec, f"target_spec sans by_role : {spec}" + assert "vlm_description" in spec, f"target_spec sans vlm_description : {spec}" + + def test_clicks_have_fallback_coordinates(self): + """Tous les clics visuels ont des coordonnées de fallback (x_pct, y_pct).""" + app_info = { + "primary_app": "Notepad.exe", + "primary_launch_cmd": "notepad", + "first_window_title": "Bloc-notes", + } + actions = _generate_setup_actions(app_info) + clicks = [a for a in actions if a["type"] == "click"] + + for click in clicks: + assert "x_pct" in click, f"Clic {click['action_id']} sans x_pct" + assert "y_pct" in click, f"Clic {click['action_id']} sans y_pct" + assert isinstance(click["x_pct"], (int, float)) + assert isinstance(click["y_pct"], (int, float)) + + def test_heavy_app_longer_wait(self): + """Les apps lourdes ont un temps d'attente plus long.""" + app_info = { + "primary_app": "winword.exe", + "primary_launch_cmd": "winword", + "first_window_title": "Document1 - Word", + } + actions = _generate_setup_actions(app_info) + wait_action = [a for a in actions if a.get("_setup_step") == "wait_app_launch"][0] + assert wait_action["duration_ms"] == 3000 + + def test_light_app_shorter_wait(self): + """Les apps légères ont un temps d'attente standard.""" + app_info = { + "primary_app": "Notepad.exe", + "primary_launch_cmd": "notepad", + "first_window_title": "Bloc-notes", + } + actions = _generate_setup_actions(app_info) + wait_action = [a for a in actions if a.get("_setup_step") == "wait_app_launch"][0] + assert wait_action["duration_ms"] == 2000 + + def test_word_uses_visual_search_text(self): + """Word utilise 'Word' comme texte de recherche visuelle, pas 'winword'.""" + app_info = { + "primary_app": "winword.exe", + "primary_launch_cmd": "winword", + "first_window_title": "Document1 - Word", + } + actions = _generate_setup_actions(app_info) + + # Le type doit utiliser le texte visuel, pas la commande shell + type_action = [a for a in actions if a["type"] == "type"][0] + assert type_action["text"] == "Word" + + # Le clic sur le résultat doit utiliser le display_name + click_result = [a for a in actions if a.get("_setup_step") == "click_app_result"][0] + assert click_result["target_spec"]["by_text"] == "Microsoft Word" + + def test_verify_screen_present_with_title(self): + """Un verify_screen est ajouté quand un titre de fenêtre est connu.""" + app_info = { + "primary_app": "Notepad.exe", + "primary_launch_cmd": "notepad", + "first_window_title": "Sans titre – Bloc-notes", + } + actions = _generate_setup_actions(app_info) + verify = [a for a in actions if a.get("type") == "verify_screen"] + assert len(verify) == 1 + assert verify[0]["_expected_title"] == "Sans titre – Bloc-notes" + + def test_no_verify_without_title(self): + """Pas de verify_screen si aucun titre de fenêtre n'est connu.""" + app_info = { + "primary_app": "Notepad.exe", + "primary_launch_cmd": "notepad", + "first_window_title": "", + } + actions = _generate_setup_actions(app_info) + verify = [a for a in actions if a.get("type") == "verify_screen"] + assert len(verify) == 0 + + def test_empty_app_info(self): + """Dict vide → pas d'actions.""" + assert _generate_setup_actions({}) == [] + + def test_system_app_ignored(self): + """Les apps système sont ignorées.""" + app_info = { + "primary_app": "explorer.exe", + "primary_launch_cmd": "explorer", + "first_window_title": "Explorateur", + } + assert _generate_setup_actions(app_info) == [] + + def test_no_launch_cmd(self): + """Pas de commande de lancement → pas d'actions.""" + app_info = { + "primary_app": "Notepad.exe", + "primary_launch_cmd": "", + "first_window_title": "Bloc-notes", + } + assert _generate_setup_actions(app_info) == [] + + def test_action_ids_unique(self): + """Tous les action_id sont uniques.""" + app_info = { + "primary_app": "Notepad.exe", + "primary_launch_cmd": "notepad", + "first_window_title": "Bloc-notes", + } + actions = _generate_setup_actions(app_info) + ids = [a["action_id"] for a in actions] + assert len(ids) == len(set(ids)) + + def test_custom_prefix(self): + """Le préfixe personnalisé est utilisé dans les action_id.""" + app_info = { + "primary_app": "Notepad.exe", + "primary_launch_cmd": "notepad", + "first_window_title": "Bloc-notes", + } + actions = _generate_setup_actions(app_info, setup_id_prefix="mysetup") + for action in actions: + assert "mysetup" in action["action_id"] + + def test_unknown_app_uses_fallback_visual_info(self): + """Une app inconnue utilise le nom de l'exécutable comme texte de recherche.""" + app_info = { + "primary_app": "MonAppMedical.exe", + "primary_launch_cmd": "MonAppMedical", + "first_window_title": "Mon App", + } + actions = _generate_setup_actions(app_info) + + # Le type doit utiliser le nom sans .exe + type_action = [a for a in actions if a["type"] == "type"][0] + assert type_action["text"] == "MonAppMedical" + + +# ========================================================================= +# Tests d'intégration : pipeline complet events → setup visuel +# ========================================================================= + +class TestSetupPipeline: + """Tests du pipeline complet : extraction + génération visuelle.""" + + def test_full_pipeline_from_events(self): + """Pipeline complet depuis des événements bruts de type Notepad.""" + events = [ + {"event": {"type": "window_focus_change", "from": None, + "to": {"app_name": "explorer.exe", "title": "Bureau"}}}, + {"event": {"type": "window_focus_change", + "from": {"app_name": "explorer.exe"}, + "to": {"app_name": "Notepad.exe", "title": "Sans titre – Bloc-notes"}}}, + {"event": {"type": "window_focus_change", + "from": {"app_name": "Notepad.exe"}, + "to": {"app_name": "Notepad.exe", "title": "*test – Bloc-notes"}}}, + ] + + app_info = _extract_required_apps_from_events(events) + assert app_info["primary_app"] == "Notepad.exe" + + actions = _generate_setup_actions(app_info) + assert len(actions) >= 8 # Au minimum 8 actions visuelles (sans verify si pas de titre) + + # Vérifier l'ordre logique 100% visuel + types = [a["type"] for a in actions] + assert types[0] == "click" # Clic Démarrer + assert types[1] == "wait" # Attente menu + assert types[2] == "click" # Clic barre de recherche + assert types[3] == "wait" # Attente barre active + assert types[4] == "type" # Taper le nom + assert types[5] == "wait" # Attente résultats + assert types[6] == "click" # Clic sur le résultat + assert types[7] == "wait" # Attente lancement + + # AUCUN key_combo dans le pipeline + assert "key_combo" not in types, "Le pipeline ne doit contenir aucun key_combo" + + # Le texte tapé est le nom visuel français + assert actions[4]["text"] == "Bloc-notes" + + def test_full_pipeline_from_workflow(self): + """Pipeline complet depuis un workflow structuré.""" + workflow = { + "nodes": [ + {"node_id": "n0", "template": { + "window": {"title_pattern": "Sans titre – Bloc-notes"}, + }}, + {"node_id": "n1", "template": { + "window": {"title_pattern": "*test – Bloc-notes"}, + }}, + ], + "edges": [], + "metadata": {}, + } + + app_info = _extract_required_apps_from_workflow(workflow) + assert app_info["primary_app"] == "Notepad.exe" + + actions = _generate_setup_actions(app_info) + assert len(actions) >= 8 + + # Le texte tapé doit être le nom visuel, pas la commande shell + type_action = [a for a in actions if a["type"] == "type"][0] + assert type_action["text"] == "Bloc-notes" + + # Aucun key_combo + key_combos = [a for a in actions if a["type"] == "key_combo"] + assert key_combos == [] diff --git a/tests/unit/test_gpu_resource_manager.py b/tests/unit/test_gpu_resource_manager.py index a77de78b0..cacd3506c 100644 --- a/tests/unit/test_gpu_resource_manager.py +++ b/tests/unit/test_gpu_resource_manager.py @@ -606,3 +606,79 @@ async def test_concurrent_operations_processed_sequentially(gpu_manager, mock_ol # Assert - operations should complete without interleaving assert "load_start" in operation_order assert "load_end" in operation_order + + +# ============================================================================= +# Tests pour acquire_inference (tâche 1 — sérialisation GPU concurrente) +# ============================================================================= + + +class TestAcquireInference: + """Sérialisation des appels GPU via acquire_inference().""" + + def test_acquire_release_basic(self, config): + """Le lock s'acquiert et se relâche sans erreur.""" + GPUResourceManager.reset_instance() + manager = GPUResourceManager(config) + + with manager.acquire_inference() as acquired: + assert acquired is True + + # Après sortie du contexte, on peut reprendre le lock immédiatement + with manager.acquire_inference(timeout=0.5) as acquired2: + assert acquired2 is True + + def test_acquire_inference_timeout(self, config): + """Si un autre thread tient le lock, le timeout retourne False.""" + import threading + + GPUResourceManager.reset_instance() + manager = GPUResourceManager(config) + held = threading.Event() + release = threading.Event() + + def holder(): + with manager.acquire_inference(): + held.set() + release.wait(timeout=5.0) + + thread = threading.Thread(target=holder, daemon=True) + thread.start() + assert held.wait(timeout=2.0) + + with manager.acquire_inference(timeout=0.1) as acquired: + assert acquired is False + + release.set() + thread.join(timeout=2.0) + + def test_acquire_inference_serializes_concurrent_calls(self, config): + """Deux threads ne peuvent pas être dans la section critique en même temps.""" + import threading + import time as _time + + GPUResourceManager.reset_instance() + manager = GPUResourceManager(config) + + inside = [] # compteur des threads actuellement dans la section + max_concurrent = [0] + lock = threading.Lock() + + def worker(): + with manager.acquire_inference(): + with lock: + inside.append(1) + max_concurrent[0] = max(max_concurrent[0], len(inside)) + _time.sleep(0.05) + with lock: + inside.pop() + + threads = [threading.Thread(target=worker) for _ in range(5)] + for t in threads: + t.start() + for t in threads: + t.join(timeout=5.0) + + assert max_concurrent[0] == 1, ( + f"Attendu max 1 thread simultané, observé {max_concurrent[0]}" + ) diff --git a/tests/unit/test_vwb_properties_panel_unit_10jan2026.py b/tests/unit/test_vwb_properties_panel_unit_10jan2026.py new file mode 100644 index 000000000..810cb6d1e --- /dev/null +++ b/tests/unit/test_vwb_properties_panel_unit_10jan2026.py @@ -0,0 +1,384 @@ +#!/usr/bin/env python3 +""" +Tests unitaires pour l'intégration du Properties Panel VWB avec les actions catalogue +Auteur : Dom, Alice, Kiro - 10 janvier 2026 + +Tests de validation de la Tâche 2.3 : Properties Panel Adapté VWB +- Intégration VWBActionProperties dans PropertiesPanel +- Éditeurs spécialisés pour paramètres VisionOnly +- Validation en temps réel des configurations +- Sélection visuelle fonctionnelle +""" + +import pytest +import json +import os +import sys +from pathlib import Path +from unittest.mock import Mock, patch, MagicMock + +# Ajouter le répertoire racine au path +sys.path.insert(0, str(Path(__file__).parent.parent.parent)) + +class TestVWBPropertiesPanelIntegration: + """Tests d'intégration du Properties Panel VWB avec le catalogue d'actions""" + + def setup_method(self): + """Configuration des tests""" + self.frontend_path = Path("visual_workflow_builder/frontend/src") + self.components_path = self.frontend_path / "components" + self.properties_panel_path = self.components_path / "PropertiesPanel" + + def test_properties_panel_structure(self): + """Test 1: Vérifier la structure du Properties Panel""" + # Vérifier que le fichier principal existe + main_file = self.properties_panel_path / "index.tsx" + assert main_file.exists(), "Le fichier PropertiesPanel/index.tsx doit exister" + + # Vérifier que le composant VWBActionProperties existe + vwb_file = self.properties_panel_path / "VWBActionProperties.tsx" + assert vwb_file.exists(), "Le fichier VWBActionProperties.tsx doit exister" + + print("✅ Structure du Properties Panel validée") + + @pytest.mark.skip(reason="API obsolète : PropertiesPanel refactoré, imports catalogService supprimés") + def test_properties_panel_imports(self): + """Test 2: Vérifier les imports du Properties Panel""" + main_file = self.properties_panel_path / "index.tsx" + content = main_file.read_text(encoding='utf-8') + + # Vérifier les imports essentiels + required_imports = [ + "import VWBActionProperties from './VWBActionProperties'", + "import { catalogService } from '../../services/catalogService'", + "import { VWBCatalogAction, VWBActionValidationResult } from '../../types/catalog'", + "import VisualSelector from '../VisualSelector'", + "import VariableAutocomplete from '../VariableAutocomplete'" + ] + + for import_stmt in required_imports: + assert import_stmt in content, f"Import manquant: {import_stmt}" + + print("✅ Imports du Properties Panel validés") + + @pytest.mark.skip(reason="API obsolète : PropertiesPanel refactoré, pattern détection VWB changé") + def test_vwb_action_detection_logic(self): + """Test 3: Vérifier la logique de détection des actions VWB""" + main_file = self.properties_panel_path / "index.tsx" + content = main_file.read_text(encoding='utf-8') + + # Vérifier la logique de détection des actions VWB + detection_patterns = [ + "const isVWBCatalogAction = useMemo", + "selectedStep?.type?.startsWith('vwb_catalog_')", + "selectedStep?.data?.isVWBCatalogAction === true" + ] + + for pattern in detection_patterns: + assert pattern in content, f"Pattern de détection manquant: {pattern}" + + print("✅ Logique de détection des actions VWB validée") + + @pytest.mark.skip(reason="API obsolète : PropertiesPanel refactoré, pattern chargement VWB changé") + def test_vwb_action_loading_logic(self): + """Test 4: Vérifier la logique de chargement des actions VWB""" + main_file = self.properties_panel_path / "index.tsx" + content = main_file.read_text(encoding='utf-8') + + # Vérifier la logique de chargement + loading_patterns = [ + "const loadVWBAction = async", + "await catalogService.getActionDetails", + "setVwbAction(action)" + ] + + for pattern in loading_patterns: + assert pattern in content, f"Pattern de chargement manquant: {pattern}" + + print("✅ Logique de chargement des actions VWB validée") + + def test_vwb_parameter_handlers(self): + """Test 5: Vérifier les gestionnaires de paramètres VWB""" + main_file = self.properties_panel_path / "index.tsx" + content = main_file.read_text(encoding='utf-8') + + # Vérifier les gestionnaires spécialisés + handler_patterns = [ + "const handleVWBParameterChange", + "const handleVWBValidationChange", + "onParameterChange={handleVWBParameterChange}", + "onValidationChange={handleVWBValidationChange}" + ] + + for pattern in handler_patterns: + assert pattern in content, f"Gestionnaire manquant: {pattern}" + + print("✅ Gestionnaires de paramètres VWB validés") + + @pytest.mark.skip(reason="API obsolète : PropertiesPanel refactoré, pattern rendu conditionnel changé") + def test_conditional_rendering_logic(self): + """Test 6: Vérifier la logique de rendu conditionnel""" + main_file = self.properties_panel_path / "index.tsx" + content = main_file.read_text(encoding='utf-8') + + # Vérifier le rendu conditionnel + rendering_patterns = [ + "{isVWBCatalogAction && vwbAction ? (", + " 0, f"Aucun message français trouvé dans {file_path.name}" + + print("✅ Localisation française validée") + + def test_performance_optimizations(self): + """Test 15: Vérifier les optimisations de performance""" + main_file = self.properties_panel_path / "index.tsx" + content = main_file.read_text(encoding='utf-8') + + # Vérifier les optimisations + optimizations = [ + "useMemo(", + "useCallback(", + "memo(PropertiesPanel", + "React.useEffect(" + ] + + for optimization in optimizations: + assert optimization in content, f"Optimisation manquante: {optimization}" + + print("✅ Optimisations de performance validées") + +def run_tests(): + """Exécuter tous les tests""" + test_instance = TestVWBPropertiesPanelIntegration() + test_instance.setup_method() + + tests = [ + test_instance.test_properties_panel_structure, + test_instance.test_properties_panel_imports, + test_instance.test_vwb_action_detection_logic, + test_instance.test_vwb_action_loading_logic, + test_instance.test_vwb_parameter_handlers, + test_instance.test_conditional_rendering_logic, + test_instance.test_vwb_action_properties_structure, + test_instance.test_visual_anchor_editor, + test_instance.test_parameter_type_editors, + test_instance.test_validation_integration, + test_instance.test_ui_components_integration, + test_instance.test_accessibility_features, + test_instance.test_error_handling, + test_instance.test_french_localization, + test_instance.test_performance_optimizations, + ] + + passed = 0 + failed = 0 + + print("🧪 TESTS UNITAIRES - PROPERTIES PANEL VWB INTÉGRATION") + print("=" * 60) + + for test in tests: + try: + test() + passed += 1 + except Exception as e: + print(f"❌ {test.__name__}: {str(e)}") + failed += 1 + + print("\n" + "=" * 60) + print(f"📊 RÉSULTATS: {passed}/{len(tests)} tests réussis") + + if failed == 0: + print("🎉 TOUS LES TESTS SONT PASSÉS!") + return True + else: + print(f"⚠️ {failed} test(s) échoué(s)") + return False + +if __name__ == "__main__": + success = run_tests() + sys.exit(0 if success else 1) \ No newline at end of file diff --git a/visual_workflow_builder/backend/actions/data/extraire_tableau.py b/visual_workflow_builder/backend/actions/data/extraire_tableau.py index 7384f17c7..ffbd2d851 100644 --- a/visual_workflow_builder/backend/actions/data/extraire_tableau.py +++ b/visual_workflow_builder/backend/actions/data/extraire_tableau.py @@ -29,7 +29,7 @@ from ...contracts.visual_anchor import VWBVisualAnchor # Configuration par défaut (centralisée via variable d'environnement) OLLAMA_DEFAULT_URL = os.environ.get("OLLAMA_URL", "http://localhost:11434") -OLLAMA_DEFAULT_MODEL = os.environ.get("VLM_MODEL", "qwen2.5-vl:7b") +OLLAMA_DEFAULT_MODEL = os.environ.get("RPA_VLM_MODEL", os.environ.get("VLM_MODEL", "gemma4:e4b")) class VWBExtraireTableauAction(BaseVWBAction): diff --git a/visual_workflow_builder/backend/actions/intelligence/analyser_avec_ia.py b/visual_workflow_builder/backend/actions/intelligence/analyser_avec_ia.py index e718046e5..7b0bd8134 100644 --- a/visual_workflow_builder/backend/actions/intelligence/analyser_avec_ia.py +++ b/visual_workflow_builder/backend/actions/intelligence/analyser_avec_ia.py @@ -27,7 +27,7 @@ import os # Configuration Ollama par défaut (configurable via variables d'environnement) OLLAMA_DEFAULT_URL = os.environ.get("OLLAMA_URL", "http://localhost:11434") -OLLAMA_DEFAULT_MODEL = os.environ.get("VLM_MODEL", "qwen3-vl:8b") +OLLAMA_DEFAULT_MODEL = os.environ.get("RPA_VLM_MODEL", os.environ.get("VLM_MODEL", "gemma4:e4b")) class VWBAnalyserAvecIAAction(BaseVWBAction): diff --git a/visual_workflow_builder/backend/actions/validation/verify_text_content.py b/visual_workflow_builder/backend/actions/validation/verify_text_content.py index c2bde7c28..d734def1d 100644 --- a/visual_workflow_builder/backend/actions/validation/verify_text_content.py +++ b/visual_workflow_builder/backend/actions/validation/verify_text_content.py @@ -39,7 +39,7 @@ class VWBVerifyTextContentAction(BaseVWBAction): # Configuration Ollama par défaut (centralisée via variable d'environnement) OLLAMA_URL = os.environ.get("OLLAMA_URL", "http://localhost:11434") - OLLAMA_MODEL = os.environ.get("VLM_MODEL", "qwen2.5-vl:7b") # Modèle de vision Qwen - excellent pour OCR + OLLAMA_MODEL = os.environ.get("RPA_VLM_MODEL", os.environ.get("VLM_MODEL", "gemma4:e4b")) def __init__( self, diff --git a/visual_workflow_builder/backend/catalog_routes_v2_vlm.py b/visual_workflow_builder/backend/catalog_routes_v2_vlm.py index 13f993319..a3ceb0c0e 100644 --- a/visual_workflow_builder/backend/catalog_routes_v2_vlm.py +++ b/visual_workflow_builder/backend/catalog_routes_v2_vlm.py @@ -110,11 +110,11 @@ except Exception as e: # ============================================================================ # VLM (Vision Language Model) - Ollama (fallback si OmniParser échoue) -# Configurable via variable d'environnement VLM_MODEL +# Configurable via variable d'environnement RPA_VLM_MODEL (ou VLM_MODEL) # ============================================================================ OLLAMA_URL = os.environ.get("OLLAMA_URL", "http://localhost:11434") -VLM_MODEL = os.environ.get("VLM_MODEL", "qwen3-vl:8b") # qwen3-vl offre une meilleure qualité OCR +VLM_MODEL = os.environ.get("RPA_VLM_MODEL", os.environ.get("VLM_MODEL", "gemma4:e4b")) # ============================================================================ # Pipeline VLM Coarse → Refine → Refine++ (Template Matching) diff --git a/visual_workflow_builder/backend/instance/workflows.db b/visual_workflow_builder/backend/instance/workflows.db index cefaf37df..9474fa486 100644 Binary files a/visual_workflow_builder/backend/instance/workflows.db and b/visual_workflow_builder/backend/instance/workflows.db differ diff --git a/visual_workflow_builder/backend/training_data/workflow_wf_f87a537d53fc_1776523414_1776534919.json b/visual_workflow_builder/backend/training_data/workflow_wf_f87a537d53fc_1776523414_1776534919.json new file mode 100644 index 000000000..61fecfad0 --- /dev/null +++ b/visual_workflow_builder/backend/training_data/workflow_wf_f87a537d53fc_1776523414_1776534919.json @@ -0,0 +1,67 @@ +{ + "workflow_id": "wf_f87a537d53fc_1776523414", + "workflow_name": "Windows_navigateur", + "description": "", + "tags": [], + "steps": [ + { + "order": 0, + "action_type": "click_anchor", + "label": "click_anchor", + "parameters": { + "visual_anchor": { + "anchor_id": "anchor_e699f12dea5d_1776523946", + "bounding_box": { + "x": 1207, + "y": 1025, + "width": 52, + "height": 50 + } + } + }, + "has_anchor": true + }, + { + "order": 0, + "action_type": "wait_for_anchor", + "label": "wait_for_anchor", + "parameters": { + "visual_anchor": { + "anchor_id": "anchor_c4784649c3f7_1776524106", + "bounding_box": { + "x": 190, + "y": 35, + "width": 140, + "height": 93 + } + } + }, + "has_anchor": true + }, + { + "order": 0, + "action_type": "type_text", + "label": "type_text", + "parameters": { + "text": "https://youtube.com", + "clear_before": true + }, + "has_anchor": false + } + ], + "exported_at": "2026-04-18T17:55:19.588636", + "metadata": { + "step_count": 3, + "action_types": [ + "type_text", + "click_anchor", + "wait_for_anchor" + ], + "has_anchors": true, + "warnings": [ + "Étape 1 (click_anchor): pas de label personnalisé", + "Étape 2 (wait_for_anchor): pas de label personnalisé", + "Étape 3 (type_text): pas de label personnalisé" + ] + } +} \ No newline at end of file diff --git a/visual_workflow_builder/frontend/package.json b/visual_workflow_builder/frontend/package.json index 5c8389e9e..9fc4ecfb1 100644 --- a/visual_workflow_builder/frontend/package.json +++ b/visual_workflow_builder/frontend/package.json @@ -2,7 +2,7 @@ "name": "frontend", "version": "0.1.0", "private": true, - "proxy": "http://localhost:5001", + "proxy": "http://localhost:5002", "dependencies": { "@emotion/react": "^11.14.0", "@emotion/styled": "^11.14.1", diff --git a/visual_workflow_builder/frontend_v4/node_modules/.package-lock.json b/visual_workflow_builder/frontend_v4/node_modules/.package-lock.json new file mode 100644 index 000000000..cdd84772c --- /dev/null +++ b/visual_workflow_builder/frontend_v4/node_modules/.package-lock.json @@ -0,0 +1,1141 @@ +{ + "name": "vwb-v4", + "version": "4.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "node_modules/@babel/code-frame": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz", + "integrity": "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.6.tgz", + "integrity": "sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.6.tgz", + "integrity": "sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/generator": "^7.28.6", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.6.tgz", + "integrity": "sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", + "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.6.tgz", + "integrity": "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.28.6" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.6.tgz", + "integrity": "sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/generator": "^7.28.6", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.6", + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.6.tgz", + "integrity": "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.27", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", + "dev": true + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.56.0.tgz", + "integrity": "sha512-MVC6UDp16ZSH7x4rtuJPAEoE1RwS8N4oK9DLHy3FTEdFoUTCFVzMfJl/BVJ330C+hx8FfprA5Wqx4FhZXkj2Kw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.56.0.tgz", + "integrity": "sha512-ZhGH1eA4Qv0lxaV00azCIS1ChedK0V32952Md3FtnxSqZTBTd6tgil4nZT5cU8B+SIw3PFYkvyR4FKo2oyZIHA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==" + }, + "node_modules/@types/d3-drag": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", + "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-selection": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz", + "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==" + }, + "node_modules/@types/d3-transition": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz", + "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-zoom": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", + "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", + "dependencies": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true + }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "devOptional": true + }, + "node_modules/@types/react": { + "version": "18.3.27", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.27.tgz", + "integrity": "sha512-cisd7gxkzjBKU2GgdYrTdtQx1SORymWyaAFhaxQPK9bYO9ot3Y5OikQRvY0VYQtvwjeQnizCINJAenh/V7MK2w==", + "devOptional": true, + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", + "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", + "dev": true, + "peerDependencies": { + "@types/react": "^18.0.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.27", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/@xyflow/react": { + "version": "12.10.0", + "resolved": "https://registry.npmjs.org/@xyflow/react/-/react-12.10.0.tgz", + "integrity": "sha512-eOtz3whDMWrB4KWVatIBrKuxECHqip6PfA8fTpaS2RUGVpiEAe+nqDKsLqkViVWxDGreq0lWX71Xth/SPAzXiw==", + "dependencies": { + "@xyflow/system": "0.0.74", + "classcat": "^5.0.3", + "zustand": "^4.4.0" + }, + "peerDependencies": { + "react": ">=17", + "react-dom": ">=17" + } + }, + "node_modules/@xyflow/system": { + "version": "0.0.74", + "resolved": "https://registry.npmjs.org/@xyflow/system/-/system-0.0.74.tgz", + "integrity": "sha512-7v7B/PkiVrkdZzSbL+inGAo6tkR/WQHHG0/jhSvLQToCsfa8YubOGmBYd1s08tpKpihdHDZFwzQZeR69QSBb4Q==", + "dependencies": { + "@types/d3-drag": "^3.0.7", + "@types/d3-interpolate": "^3.0.4", + "@types/d3-selection": "^3.0.10", + "@types/d3-transition": "^3.0.8", + "@types/d3-zoom": "^3.0.8", + "d3-drag": "^3.0.0", + "d3-interpolate": "^3.0.1", + "d3-selection": "^3.0.0", + "d3-zoom": "^3.0.0" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.9.17", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.17.tgz", + "integrity": "sha512-agD0MgJFUP/4nvjqzIB29zRPUuCF7Ge6mEv9s8dHrtYD7QWXRcx75rOADE/d5ah1NI+0vkDl0yorDd5U852IQQ==", + "dev": true, + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001766", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001766.tgz", + "integrity": "sha512-4C0lfJ0/YPjJQHagaE9x2Elb69CIqEPZeG0anQt9SIvIoOH4a4uaRl73IavyO+0qZh6MDLH//DrXThEYKHkmYA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/classcat": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/classcat/-/classcat-5.0.5.tgz", + "integrity": "sha512-JhZUT7JFcQy/EzW605k/ktHtncoo9vnyW/2GspNYwFlN1C/WmjuV/xtS04e9SOkL2sTdw0VAZ2UGCcQ9lR6p6w==" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "devOptional": true + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.277", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.277.tgz", + "integrity": "sha512-wKXFZw4erWmmOz5N/grBoJ2XrNJGDFMu2+W5ACHza5rHtvsqrK4gb6rnLC7XxKB9WlJ+RmyQatuEXmtm86xbnw==", + "dev": true + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-refresh": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.56.0.tgz", + "integrity": "sha512-9FwVqlgUHzbXtDg9RCMgodF3Ua4Na6Gau+Sdt9vyCN4RhHfVKX2DCHy3BjMLTDd47ITDhYAnTwGulWTblJSDLg==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.56.0", + "@rollup/rollup-android-arm64": "4.56.0", + "@rollup/rollup-darwin-arm64": "4.56.0", + "@rollup/rollup-darwin-x64": "4.56.0", + "@rollup/rollup-freebsd-arm64": "4.56.0", + "@rollup/rollup-freebsd-x64": "4.56.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.56.0", + "@rollup/rollup-linux-arm-musleabihf": "4.56.0", + "@rollup/rollup-linux-arm64-gnu": "4.56.0", + "@rollup/rollup-linux-arm64-musl": "4.56.0", + "@rollup/rollup-linux-loong64-gnu": "4.56.0", + "@rollup/rollup-linux-loong64-musl": "4.56.0", + "@rollup/rollup-linux-ppc64-gnu": "4.56.0", + "@rollup/rollup-linux-ppc64-musl": "4.56.0", + "@rollup/rollup-linux-riscv64-gnu": "4.56.0", + "@rollup/rollup-linux-riscv64-musl": "4.56.0", + "@rollup/rollup-linux-s390x-gnu": "4.56.0", + "@rollup/rollup-linux-x64-gnu": "4.56.0", + "@rollup/rollup-linux-x64-musl": "4.56.0", + "@rollup/rollup-openbsd-x64": "4.56.0", + "@rollup/rollup-openharmony-arm64": "4.56.0", + "@rollup/rollup-win32-arm64-msvc": "4.56.0", + "@rollup/rollup-win32-ia32-msvc": "4.56.0", + "@rollup/rollup-win32-x64-gnu": "4.56.0", + "@rollup/rollup-win32-x64-msvc": "4.56.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/use-sync-external-store": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/vite": { + "version": "5.4.21", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", + "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", + "dev": true, + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/zustand": { + "version": "4.5.7", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.7.tgz", + "integrity": "sha512-CHOUy7mu3lbD6o6LJLfllpjkzhHXSBlX8B9+qPddUsIfeF5S/UZ5q0kmCsnRqT1UHFQZchNFDDzMbQsuesHWlw==", + "dependencies": { + "use-sync-external-store": "^1.2.2" + }, + "engines": { + "node": ">=12.7.0" + }, + "peerDependencies": { + "@types/react": ">=16.8", + "immer": ">=9.0.6", + "react": ">=16.8" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + } + } + } + } +} diff --git a/visual_workflow_builder/frontend_v4/node_modules/.vite/deps/@xyflow_react.js b/visual_workflow_builder/frontend_v4/node_modules/.vite/deps/@xyflow_react.js new file mode 100644 index 000000000..9ef8094fc --- /dev/null +++ b/visual_workflow_builder/frontend_v4/node_modules/.vite/deps/@xyflow_react.js @@ -0,0 +1,9899 @@ +"use client"; +import { + require_jsx_runtime +} from "./chunk-GRWX7YRK.js"; +import { + require_react_dom +} from "./chunk-XPR23Y44.js"; +import { + __commonJS, + __toESM, + require_react +} from "./chunk-I4MZPW7S.js"; + +// node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js +var require_use_sync_external_store_shim_development = __commonJS({ + "node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js"(exports) { + "use strict"; + (function() { + function is(x, y) { + return x === y && (0 !== x || 1 / x === 1 / y) || x !== x && y !== y; + } + function useSyncExternalStore$2(subscribe, getSnapshot) { + didWarnOld18Alpha || void 0 === React.startTransition || (didWarnOld18Alpha = true, console.error( + "You are using an outdated, pre-release alpha of React 18 that does not support useSyncExternalStore. The use-sync-external-store shim will not work correctly. Upgrade to a newer pre-release." + )); + var value = getSnapshot(); + if (!didWarnUncachedGetSnapshot) { + var cachedValue = getSnapshot(); + objectIs(value, cachedValue) || (console.error( + "The result of getSnapshot should be cached to avoid an infinite loop" + ), didWarnUncachedGetSnapshot = true); + } + cachedValue = useState2({ + inst: { value, getSnapshot } + }); + var inst = cachedValue[0].inst, forceUpdate = cachedValue[1]; + useLayoutEffect2( + function() { + inst.value = value; + inst.getSnapshot = getSnapshot; + checkIfSnapshotChanged(inst) && forceUpdate({ inst }); + }, + [subscribe, value, getSnapshot] + ); + useEffect2( + function() { + checkIfSnapshotChanged(inst) && forceUpdate({ inst }); + return subscribe(function() { + checkIfSnapshotChanged(inst) && forceUpdate({ inst }); + }); + }, + [subscribe] + ); + useDebugValue2(value); + return value; + } + function checkIfSnapshotChanged(inst) { + var latestGetSnapshot = inst.getSnapshot; + inst = inst.value; + try { + var nextValue = latestGetSnapshot(); + return !objectIs(inst, nextValue); + } catch (error) { + return true; + } + } + function useSyncExternalStore$1(subscribe, getSnapshot) { + return getSnapshot(); + } + "undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && "function" === typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart && __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(Error()); + var React = require_react(), objectIs = "function" === typeof Object.is ? Object.is : is, useState2 = React.useState, useEffect2 = React.useEffect, useLayoutEffect2 = React.useLayoutEffect, useDebugValue2 = React.useDebugValue, didWarnOld18Alpha = false, didWarnUncachedGetSnapshot = false, shim = "undefined" === typeof window || "undefined" === typeof window.document || "undefined" === typeof window.document.createElement ? useSyncExternalStore$1 : useSyncExternalStore$2; + exports.useSyncExternalStore = void 0 !== React.useSyncExternalStore ? React.useSyncExternalStore : shim; + "undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && "function" === typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop && __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error()); + })(); + } +}); + +// node_modules/use-sync-external-store/shim/index.js +var require_shim = __commonJS({ + "node_modules/use-sync-external-store/shim/index.js"(exports, module) { + "use strict"; + if (false) { + module.exports = null; + } else { + module.exports = require_use_sync_external_store_shim_development(); + } + } +}); + +// node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js +var require_with_selector_development = __commonJS({ + "node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js"(exports) { + "use strict"; + (function() { + function is(x, y) { + return x === y && (0 !== x || 1 / x === 1 / y) || x !== x && y !== y; + } + "undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && "function" === typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart && __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(Error()); + var React = require_react(), shim = require_shim(), objectIs = "function" === typeof Object.is ? Object.is : is, useSyncExternalStore = shim.useSyncExternalStore, useRef2 = React.useRef, useEffect2 = React.useEffect, useMemo2 = React.useMemo, useDebugValue2 = React.useDebugValue; + exports.useSyncExternalStoreWithSelector = function(subscribe, getSnapshot, getServerSnapshot, selector2, isEqual) { + var instRef = useRef2(null); + if (null === instRef.current) { + var inst = { hasValue: false, value: null }; + instRef.current = inst; + } else inst = instRef.current; + instRef = useMemo2( + function() { + function memoizedSelector(nextSnapshot) { + if (!hasMemo) { + hasMemo = true; + memoizedSnapshot = nextSnapshot; + nextSnapshot = selector2(nextSnapshot); + if (void 0 !== isEqual && inst.hasValue) { + var currentSelection = inst.value; + if (isEqual(currentSelection, nextSnapshot)) + return memoizedSelection = currentSelection; + } + return memoizedSelection = nextSnapshot; + } + currentSelection = memoizedSelection; + if (objectIs(memoizedSnapshot, nextSnapshot)) + return currentSelection; + var nextSelection = selector2(nextSnapshot); + if (void 0 !== isEqual && isEqual(currentSelection, nextSelection)) + return memoizedSnapshot = nextSnapshot, currentSelection; + memoizedSnapshot = nextSnapshot; + return memoizedSelection = nextSelection; + } + var hasMemo = false, memoizedSnapshot, memoizedSelection, maybeGetServerSnapshot = void 0 === getServerSnapshot ? null : getServerSnapshot; + return [ + function() { + return memoizedSelector(getSnapshot()); + }, + null === maybeGetServerSnapshot ? void 0 : function() { + return memoizedSelector(maybeGetServerSnapshot()); + } + ]; + }, + [getSnapshot, getServerSnapshot, selector2, isEqual] + ); + var value = useSyncExternalStore(subscribe, instRef[0], instRef[1]); + useEffect2( + function() { + inst.hasValue = true; + inst.value = value; + }, + [value] + ); + useDebugValue2(value); + return value; + }; + "undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && "function" === typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop && __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error()); + })(); + } +}); + +// node_modules/use-sync-external-store/shim/with-selector.js +var require_with_selector = __commonJS({ + "node_modules/use-sync-external-store/shim/with-selector.js"(exports, module) { + "use strict"; + if (false) { + module.exports = null; + } else { + module.exports = require_with_selector_development(); + } + } +}); + +// node_modules/@xyflow/react/dist/esm/index.js +var import_jsx_runtime = __toESM(require_jsx_runtime()); +var import_react2 = __toESM(require_react()); + +// node_modules/classcat/index.js +function cc(names) { + if (typeof names === "string" || typeof names === "number") return "" + names; + let out = ""; + if (Array.isArray(names)) { + for (let i = 0, tmp; i < names.length; i++) { + if ((tmp = cc(names[i])) !== "") { + out += (out && " ") + tmp; + } + } + } else { + for (let k in names) { + if (names[k]) out += (out && " ") + k; + } + } + return out; +} + +// node_modules/d3-dispatch/src/dispatch.js +var noop = { value: () => { +} }; +function dispatch() { + for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) { + if (!(t = arguments[i] + "") || t in _ || /[\s.]/.test(t)) throw new Error("illegal type: " + t); + _[t] = []; + } + return new Dispatch(_); +} +function Dispatch(_) { + this._ = _; +} +function parseTypenames(typenames, types) { + return typenames.trim().split(/^|\s+/).map(function(t) { + var name = "", i = t.indexOf("."); + if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i); + if (t && !types.hasOwnProperty(t)) throw new Error("unknown type: " + t); + return { type: t, name }; + }); +} +Dispatch.prototype = dispatch.prototype = { + constructor: Dispatch, + on: function(typename, callback) { + var _ = this._, T = parseTypenames(typename + "", _), t, i = -1, n = T.length; + if (arguments.length < 2) { + while (++i < n) if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t; + return; + } + if (callback != null && typeof callback !== "function") throw new Error("invalid callback: " + callback); + while (++i < n) { + if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback); + else if (callback == null) for (t in _) _[t] = set(_[t], typename.name, null); + } + return this; + }, + copy: function() { + var copy = {}, _ = this._; + for (var t in _) copy[t] = _[t].slice(); + return new Dispatch(copy); + }, + call: function(type, that) { + if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2]; + if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type); + for (t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args); + }, + apply: function(type, that, args) { + if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type); + for (var t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args); + } +}; +function get(type, name) { + for (var i = 0, n = type.length, c; i < n; ++i) { + if ((c = type[i]).name === name) { + return c.value; + } + } +} +function set(type, name, callback) { + for (var i = 0, n = type.length; i < n; ++i) { + if (type[i].name === name) { + type[i] = noop, type = type.slice(0, i).concat(type.slice(i + 1)); + break; + } + } + if (callback != null) type.push({ name, value: callback }); + return type; +} +var dispatch_default = dispatch; + +// node_modules/d3-selection/src/namespaces.js +var xhtml = "http://www.w3.org/1999/xhtml"; +var namespaces_default = { + svg: "http://www.w3.org/2000/svg", + xhtml, + xlink: "http://www.w3.org/1999/xlink", + xml: "http://www.w3.org/XML/1998/namespace", + xmlns: "http://www.w3.org/2000/xmlns/" +}; + +// node_modules/d3-selection/src/namespace.js +function namespace_default(name) { + var prefix = name += "", i = prefix.indexOf(":"); + if (i >= 0 && (prefix = name.slice(0, i)) !== "xmlns") name = name.slice(i + 1); + return namespaces_default.hasOwnProperty(prefix) ? { space: namespaces_default[prefix], local: name } : name; +} + +// node_modules/d3-selection/src/creator.js +function creatorInherit(name) { + return function() { + var document2 = this.ownerDocument, uri = this.namespaceURI; + return uri === xhtml && document2.documentElement.namespaceURI === xhtml ? document2.createElement(name) : document2.createElementNS(uri, name); + }; +} +function creatorFixed(fullname) { + return function() { + return this.ownerDocument.createElementNS(fullname.space, fullname.local); + }; +} +function creator_default(name) { + var fullname = namespace_default(name); + return (fullname.local ? creatorFixed : creatorInherit)(fullname); +} + +// node_modules/d3-selection/src/selector.js +function none() { +} +function selector_default(selector2) { + return selector2 == null ? none : function() { + return this.querySelector(selector2); + }; +} + +// node_modules/d3-selection/src/selection/select.js +function select_default(select) { + if (typeof select !== "function") select = selector_default(select); + for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) { + if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) { + if ("__data__" in node) subnode.__data__ = node.__data__; + subgroup[i] = subnode; + } + } + } + return new Selection(subgroups, this._parents); +} + +// node_modules/d3-selection/src/array.js +function array(x) { + return x == null ? [] : Array.isArray(x) ? x : Array.from(x); +} + +// node_modules/d3-selection/src/selectorAll.js +function empty() { + return []; +} +function selectorAll_default(selector2) { + return selector2 == null ? empty : function() { + return this.querySelectorAll(selector2); + }; +} + +// node_modules/d3-selection/src/selection/selectAll.js +function arrayAll(select) { + return function() { + return array(select.apply(this, arguments)); + }; +} +function selectAll_default(select) { + if (typeof select === "function") select = arrayAll(select); + else select = selectorAll_default(select); + for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + subgroups.push(select.call(node, node.__data__, i, group)); + parents.push(node); + } + } + } + return new Selection(subgroups, parents); +} + +// node_modules/d3-selection/src/matcher.js +function matcher_default(selector2) { + return function() { + return this.matches(selector2); + }; +} +function childMatcher(selector2) { + return function(node) { + return node.matches(selector2); + }; +} + +// node_modules/d3-selection/src/selection/selectChild.js +var find = Array.prototype.find; +function childFind(match) { + return function() { + return find.call(this.children, match); + }; +} +function childFirst() { + return this.firstElementChild; +} +function selectChild_default(match) { + return this.select(match == null ? childFirst : childFind(typeof match === "function" ? match : childMatcher(match))); +} + +// node_modules/d3-selection/src/selection/selectChildren.js +var filter = Array.prototype.filter; +function children() { + return Array.from(this.children); +} +function childrenFilter(match) { + return function() { + return filter.call(this.children, match); + }; +} +function selectChildren_default(match) { + return this.selectAll(match == null ? children : childrenFilter(typeof match === "function" ? match : childMatcher(match))); +} + +// node_modules/d3-selection/src/selection/filter.js +function filter_default(match) { + if (typeof match !== "function") match = matcher_default(match); + for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) { + if ((node = group[i]) && match.call(node, node.__data__, i, group)) { + subgroup.push(node); + } + } + } + return new Selection(subgroups, this._parents); +} + +// node_modules/d3-selection/src/selection/sparse.js +function sparse_default(update) { + return new Array(update.length); +} + +// node_modules/d3-selection/src/selection/enter.js +function enter_default() { + return new Selection(this._enter || this._groups.map(sparse_default), this._parents); +} +function EnterNode(parent, datum2) { + this.ownerDocument = parent.ownerDocument; + this.namespaceURI = parent.namespaceURI; + this._next = null; + this._parent = parent; + this.__data__ = datum2; +} +EnterNode.prototype = { + constructor: EnterNode, + appendChild: function(child) { + return this._parent.insertBefore(child, this._next); + }, + insertBefore: function(child, next) { + return this._parent.insertBefore(child, next); + }, + querySelector: function(selector2) { + return this._parent.querySelector(selector2); + }, + querySelectorAll: function(selector2) { + return this._parent.querySelectorAll(selector2); + } +}; + +// node_modules/d3-selection/src/constant.js +function constant_default(x) { + return function() { + return x; + }; +} + +// node_modules/d3-selection/src/selection/data.js +function bindIndex(parent, group, enter, update, exit, data) { + var i = 0, node, groupLength = group.length, dataLength = data.length; + for (; i < dataLength; ++i) { + if (node = group[i]) { + node.__data__ = data[i]; + update[i] = node; + } else { + enter[i] = new EnterNode(parent, data[i]); + } + } + for (; i < groupLength; ++i) { + if (node = group[i]) { + exit[i] = node; + } + } +} +function bindKey(parent, group, enter, update, exit, data, key) { + var i, node, nodeByKeyValue = /* @__PURE__ */ new Map(), groupLength = group.length, dataLength = data.length, keyValues = new Array(groupLength), keyValue; + for (i = 0; i < groupLength; ++i) { + if (node = group[i]) { + keyValues[i] = keyValue = key.call(node, node.__data__, i, group) + ""; + if (nodeByKeyValue.has(keyValue)) { + exit[i] = node; + } else { + nodeByKeyValue.set(keyValue, node); + } + } + } + for (i = 0; i < dataLength; ++i) { + keyValue = key.call(parent, data[i], i, data) + ""; + if (node = nodeByKeyValue.get(keyValue)) { + update[i] = node; + node.__data__ = data[i]; + nodeByKeyValue.delete(keyValue); + } else { + enter[i] = new EnterNode(parent, data[i]); + } + } + for (i = 0; i < groupLength; ++i) { + if ((node = group[i]) && nodeByKeyValue.get(keyValues[i]) === node) { + exit[i] = node; + } + } +} +function datum(node) { + return node.__data__; +} +function data_default(value, key) { + if (!arguments.length) return Array.from(this, datum); + var bind = key ? bindKey : bindIndex, parents = this._parents, groups = this._groups; + if (typeof value !== "function") value = constant_default(value); + for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) { + var parent = parents[j], group = groups[j], groupLength = group.length, data = arraylike(value.call(parent, parent && parent.__data__, j, parents)), dataLength = data.length, enterGroup = enter[j] = new Array(dataLength), updateGroup = update[j] = new Array(dataLength), exitGroup = exit[j] = new Array(groupLength); + bind(parent, group, enterGroup, updateGroup, exitGroup, data, key); + for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) { + if (previous = enterGroup[i0]) { + if (i0 >= i1) i1 = i0 + 1; + while (!(next = updateGroup[i1]) && ++i1 < dataLength) ; + previous._next = next || null; + } + } + } + update = new Selection(update, parents); + update._enter = enter; + update._exit = exit; + return update; +} +function arraylike(data) { + return typeof data === "object" && "length" in data ? data : Array.from(data); +} + +// node_modules/d3-selection/src/selection/exit.js +function exit_default() { + return new Selection(this._exit || this._groups.map(sparse_default), this._parents); +} + +// node_modules/d3-selection/src/selection/join.js +function join_default(onenter, onupdate, onexit) { + var enter = this.enter(), update = this, exit = this.exit(); + if (typeof onenter === "function") { + enter = onenter(enter); + if (enter) enter = enter.selection(); + } else { + enter = enter.append(onenter + ""); + } + if (onupdate != null) { + update = onupdate(update); + if (update) update = update.selection(); + } + if (onexit == null) exit.remove(); + else onexit(exit); + return enter && update ? enter.merge(update).order() : update; +} + +// node_modules/d3-selection/src/selection/merge.js +function merge_default(context) { + var selection2 = context.selection ? context.selection() : context; + for (var groups0 = this._groups, groups1 = selection2._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) { + for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) { + if (node = group0[i] || group1[i]) { + merge[i] = node; + } + } + } + for (; j < m0; ++j) { + merges[j] = groups0[j]; + } + return new Selection(merges, this._parents); +} + +// node_modules/d3-selection/src/selection/order.js +function order_default() { + for (var groups = this._groups, j = -1, m = groups.length; ++j < m; ) { + for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0; ) { + if (node = group[i]) { + if (next && node.compareDocumentPosition(next) ^ 4) next.parentNode.insertBefore(node, next); + next = node; + } + } + } + return this; +} + +// node_modules/d3-selection/src/selection/sort.js +function sort_default(compare) { + if (!compare) compare = ascending; + function compareNode(a, b) { + return a && b ? compare(a.__data__, b.__data__) : !a - !b; + } + for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) { + if (node = group[i]) { + sortgroup[i] = node; + } + } + sortgroup.sort(compareNode); + } + return new Selection(sortgroups, this._parents).order(); +} +function ascending(a, b) { + return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN; +} + +// node_modules/d3-selection/src/selection/call.js +function call_default() { + var callback = arguments[0]; + arguments[0] = this; + callback.apply(null, arguments); + return this; +} + +// node_modules/d3-selection/src/selection/nodes.js +function nodes_default() { + return Array.from(this); +} + +// node_modules/d3-selection/src/selection/node.js +function node_default() { + for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) { + for (var group = groups[j], i = 0, n = group.length; i < n; ++i) { + var node = group[i]; + if (node) return node; + } + } + return null; +} + +// node_modules/d3-selection/src/selection/size.js +function size_default() { + let size = 0; + for (const node of this) ++size; + return size; +} + +// node_modules/d3-selection/src/selection/empty.js +function empty_default() { + return !this.node(); +} + +// node_modules/d3-selection/src/selection/each.js +function each_default(callback) { + for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) { + for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) { + if (node = group[i]) callback.call(node, node.__data__, i, group); + } + } + return this; +} + +// node_modules/d3-selection/src/selection/attr.js +function attrRemove(name) { + return function() { + this.removeAttribute(name); + }; +} +function attrRemoveNS(fullname) { + return function() { + this.removeAttributeNS(fullname.space, fullname.local); + }; +} +function attrConstant(name, value) { + return function() { + this.setAttribute(name, value); + }; +} +function attrConstantNS(fullname, value) { + return function() { + this.setAttributeNS(fullname.space, fullname.local, value); + }; +} +function attrFunction(name, value) { + return function() { + var v = value.apply(this, arguments); + if (v == null) this.removeAttribute(name); + else this.setAttribute(name, v); + }; +} +function attrFunctionNS(fullname, value) { + return function() { + var v = value.apply(this, arguments); + if (v == null) this.removeAttributeNS(fullname.space, fullname.local); + else this.setAttributeNS(fullname.space, fullname.local, v); + }; +} +function attr_default(name, value) { + var fullname = namespace_default(name); + if (arguments.length < 2) { + var node = this.node(); + return fullname.local ? node.getAttributeNS(fullname.space, fullname.local) : node.getAttribute(fullname); + } + return this.each((value == null ? fullname.local ? attrRemoveNS : attrRemove : typeof value === "function" ? fullname.local ? attrFunctionNS : attrFunction : fullname.local ? attrConstantNS : attrConstant)(fullname, value)); +} + +// node_modules/d3-selection/src/window.js +function window_default(node) { + return node.ownerDocument && node.ownerDocument.defaultView || node.document && node || node.defaultView; +} + +// node_modules/d3-selection/src/selection/style.js +function styleRemove(name) { + return function() { + this.style.removeProperty(name); + }; +} +function styleConstant(name, value, priority) { + return function() { + this.style.setProperty(name, value, priority); + }; +} +function styleFunction(name, value, priority) { + return function() { + var v = value.apply(this, arguments); + if (v == null) this.style.removeProperty(name); + else this.style.setProperty(name, v, priority); + }; +} +function style_default(name, value, priority) { + return arguments.length > 1 ? this.each((value == null ? styleRemove : typeof value === "function" ? styleFunction : styleConstant)(name, value, priority == null ? "" : priority)) : styleValue(this.node(), name); +} +function styleValue(node, name) { + return node.style.getPropertyValue(name) || window_default(node).getComputedStyle(node, null).getPropertyValue(name); +} + +// node_modules/d3-selection/src/selection/property.js +function propertyRemove(name) { + return function() { + delete this[name]; + }; +} +function propertyConstant(name, value) { + return function() { + this[name] = value; + }; +} +function propertyFunction(name, value) { + return function() { + var v = value.apply(this, arguments); + if (v == null) delete this[name]; + else this[name] = v; + }; +} +function property_default(name, value) { + return arguments.length > 1 ? this.each((value == null ? propertyRemove : typeof value === "function" ? propertyFunction : propertyConstant)(name, value)) : this.node()[name]; +} + +// node_modules/d3-selection/src/selection/classed.js +function classArray(string) { + return string.trim().split(/^|\s+/); +} +function classList(node) { + return node.classList || new ClassList(node); +} +function ClassList(node) { + this._node = node; + this._names = classArray(node.getAttribute("class") || ""); +} +ClassList.prototype = { + add: function(name) { + var i = this._names.indexOf(name); + if (i < 0) { + this._names.push(name); + this._node.setAttribute("class", this._names.join(" ")); + } + }, + remove: function(name) { + var i = this._names.indexOf(name); + if (i >= 0) { + this._names.splice(i, 1); + this._node.setAttribute("class", this._names.join(" ")); + } + }, + contains: function(name) { + return this._names.indexOf(name) >= 0; + } +}; +function classedAdd(node, names) { + var list = classList(node), i = -1, n = names.length; + while (++i < n) list.add(names[i]); +} +function classedRemove(node, names) { + var list = classList(node), i = -1, n = names.length; + while (++i < n) list.remove(names[i]); +} +function classedTrue(names) { + return function() { + classedAdd(this, names); + }; +} +function classedFalse(names) { + return function() { + classedRemove(this, names); + }; +} +function classedFunction(names, value) { + return function() { + (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names); + }; +} +function classed_default(name, value) { + var names = classArray(name + ""); + if (arguments.length < 2) { + var list = classList(this.node()), i = -1, n = names.length; + while (++i < n) if (!list.contains(names[i])) return false; + return true; + } + return this.each((typeof value === "function" ? classedFunction : value ? classedTrue : classedFalse)(names, value)); +} + +// node_modules/d3-selection/src/selection/text.js +function textRemove() { + this.textContent = ""; +} +function textConstant(value) { + return function() { + this.textContent = value; + }; +} +function textFunction(value) { + return function() { + var v = value.apply(this, arguments); + this.textContent = v == null ? "" : v; + }; +} +function text_default(value) { + return arguments.length ? this.each(value == null ? textRemove : (typeof value === "function" ? textFunction : textConstant)(value)) : this.node().textContent; +} + +// node_modules/d3-selection/src/selection/html.js +function htmlRemove() { + this.innerHTML = ""; +} +function htmlConstant(value) { + return function() { + this.innerHTML = value; + }; +} +function htmlFunction(value) { + return function() { + var v = value.apply(this, arguments); + this.innerHTML = v == null ? "" : v; + }; +} +function html_default(value) { + return arguments.length ? this.each(value == null ? htmlRemove : (typeof value === "function" ? htmlFunction : htmlConstant)(value)) : this.node().innerHTML; +} + +// node_modules/d3-selection/src/selection/raise.js +function raise() { + if (this.nextSibling) this.parentNode.appendChild(this); +} +function raise_default() { + return this.each(raise); +} + +// node_modules/d3-selection/src/selection/lower.js +function lower() { + if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild); +} +function lower_default() { + return this.each(lower); +} + +// node_modules/d3-selection/src/selection/append.js +function append_default(name) { + var create2 = typeof name === "function" ? name : creator_default(name); + return this.select(function() { + return this.appendChild(create2.apply(this, arguments)); + }); +} + +// node_modules/d3-selection/src/selection/insert.js +function constantNull() { + return null; +} +function insert_default(name, before) { + var create2 = typeof name === "function" ? name : creator_default(name), select = before == null ? constantNull : typeof before === "function" ? before : selector_default(before); + return this.select(function() { + return this.insertBefore(create2.apply(this, arguments), select.apply(this, arguments) || null); + }); +} + +// node_modules/d3-selection/src/selection/remove.js +function remove() { + var parent = this.parentNode; + if (parent) parent.removeChild(this); +} +function remove_default() { + return this.each(remove); +} + +// node_modules/d3-selection/src/selection/clone.js +function selection_cloneShallow() { + var clone = this.cloneNode(false), parent = this.parentNode; + return parent ? parent.insertBefore(clone, this.nextSibling) : clone; +} +function selection_cloneDeep() { + var clone = this.cloneNode(true), parent = this.parentNode; + return parent ? parent.insertBefore(clone, this.nextSibling) : clone; +} +function clone_default(deep) { + return this.select(deep ? selection_cloneDeep : selection_cloneShallow); +} + +// node_modules/d3-selection/src/selection/datum.js +function datum_default(value) { + return arguments.length ? this.property("__data__", value) : this.node().__data__; +} + +// node_modules/d3-selection/src/selection/on.js +function contextListener(listener) { + return function(event) { + listener.call(this, event, this.__data__); + }; +} +function parseTypenames2(typenames) { + return typenames.trim().split(/^|\s+/).map(function(t) { + var name = "", i = t.indexOf("."); + if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i); + return { type: t, name }; + }); +} +function onRemove(typename) { + return function() { + var on = this.__on; + if (!on) return; + for (var j = 0, i = -1, m = on.length, o; j < m; ++j) { + if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) { + this.removeEventListener(o.type, o.listener, o.options); + } else { + on[++i] = o; + } + } + if (++i) on.length = i; + else delete this.__on; + }; +} +function onAdd(typename, value, options) { + return function() { + var on = this.__on, o, listener = contextListener(value); + if (on) for (var j = 0, m = on.length; j < m; ++j) { + if ((o = on[j]).type === typename.type && o.name === typename.name) { + this.removeEventListener(o.type, o.listener, o.options); + this.addEventListener(o.type, o.listener = listener, o.options = options); + o.value = value; + return; + } + } + this.addEventListener(typename.type, listener, options); + o = { type: typename.type, name: typename.name, value, listener, options }; + if (!on) this.__on = [o]; + else on.push(o); + }; +} +function on_default(typename, value, options) { + var typenames = parseTypenames2(typename + ""), i, n = typenames.length, t; + if (arguments.length < 2) { + var on = this.node().__on; + if (on) for (var j = 0, m = on.length, o; j < m; ++j) { + for (i = 0, o = on[j]; i < n; ++i) { + if ((t = typenames[i]).type === o.type && t.name === o.name) { + return o.value; + } + } + } + return; + } + on = value ? onAdd : onRemove; + for (i = 0; i < n; ++i) this.each(on(typenames[i], value, options)); + return this; +} + +// node_modules/d3-selection/src/selection/dispatch.js +function dispatchEvent(node, type, params) { + var window2 = window_default(node), event = window2.CustomEvent; + if (typeof event === "function") { + event = new event(type, params); + } else { + event = window2.document.createEvent("Event"); + if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail; + else event.initEvent(type, false, false); + } + node.dispatchEvent(event); +} +function dispatchConstant(type, params) { + return function() { + return dispatchEvent(this, type, params); + }; +} +function dispatchFunction(type, params) { + return function() { + return dispatchEvent(this, type, params.apply(this, arguments)); + }; +} +function dispatch_default2(type, params) { + return this.each((typeof params === "function" ? dispatchFunction : dispatchConstant)(type, params)); +} + +// node_modules/d3-selection/src/selection/iterator.js +function* iterator_default() { + for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) { + for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) { + if (node = group[i]) yield node; + } + } +} + +// node_modules/d3-selection/src/selection/index.js +var root = [null]; +function Selection(groups, parents) { + this._groups = groups; + this._parents = parents; +} +function selection() { + return new Selection([[document.documentElement]], root); +} +function selection_selection() { + return this; +} +Selection.prototype = selection.prototype = { + constructor: Selection, + select: select_default, + selectAll: selectAll_default, + selectChild: selectChild_default, + selectChildren: selectChildren_default, + filter: filter_default, + data: data_default, + enter: enter_default, + exit: exit_default, + join: join_default, + merge: merge_default, + selection: selection_selection, + order: order_default, + sort: sort_default, + call: call_default, + nodes: nodes_default, + node: node_default, + size: size_default, + empty: empty_default, + each: each_default, + attr: attr_default, + style: style_default, + property: property_default, + classed: classed_default, + text: text_default, + html: html_default, + raise: raise_default, + lower: lower_default, + append: append_default, + insert: insert_default, + remove: remove_default, + clone: clone_default, + datum: datum_default, + on: on_default, + dispatch: dispatch_default2, + [Symbol.iterator]: iterator_default +}; +var selection_default = selection; + +// node_modules/d3-selection/src/select.js +function select_default2(selector2) { + return typeof selector2 === "string" ? new Selection([[document.querySelector(selector2)]], [document.documentElement]) : new Selection([[selector2]], root); +} + +// node_modules/d3-selection/src/local.js +var nextId = 0; +function local() { + return new Local(); +} +function Local() { + this._ = "@" + (++nextId).toString(36); +} +Local.prototype = local.prototype = { + constructor: Local, + get: function(node) { + var id2 = this._; + while (!(id2 in node)) if (!(node = node.parentNode)) return; + return node[id2]; + }, + set: function(node, value) { + return node[this._] = value; + }, + remove: function(node) { + return this._ in node && delete node[this._]; + }, + toString: function() { + return this._; + } +}; + +// node_modules/d3-selection/src/sourceEvent.js +function sourceEvent_default(event) { + let sourceEvent; + while (sourceEvent = event.sourceEvent) event = sourceEvent; + return event; +} + +// node_modules/d3-selection/src/pointer.js +function pointer_default(event, node) { + event = sourceEvent_default(event); + if (node === void 0) node = event.currentTarget; + if (node) { + var svg = node.ownerSVGElement || node; + if (svg.createSVGPoint) { + var point = svg.createSVGPoint(); + point.x = event.clientX, point.y = event.clientY; + point = point.matrixTransform(node.getScreenCTM().inverse()); + return [point.x, point.y]; + } + if (node.getBoundingClientRect) { + var rect = node.getBoundingClientRect(); + return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop]; + } + } + return [event.pageX, event.pageY]; +} + +// node_modules/d3-drag/src/noevent.js +var nonpassive = { passive: false }; +var nonpassivecapture = { capture: true, passive: false }; +function nopropagation(event) { + event.stopImmediatePropagation(); +} +function noevent_default(event) { + event.preventDefault(); + event.stopImmediatePropagation(); +} + +// node_modules/d3-drag/src/nodrag.js +function nodrag_default(view) { + var root2 = view.document.documentElement, selection2 = select_default2(view).on("dragstart.drag", noevent_default, nonpassivecapture); + if ("onselectstart" in root2) { + selection2.on("selectstart.drag", noevent_default, nonpassivecapture); + } else { + root2.__noselect = root2.style.MozUserSelect; + root2.style.MozUserSelect = "none"; + } +} +function yesdrag(view, noclick) { + var root2 = view.document.documentElement, selection2 = select_default2(view).on("dragstart.drag", null); + if (noclick) { + selection2.on("click.drag", noevent_default, nonpassivecapture); + setTimeout(function() { + selection2.on("click.drag", null); + }, 0); + } + if ("onselectstart" in root2) { + selection2.on("selectstart.drag", null); + } else { + root2.style.MozUserSelect = root2.__noselect; + delete root2.__noselect; + } +} + +// node_modules/d3-drag/src/constant.js +var constant_default2 = (x) => () => x; + +// node_modules/d3-drag/src/event.js +function DragEvent(type, { + sourceEvent, + subject, + target, + identifier, + active, + x, + y, + dx, + dy, + dispatch: dispatch2 +}) { + Object.defineProperties(this, { + type: { value: type, enumerable: true, configurable: true }, + sourceEvent: { value: sourceEvent, enumerable: true, configurable: true }, + subject: { value: subject, enumerable: true, configurable: true }, + target: { value: target, enumerable: true, configurable: true }, + identifier: { value: identifier, enumerable: true, configurable: true }, + active: { value: active, enumerable: true, configurable: true }, + x: { value: x, enumerable: true, configurable: true }, + y: { value: y, enumerable: true, configurable: true }, + dx: { value: dx, enumerable: true, configurable: true }, + dy: { value: dy, enumerable: true, configurable: true }, + _: { value: dispatch2 } + }); +} +DragEvent.prototype.on = function() { + var value = this._.on.apply(this._, arguments); + return value === this._ ? this : value; +}; + +// node_modules/d3-drag/src/drag.js +function defaultFilter(event) { + return !event.ctrlKey && !event.button; +} +function defaultContainer() { + return this.parentNode; +} +function defaultSubject(event, d) { + return d == null ? { x: event.x, y: event.y } : d; +} +function defaultTouchable() { + return navigator.maxTouchPoints || "ontouchstart" in this; +} +function drag_default() { + var filter2 = defaultFilter, container = defaultContainer, subject = defaultSubject, touchable = defaultTouchable, gestures = {}, listeners = dispatch_default("start", "drag", "end"), active = 0, mousedownx, mousedowny, mousemoving, touchending, clickDistance2 = 0; + function drag(selection2) { + selection2.on("mousedown.drag", mousedowned).filter(touchable).on("touchstart.drag", touchstarted).on("touchmove.drag", touchmoved, nonpassive).on("touchend.drag touchcancel.drag", touchended).style("touch-action", "none").style("-webkit-tap-highlight-color", "rgba(0,0,0,0)"); + } + function mousedowned(event, d) { + if (touchending || !filter2.call(this, event, d)) return; + var gesture = beforestart(this, container.call(this, event, d), event, d, "mouse"); + if (!gesture) return; + select_default2(event.view).on("mousemove.drag", mousemoved, nonpassivecapture).on("mouseup.drag", mouseupped, nonpassivecapture); + nodrag_default(event.view); + nopropagation(event); + mousemoving = false; + mousedownx = event.clientX; + mousedowny = event.clientY; + gesture("start", event); + } + function mousemoved(event) { + noevent_default(event); + if (!mousemoving) { + var dx = event.clientX - mousedownx, dy = event.clientY - mousedowny; + mousemoving = dx * dx + dy * dy > clickDistance2; + } + gestures.mouse("drag", event); + } + function mouseupped(event) { + select_default2(event.view).on("mousemove.drag mouseup.drag", null); + yesdrag(event.view, mousemoving); + noevent_default(event); + gestures.mouse("end", event); + } + function touchstarted(event, d) { + if (!filter2.call(this, event, d)) return; + var touches = event.changedTouches, c = container.call(this, event, d), n = touches.length, i, gesture; + for (i = 0; i < n; ++i) { + if (gesture = beforestart(this, c, event, d, touches[i].identifier, touches[i])) { + nopropagation(event); + gesture("start", event, touches[i]); + } + } + } + function touchmoved(event) { + var touches = event.changedTouches, n = touches.length, i, gesture; + for (i = 0; i < n; ++i) { + if (gesture = gestures[touches[i].identifier]) { + noevent_default(event); + gesture("drag", event, touches[i]); + } + } + } + function touchended(event) { + var touches = event.changedTouches, n = touches.length, i, gesture; + if (touchending) clearTimeout(touchending); + touchending = setTimeout(function() { + touchending = null; + }, 500); + for (i = 0; i < n; ++i) { + if (gesture = gestures[touches[i].identifier]) { + nopropagation(event); + gesture("end", event, touches[i]); + } + } + } + function beforestart(that, container2, event, d, identifier, touch) { + var dispatch2 = listeners.copy(), p = pointer_default(touch || event, container2), dx, dy, s; + if ((s = subject.call(that, new DragEvent("beforestart", { + sourceEvent: event, + target: drag, + identifier, + active, + x: p[0], + y: p[1], + dx: 0, + dy: 0, + dispatch: dispatch2 + }), d)) == null) return; + dx = s.x - p[0] || 0; + dy = s.y - p[1] || 0; + return function gesture(type, event2, touch2) { + var p0 = p, n; + switch (type) { + case "start": + gestures[identifier] = gesture, n = active++; + break; + case "end": + delete gestures[identifier], --active; + case "drag": + p = pointer_default(touch2 || event2, container2), n = active; + break; + } + dispatch2.call( + type, + that, + new DragEvent(type, { + sourceEvent: event2, + subject: s, + target: drag, + identifier, + active: n, + x: p[0] + dx, + y: p[1] + dy, + dx: p[0] - p0[0], + dy: p[1] - p0[1], + dispatch: dispatch2 + }), + d + ); + }; + } + drag.filter = function(_) { + return arguments.length ? (filter2 = typeof _ === "function" ? _ : constant_default2(!!_), drag) : filter2; + }; + drag.container = function(_) { + return arguments.length ? (container = typeof _ === "function" ? _ : constant_default2(_), drag) : container; + }; + drag.subject = function(_) { + return arguments.length ? (subject = typeof _ === "function" ? _ : constant_default2(_), drag) : subject; + }; + drag.touchable = function(_) { + return arguments.length ? (touchable = typeof _ === "function" ? _ : constant_default2(!!_), drag) : touchable; + }; + drag.on = function() { + var value = listeners.on.apply(listeners, arguments); + return value === listeners ? drag : value; + }; + drag.clickDistance = function(_) { + return arguments.length ? (clickDistance2 = (_ = +_) * _, drag) : Math.sqrt(clickDistance2); + }; + return drag; +} + +// node_modules/d3-color/src/define.js +function define_default(constructor, factory, prototype) { + constructor.prototype = factory.prototype = prototype; + prototype.constructor = constructor; +} +function extend(parent, definition) { + var prototype = Object.create(parent.prototype); + for (var key in definition) prototype[key] = definition[key]; + return prototype; +} + +// node_modules/d3-color/src/color.js +function Color() { +} +var darker = 0.7; +var brighter = 1 / darker; +var reI = "\\s*([+-]?\\d+)\\s*"; +var reN = "\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)\\s*"; +var reP = "\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)%\\s*"; +var reHex = /^#([0-9a-f]{3,8})$/; +var reRgbInteger = new RegExp(`^rgb\\(${reI},${reI},${reI}\\)$`); +var reRgbPercent = new RegExp(`^rgb\\(${reP},${reP},${reP}\\)$`); +var reRgbaInteger = new RegExp(`^rgba\\(${reI},${reI},${reI},${reN}\\)$`); +var reRgbaPercent = new RegExp(`^rgba\\(${reP},${reP},${reP},${reN}\\)$`); +var reHslPercent = new RegExp(`^hsl\\(${reN},${reP},${reP}\\)$`); +var reHslaPercent = new RegExp(`^hsla\\(${reN},${reP},${reP},${reN}\\)$`); +var named = { + aliceblue: 15792383, + antiquewhite: 16444375, + aqua: 65535, + aquamarine: 8388564, + azure: 15794175, + beige: 16119260, + bisque: 16770244, + black: 0, + blanchedalmond: 16772045, + blue: 255, + blueviolet: 9055202, + brown: 10824234, + burlywood: 14596231, + cadetblue: 6266528, + chartreuse: 8388352, + chocolate: 13789470, + coral: 16744272, + cornflowerblue: 6591981, + cornsilk: 16775388, + crimson: 14423100, + cyan: 65535, + darkblue: 139, + darkcyan: 35723, + darkgoldenrod: 12092939, + darkgray: 11119017, + darkgreen: 25600, + darkgrey: 11119017, + darkkhaki: 12433259, + darkmagenta: 9109643, + darkolivegreen: 5597999, + darkorange: 16747520, + darkorchid: 10040012, + darkred: 9109504, + darksalmon: 15308410, + darkseagreen: 9419919, + darkslateblue: 4734347, + darkslategray: 3100495, + darkslategrey: 3100495, + darkturquoise: 52945, + darkviolet: 9699539, + deeppink: 16716947, + deepskyblue: 49151, + dimgray: 6908265, + dimgrey: 6908265, + dodgerblue: 2003199, + firebrick: 11674146, + floralwhite: 16775920, + forestgreen: 2263842, + fuchsia: 16711935, + gainsboro: 14474460, + ghostwhite: 16316671, + gold: 16766720, + goldenrod: 14329120, + gray: 8421504, + green: 32768, + greenyellow: 11403055, + grey: 8421504, + honeydew: 15794160, + hotpink: 16738740, + indianred: 13458524, + indigo: 4915330, + ivory: 16777200, + khaki: 15787660, + lavender: 15132410, + lavenderblush: 16773365, + lawngreen: 8190976, + lemonchiffon: 16775885, + lightblue: 11393254, + lightcoral: 15761536, + lightcyan: 14745599, + lightgoldenrodyellow: 16448210, + lightgray: 13882323, + lightgreen: 9498256, + lightgrey: 13882323, + lightpink: 16758465, + lightsalmon: 16752762, + lightseagreen: 2142890, + lightskyblue: 8900346, + lightslategray: 7833753, + lightslategrey: 7833753, + lightsteelblue: 11584734, + lightyellow: 16777184, + lime: 65280, + limegreen: 3329330, + linen: 16445670, + magenta: 16711935, + maroon: 8388608, + mediumaquamarine: 6737322, + mediumblue: 205, + mediumorchid: 12211667, + mediumpurple: 9662683, + mediumseagreen: 3978097, + mediumslateblue: 8087790, + mediumspringgreen: 64154, + mediumturquoise: 4772300, + mediumvioletred: 13047173, + midnightblue: 1644912, + mintcream: 16121850, + mistyrose: 16770273, + moccasin: 16770229, + navajowhite: 16768685, + navy: 128, + oldlace: 16643558, + olive: 8421376, + olivedrab: 7048739, + orange: 16753920, + orangered: 16729344, + orchid: 14315734, + palegoldenrod: 15657130, + palegreen: 10025880, + paleturquoise: 11529966, + palevioletred: 14381203, + papayawhip: 16773077, + peachpuff: 16767673, + peru: 13468991, + pink: 16761035, + plum: 14524637, + powderblue: 11591910, + purple: 8388736, + rebeccapurple: 6697881, + red: 16711680, + rosybrown: 12357519, + royalblue: 4286945, + saddlebrown: 9127187, + salmon: 16416882, + sandybrown: 16032864, + seagreen: 3050327, + seashell: 16774638, + sienna: 10506797, + silver: 12632256, + skyblue: 8900331, + slateblue: 6970061, + slategray: 7372944, + slategrey: 7372944, + snow: 16775930, + springgreen: 65407, + steelblue: 4620980, + tan: 13808780, + teal: 32896, + thistle: 14204888, + tomato: 16737095, + turquoise: 4251856, + violet: 15631086, + wheat: 16113331, + white: 16777215, + whitesmoke: 16119285, + yellow: 16776960, + yellowgreen: 10145074 +}; +define_default(Color, color, { + copy(channels) { + return Object.assign(new this.constructor(), this, channels); + }, + displayable() { + return this.rgb().displayable(); + }, + hex: color_formatHex, + // Deprecated! Use color.formatHex. + formatHex: color_formatHex, + formatHex8: color_formatHex8, + formatHsl: color_formatHsl, + formatRgb: color_formatRgb, + toString: color_formatRgb +}); +function color_formatHex() { + return this.rgb().formatHex(); +} +function color_formatHex8() { + return this.rgb().formatHex8(); +} +function color_formatHsl() { + return hslConvert(this).formatHsl(); +} +function color_formatRgb() { + return this.rgb().formatRgb(); +} +function color(format) { + var m, l; + format = (format + "").trim().toLowerCase(); + return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) : l === 3 ? new Rgb(m >> 8 & 15 | m >> 4 & 240, m >> 4 & 15 | m & 240, (m & 15) << 4 | m & 15, 1) : l === 8 ? rgba(m >> 24 & 255, m >> 16 & 255, m >> 8 & 255, (m & 255) / 255) : l === 4 ? rgba(m >> 12 & 15 | m >> 8 & 240, m >> 8 & 15 | m >> 4 & 240, m >> 4 & 15 | m & 240, ((m & 15) << 4 | m & 15) / 255) : null) : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) : named.hasOwnProperty(format) ? rgbn(named[format]) : format === "transparent" ? new Rgb(NaN, NaN, NaN, 0) : null; +} +function rgbn(n) { + return new Rgb(n >> 16 & 255, n >> 8 & 255, n & 255, 1); +} +function rgba(r, g, b, a) { + if (a <= 0) r = g = b = NaN; + return new Rgb(r, g, b, a); +} +function rgbConvert(o) { + if (!(o instanceof Color)) o = color(o); + if (!o) return new Rgb(); + o = o.rgb(); + return new Rgb(o.r, o.g, o.b, o.opacity); +} +function rgb(r, g, b, opacity) { + return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity); +} +function Rgb(r, g, b, opacity) { + this.r = +r; + this.g = +g; + this.b = +b; + this.opacity = +opacity; +} +define_default(Rgb, rgb, extend(Color, { + brighter(k) { + k = k == null ? brighter : Math.pow(brighter, k); + return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity); + }, + darker(k) { + k = k == null ? darker : Math.pow(darker, k); + return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity); + }, + rgb() { + return this; + }, + clamp() { + return new Rgb(clampi(this.r), clampi(this.g), clampi(this.b), clampa(this.opacity)); + }, + displayable() { + return -0.5 <= this.r && this.r < 255.5 && (-0.5 <= this.g && this.g < 255.5) && (-0.5 <= this.b && this.b < 255.5) && (0 <= this.opacity && this.opacity <= 1); + }, + hex: rgb_formatHex, + // Deprecated! Use color.formatHex. + formatHex: rgb_formatHex, + formatHex8: rgb_formatHex8, + formatRgb: rgb_formatRgb, + toString: rgb_formatRgb +})); +function rgb_formatHex() { + return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}`; +} +function rgb_formatHex8() { + return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}${hex((isNaN(this.opacity) ? 1 : this.opacity) * 255)}`; +} +function rgb_formatRgb() { + const a = clampa(this.opacity); + return `${a === 1 ? "rgb(" : "rgba("}${clampi(this.r)}, ${clampi(this.g)}, ${clampi(this.b)}${a === 1 ? ")" : `, ${a})`}`; +} +function clampa(opacity) { + return isNaN(opacity) ? 1 : Math.max(0, Math.min(1, opacity)); +} +function clampi(value) { + return Math.max(0, Math.min(255, Math.round(value) || 0)); +} +function hex(value) { + value = clampi(value); + return (value < 16 ? "0" : "") + value.toString(16); +} +function hsla(h, s, l, a) { + if (a <= 0) h = s = l = NaN; + else if (l <= 0 || l >= 1) h = s = NaN; + else if (s <= 0) h = NaN; + return new Hsl(h, s, l, a); +} +function hslConvert(o) { + if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity); + if (!(o instanceof Color)) o = color(o); + if (!o) return new Hsl(); + if (o instanceof Hsl) return o; + o = o.rgb(); + var r = o.r / 255, g = o.g / 255, b = o.b / 255, min = Math.min(r, g, b), max = Math.max(r, g, b), h = NaN, s = max - min, l = (max + min) / 2; + if (s) { + if (r === max) h = (g - b) / s + (g < b) * 6; + else if (g === max) h = (b - r) / s + 2; + else h = (r - g) / s + 4; + s /= l < 0.5 ? max + min : 2 - max - min; + h *= 60; + } else { + s = l > 0 && l < 1 ? 0 : h; + } + return new Hsl(h, s, l, o.opacity); +} +function hsl(h, s, l, opacity) { + return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity); +} +function Hsl(h, s, l, opacity) { + this.h = +h; + this.s = +s; + this.l = +l; + this.opacity = +opacity; +} +define_default(Hsl, hsl, extend(Color, { + brighter(k) { + k = k == null ? brighter : Math.pow(brighter, k); + return new Hsl(this.h, this.s, this.l * k, this.opacity); + }, + darker(k) { + k = k == null ? darker : Math.pow(darker, k); + return new Hsl(this.h, this.s, this.l * k, this.opacity); + }, + rgb() { + var h = this.h % 360 + (this.h < 0) * 360, s = isNaN(h) || isNaN(this.s) ? 0 : this.s, l = this.l, m2 = l + (l < 0.5 ? l : 1 - l) * s, m1 = 2 * l - m2; + return new Rgb( + hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2), + hsl2rgb(h, m1, m2), + hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2), + this.opacity + ); + }, + clamp() { + return new Hsl(clamph(this.h), clampt(this.s), clampt(this.l), clampa(this.opacity)); + }, + displayable() { + return (0 <= this.s && this.s <= 1 || isNaN(this.s)) && (0 <= this.l && this.l <= 1) && (0 <= this.opacity && this.opacity <= 1); + }, + formatHsl() { + const a = clampa(this.opacity); + return `${a === 1 ? "hsl(" : "hsla("}${clamph(this.h)}, ${clampt(this.s) * 100}%, ${clampt(this.l) * 100}%${a === 1 ? ")" : `, ${a})`}`; + } +})); +function clamph(value) { + value = (value || 0) % 360; + return value < 0 ? value + 360 : value; +} +function clampt(value) { + return Math.max(0, Math.min(1, value || 0)); +} +function hsl2rgb(h, m1, m2) { + return (h < 60 ? m1 + (m2 - m1) * h / 60 : h < 180 ? m2 : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60 : m1) * 255; +} + +// node_modules/d3-color/src/math.js +var radians = Math.PI / 180; +var degrees = 180 / Math.PI; + +// node_modules/d3-color/src/lab.js +var K = 18; +var Xn = 0.96422; +var Yn = 1; +var Zn = 0.82521; +var t0 = 4 / 29; +var t1 = 6 / 29; +var t2 = 3 * t1 * t1; +var t3 = t1 * t1 * t1; +function labConvert(o) { + if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity); + if (o instanceof Hcl) return hcl2lab(o); + if (!(o instanceof Rgb)) o = rgbConvert(o); + var r = rgb2lrgb(o.r), g = rgb2lrgb(o.g), b = rgb2lrgb(o.b), y = xyz2lab((0.2225045 * r + 0.7168786 * g + 0.0606169 * b) / Yn), x, z; + if (r === g && g === b) x = z = y; + else { + x = xyz2lab((0.4360747 * r + 0.3850649 * g + 0.1430804 * b) / Xn); + z = xyz2lab((0.0139322 * r + 0.0971045 * g + 0.7141733 * b) / Zn); + } + return new Lab(116 * y - 16, 500 * (x - y), 200 * (y - z), o.opacity); +} +function lab(l, a, b, opacity) { + return arguments.length === 1 ? labConvert(l) : new Lab(l, a, b, opacity == null ? 1 : opacity); +} +function Lab(l, a, b, opacity) { + this.l = +l; + this.a = +a; + this.b = +b; + this.opacity = +opacity; +} +define_default(Lab, lab, extend(Color, { + brighter(k) { + return new Lab(this.l + K * (k == null ? 1 : k), this.a, this.b, this.opacity); + }, + darker(k) { + return new Lab(this.l - K * (k == null ? 1 : k), this.a, this.b, this.opacity); + }, + rgb() { + var y = (this.l + 16) / 116, x = isNaN(this.a) ? y : y + this.a / 500, z = isNaN(this.b) ? y : y - this.b / 200; + x = Xn * lab2xyz(x); + y = Yn * lab2xyz(y); + z = Zn * lab2xyz(z); + return new Rgb( + lrgb2rgb(3.1338561 * x - 1.6168667 * y - 0.4906146 * z), + lrgb2rgb(-0.9787684 * x + 1.9161415 * y + 0.033454 * z), + lrgb2rgb(0.0719453 * x - 0.2289914 * y + 1.4052427 * z), + this.opacity + ); + } +})); +function xyz2lab(t) { + return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0; +} +function lab2xyz(t) { + return t > t1 ? t * t * t : t2 * (t - t0); +} +function lrgb2rgb(x) { + return 255 * (x <= 31308e-7 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055); +} +function rgb2lrgb(x) { + return (x /= 255) <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4); +} +function hclConvert(o) { + if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity); + if (!(o instanceof Lab)) o = labConvert(o); + if (o.a === 0 && o.b === 0) return new Hcl(NaN, 0 < o.l && o.l < 100 ? 0 : NaN, o.l, o.opacity); + var h = Math.atan2(o.b, o.a) * degrees; + return new Hcl(h < 0 ? h + 360 : h, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity); +} +function hcl(h, c, l, opacity) { + return arguments.length === 1 ? hclConvert(h) : new Hcl(h, c, l, opacity == null ? 1 : opacity); +} +function Hcl(h, c, l, opacity) { + this.h = +h; + this.c = +c; + this.l = +l; + this.opacity = +opacity; +} +function hcl2lab(o) { + if (isNaN(o.h)) return new Lab(o.l, 0, 0, o.opacity); + var h = o.h * radians; + return new Lab(o.l, Math.cos(h) * o.c, Math.sin(h) * o.c, o.opacity); +} +define_default(Hcl, hcl, extend(Color, { + brighter(k) { + return new Hcl(this.h, this.c, this.l + K * (k == null ? 1 : k), this.opacity); + }, + darker(k) { + return new Hcl(this.h, this.c, this.l - K * (k == null ? 1 : k), this.opacity); + }, + rgb() { + return hcl2lab(this).rgb(); + } +})); + +// node_modules/d3-color/src/cubehelix.js +var A = -0.14861; +var B = 1.78277; +var C = -0.29227; +var D = -0.90649; +var E = 1.97294; +var ED = E * D; +var EB = E * B; +var BC_DA = B * C - D * A; +function cubehelixConvert(o) { + if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity); + if (!(o instanceof Rgb)) o = rgbConvert(o); + var r = o.r / 255, g = o.g / 255, b = o.b / 255, l = (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB), bl = b - l, k = (E * (g - l) - C * bl) / D, s = Math.sqrt(k * k + bl * bl) / (E * l * (1 - l)), h = s ? Math.atan2(k, bl) * degrees - 120 : NaN; + return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity); +} +function cubehelix(h, s, l, opacity) { + return arguments.length === 1 ? cubehelixConvert(h) : new Cubehelix(h, s, l, opacity == null ? 1 : opacity); +} +function Cubehelix(h, s, l, opacity) { + this.h = +h; + this.s = +s; + this.l = +l; + this.opacity = +opacity; +} +define_default(Cubehelix, cubehelix, extend(Color, { + brighter(k) { + k = k == null ? brighter : Math.pow(brighter, k); + return new Cubehelix(this.h, this.s, this.l * k, this.opacity); + }, + darker(k) { + k = k == null ? darker : Math.pow(darker, k); + return new Cubehelix(this.h, this.s, this.l * k, this.opacity); + }, + rgb() { + var h = isNaN(this.h) ? 0 : (this.h + 120) * radians, l = +this.l, a = isNaN(this.s) ? 0 : this.s * l * (1 - l), cosh2 = Math.cos(h), sinh2 = Math.sin(h); + return new Rgb( + 255 * (l + a * (A * cosh2 + B * sinh2)), + 255 * (l + a * (C * cosh2 + D * sinh2)), + 255 * (l + a * (E * cosh2)), + this.opacity + ); + } +})); + +// node_modules/d3-interpolate/src/basis.js +function basis(t12, v0, v1, v2, v3) { + var t22 = t12 * t12, t32 = t22 * t12; + return ((1 - 3 * t12 + 3 * t22 - t32) * v0 + (4 - 6 * t22 + 3 * t32) * v1 + (1 + 3 * t12 + 3 * t22 - 3 * t32) * v2 + t32 * v3) / 6; +} +function basis_default(values) { + var n = values.length - 1; + return function(t) { + var i = t <= 0 ? t = 0 : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n), v1 = values[i], v2 = values[i + 1], v0 = i > 0 ? values[i - 1] : 2 * v1 - v2, v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1; + return basis((t - i / n) * n, v0, v1, v2, v3); + }; +} + +// node_modules/d3-interpolate/src/basisClosed.js +function basisClosed_default(values) { + var n = values.length; + return function(t) { + var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n), v0 = values[(i + n - 1) % n], v1 = values[i % n], v2 = values[(i + 1) % n], v3 = values[(i + 2) % n]; + return basis((t - i / n) * n, v0, v1, v2, v3); + }; +} + +// node_modules/d3-interpolate/src/constant.js +var constant_default3 = (x) => () => x; + +// node_modules/d3-interpolate/src/color.js +function linear(a, d) { + return function(t) { + return a + t * d; + }; +} +function exponential(a, b, y) { + return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) { + return Math.pow(a + t * b, y); + }; +} +function hue(a, b) { + var d = b - a; + return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant_default3(isNaN(a) ? b : a); +} +function gamma(y) { + return (y = +y) === 1 ? nogamma : function(a, b) { + return b - a ? exponential(a, b, y) : constant_default3(isNaN(a) ? b : a); + }; +} +function nogamma(a, b) { + var d = b - a; + return d ? linear(a, d) : constant_default3(isNaN(a) ? b : a); +} + +// node_modules/d3-interpolate/src/rgb.js +var rgb_default = function rgbGamma(y) { + var color2 = gamma(y); + function rgb2(start2, end) { + var r = color2((start2 = rgb(start2)).r, (end = rgb(end)).r), g = color2(start2.g, end.g), b = color2(start2.b, end.b), opacity = nogamma(start2.opacity, end.opacity); + return function(t) { + start2.r = r(t); + start2.g = g(t); + start2.b = b(t); + start2.opacity = opacity(t); + return start2 + ""; + }; + } + rgb2.gamma = rgbGamma; + return rgb2; +}(1); +function rgbSpline(spline) { + return function(colors) { + var n = colors.length, r = new Array(n), g = new Array(n), b = new Array(n), i, color2; + for (i = 0; i < n; ++i) { + color2 = rgb(colors[i]); + r[i] = color2.r || 0; + g[i] = color2.g || 0; + b[i] = color2.b || 0; + } + r = spline(r); + g = spline(g); + b = spline(b); + color2.opacity = 1; + return function(t) { + color2.r = r(t); + color2.g = g(t); + color2.b = b(t); + return color2 + ""; + }; + }; +} +var rgbBasis = rgbSpline(basis_default); +var rgbBasisClosed = rgbSpline(basisClosed_default); + +// node_modules/d3-interpolate/src/numberArray.js +function numberArray_default(a, b) { + if (!b) b = []; + var n = a ? Math.min(b.length, a.length) : 0, c = b.slice(), i; + return function(t) { + for (i = 0; i < n; ++i) c[i] = a[i] * (1 - t) + b[i] * t; + return c; + }; +} +function isNumberArray(x) { + return ArrayBuffer.isView(x) && !(x instanceof DataView); +} + +// node_modules/d3-interpolate/src/array.js +function genericArray(a, b) { + var nb = b ? b.length : 0, na = a ? Math.min(nb, a.length) : 0, x = new Array(na), c = new Array(nb), i; + for (i = 0; i < na; ++i) x[i] = value_default(a[i], b[i]); + for (; i < nb; ++i) c[i] = b[i]; + return function(t) { + for (i = 0; i < na; ++i) c[i] = x[i](t); + return c; + }; +} + +// node_modules/d3-interpolate/src/date.js +function date_default(a, b) { + var d = /* @__PURE__ */ new Date(); + return a = +a, b = +b, function(t) { + return d.setTime(a * (1 - t) + b * t), d; + }; +} + +// node_modules/d3-interpolate/src/number.js +function number_default(a, b) { + return a = +a, b = +b, function(t) { + return a * (1 - t) + b * t; + }; +} + +// node_modules/d3-interpolate/src/object.js +function object_default(a, b) { + var i = {}, c = {}, k; + if (a === null || typeof a !== "object") a = {}; + if (b === null || typeof b !== "object") b = {}; + for (k in b) { + if (k in a) { + i[k] = value_default(a[k], b[k]); + } else { + c[k] = b[k]; + } + } + return function(t) { + for (k in i) c[k] = i[k](t); + return c; + }; +} + +// node_modules/d3-interpolate/src/string.js +var reA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g; +var reB = new RegExp(reA.source, "g"); +function zero(b) { + return function() { + return b; + }; +} +function one(b) { + return function(t) { + return b(t) + ""; + }; +} +function string_default(a, b) { + var bi = reA.lastIndex = reB.lastIndex = 0, am, bm, bs, i = -1, s = [], q = []; + a = a + "", b = b + ""; + while ((am = reA.exec(a)) && (bm = reB.exec(b))) { + if ((bs = bm.index) > bi) { + bs = b.slice(bi, bs); + if (s[i]) s[i] += bs; + else s[++i] = bs; + } + if ((am = am[0]) === (bm = bm[0])) { + if (s[i]) s[i] += bm; + else s[++i] = bm; + } else { + s[++i] = null; + q.push({ i, x: number_default(am, bm) }); + } + bi = reB.lastIndex; + } + if (bi < b.length) { + bs = b.slice(bi); + if (s[i]) s[i] += bs; + else s[++i] = bs; + } + return s.length < 2 ? q[0] ? one(q[0].x) : zero(b) : (b = q.length, function(t) { + for (var i2 = 0, o; i2 < b; ++i2) s[(o = q[i2]).i] = o.x(t); + return s.join(""); + }); +} + +// node_modules/d3-interpolate/src/value.js +function value_default(a, b) { + var t = typeof b, c; + return b == null || t === "boolean" ? constant_default3(b) : (t === "number" ? number_default : t === "string" ? (c = color(b)) ? (b = c, rgb_default) : string_default : b instanceof color ? rgb_default : b instanceof Date ? date_default : isNumberArray(b) ? numberArray_default : Array.isArray(b) ? genericArray : typeof b.valueOf !== "function" && typeof b.toString !== "function" || isNaN(b) ? object_default : number_default)(a, b); +} + +// node_modules/d3-interpolate/src/transform/decompose.js +var degrees2 = 180 / Math.PI; +var identity = { + translateX: 0, + translateY: 0, + rotate: 0, + skewX: 0, + scaleX: 1, + scaleY: 1 +}; +function decompose_default(a, b, c, d, e, f) { + var scaleX, scaleY, skewX; + if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX; + if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX; + if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY; + if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX; + return { + translateX: e, + translateY: f, + rotate: Math.atan2(b, a) * degrees2, + skewX: Math.atan(skewX) * degrees2, + scaleX, + scaleY + }; +} + +// node_modules/d3-interpolate/src/transform/parse.js +var svgNode; +function parseCss(value) { + const m = new (typeof DOMMatrix === "function" ? DOMMatrix : WebKitCSSMatrix)(value + ""); + return m.isIdentity ? identity : decompose_default(m.a, m.b, m.c, m.d, m.e, m.f); +} +function parseSvg(value) { + if (value == null) return identity; + if (!svgNode) svgNode = document.createElementNS("http://www.w3.org/2000/svg", "g"); + svgNode.setAttribute("transform", value); + if (!(value = svgNode.transform.baseVal.consolidate())) return identity; + value = value.matrix; + return decompose_default(value.a, value.b, value.c, value.d, value.e, value.f); +} + +// node_modules/d3-interpolate/src/transform/index.js +function interpolateTransform(parse, pxComma, pxParen, degParen) { + function pop(s) { + return s.length ? s.pop() + " " : ""; + } + function translate(xa, ya, xb, yb, s, q) { + if (xa !== xb || ya !== yb) { + var i = s.push("translate(", null, pxComma, null, pxParen); + q.push({ i: i - 4, x: number_default(xa, xb) }, { i: i - 2, x: number_default(ya, yb) }); + } else if (xb || yb) { + s.push("translate(" + xb + pxComma + yb + pxParen); + } + } + function rotate(a, b, s, q) { + if (a !== b) { + if (a - b > 180) b += 360; + else if (b - a > 180) a += 360; + q.push({ i: s.push(pop(s) + "rotate(", null, degParen) - 2, x: number_default(a, b) }); + } else if (b) { + s.push(pop(s) + "rotate(" + b + degParen); + } + } + function skewX(a, b, s, q) { + if (a !== b) { + q.push({ i: s.push(pop(s) + "skewX(", null, degParen) - 2, x: number_default(a, b) }); + } else if (b) { + s.push(pop(s) + "skewX(" + b + degParen); + } + } + function scale(xa, ya, xb, yb, s, q) { + if (xa !== xb || ya !== yb) { + var i = s.push(pop(s) + "scale(", null, ",", null, ")"); + q.push({ i: i - 4, x: number_default(xa, xb) }, { i: i - 2, x: number_default(ya, yb) }); + } else if (xb !== 1 || yb !== 1) { + s.push(pop(s) + "scale(" + xb + "," + yb + ")"); + } + } + return function(a, b) { + var s = [], q = []; + a = parse(a), b = parse(b); + translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q); + rotate(a.rotate, b.rotate, s, q); + skewX(a.skewX, b.skewX, s, q); + scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q); + a = b = null; + return function(t) { + var i = -1, n = q.length, o; + while (++i < n) s[(o = q[i]).i] = o.x(t); + return s.join(""); + }; + }; +} +var interpolateTransformCss = interpolateTransform(parseCss, "px, ", "px)", "deg)"); +var interpolateTransformSvg = interpolateTransform(parseSvg, ", ", ")", ")"); + +// node_modules/d3-interpolate/src/zoom.js +var epsilon2 = 1e-12; +function cosh(x) { + return ((x = Math.exp(x)) + 1 / x) / 2; +} +function sinh(x) { + return ((x = Math.exp(x)) - 1 / x) / 2; +} +function tanh(x) { + return ((x = Math.exp(2 * x)) - 1) / (x + 1); +} +var zoom_default = function zoomRho(rho, rho2, rho4) { + function zoom(p0, p1) { + var ux0 = p0[0], uy0 = p0[1], w0 = p0[2], ux1 = p1[0], uy1 = p1[1], w1 = p1[2], dx = ux1 - ux0, dy = uy1 - uy0, d2 = dx * dx + dy * dy, i, S; + if (d2 < epsilon2) { + S = Math.log(w1 / w0) / rho; + i = function(t) { + return [ + ux0 + t * dx, + uy0 + t * dy, + w0 * Math.exp(rho * t * S) + ]; + }; + } else { + var d1 = Math.sqrt(d2), b02 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1), b12 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1), r0 = Math.log(Math.sqrt(b02 * b02 + 1) - b02), r1 = Math.log(Math.sqrt(b12 * b12 + 1) - b12); + S = (r1 - r0) / rho; + i = function(t) { + var s = t * S, coshr0 = cosh(r0), u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0)); + return [ + ux0 + u * dx, + uy0 + u * dy, + w0 * coshr0 / cosh(rho * s + r0) + ]; + }; + } + i.duration = S * 1e3 * rho / Math.SQRT2; + return i; + } + zoom.rho = function(_) { + var _1 = Math.max(1e-3, +_), _2 = _1 * _1, _4 = _2 * _2; + return zoomRho(_1, _2, _4); + }; + return zoom; +}(Math.SQRT2, 2, 4); + +// node_modules/d3-interpolate/src/hsl.js +function hsl2(hue2) { + return function(start2, end) { + var h = hue2((start2 = hsl(start2)).h, (end = hsl(end)).h), s = nogamma(start2.s, end.s), l = nogamma(start2.l, end.l), opacity = nogamma(start2.opacity, end.opacity); + return function(t) { + start2.h = h(t); + start2.s = s(t); + start2.l = l(t); + start2.opacity = opacity(t); + return start2 + ""; + }; + }; +} +var hsl_default = hsl2(hue); +var hslLong = hsl2(nogamma); + +// node_modules/d3-interpolate/src/hcl.js +function hcl2(hue2) { + return function(start2, end) { + var h = hue2((start2 = hcl(start2)).h, (end = hcl(end)).h), c = nogamma(start2.c, end.c), l = nogamma(start2.l, end.l), opacity = nogamma(start2.opacity, end.opacity); + return function(t) { + start2.h = h(t); + start2.c = c(t); + start2.l = l(t); + start2.opacity = opacity(t); + return start2 + ""; + }; + }; +} +var hcl_default = hcl2(hue); +var hclLong = hcl2(nogamma); + +// node_modules/d3-interpolate/src/cubehelix.js +function cubehelix2(hue2) { + return function cubehelixGamma(y) { + y = +y; + function cubehelix3(start2, end) { + var h = hue2((start2 = cubehelix(start2)).h, (end = cubehelix(end)).h), s = nogamma(start2.s, end.s), l = nogamma(start2.l, end.l), opacity = nogamma(start2.opacity, end.opacity); + return function(t) { + start2.h = h(t); + start2.s = s(t); + start2.l = l(Math.pow(t, y)); + start2.opacity = opacity(t); + return start2 + ""; + }; + } + cubehelix3.gamma = cubehelixGamma; + return cubehelix3; + }(1); +} +var cubehelix_default = cubehelix2(hue); +var cubehelixLong = cubehelix2(nogamma); + +// node_modules/d3-timer/src/timer.js +var frame = 0; +var timeout = 0; +var interval = 0; +var pokeDelay = 1e3; +var taskHead; +var taskTail; +var clockLast = 0; +var clockNow = 0; +var clockSkew = 0; +var clock = typeof performance === "object" && performance.now ? performance : Date; +var setFrame = typeof window === "object" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) { + setTimeout(f, 17); +}; +function now() { + return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew); +} +function clearNow() { + clockNow = 0; +} +function Timer() { + this._call = this._time = this._next = null; +} +Timer.prototype = timer.prototype = { + constructor: Timer, + restart: function(callback, delay, time) { + if (typeof callback !== "function") throw new TypeError("callback is not a function"); + time = (time == null ? now() : +time) + (delay == null ? 0 : +delay); + if (!this._next && taskTail !== this) { + if (taskTail) taskTail._next = this; + else taskHead = this; + taskTail = this; + } + this._call = callback; + this._time = time; + sleep(); + }, + stop: function() { + if (this._call) { + this._call = null; + this._time = Infinity; + sleep(); + } + } +}; +function timer(callback, delay, time) { + var t = new Timer(); + t.restart(callback, delay, time); + return t; +} +function timerFlush() { + now(); + ++frame; + var t = taskHead, e; + while (t) { + if ((e = clockNow - t._time) >= 0) t._call.call(void 0, e); + t = t._next; + } + --frame; +} +function wake() { + clockNow = (clockLast = clock.now()) + clockSkew; + frame = timeout = 0; + try { + timerFlush(); + } finally { + frame = 0; + nap(); + clockNow = 0; + } +} +function poke() { + var now2 = clock.now(), delay = now2 - clockLast; + if (delay > pokeDelay) clockSkew -= delay, clockLast = now2; +} +function nap() { + var t02, t12 = taskHead, t22, time = Infinity; + while (t12) { + if (t12._call) { + if (time > t12._time) time = t12._time; + t02 = t12, t12 = t12._next; + } else { + t22 = t12._next, t12._next = null; + t12 = t02 ? t02._next = t22 : taskHead = t22; + } + } + taskTail = t02; + sleep(time); +} +function sleep(time) { + if (frame) return; + if (timeout) timeout = clearTimeout(timeout); + var delay = time - clockNow; + if (delay > 24) { + if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew); + if (interval) interval = clearInterval(interval); + } else { + if (!interval) clockLast = clock.now(), interval = setInterval(poke, pokeDelay); + frame = 1, setFrame(wake); + } +} + +// node_modules/d3-timer/src/timeout.js +function timeout_default(callback, delay, time) { + var t = new Timer(); + delay = delay == null ? 0 : +delay; + t.restart((elapsed) => { + t.stop(); + callback(elapsed + delay); + }, delay, time); + return t; +} + +// node_modules/d3-transition/src/transition/schedule.js +var emptyOn = dispatch_default("start", "end", "cancel", "interrupt"); +var emptyTween = []; +var CREATED = 0; +var SCHEDULED = 1; +var STARTING = 2; +var STARTED = 3; +var RUNNING = 4; +var ENDING = 5; +var ENDED = 6; +function schedule_default(node, name, id2, index2, group, timing) { + var schedules = node.__transition; + if (!schedules) node.__transition = {}; + else if (id2 in schedules) return; + create(node, id2, { + name, + index: index2, + // For context during callback. + group, + // For context during callback. + on: emptyOn, + tween: emptyTween, + time: timing.time, + delay: timing.delay, + duration: timing.duration, + ease: timing.ease, + timer: null, + state: CREATED + }); +} +function init(node, id2) { + var schedule = get2(node, id2); + if (schedule.state > CREATED) throw new Error("too late; already scheduled"); + return schedule; +} +function set2(node, id2) { + var schedule = get2(node, id2); + if (schedule.state > STARTED) throw new Error("too late; already running"); + return schedule; +} +function get2(node, id2) { + var schedule = node.__transition; + if (!schedule || !(schedule = schedule[id2])) throw new Error("transition not found"); + return schedule; +} +function create(node, id2, self) { + var schedules = node.__transition, tween; + schedules[id2] = self; + self.timer = timer(schedule, 0, self.time); + function schedule(elapsed) { + self.state = SCHEDULED; + self.timer.restart(start2, self.delay, self.time); + if (self.delay <= elapsed) start2(elapsed - self.delay); + } + function start2(elapsed) { + var i, j, n, o; + if (self.state !== SCHEDULED) return stop(); + for (i in schedules) { + o = schedules[i]; + if (o.name !== self.name) continue; + if (o.state === STARTED) return timeout_default(start2); + if (o.state === RUNNING) { + o.state = ENDED; + o.timer.stop(); + o.on.call("interrupt", node, node.__data__, o.index, o.group); + delete schedules[i]; + } else if (+i < id2) { + o.state = ENDED; + o.timer.stop(); + o.on.call("cancel", node, node.__data__, o.index, o.group); + delete schedules[i]; + } + } + timeout_default(function() { + if (self.state === STARTED) { + self.state = RUNNING; + self.timer.restart(tick, self.delay, self.time); + tick(elapsed); + } + }); + self.state = STARTING; + self.on.call("start", node, node.__data__, self.index, self.group); + if (self.state !== STARTING) return; + self.state = STARTED; + tween = new Array(n = self.tween.length); + for (i = 0, j = -1; i < n; ++i) { + if (o = self.tween[i].value.call(node, node.__data__, self.index, self.group)) { + tween[++j] = o; + } + } + tween.length = j + 1; + } + function tick(elapsed) { + var t = elapsed < self.duration ? self.ease.call(null, elapsed / self.duration) : (self.timer.restart(stop), self.state = ENDING, 1), i = -1, n = tween.length; + while (++i < n) { + tween[i].call(node, t); + } + if (self.state === ENDING) { + self.on.call("end", node, node.__data__, self.index, self.group); + stop(); + } + } + function stop() { + self.state = ENDED; + self.timer.stop(); + delete schedules[id2]; + for (var i in schedules) return; + delete node.__transition; + } +} + +// node_modules/d3-transition/src/interrupt.js +function interrupt_default(node, name) { + var schedules = node.__transition, schedule, active, empty2 = true, i; + if (!schedules) return; + name = name == null ? null : name + ""; + for (i in schedules) { + if ((schedule = schedules[i]).name !== name) { + empty2 = false; + continue; + } + active = schedule.state > STARTING && schedule.state < ENDING; + schedule.state = ENDED; + schedule.timer.stop(); + schedule.on.call(active ? "interrupt" : "cancel", node, node.__data__, schedule.index, schedule.group); + delete schedules[i]; + } + if (empty2) delete node.__transition; +} + +// node_modules/d3-transition/src/selection/interrupt.js +function interrupt_default2(name) { + return this.each(function() { + interrupt_default(this, name); + }); +} + +// node_modules/d3-transition/src/transition/tween.js +function tweenRemove(id2, name) { + var tween0, tween1; + return function() { + var schedule = set2(this, id2), tween = schedule.tween; + if (tween !== tween0) { + tween1 = tween0 = tween; + for (var i = 0, n = tween1.length; i < n; ++i) { + if (tween1[i].name === name) { + tween1 = tween1.slice(); + tween1.splice(i, 1); + break; + } + } + } + schedule.tween = tween1; + }; +} +function tweenFunction(id2, name, value) { + var tween0, tween1; + if (typeof value !== "function") throw new Error(); + return function() { + var schedule = set2(this, id2), tween = schedule.tween; + if (tween !== tween0) { + tween1 = (tween0 = tween).slice(); + for (var t = { name, value }, i = 0, n = tween1.length; i < n; ++i) { + if (tween1[i].name === name) { + tween1[i] = t; + break; + } + } + if (i === n) tween1.push(t); + } + schedule.tween = tween1; + }; +} +function tween_default(name, value) { + var id2 = this._id; + name += ""; + if (arguments.length < 2) { + var tween = get2(this.node(), id2).tween; + for (var i = 0, n = tween.length, t; i < n; ++i) { + if ((t = tween[i]).name === name) { + return t.value; + } + } + return null; + } + return this.each((value == null ? tweenRemove : tweenFunction)(id2, name, value)); +} +function tweenValue(transition2, name, value) { + var id2 = transition2._id; + transition2.each(function() { + var schedule = set2(this, id2); + (schedule.value || (schedule.value = {}))[name] = value.apply(this, arguments); + }); + return function(node) { + return get2(node, id2).value[name]; + }; +} + +// node_modules/d3-transition/src/transition/interpolate.js +function interpolate_default(a, b) { + var c; + return (typeof b === "number" ? number_default : b instanceof color ? rgb_default : (c = color(b)) ? (b = c, rgb_default) : string_default)(a, b); +} + +// node_modules/d3-transition/src/transition/attr.js +function attrRemove2(name) { + return function() { + this.removeAttribute(name); + }; +} +function attrRemoveNS2(fullname) { + return function() { + this.removeAttributeNS(fullname.space, fullname.local); + }; +} +function attrConstant2(name, interpolate, value1) { + var string00, string1 = value1 + "", interpolate0; + return function() { + var string0 = this.getAttribute(name); + return string0 === string1 ? null : string0 === string00 ? interpolate0 : interpolate0 = interpolate(string00 = string0, value1); + }; +} +function attrConstantNS2(fullname, interpolate, value1) { + var string00, string1 = value1 + "", interpolate0; + return function() { + var string0 = this.getAttributeNS(fullname.space, fullname.local); + return string0 === string1 ? null : string0 === string00 ? interpolate0 : interpolate0 = interpolate(string00 = string0, value1); + }; +} +function attrFunction2(name, interpolate, value) { + var string00, string10, interpolate0; + return function() { + var string0, value1 = value(this), string1; + if (value1 == null) return void this.removeAttribute(name); + string0 = this.getAttribute(name); + string1 = value1 + ""; + return string0 === string1 ? null : string0 === string00 && string1 === string10 ? interpolate0 : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1)); + }; +} +function attrFunctionNS2(fullname, interpolate, value) { + var string00, string10, interpolate0; + return function() { + var string0, value1 = value(this), string1; + if (value1 == null) return void this.removeAttributeNS(fullname.space, fullname.local); + string0 = this.getAttributeNS(fullname.space, fullname.local); + string1 = value1 + ""; + return string0 === string1 ? null : string0 === string00 && string1 === string10 ? interpolate0 : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1)); + }; +} +function attr_default2(name, value) { + var fullname = namespace_default(name), i = fullname === "transform" ? interpolateTransformSvg : interpolate_default; + return this.attrTween(name, typeof value === "function" ? (fullname.local ? attrFunctionNS2 : attrFunction2)(fullname, i, tweenValue(this, "attr." + name, value)) : value == null ? (fullname.local ? attrRemoveNS2 : attrRemove2)(fullname) : (fullname.local ? attrConstantNS2 : attrConstant2)(fullname, i, value)); +} + +// node_modules/d3-transition/src/transition/attrTween.js +function attrInterpolate(name, i) { + return function(t) { + this.setAttribute(name, i.call(this, t)); + }; +} +function attrInterpolateNS(fullname, i) { + return function(t) { + this.setAttributeNS(fullname.space, fullname.local, i.call(this, t)); + }; +} +function attrTweenNS(fullname, value) { + var t02, i0; + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) t02 = (i0 = i) && attrInterpolateNS(fullname, i); + return t02; + } + tween._value = value; + return tween; +} +function attrTween(name, value) { + var t02, i0; + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) t02 = (i0 = i) && attrInterpolate(name, i); + return t02; + } + tween._value = value; + return tween; +} +function attrTween_default(name, value) { + var key = "attr." + name; + if (arguments.length < 2) return (key = this.tween(key)) && key._value; + if (value == null) return this.tween(key, null); + if (typeof value !== "function") throw new Error(); + var fullname = namespace_default(name); + return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value)); +} + +// node_modules/d3-transition/src/transition/delay.js +function delayFunction(id2, value) { + return function() { + init(this, id2).delay = +value.apply(this, arguments); + }; +} +function delayConstant(id2, value) { + return value = +value, function() { + init(this, id2).delay = value; + }; +} +function delay_default(value) { + var id2 = this._id; + return arguments.length ? this.each((typeof value === "function" ? delayFunction : delayConstant)(id2, value)) : get2(this.node(), id2).delay; +} + +// node_modules/d3-transition/src/transition/duration.js +function durationFunction(id2, value) { + return function() { + set2(this, id2).duration = +value.apply(this, arguments); + }; +} +function durationConstant(id2, value) { + return value = +value, function() { + set2(this, id2).duration = value; + }; +} +function duration_default(value) { + var id2 = this._id; + return arguments.length ? this.each((typeof value === "function" ? durationFunction : durationConstant)(id2, value)) : get2(this.node(), id2).duration; +} + +// node_modules/d3-transition/src/transition/ease.js +function easeConstant(id2, value) { + if (typeof value !== "function") throw new Error(); + return function() { + set2(this, id2).ease = value; + }; +} +function ease_default(value) { + var id2 = this._id; + return arguments.length ? this.each(easeConstant(id2, value)) : get2(this.node(), id2).ease; +} + +// node_modules/d3-transition/src/transition/easeVarying.js +function easeVarying(id2, value) { + return function() { + var v = value.apply(this, arguments); + if (typeof v !== "function") throw new Error(); + set2(this, id2).ease = v; + }; +} +function easeVarying_default(value) { + if (typeof value !== "function") throw new Error(); + return this.each(easeVarying(this._id, value)); +} + +// node_modules/d3-transition/src/transition/filter.js +function filter_default2(match) { + if (typeof match !== "function") match = matcher_default(match); + for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) { + if ((node = group[i]) && match.call(node, node.__data__, i, group)) { + subgroup.push(node); + } + } + } + return new Transition(subgroups, this._parents, this._name, this._id); +} + +// node_modules/d3-transition/src/transition/merge.js +function merge_default2(transition2) { + if (transition2._id !== this._id) throw new Error(); + for (var groups0 = this._groups, groups1 = transition2._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) { + for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) { + if (node = group0[i] || group1[i]) { + merge[i] = node; + } + } + } + for (; j < m0; ++j) { + merges[j] = groups0[j]; + } + return new Transition(merges, this._parents, this._name, this._id); +} + +// node_modules/d3-transition/src/transition/on.js +function start(name) { + return (name + "").trim().split(/^|\s+/).every(function(t) { + var i = t.indexOf("."); + if (i >= 0) t = t.slice(0, i); + return !t || t === "start"; + }); +} +function onFunction(id2, name, listener) { + var on0, on1, sit = start(name) ? init : set2; + return function() { + var schedule = sit(this, id2), on = schedule.on; + if (on !== on0) (on1 = (on0 = on).copy()).on(name, listener); + schedule.on = on1; + }; +} +function on_default2(name, listener) { + var id2 = this._id; + return arguments.length < 2 ? get2(this.node(), id2).on.on(name) : this.each(onFunction(id2, name, listener)); +} + +// node_modules/d3-transition/src/transition/remove.js +function removeFunction(id2) { + return function() { + var parent = this.parentNode; + for (var i in this.__transition) if (+i !== id2) return; + if (parent) parent.removeChild(this); + }; +} +function remove_default2() { + return this.on("end.remove", removeFunction(this._id)); +} + +// node_modules/d3-transition/src/transition/select.js +function select_default3(select) { + var name = this._name, id2 = this._id; + if (typeof select !== "function") select = selector_default(select); + for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) { + if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) { + if ("__data__" in node) subnode.__data__ = node.__data__; + subgroup[i] = subnode; + schedule_default(subgroup[i], name, id2, i, subgroup, get2(node, id2)); + } + } + } + return new Transition(subgroups, this._parents, name, id2); +} + +// node_modules/d3-transition/src/transition/selectAll.js +function selectAll_default3(select) { + var name = this._name, id2 = this._id; + if (typeof select !== "function") select = selectorAll_default(select); + for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + for (var children2 = select.call(node, node.__data__, i, group), child, inherit2 = get2(node, id2), k = 0, l = children2.length; k < l; ++k) { + if (child = children2[k]) { + schedule_default(child, name, id2, k, children2, inherit2); + } + } + subgroups.push(children2); + parents.push(node); + } + } + } + return new Transition(subgroups, parents, name, id2); +} + +// node_modules/d3-transition/src/transition/selection.js +var Selection2 = selection_default.prototype.constructor; +function selection_default2() { + return new Selection2(this._groups, this._parents); +} + +// node_modules/d3-transition/src/transition/style.js +function styleNull(name, interpolate) { + var string00, string10, interpolate0; + return function() { + var string0 = styleValue(this, name), string1 = (this.style.removeProperty(name), styleValue(this, name)); + return string0 === string1 ? null : string0 === string00 && string1 === string10 ? interpolate0 : interpolate0 = interpolate(string00 = string0, string10 = string1); + }; +} +function styleRemove2(name) { + return function() { + this.style.removeProperty(name); + }; +} +function styleConstant2(name, interpolate, value1) { + var string00, string1 = value1 + "", interpolate0; + return function() { + var string0 = styleValue(this, name); + return string0 === string1 ? null : string0 === string00 ? interpolate0 : interpolate0 = interpolate(string00 = string0, value1); + }; +} +function styleFunction2(name, interpolate, value) { + var string00, string10, interpolate0; + return function() { + var string0 = styleValue(this, name), value1 = value(this), string1 = value1 + ""; + if (value1 == null) string1 = value1 = (this.style.removeProperty(name), styleValue(this, name)); + return string0 === string1 ? null : string0 === string00 && string1 === string10 ? interpolate0 : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1)); + }; +} +function styleMaybeRemove(id2, name) { + var on0, on1, listener0, key = "style." + name, event = "end." + key, remove2; + return function() { + var schedule = set2(this, id2), on = schedule.on, listener = schedule.value[key] == null ? remove2 || (remove2 = styleRemove2(name)) : void 0; + if (on !== on0 || listener0 !== listener) (on1 = (on0 = on).copy()).on(event, listener0 = listener); + schedule.on = on1; + }; +} +function style_default2(name, value, priority) { + var i = (name += "") === "transform" ? interpolateTransformCss : interpolate_default; + return value == null ? this.styleTween(name, styleNull(name, i)).on("end.style." + name, styleRemove2(name)) : typeof value === "function" ? this.styleTween(name, styleFunction2(name, i, tweenValue(this, "style." + name, value))).each(styleMaybeRemove(this._id, name)) : this.styleTween(name, styleConstant2(name, i, value), priority).on("end.style." + name, null); +} + +// node_modules/d3-transition/src/transition/styleTween.js +function styleInterpolate(name, i, priority) { + return function(t) { + this.style.setProperty(name, i.call(this, t), priority); + }; +} +function styleTween(name, value, priority) { + var t, i0; + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) t = (i0 = i) && styleInterpolate(name, i, priority); + return t; + } + tween._value = value; + return tween; +} +function styleTween_default(name, value, priority) { + var key = "style." + (name += ""); + if (arguments.length < 2) return (key = this.tween(key)) && key._value; + if (value == null) return this.tween(key, null); + if (typeof value !== "function") throw new Error(); + return this.tween(key, styleTween(name, value, priority == null ? "" : priority)); +} + +// node_modules/d3-transition/src/transition/text.js +function textConstant2(value) { + return function() { + this.textContent = value; + }; +} +function textFunction2(value) { + return function() { + var value1 = value(this); + this.textContent = value1 == null ? "" : value1; + }; +} +function text_default2(value) { + return this.tween("text", typeof value === "function" ? textFunction2(tweenValue(this, "text", value)) : textConstant2(value == null ? "" : value + "")); +} + +// node_modules/d3-transition/src/transition/textTween.js +function textInterpolate(i) { + return function(t) { + this.textContent = i.call(this, t); + }; +} +function textTween(value) { + var t02, i0; + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) t02 = (i0 = i) && textInterpolate(i); + return t02; + } + tween._value = value; + return tween; +} +function textTween_default(value) { + var key = "text"; + if (arguments.length < 1) return (key = this.tween(key)) && key._value; + if (value == null) return this.tween(key, null); + if (typeof value !== "function") throw new Error(); + return this.tween(key, textTween(value)); +} + +// node_modules/d3-transition/src/transition/transition.js +function transition_default() { + var name = this._name, id0 = this._id, id1 = newId(); + for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + var inherit2 = get2(node, id0); + schedule_default(node, name, id1, i, group, { + time: inherit2.time + inherit2.delay + inherit2.duration, + delay: 0, + duration: inherit2.duration, + ease: inherit2.ease + }); + } + } + } + return new Transition(groups, this._parents, name, id1); +} + +// node_modules/d3-transition/src/transition/end.js +function end_default() { + var on0, on1, that = this, id2 = that._id, size = that.size(); + return new Promise(function(resolve, reject) { + var cancel = { value: reject }, end = { value: function() { + if (--size === 0) resolve(); + } }; + that.each(function() { + var schedule = set2(this, id2), on = schedule.on; + if (on !== on0) { + on1 = (on0 = on).copy(); + on1._.cancel.push(cancel); + on1._.interrupt.push(cancel); + on1._.end.push(end); + } + schedule.on = on1; + }); + if (size === 0) resolve(); + }); +} + +// node_modules/d3-transition/src/transition/index.js +var id = 0; +function Transition(groups, parents, name, id2) { + this._groups = groups; + this._parents = parents; + this._name = name; + this._id = id2; +} +function transition(name) { + return selection_default().transition(name); +} +function newId() { + return ++id; +} +var selection_prototype = selection_default.prototype; +Transition.prototype = transition.prototype = { + constructor: Transition, + select: select_default3, + selectAll: selectAll_default3, + selectChild: selection_prototype.selectChild, + selectChildren: selection_prototype.selectChildren, + filter: filter_default2, + merge: merge_default2, + selection: selection_default2, + transition: transition_default, + call: selection_prototype.call, + nodes: selection_prototype.nodes, + node: selection_prototype.node, + size: selection_prototype.size, + empty: selection_prototype.empty, + each: selection_prototype.each, + on: on_default2, + attr: attr_default2, + attrTween: attrTween_default, + style: style_default2, + styleTween: styleTween_default, + text: text_default2, + textTween: textTween_default, + remove: remove_default2, + tween: tween_default, + delay: delay_default, + duration: duration_default, + ease: ease_default, + easeVarying: easeVarying_default, + end: end_default, + [Symbol.iterator]: selection_prototype[Symbol.iterator] +}; + +// node_modules/d3-ease/src/cubic.js +function cubicInOut(t) { + return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2; +} + +// node_modules/d3-ease/src/poly.js +var exponent = 3; +var polyIn = function custom(e) { + e = +e; + function polyIn2(t) { + return Math.pow(t, e); + } + polyIn2.exponent = custom; + return polyIn2; +}(exponent); +var polyOut = function custom2(e) { + e = +e; + function polyOut2(t) { + return 1 - Math.pow(1 - t, e); + } + polyOut2.exponent = custom2; + return polyOut2; +}(exponent); +var polyInOut = function custom3(e) { + e = +e; + function polyInOut2(t) { + return ((t *= 2) <= 1 ? Math.pow(t, e) : 2 - Math.pow(2 - t, e)) / 2; + } + polyInOut2.exponent = custom3; + return polyInOut2; +}(exponent); + +// node_modules/d3-ease/src/sin.js +var pi = Math.PI; +var halfPi = pi / 2; + +// node_modules/d3-ease/src/math.js +function tpmt(x) { + return (Math.pow(2, -10 * x) - 9765625e-10) * 1.0009775171065494; +} + +// node_modules/d3-ease/src/bounce.js +var b1 = 4 / 11; +var b2 = 6 / 11; +var b3 = 8 / 11; +var b4 = 3 / 4; +var b5 = 9 / 11; +var b6 = 10 / 11; +var b7 = 15 / 16; +var b8 = 21 / 22; +var b9 = 63 / 64; +var b0 = 1 / b1 / b1; + +// node_modules/d3-ease/src/back.js +var overshoot = 1.70158; +var backIn = function custom4(s) { + s = +s; + function backIn2(t) { + return (t = +t) * t * (s * (t - 1) + t); + } + backIn2.overshoot = custom4; + return backIn2; +}(overshoot); +var backOut = function custom5(s) { + s = +s; + function backOut2(t) { + return --t * t * ((t + 1) * s + t) + 1; + } + backOut2.overshoot = custom5; + return backOut2; +}(overshoot); +var backInOut = function custom6(s) { + s = +s; + function backInOut2(t) { + return ((t *= 2) < 1 ? t * t * ((s + 1) * t - s) : (t -= 2) * t * ((s + 1) * t + s) + 2) / 2; + } + backInOut2.overshoot = custom6; + return backInOut2; +}(overshoot); + +// node_modules/d3-ease/src/elastic.js +var tau = 2 * Math.PI; +var amplitude = 1; +var period = 0.3; +var elasticIn = function custom7(a, p) { + var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau); + function elasticIn2(t) { + return a * tpmt(- --t) * Math.sin((s - t) / p); + } + elasticIn2.amplitude = function(a2) { + return custom7(a2, p * tau); + }; + elasticIn2.period = function(p2) { + return custom7(a, p2); + }; + return elasticIn2; +}(amplitude, period); +var elasticOut = function custom8(a, p) { + var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau); + function elasticOut2(t) { + return 1 - a * tpmt(t = +t) * Math.sin((t + s) / p); + } + elasticOut2.amplitude = function(a2) { + return custom8(a2, p * tau); + }; + elasticOut2.period = function(p2) { + return custom8(a, p2); + }; + return elasticOut2; +}(amplitude, period); +var elasticInOut = function custom9(a, p) { + var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau); + function elasticInOut2(t) { + return ((t = t * 2 - 1) < 0 ? a * tpmt(-t) * Math.sin((s - t) / p) : 2 - a * tpmt(t) * Math.sin((s + t) / p)) / 2; + } + elasticInOut2.amplitude = function(a2) { + return custom9(a2, p * tau); + }; + elasticInOut2.period = function(p2) { + return custom9(a, p2); + }; + return elasticInOut2; +}(amplitude, period); + +// node_modules/d3-transition/src/selection/transition.js +var defaultTiming = { + time: null, + // Set on use. + delay: 0, + duration: 250, + ease: cubicInOut +}; +function inherit(node, id2) { + var timing; + while (!(timing = node.__transition) || !(timing = timing[id2])) { + if (!(node = node.parentNode)) { + throw new Error(`transition ${id2} not found`); + } + } + return timing; +} +function transition_default2(name) { + var id2, timing; + if (name instanceof Transition) { + id2 = name._id, name = name._name; + } else { + id2 = newId(), (timing = defaultTiming).time = now(), name = name == null ? null : name + ""; + } + for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + schedule_default(node, name, id2, i, group, timing || inherit(node, id2)); + } + } + } + return new Transition(groups, this._parents, name, id2); +} + +// node_modules/d3-transition/src/selection/index.js +selection_default.prototype.interrupt = interrupt_default2; +selection_default.prototype.transition = transition_default2; + +// node_modules/d3-zoom/src/constant.js +var constant_default4 = (x) => () => x; + +// node_modules/d3-zoom/src/event.js +function ZoomEvent(type, { + sourceEvent, + target, + transform: transform2, + dispatch: dispatch2 +}) { + Object.defineProperties(this, { + type: { value: type, enumerable: true, configurable: true }, + sourceEvent: { value: sourceEvent, enumerable: true, configurable: true }, + target: { value: target, enumerable: true, configurable: true }, + transform: { value: transform2, enumerable: true, configurable: true }, + _: { value: dispatch2 } + }); +} + +// node_modules/d3-zoom/src/transform.js +function Transform(k, x, y) { + this.k = k; + this.x = x; + this.y = y; +} +Transform.prototype = { + constructor: Transform, + scale: function(k) { + return k === 1 ? this : new Transform(this.k * k, this.x, this.y); + }, + translate: function(x, y) { + return x === 0 & y === 0 ? this : new Transform(this.k, this.x + this.k * x, this.y + this.k * y); + }, + apply: function(point) { + return [point[0] * this.k + this.x, point[1] * this.k + this.y]; + }, + applyX: function(x) { + return x * this.k + this.x; + }, + applyY: function(y) { + return y * this.k + this.y; + }, + invert: function(location) { + return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k]; + }, + invertX: function(x) { + return (x - this.x) / this.k; + }, + invertY: function(y) { + return (y - this.y) / this.k; + }, + rescaleX: function(x) { + return x.copy().domain(x.range().map(this.invertX, this).map(x.invert, x)); + }, + rescaleY: function(y) { + return y.copy().domain(y.range().map(this.invertY, this).map(y.invert, y)); + }, + toString: function() { + return "translate(" + this.x + "," + this.y + ") scale(" + this.k + ")"; + } +}; +var identity2 = new Transform(1, 0, 0); +transform.prototype = Transform.prototype; +function transform(node) { + while (!node.__zoom) if (!(node = node.parentNode)) return identity2; + return node.__zoom; +} + +// node_modules/d3-zoom/src/noevent.js +function nopropagation2(event) { + event.stopImmediatePropagation(); +} +function noevent_default2(event) { + event.preventDefault(); + event.stopImmediatePropagation(); +} + +// node_modules/d3-zoom/src/zoom.js +function defaultFilter2(event) { + return (!event.ctrlKey || event.type === "wheel") && !event.button; +} +function defaultExtent() { + var e = this; + if (e instanceof SVGElement) { + e = e.ownerSVGElement || e; + if (e.hasAttribute("viewBox")) { + e = e.viewBox.baseVal; + return [[e.x, e.y], [e.x + e.width, e.y + e.height]]; + } + return [[0, 0], [e.width.baseVal.value, e.height.baseVal.value]]; + } + return [[0, 0], [e.clientWidth, e.clientHeight]]; +} +function defaultTransform() { + return this.__zoom || identity2; +} +function defaultWheelDelta(event) { + return -event.deltaY * (event.deltaMode === 1 ? 0.05 : event.deltaMode ? 1 : 2e-3) * (event.ctrlKey ? 10 : 1); +} +function defaultTouchable2() { + return navigator.maxTouchPoints || "ontouchstart" in this; +} +function defaultConstrain(transform2, extent, translateExtent) { + var dx0 = transform2.invertX(extent[0][0]) - translateExtent[0][0], dx1 = transform2.invertX(extent[1][0]) - translateExtent[1][0], dy0 = transform2.invertY(extent[0][1]) - translateExtent[0][1], dy1 = transform2.invertY(extent[1][1]) - translateExtent[1][1]; + return transform2.translate( + dx1 > dx0 ? (dx0 + dx1) / 2 : Math.min(0, dx0) || Math.max(0, dx1), + dy1 > dy0 ? (dy0 + dy1) / 2 : Math.min(0, dy0) || Math.max(0, dy1) + ); +} +function zoom_default2() { + var filter2 = defaultFilter2, extent = defaultExtent, constrain = defaultConstrain, wheelDelta2 = defaultWheelDelta, touchable = defaultTouchable2, scaleExtent = [0, Infinity], translateExtent = [[-Infinity, -Infinity], [Infinity, Infinity]], duration = 250, interpolate = zoom_default, listeners = dispatch_default("start", "zoom", "end"), touchstarting, touchfirst, touchending, touchDelay = 500, wheelDelay = 150, clickDistance2 = 0, tapDistance = 10; + function zoom(selection2) { + selection2.property("__zoom", defaultTransform).on("wheel.zoom", wheeled, { passive: false }).on("mousedown.zoom", mousedowned).on("dblclick.zoom", dblclicked).filter(touchable).on("touchstart.zoom", touchstarted).on("touchmove.zoom", touchmoved).on("touchend.zoom touchcancel.zoom", touchended).style("-webkit-tap-highlight-color", "rgba(0,0,0,0)"); + } + zoom.transform = function(collection, transform2, point, event) { + var selection2 = collection.selection ? collection.selection() : collection; + selection2.property("__zoom", defaultTransform); + if (collection !== selection2) { + schedule(collection, transform2, point, event); + } else { + selection2.interrupt().each(function() { + gesture(this, arguments).event(event).start().zoom(null, typeof transform2 === "function" ? transform2.apply(this, arguments) : transform2).end(); + }); + } + }; + zoom.scaleBy = function(selection2, k, p, event) { + zoom.scaleTo(selection2, function() { + var k0 = this.__zoom.k, k1 = typeof k === "function" ? k.apply(this, arguments) : k; + return k0 * k1; + }, p, event); + }; + zoom.scaleTo = function(selection2, k, p, event) { + zoom.transform(selection2, function() { + var e = extent.apply(this, arguments), t02 = this.__zoom, p0 = p == null ? centroid(e) : typeof p === "function" ? p.apply(this, arguments) : p, p1 = t02.invert(p0), k1 = typeof k === "function" ? k.apply(this, arguments) : k; + return constrain(translate(scale(t02, k1), p0, p1), e, translateExtent); + }, p, event); + }; + zoom.translateBy = function(selection2, x, y, event) { + zoom.transform(selection2, function() { + return constrain(this.__zoom.translate( + typeof x === "function" ? x.apply(this, arguments) : x, + typeof y === "function" ? y.apply(this, arguments) : y + ), extent.apply(this, arguments), translateExtent); + }, null, event); + }; + zoom.translateTo = function(selection2, x, y, p, event) { + zoom.transform(selection2, function() { + var e = extent.apply(this, arguments), t = this.__zoom, p0 = p == null ? centroid(e) : typeof p === "function" ? p.apply(this, arguments) : p; + return constrain(identity2.translate(p0[0], p0[1]).scale(t.k).translate( + typeof x === "function" ? -x.apply(this, arguments) : -x, + typeof y === "function" ? -y.apply(this, arguments) : -y + ), e, translateExtent); + }, p, event); + }; + function scale(transform2, k) { + k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], k)); + return k === transform2.k ? transform2 : new Transform(k, transform2.x, transform2.y); + } + function translate(transform2, p0, p1) { + var x = p0[0] - p1[0] * transform2.k, y = p0[1] - p1[1] * transform2.k; + return x === transform2.x && y === transform2.y ? transform2 : new Transform(transform2.k, x, y); + } + function centroid(extent2) { + return [(+extent2[0][0] + +extent2[1][0]) / 2, (+extent2[0][1] + +extent2[1][1]) / 2]; + } + function schedule(transition2, transform2, point, event) { + transition2.on("start.zoom", function() { + gesture(this, arguments).event(event).start(); + }).on("interrupt.zoom end.zoom", function() { + gesture(this, arguments).event(event).end(); + }).tween("zoom", function() { + var that = this, args = arguments, g = gesture(that, args).event(event), e = extent.apply(that, args), p = point == null ? centroid(e) : typeof point === "function" ? point.apply(that, args) : point, w = Math.max(e[1][0] - e[0][0], e[1][1] - e[0][1]), a = that.__zoom, b = typeof transform2 === "function" ? transform2.apply(that, args) : transform2, i = interpolate(a.invert(p).concat(w / a.k), b.invert(p).concat(w / b.k)); + return function(t) { + if (t === 1) t = b; + else { + var l = i(t), k = w / l[2]; + t = new Transform(k, p[0] - l[0] * k, p[1] - l[1] * k); + } + g.zoom(null, t); + }; + }); + } + function gesture(that, args, clean) { + return !clean && that.__zooming || new Gesture(that, args); + } + function Gesture(that, args) { + this.that = that; + this.args = args; + this.active = 0; + this.sourceEvent = null; + this.extent = extent.apply(that, args); + this.taps = 0; + } + Gesture.prototype = { + event: function(event) { + if (event) this.sourceEvent = event; + return this; + }, + start: function() { + if (++this.active === 1) { + this.that.__zooming = this; + this.emit("start"); + } + return this; + }, + zoom: function(key, transform2) { + if (this.mouse && key !== "mouse") this.mouse[1] = transform2.invert(this.mouse[0]); + if (this.touch0 && key !== "touch") this.touch0[1] = transform2.invert(this.touch0[0]); + if (this.touch1 && key !== "touch") this.touch1[1] = transform2.invert(this.touch1[0]); + this.that.__zoom = transform2; + this.emit("zoom"); + return this; + }, + end: function() { + if (--this.active === 0) { + delete this.that.__zooming; + this.emit("end"); + } + return this; + }, + emit: function(type) { + var d = select_default2(this.that).datum(); + listeners.call( + type, + this.that, + new ZoomEvent(type, { + sourceEvent: this.sourceEvent, + target: zoom, + type, + transform: this.that.__zoom, + dispatch: listeners + }), + d + ); + } + }; + function wheeled(event, ...args) { + if (!filter2.apply(this, arguments)) return; + var g = gesture(this, args).event(event), t = this.__zoom, k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], t.k * Math.pow(2, wheelDelta2.apply(this, arguments)))), p = pointer_default(event); + if (g.wheel) { + if (g.mouse[0][0] !== p[0] || g.mouse[0][1] !== p[1]) { + g.mouse[1] = t.invert(g.mouse[0] = p); + } + clearTimeout(g.wheel); + } else if (t.k === k) return; + else { + g.mouse = [p, t.invert(p)]; + interrupt_default(this); + g.start(); + } + noevent_default2(event); + g.wheel = setTimeout(wheelidled, wheelDelay); + g.zoom("mouse", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent, translateExtent)); + function wheelidled() { + g.wheel = null; + g.end(); + } + } + function mousedowned(event, ...args) { + if (touchending || !filter2.apply(this, arguments)) return; + var currentTarget = event.currentTarget, g = gesture(this, args, true).event(event), v = select_default2(event.view).on("mousemove.zoom", mousemoved, true).on("mouseup.zoom", mouseupped, true), p = pointer_default(event, currentTarget), x0 = event.clientX, y0 = event.clientY; + nodrag_default(event.view); + nopropagation2(event); + g.mouse = [p, this.__zoom.invert(p)]; + interrupt_default(this); + g.start(); + function mousemoved(event2) { + noevent_default2(event2); + if (!g.moved) { + var dx = event2.clientX - x0, dy = event2.clientY - y0; + g.moved = dx * dx + dy * dy > clickDistance2; + } + g.event(event2).zoom("mouse", constrain(translate(g.that.__zoom, g.mouse[0] = pointer_default(event2, currentTarget), g.mouse[1]), g.extent, translateExtent)); + } + function mouseupped(event2) { + v.on("mousemove.zoom mouseup.zoom", null); + yesdrag(event2.view, g.moved); + noevent_default2(event2); + g.event(event2).end(); + } + } + function dblclicked(event, ...args) { + if (!filter2.apply(this, arguments)) return; + var t02 = this.__zoom, p0 = pointer_default(event.changedTouches ? event.changedTouches[0] : event, this), p1 = t02.invert(p0), k1 = t02.k * (event.shiftKey ? 0.5 : 2), t12 = constrain(translate(scale(t02, k1), p0, p1), extent.apply(this, args), translateExtent); + noevent_default2(event); + if (duration > 0) select_default2(this).transition().duration(duration).call(schedule, t12, p0, event); + else select_default2(this).call(zoom.transform, t12, p0, event); + } + function touchstarted(event, ...args) { + if (!filter2.apply(this, arguments)) return; + var touches = event.touches, n = touches.length, g = gesture(this, args, event.changedTouches.length === n).event(event), started, i, t, p; + nopropagation2(event); + for (i = 0; i < n; ++i) { + t = touches[i], p = pointer_default(t, this); + p = [p, this.__zoom.invert(p), t.identifier]; + if (!g.touch0) g.touch0 = p, started = true, g.taps = 1 + !!touchstarting; + else if (!g.touch1 && g.touch0[2] !== p[2]) g.touch1 = p, g.taps = 0; + } + if (touchstarting) touchstarting = clearTimeout(touchstarting); + if (started) { + if (g.taps < 2) touchfirst = p[0], touchstarting = setTimeout(function() { + touchstarting = null; + }, touchDelay); + interrupt_default(this); + g.start(); + } + } + function touchmoved(event, ...args) { + if (!this.__zooming) return; + var g = gesture(this, args).event(event), touches = event.changedTouches, n = touches.length, i, t, p, l; + noevent_default2(event); + for (i = 0; i < n; ++i) { + t = touches[i], p = pointer_default(t, this); + if (g.touch0 && g.touch0[2] === t.identifier) g.touch0[0] = p; + else if (g.touch1 && g.touch1[2] === t.identifier) g.touch1[0] = p; + } + t = g.that.__zoom; + if (g.touch1) { + var p0 = g.touch0[0], l0 = g.touch0[1], p1 = g.touch1[0], l1 = g.touch1[1], dp = (dp = p1[0] - p0[0]) * dp + (dp = p1[1] - p0[1]) * dp, dl = (dl = l1[0] - l0[0]) * dl + (dl = l1[1] - l0[1]) * dl; + t = scale(t, Math.sqrt(dp / dl)); + p = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2]; + l = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2]; + } else if (g.touch0) p = g.touch0[0], l = g.touch0[1]; + else return; + g.zoom("touch", constrain(translate(t, p, l), g.extent, translateExtent)); + } + function touchended(event, ...args) { + if (!this.__zooming) return; + var g = gesture(this, args).event(event), touches = event.changedTouches, n = touches.length, i, t; + nopropagation2(event); + if (touchending) clearTimeout(touchending); + touchending = setTimeout(function() { + touchending = null; + }, touchDelay); + for (i = 0; i < n; ++i) { + t = touches[i]; + if (g.touch0 && g.touch0[2] === t.identifier) delete g.touch0; + else if (g.touch1 && g.touch1[2] === t.identifier) delete g.touch1; + } + if (g.touch1 && !g.touch0) g.touch0 = g.touch1, delete g.touch1; + if (g.touch0) g.touch0[1] = this.__zoom.invert(g.touch0[0]); + else { + g.end(); + if (g.taps === 2) { + t = pointer_default(t, this); + if (Math.hypot(touchfirst[0] - t[0], touchfirst[1] - t[1]) < tapDistance) { + var p = select_default2(this).on("dblclick.zoom"); + if (p) p.apply(this, arguments); + } + } + } + } + zoom.wheelDelta = function(_) { + return arguments.length ? (wheelDelta2 = typeof _ === "function" ? _ : constant_default4(+_), zoom) : wheelDelta2; + }; + zoom.filter = function(_) { + return arguments.length ? (filter2 = typeof _ === "function" ? _ : constant_default4(!!_), zoom) : filter2; + }; + zoom.touchable = function(_) { + return arguments.length ? (touchable = typeof _ === "function" ? _ : constant_default4(!!_), zoom) : touchable; + }; + zoom.extent = function(_) { + return arguments.length ? (extent = typeof _ === "function" ? _ : constant_default4([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent; + }; + zoom.scaleExtent = function(_) { + return arguments.length ? (scaleExtent[0] = +_[0], scaleExtent[1] = +_[1], zoom) : [scaleExtent[0], scaleExtent[1]]; + }; + zoom.translateExtent = function(_) { + return arguments.length ? (translateExtent[0][0] = +_[0][0], translateExtent[1][0] = +_[1][0], translateExtent[0][1] = +_[0][1], translateExtent[1][1] = +_[1][1], zoom) : [[translateExtent[0][0], translateExtent[0][1]], [translateExtent[1][0], translateExtent[1][1]]]; + }; + zoom.constrain = function(_) { + return arguments.length ? (constrain = _, zoom) : constrain; + }; + zoom.duration = function(_) { + return arguments.length ? (duration = +_, zoom) : duration; + }; + zoom.interpolate = function(_) { + return arguments.length ? (interpolate = _, zoom) : interpolate; + }; + zoom.on = function() { + var value = listeners.on.apply(listeners, arguments); + return value === listeners ? zoom : value; + }; + zoom.clickDistance = function(_) { + return arguments.length ? (clickDistance2 = (_ = +_) * _, zoom) : Math.sqrt(clickDistance2); + }; + zoom.tapDistance = function(_) { + return arguments.length ? (tapDistance = +_, zoom) : tapDistance; + }; + return zoom; +} + +// node_modules/@xyflow/system/dist/esm/index.js +var errorMessages = { + error001: () => "[React Flow]: Seems like you have not used zustand provider as an ancestor. Help: https://reactflow.dev/error#001", + error002: () => "It looks like you've created a new nodeTypes or edgeTypes object. If this wasn't on purpose please define the nodeTypes/edgeTypes outside of the component or memoize them.", + error003: (nodeType) => `Node type "${nodeType}" not found. Using fallback type "default".`, + error004: () => "The React Flow parent container needs a width and a height to render the graph.", + error005: () => "Only child nodes can use a parent extent.", + error006: () => "Can't create edge. An edge needs a source and a target.", + error007: (id2) => `The old edge with id=${id2} does not exist.`, + error009: (type) => `Marker type "${type}" doesn't exist.`, + error008: (handleType, { id: id2, sourceHandle, targetHandle }) => `Couldn't create edge for ${handleType} handle id: "${handleType === "source" ? sourceHandle : targetHandle}", edge id: ${id2}.`, + error010: () => "Handle: No node id found. Make sure to only use a Handle inside a custom Node.", + error011: (edgeType) => `Edge type "${edgeType}" not found. Using fallback type "default".`, + error012: (id2) => `Node with id "${id2}" does not exist, it may have been removed. This can happen when a node is deleted before the "onNodeClick" handler is called.`, + error013: (lib = "react") => `It seems that you haven't loaded the styles. Please import '@xyflow/${lib}/dist/style.css' or base.css to make sure everything is working properly.`, + error014: () => "useNodeConnections: No node ID found. Call useNodeConnections inside a custom Node or provide a node ID.", + error015: () => "It seems that you are trying to drag a node that is not initialized. Please use onNodesChange as explained in the docs." +}; +var infiniteExtent = [ + [Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY], + [Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY] +]; +var elementSelectionKeys = ["Enter", " ", "Escape"]; +var defaultAriaLabelConfig = { + "node.a11yDescription.default": "Press enter or space to select a node. Press delete to remove it and escape to cancel.", + "node.a11yDescription.keyboardDisabled": "Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.", + "node.a11yDescription.ariaLiveMessage": ({ direction, x, y }) => `Moved selected node ${direction}. New position, x: ${x}, y: ${y}`, + "edge.a11yDescription.default": "Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.", + // Control elements + "controls.ariaLabel": "Control Panel", + "controls.zoomIn.ariaLabel": "Zoom In", + "controls.zoomOut.ariaLabel": "Zoom Out", + "controls.fitView.ariaLabel": "Fit View", + "controls.interactive.ariaLabel": "Toggle Interactivity", + // Mini map + "minimap.ariaLabel": "Mini Map", + // Handle + "handle.ariaLabel": "Handle" +}; +var ConnectionMode; +(function(ConnectionMode2) { + ConnectionMode2["Strict"] = "strict"; + ConnectionMode2["Loose"] = "loose"; +})(ConnectionMode || (ConnectionMode = {})); +var PanOnScrollMode; +(function(PanOnScrollMode2) { + PanOnScrollMode2["Free"] = "free"; + PanOnScrollMode2["Vertical"] = "vertical"; + PanOnScrollMode2["Horizontal"] = "horizontal"; +})(PanOnScrollMode || (PanOnScrollMode = {})); +var SelectionMode; +(function(SelectionMode2) { + SelectionMode2["Partial"] = "partial"; + SelectionMode2["Full"] = "full"; +})(SelectionMode || (SelectionMode = {})); +var initialConnection = { + inProgress: false, + isValid: null, + from: null, + fromHandle: null, + fromPosition: null, + fromNode: null, + to: null, + toHandle: null, + toPosition: null, + toNode: null, + pointer: null +}; +var ConnectionLineType; +(function(ConnectionLineType2) { + ConnectionLineType2["Bezier"] = "default"; + ConnectionLineType2["Straight"] = "straight"; + ConnectionLineType2["Step"] = "step"; + ConnectionLineType2["SmoothStep"] = "smoothstep"; + ConnectionLineType2["SimpleBezier"] = "simplebezier"; +})(ConnectionLineType || (ConnectionLineType = {})); +var MarkerType; +(function(MarkerType2) { + MarkerType2["Arrow"] = "arrow"; + MarkerType2["ArrowClosed"] = "arrowclosed"; +})(MarkerType || (MarkerType = {})); +var Position; +(function(Position2) { + Position2["Left"] = "left"; + Position2["Top"] = "top"; + Position2["Right"] = "right"; + Position2["Bottom"] = "bottom"; +})(Position || (Position = {})); +var oppositePosition = { + [Position.Left]: Position.Right, + [Position.Right]: Position.Left, + [Position.Top]: Position.Bottom, + [Position.Bottom]: Position.Top +}; +function areConnectionMapsEqual(a, b) { + if (!a && !b) { + return true; + } + if (!a || !b || a.size !== b.size) { + return false; + } + if (!a.size && !b.size) { + return true; + } + for (const key of a.keys()) { + if (!b.has(key)) { + return false; + } + } + return true; +} +function handleConnectionChange(a, b, cb) { + if (!cb) { + return; + } + const diff = []; + a.forEach((connection, key) => { + if (!(b == null ? void 0 : b.has(key))) { + diff.push(connection); + } + }); + if (diff.length) { + cb(diff); + } +} +function getConnectionStatus(isValid) { + return isValid === null ? null : isValid ? "valid" : "invalid"; +} +var isEdgeBase = (element) => "id" in element && "source" in element && "target" in element; +var isNodeBase = (element) => "id" in element && "position" in element && !("source" in element) && !("target" in element); +var isInternalNodeBase = (element) => "id" in element && "internals" in element && !("source" in element) && !("target" in element); +var getOutgoers = (node, nodes, edges) => { + if (!node.id) { + return []; + } + const outgoerIds = /* @__PURE__ */ new Set(); + edges.forEach((edge) => { + if (edge.source === node.id) { + outgoerIds.add(edge.target); + } + }); + return nodes.filter((n) => outgoerIds.has(n.id)); +}; +var getIncomers = (node, nodes, edges) => { + if (!node.id) { + return []; + } + const incomersIds = /* @__PURE__ */ new Set(); + edges.forEach((edge) => { + if (edge.target === node.id) { + incomersIds.add(edge.source); + } + }); + return nodes.filter((n) => incomersIds.has(n.id)); +}; +var getNodePositionWithOrigin = (node, nodeOrigin = [0, 0]) => { + const { width, height } = getNodeDimensions(node); + const origin = node.origin ?? nodeOrigin; + const offsetX = width * origin[0]; + const offsetY = height * origin[1]; + return { + x: node.position.x - offsetX, + y: node.position.y - offsetY + }; +}; +var getNodesBounds = (nodes, params = { nodeOrigin: [0, 0] }) => { + if (!params.nodeLookup) { + console.warn("Please use `getNodesBounds` from `useReactFlow`/`useSvelteFlow` hook to ensure correct values for sub flows. If not possible, you have to provide a nodeLookup to support sub flows."); + } + if (nodes.length === 0) { + return { x: 0, y: 0, width: 0, height: 0 }; + } + const box = nodes.reduce((currBox, nodeOrId) => { + const isId = typeof nodeOrId === "string"; + let currentNode = !params.nodeLookup && !isId ? nodeOrId : void 0; + if (params.nodeLookup) { + currentNode = isId ? params.nodeLookup.get(nodeOrId) : !isInternalNodeBase(nodeOrId) ? params.nodeLookup.get(nodeOrId.id) : nodeOrId; + } + const nodeBox = currentNode ? nodeToBox(currentNode, params.nodeOrigin) : { x: 0, y: 0, x2: 0, y2: 0 }; + return getBoundsOfBoxes(currBox, nodeBox); + }, { x: Infinity, y: Infinity, x2: -Infinity, y2: -Infinity }); + return boxToRect(box); +}; +var getInternalNodesBounds = (nodeLookup, params = {}) => { + let box = { x: Infinity, y: Infinity, x2: -Infinity, y2: -Infinity }; + let hasVisibleNodes = false; + nodeLookup.forEach((node) => { + if (params.filter === void 0 || params.filter(node)) { + box = getBoundsOfBoxes(box, nodeToBox(node)); + hasVisibleNodes = true; + } + }); + return hasVisibleNodes ? boxToRect(box) : { x: 0, y: 0, width: 0, height: 0 }; +}; +var getNodesInside = (nodes, rect, [tx, ty, tScale] = [0, 0, 1], partially = false, excludeNonSelectableNodes = false) => { + const paneRect = { + ...pointToRendererPoint(rect, [tx, ty, tScale]), + width: rect.width / tScale, + height: rect.height / tScale + }; + const visibleNodes = []; + for (const node of nodes.values()) { + const { measured, selectable = true, hidden = false } = node; + if (excludeNonSelectableNodes && !selectable || hidden) { + continue; + } + const width = measured.width ?? node.width ?? node.initialWidth ?? null; + const height = measured.height ?? node.height ?? node.initialHeight ?? null; + const overlappingArea = getOverlappingArea(paneRect, nodeToRect(node)); + const area = (width ?? 0) * (height ?? 0); + const partiallyVisible = partially && overlappingArea > 0; + const forceInitialRender = !node.internals.handleBounds; + const isVisible = forceInitialRender || partiallyVisible || overlappingArea >= area; + if (isVisible || node.dragging) { + visibleNodes.push(node); + } + } + return visibleNodes; +}; +var getConnectedEdges = (nodes, edges) => { + const nodeIds = /* @__PURE__ */ new Set(); + nodes.forEach((node) => { + nodeIds.add(node.id); + }); + return edges.filter((edge) => nodeIds.has(edge.source) || nodeIds.has(edge.target)); +}; +function getFitViewNodes(nodeLookup, options) { + const fitViewNodes = /* @__PURE__ */ new Map(); + const optionNodeIds = (options == null ? void 0 : options.nodes) ? new Set(options.nodes.map((node) => node.id)) : null; + nodeLookup.forEach((n) => { + const isVisible = n.measured.width && n.measured.height && ((options == null ? void 0 : options.includeHiddenNodes) || !n.hidden); + if (isVisible && (!optionNodeIds || optionNodeIds.has(n.id))) { + fitViewNodes.set(n.id, n); + } + }); + return fitViewNodes; +} +async function fitViewport({ nodes, width, height, panZoom, minZoom, maxZoom }, options) { + if (nodes.size === 0) { + return Promise.resolve(true); + } + const nodesToFit = getFitViewNodes(nodes, options); + const bounds = getInternalNodesBounds(nodesToFit); + const viewport = getViewportForBounds(bounds, width, height, (options == null ? void 0 : options.minZoom) ?? minZoom, (options == null ? void 0 : options.maxZoom) ?? maxZoom, (options == null ? void 0 : options.padding) ?? 0.1); + await panZoom.setViewport(viewport, { + duration: options == null ? void 0 : options.duration, + ease: options == null ? void 0 : options.ease, + interpolate: options == null ? void 0 : options.interpolate + }); + return Promise.resolve(true); +} +function calculateNodePosition({ nodeId, nextPosition, nodeLookup, nodeOrigin = [0, 0], nodeExtent, onError }) { + const node = nodeLookup.get(nodeId); + const parentNode = node.parentId ? nodeLookup.get(node.parentId) : void 0; + const { x: parentX, y: parentY } = parentNode ? parentNode.internals.positionAbsolute : { x: 0, y: 0 }; + const origin = node.origin ?? nodeOrigin; + let extent = node.extent || nodeExtent; + if (node.extent === "parent" && !node.expandParent) { + if (!parentNode) { + onError == null ? void 0 : onError("005", errorMessages["error005"]()); + } else { + const parentWidth = parentNode.measured.width; + const parentHeight = parentNode.measured.height; + if (parentWidth && parentHeight) { + extent = [ + [parentX, parentY], + [parentX + parentWidth, parentY + parentHeight] + ]; + } + } + } else if (parentNode && isCoordinateExtent(node.extent)) { + extent = [ + [node.extent[0][0] + parentX, node.extent[0][1] + parentY], + [node.extent[1][0] + parentX, node.extent[1][1] + parentY] + ]; + } + const positionAbsolute = isCoordinateExtent(extent) ? clampPosition(nextPosition, extent, node.measured) : nextPosition; + if (node.measured.width === void 0 || node.measured.height === void 0) { + onError == null ? void 0 : onError("015", errorMessages["error015"]()); + } + return { + position: { + x: positionAbsolute.x - parentX + (node.measured.width ?? 0) * origin[0], + y: positionAbsolute.y - parentY + (node.measured.height ?? 0) * origin[1] + }, + positionAbsolute + }; +} +async function getElementsToRemove({ nodesToRemove = [], edgesToRemove = [], nodes, edges, onBeforeDelete }) { + const nodeIds = new Set(nodesToRemove.map((node) => node.id)); + const matchingNodes = []; + for (const node of nodes) { + if (node.deletable === false) { + continue; + } + const isIncluded = nodeIds.has(node.id); + const parentHit = !isIncluded && node.parentId && matchingNodes.find((n) => n.id === node.parentId); + if (isIncluded || parentHit) { + matchingNodes.push(node); + } + } + const edgeIds = new Set(edgesToRemove.map((edge) => edge.id)); + const deletableEdges = edges.filter((edge) => edge.deletable !== false); + const connectedEdges = getConnectedEdges(matchingNodes, deletableEdges); + const matchingEdges = connectedEdges; + for (const edge of deletableEdges) { + const isIncluded = edgeIds.has(edge.id); + if (isIncluded && !matchingEdges.find((e) => e.id === edge.id)) { + matchingEdges.push(edge); + } + } + if (!onBeforeDelete) { + return { + edges: matchingEdges, + nodes: matchingNodes + }; + } + const onBeforeDeleteResult = await onBeforeDelete({ + nodes: matchingNodes, + edges: matchingEdges + }); + if (typeof onBeforeDeleteResult === "boolean") { + return onBeforeDeleteResult ? { edges: matchingEdges, nodes: matchingNodes } : { edges: [], nodes: [] }; + } + return onBeforeDeleteResult; +} +var clamp = (val, min = 0, max = 1) => Math.min(Math.max(val, min), max); +var clampPosition = (position = { x: 0, y: 0 }, extent, dimensions) => ({ + x: clamp(position.x, extent[0][0], extent[1][0] - ((dimensions == null ? void 0 : dimensions.width) ?? 0)), + y: clamp(position.y, extent[0][1], extent[1][1] - ((dimensions == null ? void 0 : dimensions.height) ?? 0)) +}); +function clampPositionToParent(childPosition, childDimensions, parent) { + const { width: parentWidth, height: parentHeight } = getNodeDimensions(parent); + const { x: parentX, y: parentY } = parent.internals.positionAbsolute; + return clampPosition(childPosition, [ + [parentX, parentY], + [parentX + parentWidth, parentY + parentHeight] + ], childDimensions); +} +var calcAutoPanVelocity = (value, min, max) => { + if (value < min) { + return clamp(Math.abs(value - min), 1, min) / min; + } else if (value > max) { + return -clamp(Math.abs(value - max), 1, min) / min; + } + return 0; +}; +var calcAutoPan = (pos, bounds, speed = 15, distance2 = 40) => { + const xMovement = calcAutoPanVelocity(pos.x, distance2, bounds.width - distance2) * speed; + const yMovement = calcAutoPanVelocity(pos.y, distance2, bounds.height - distance2) * speed; + return [xMovement, yMovement]; +}; +var getBoundsOfBoxes = (box1, box2) => ({ + x: Math.min(box1.x, box2.x), + y: Math.min(box1.y, box2.y), + x2: Math.max(box1.x2, box2.x2), + y2: Math.max(box1.y2, box2.y2) +}); +var rectToBox = ({ x, y, width, height }) => ({ + x, + y, + x2: x + width, + y2: y + height +}); +var boxToRect = ({ x, y, x2, y2 }) => ({ + x, + y, + width: x2 - x, + height: y2 - y +}); +var nodeToRect = (node, nodeOrigin = [0, 0]) => { + var _a, _b; + const { x, y } = isInternalNodeBase(node) ? node.internals.positionAbsolute : getNodePositionWithOrigin(node, nodeOrigin); + return { + x, + y, + width: ((_a = node.measured) == null ? void 0 : _a.width) ?? node.width ?? node.initialWidth ?? 0, + height: ((_b = node.measured) == null ? void 0 : _b.height) ?? node.height ?? node.initialHeight ?? 0 + }; +}; +var nodeToBox = (node, nodeOrigin = [0, 0]) => { + var _a, _b; + const { x, y } = isInternalNodeBase(node) ? node.internals.positionAbsolute : getNodePositionWithOrigin(node, nodeOrigin); + return { + x, + y, + x2: x + (((_a = node.measured) == null ? void 0 : _a.width) ?? node.width ?? node.initialWidth ?? 0), + y2: y + (((_b = node.measured) == null ? void 0 : _b.height) ?? node.height ?? node.initialHeight ?? 0) + }; +}; +var getBoundsOfRects = (rect1, rect2) => boxToRect(getBoundsOfBoxes(rectToBox(rect1), rectToBox(rect2))); +var getOverlappingArea = (rectA, rectB) => { + const xOverlap = Math.max(0, Math.min(rectA.x + rectA.width, rectB.x + rectB.width) - Math.max(rectA.x, rectB.x)); + const yOverlap = Math.max(0, Math.min(rectA.y + rectA.height, rectB.y + rectB.height) - Math.max(rectA.y, rectB.y)); + return Math.ceil(xOverlap * yOverlap); +}; +var isRectObject = (obj) => isNumeric(obj.width) && isNumeric(obj.height) && isNumeric(obj.x) && isNumeric(obj.y); +var isNumeric = (n) => !isNaN(n) && isFinite(n); +var devWarn = (id2, message) => { + if (true) { + console.warn(`[React Flow]: ${message} Help: https://reactflow.dev/error#${id2}`); + } +}; +var snapPosition = (position, snapGrid = [1, 1]) => { + return { + x: snapGrid[0] * Math.round(position.x / snapGrid[0]), + y: snapGrid[1] * Math.round(position.y / snapGrid[1]) + }; +}; +var pointToRendererPoint = ({ x, y }, [tx, ty, tScale], snapToGrid = false, snapGrid = [1, 1]) => { + const position = { + x: (x - tx) / tScale, + y: (y - ty) / tScale + }; + return snapToGrid ? snapPosition(position, snapGrid) : position; +}; +var rendererPointToPoint = ({ x, y }, [tx, ty, tScale]) => { + return { + x: x * tScale + tx, + y: y * tScale + ty + }; +}; +function parsePadding(padding, viewport) { + if (typeof padding === "number") { + return Math.floor((viewport - viewport / (1 + padding)) * 0.5); + } + if (typeof padding === "string" && padding.endsWith("px")) { + const paddingValue = parseFloat(padding); + if (!Number.isNaN(paddingValue)) { + return Math.floor(paddingValue); + } + } + if (typeof padding === "string" && padding.endsWith("%")) { + const paddingValue = parseFloat(padding); + if (!Number.isNaN(paddingValue)) { + return Math.floor(viewport * paddingValue * 0.01); + } + } + console.error(`[React Flow] The padding value "${padding}" is invalid. Please provide a number or a string with a valid unit (px or %).`); + return 0; +} +function parsePaddings(padding, width, height) { + if (typeof padding === "string" || typeof padding === "number") { + const paddingY = parsePadding(padding, height); + const paddingX = parsePadding(padding, width); + return { + top: paddingY, + right: paddingX, + bottom: paddingY, + left: paddingX, + x: paddingX * 2, + y: paddingY * 2 + }; + } + if (typeof padding === "object") { + const top = parsePadding(padding.top ?? padding.y ?? 0, height); + const bottom = parsePadding(padding.bottom ?? padding.y ?? 0, height); + const left = parsePadding(padding.left ?? padding.x ?? 0, width); + const right = parsePadding(padding.right ?? padding.x ?? 0, width); + return { top, right, bottom, left, x: left + right, y: top + bottom }; + } + return { top: 0, right: 0, bottom: 0, left: 0, x: 0, y: 0 }; +} +function calculateAppliedPaddings(bounds, x, y, zoom, width, height) { + const { x: left, y: top } = rendererPointToPoint(bounds, [x, y, zoom]); + const { x: boundRight, y: boundBottom } = rendererPointToPoint({ x: bounds.x + bounds.width, y: bounds.y + bounds.height }, [x, y, zoom]); + const right = width - boundRight; + const bottom = height - boundBottom; + return { + left: Math.floor(left), + top: Math.floor(top), + right: Math.floor(right), + bottom: Math.floor(bottom) + }; +} +var getViewportForBounds = (bounds, width, height, minZoom, maxZoom, padding) => { + const p = parsePaddings(padding, width, height); + const xZoom = (width - p.x) / bounds.width; + const yZoom = (height - p.y) / bounds.height; + const zoom = Math.min(xZoom, yZoom); + const clampedZoom = clamp(zoom, minZoom, maxZoom); + const boundsCenterX = bounds.x + bounds.width / 2; + const boundsCenterY = bounds.y + bounds.height / 2; + const x = width / 2 - boundsCenterX * clampedZoom; + const y = height / 2 - boundsCenterY * clampedZoom; + const newPadding = calculateAppliedPaddings(bounds, x, y, clampedZoom, width, height); + const offset = { + left: Math.min(newPadding.left - p.left, 0), + top: Math.min(newPadding.top - p.top, 0), + right: Math.min(newPadding.right - p.right, 0), + bottom: Math.min(newPadding.bottom - p.bottom, 0) + }; + return { + x: x - offset.left + offset.right, + y: y - offset.top + offset.bottom, + zoom: clampedZoom + }; +}; +var isMacOs = () => { + var _a; + return typeof navigator !== "undefined" && ((_a = navigator == null ? void 0 : navigator.userAgent) == null ? void 0 : _a.indexOf("Mac")) >= 0; +}; +function isCoordinateExtent(extent) { + return extent !== void 0 && extent !== null && extent !== "parent"; +} +function getNodeDimensions(node) { + var _a, _b; + return { + width: ((_a = node.measured) == null ? void 0 : _a.width) ?? node.width ?? node.initialWidth ?? 0, + height: ((_b = node.measured) == null ? void 0 : _b.height) ?? node.height ?? node.initialHeight ?? 0 + }; +} +function nodeHasDimensions(node) { + var _a, _b; + return (((_a = node.measured) == null ? void 0 : _a.width) ?? node.width ?? node.initialWidth) !== void 0 && (((_b = node.measured) == null ? void 0 : _b.height) ?? node.height ?? node.initialHeight) !== void 0; +} +function evaluateAbsolutePosition(position, dimensions = { width: 0, height: 0 }, parentId, nodeLookup, nodeOrigin) { + const positionAbsolute = { ...position }; + const parent = nodeLookup.get(parentId); + if (parent) { + const origin = parent.origin || nodeOrigin; + positionAbsolute.x += parent.internals.positionAbsolute.x - (dimensions.width ?? 0) * origin[0]; + positionAbsolute.y += parent.internals.positionAbsolute.y - (dimensions.height ?? 0) * origin[1]; + } + return positionAbsolute; +} +function areSetsEqual(a, b) { + if (a.size !== b.size) { + return false; + } + for (const item of a) { + if (!b.has(item)) { + return false; + } + } + return true; +} +function withResolvers() { + let resolve; + let reject; + const promise = new Promise((res, rej) => { + resolve = res; + reject = rej; + }); + return { promise, resolve, reject }; +} +function mergeAriaLabelConfig(partial) { + return { ...defaultAriaLabelConfig, ...partial || {} }; +} +function getPointerPosition(event, { snapGrid = [0, 0], snapToGrid = false, transform: transform2, containerBounds }) { + const { x, y } = getEventPosition(event); + const pointerPos = pointToRendererPoint({ x: x - ((containerBounds == null ? void 0 : containerBounds.left) ?? 0), y: y - ((containerBounds == null ? void 0 : containerBounds.top) ?? 0) }, transform2); + const { x: xSnapped, y: ySnapped } = snapToGrid ? snapPosition(pointerPos, snapGrid) : pointerPos; + return { + xSnapped, + ySnapped, + ...pointerPos + }; +} +var getDimensions = (node) => ({ + width: node.offsetWidth, + height: node.offsetHeight +}); +var getHostForElement = (element) => { + var _a; + return ((_a = element == null ? void 0 : element.getRootNode) == null ? void 0 : _a.call(element)) || (window == null ? void 0 : window.document); +}; +var inputTags = ["INPUT", "SELECT", "TEXTAREA"]; +function isInputDOMNode(event) { + var _a, _b; + const target = ((_b = (_a = event.composedPath) == null ? void 0 : _a.call(event)) == null ? void 0 : _b[0]) || event.target; + if ((target == null ? void 0 : target.nodeType) !== 1) + return false; + const isInput = inputTags.includes(target.nodeName) || target.hasAttribute("contenteditable"); + return isInput || !!target.closest(".nokey"); +} +var isMouseEvent = (event) => "clientX" in event; +var getEventPosition = (event, bounds) => { + var _a, _b; + const isMouse = isMouseEvent(event); + const evtX = isMouse ? event.clientX : (_a = event.touches) == null ? void 0 : _a[0].clientX; + const evtY = isMouse ? event.clientY : (_b = event.touches) == null ? void 0 : _b[0].clientY; + return { + x: evtX - ((bounds == null ? void 0 : bounds.left) ?? 0), + y: evtY - ((bounds == null ? void 0 : bounds.top) ?? 0) + }; +}; +var getHandleBounds = (type, nodeElement, nodeBounds, zoom, nodeId) => { + const handles = nodeElement.querySelectorAll(`.${type}`); + if (!handles || !handles.length) { + return null; + } + return Array.from(handles).map((handle) => { + const handleBounds = handle.getBoundingClientRect(); + return { + id: handle.getAttribute("data-handleid"), + type, + nodeId, + position: handle.getAttribute("data-handlepos"), + x: (handleBounds.left - nodeBounds.left) / zoom, + y: (handleBounds.top - nodeBounds.top) / zoom, + ...getDimensions(handle) + }; + }); +}; +function getBezierEdgeCenter({ sourceX, sourceY, targetX, targetY, sourceControlX, sourceControlY, targetControlX, targetControlY }) { + const centerX = sourceX * 0.125 + sourceControlX * 0.375 + targetControlX * 0.375 + targetX * 0.125; + const centerY = sourceY * 0.125 + sourceControlY * 0.375 + targetControlY * 0.375 + targetY * 0.125; + const offsetX = Math.abs(centerX - sourceX); + const offsetY = Math.abs(centerY - sourceY); + return [centerX, centerY, offsetX, offsetY]; +} +function calculateControlOffset(distance2, curvature) { + if (distance2 >= 0) { + return 0.5 * distance2; + } + return curvature * 25 * Math.sqrt(-distance2); +} +function getControlWithCurvature({ pos, x1, y1, x2, y2, c }) { + switch (pos) { + case Position.Left: + return [x1 - calculateControlOffset(x1 - x2, c), y1]; + case Position.Right: + return [x1 + calculateControlOffset(x2 - x1, c), y1]; + case Position.Top: + return [x1, y1 - calculateControlOffset(y1 - y2, c)]; + case Position.Bottom: + return [x1, y1 + calculateControlOffset(y2 - y1, c)]; + } +} +function getBezierPath({ sourceX, sourceY, sourcePosition = Position.Bottom, targetX, targetY, targetPosition = Position.Top, curvature = 0.25 }) { + const [sourceControlX, sourceControlY] = getControlWithCurvature({ + pos: sourcePosition, + x1: sourceX, + y1: sourceY, + x2: targetX, + y2: targetY, + c: curvature + }); + const [targetControlX, targetControlY] = getControlWithCurvature({ + pos: targetPosition, + x1: targetX, + y1: targetY, + x2: sourceX, + y2: sourceY, + c: curvature + }); + const [labelX, labelY, offsetX, offsetY] = getBezierEdgeCenter({ + sourceX, + sourceY, + targetX, + targetY, + sourceControlX, + sourceControlY, + targetControlX, + targetControlY + }); + return [ + `M${sourceX},${sourceY} C${sourceControlX},${sourceControlY} ${targetControlX},${targetControlY} ${targetX},${targetY}`, + labelX, + labelY, + offsetX, + offsetY + ]; +} +function getEdgeCenter({ sourceX, sourceY, targetX, targetY }) { + const xOffset = Math.abs(targetX - sourceX) / 2; + const centerX = targetX < sourceX ? targetX + xOffset : targetX - xOffset; + const yOffset = Math.abs(targetY - sourceY) / 2; + const centerY = targetY < sourceY ? targetY + yOffset : targetY - yOffset; + return [centerX, centerY, xOffset, yOffset]; +} +function getElevatedEdgeZIndex({ sourceNode, targetNode, selected: selected2 = false, zIndex = 0, elevateOnSelect = false, zIndexMode = "basic" }) { + if (zIndexMode === "manual") { + return zIndex; + } + const edgeZ = elevateOnSelect && selected2 ? zIndex + 1e3 : zIndex; + const nodeZ = Math.max(sourceNode.parentId || elevateOnSelect && sourceNode.selected ? sourceNode.internals.z : 0, targetNode.parentId || elevateOnSelect && targetNode.selected ? targetNode.internals.z : 0); + return edgeZ + nodeZ; +} +function isEdgeVisible({ sourceNode, targetNode, width, height, transform: transform2 }) { + const edgeBox = getBoundsOfBoxes(nodeToBox(sourceNode), nodeToBox(targetNode)); + if (edgeBox.x === edgeBox.x2) { + edgeBox.x2 += 1; + } + if (edgeBox.y === edgeBox.y2) { + edgeBox.y2 += 1; + } + const viewRect = { + x: -transform2[0] / transform2[2], + y: -transform2[1] / transform2[2], + width: width / transform2[2], + height: height / transform2[2] + }; + return getOverlappingArea(viewRect, boxToRect(edgeBox)) > 0; +} +var getEdgeId = ({ source, sourceHandle, target, targetHandle }) => `xy-edge__${source}${sourceHandle || ""}-${target}${targetHandle || ""}`; +var connectionExists = (edge, edges) => { + return edges.some((el) => el.source === edge.source && el.target === edge.target && (el.sourceHandle === edge.sourceHandle || !el.sourceHandle && !edge.sourceHandle) && (el.targetHandle === edge.targetHandle || !el.targetHandle && !edge.targetHandle)); +}; +var addEdge = (edgeParams, edges, options = {}) => { + if (!edgeParams.source || !edgeParams.target) { + devWarn("006", errorMessages["error006"]()); + return edges; + } + const edgeIdGenerator = options.getEdgeId || getEdgeId; + let edge; + if (isEdgeBase(edgeParams)) { + edge = { ...edgeParams }; + } else { + edge = { + ...edgeParams, + id: edgeIdGenerator(edgeParams) + }; + } + if (connectionExists(edge, edges)) { + return edges; + } + if (edge.sourceHandle === null) { + delete edge.sourceHandle; + } + if (edge.targetHandle === null) { + delete edge.targetHandle; + } + return edges.concat(edge); +}; +var reconnectEdge = (oldEdge, newConnection, edges, options = { shouldReplaceId: true }) => { + const { id: oldEdgeId, ...rest } = oldEdge; + if (!newConnection.source || !newConnection.target) { + devWarn("006", errorMessages["error006"]()); + return edges; + } + const foundEdge = edges.find((e) => e.id === oldEdge.id); + if (!foundEdge) { + devWarn("007", errorMessages["error007"](oldEdgeId)); + return edges; + } + const edgeIdGenerator = options.getEdgeId || getEdgeId; + const edge = { + ...rest, + id: options.shouldReplaceId ? edgeIdGenerator(newConnection) : oldEdgeId, + source: newConnection.source, + target: newConnection.target, + sourceHandle: newConnection.sourceHandle, + targetHandle: newConnection.targetHandle + }; + return edges.filter((e) => e.id !== oldEdgeId).concat(edge); +}; +function getStraightPath({ sourceX, sourceY, targetX, targetY }) { + const [labelX, labelY, offsetX, offsetY] = getEdgeCenter({ + sourceX, + sourceY, + targetX, + targetY + }); + return [`M ${sourceX},${sourceY}L ${targetX},${targetY}`, labelX, labelY, offsetX, offsetY]; +} +var handleDirections = { + [Position.Left]: { x: -1, y: 0 }, + [Position.Right]: { x: 1, y: 0 }, + [Position.Top]: { x: 0, y: -1 }, + [Position.Bottom]: { x: 0, y: 1 } +}; +var getDirection = ({ source, sourcePosition = Position.Bottom, target }) => { + if (sourcePosition === Position.Left || sourcePosition === Position.Right) { + return source.x < target.x ? { x: 1, y: 0 } : { x: -1, y: 0 }; + } + return source.y < target.y ? { x: 0, y: 1 } : { x: 0, y: -1 }; +}; +var distance = (a, b) => Math.sqrt(Math.pow(b.x - a.x, 2) + Math.pow(b.y - a.y, 2)); +function getPoints({ source, sourcePosition = Position.Bottom, target, targetPosition = Position.Top, center, offset, stepPosition }) { + const sourceDir = handleDirections[sourcePosition]; + const targetDir = handleDirections[targetPosition]; + const sourceGapped = { x: source.x + sourceDir.x * offset, y: source.y + sourceDir.y * offset }; + const targetGapped = { x: target.x + targetDir.x * offset, y: target.y + targetDir.y * offset }; + const dir = getDirection({ + source: sourceGapped, + sourcePosition, + target: targetGapped + }); + const dirAccessor = dir.x !== 0 ? "x" : "y"; + const currDir = dir[dirAccessor]; + let points = []; + let centerX, centerY; + const sourceGapOffset = { x: 0, y: 0 }; + const targetGapOffset = { x: 0, y: 0 }; + const [, , defaultOffsetX, defaultOffsetY] = getEdgeCenter({ + sourceX: source.x, + sourceY: source.y, + targetX: target.x, + targetY: target.y + }); + if (sourceDir[dirAccessor] * targetDir[dirAccessor] === -1) { + if (dirAccessor === "x") { + centerX = center.x ?? sourceGapped.x + (targetGapped.x - sourceGapped.x) * stepPosition; + centerY = center.y ?? (sourceGapped.y + targetGapped.y) / 2; + } else { + centerX = center.x ?? (sourceGapped.x + targetGapped.x) / 2; + centerY = center.y ?? sourceGapped.y + (targetGapped.y - sourceGapped.y) * stepPosition; + } + const verticalSplit = [ + { x: centerX, y: sourceGapped.y }, + { x: centerX, y: targetGapped.y } + ]; + const horizontalSplit = [ + { x: sourceGapped.x, y: centerY }, + { x: targetGapped.x, y: centerY } + ]; + if (sourceDir[dirAccessor] === currDir) { + points = dirAccessor === "x" ? verticalSplit : horizontalSplit; + } else { + points = dirAccessor === "x" ? horizontalSplit : verticalSplit; + } + } else { + const sourceTarget = [{ x: sourceGapped.x, y: targetGapped.y }]; + const targetSource = [{ x: targetGapped.x, y: sourceGapped.y }]; + if (dirAccessor === "x") { + points = sourceDir.x === currDir ? targetSource : sourceTarget; + } else { + points = sourceDir.y === currDir ? sourceTarget : targetSource; + } + if (sourcePosition === targetPosition) { + const diff = Math.abs(source[dirAccessor] - target[dirAccessor]); + if (diff <= offset) { + const gapOffset = Math.min(offset - 1, offset - diff); + if (sourceDir[dirAccessor] === currDir) { + sourceGapOffset[dirAccessor] = (sourceGapped[dirAccessor] > source[dirAccessor] ? -1 : 1) * gapOffset; + } else { + targetGapOffset[dirAccessor] = (targetGapped[dirAccessor] > target[dirAccessor] ? -1 : 1) * gapOffset; + } + } + } + if (sourcePosition !== targetPosition) { + const dirAccessorOpposite = dirAccessor === "x" ? "y" : "x"; + const isSameDir = sourceDir[dirAccessor] === targetDir[dirAccessorOpposite]; + const sourceGtTargetOppo = sourceGapped[dirAccessorOpposite] > targetGapped[dirAccessorOpposite]; + const sourceLtTargetOppo = sourceGapped[dirAccessorOpposite] < targetGapped[dirAccessorOpposite]; + const flipSourceTarget = sourceDir[dirAccessor] === 1 && (!isSameDir && sourceGtTargetOppo || isSameDir && sourceLtTargetOppo) || sourceDir[dirAccessor] !== 1 && (!isSameDir && sourceLtTargetOppo || isSameDir && sourceGtTargetOppo); + if (flipSourceTarget) { + points = dirAccessor === "x" ? sourceTarget : targetSource; + } + } + const sourceGapPoint = { x: sourceGapped.x + sourceGapOffset.x, y: sourceGapped.y + sourceGapOffset.y }; + const targetGapPoint = { x: targetGapped.x + targetGapOffset.x, y: targetGapped.y + targetGapOffset.y }; + const maxXDistance = Math.max(Math.abs(sourceGapPoint.x - points[0].x), Math.abs(targetGapPoint.x - points[0].x)); + const maxYDistance = Math.max(Math.abs(sourceGapPoint.y - points[0].y), Math.abs(targetGapPoint.y - points[0].y)); + if (maxXDistance >= maxYDistance) { + centerX = (sourceGapPoint.x + targetGapPoint.x) / 2; + centerY = points[0].y; + } else { + centerX = points[0].x; + centerY = (sourceGapPoint.y + targetGapPoint.y) / 2; + } + } + const pathPoints = [ + source, + { x: sourceGapped.x + sourceGapOffset.x, y: sourceGapped.y + sourceGapOffset.y }, + ...points, + { x: targetGapped.x + targetGapOffset.x, y: targetGapped.y + targetGapOffset.y }, + target + ]; + return [pathPoints, centerX, centerY, defaultOffsetX, defaultOffsetY]; +} +function getBend(a, b, c, size) { + const bendSize = Math.min(distance(a, b) / 2, distance(b, c) / 2, size); + const { x, y } = b; + if (a.x === x && x === c.x || a.y === y && y === c.y) { + return `L${x} ${y}`; + } + if (a.y === y) { + const xDir2 = a.x < c.x ? -1 : 1; + const yDir2 = a.y < c.y ? 1 : -1; + return `L ${x + bendSize * xDir2},${y}Q ${x},${y} ${x},${y + bendSize * yDir2}`; + } + const xDir = a.x < c.x ? 1 : -1; + const yDir = a.y < c.y ? -1 : 1; + return `L ${x},${y + bendSize * yDir}Q ${x},${y} ${x + bendSize * xDir},${y}`; +} +function getSmoothStepPath({ sourceX, sourceY, sourcePosition = Position.Bottom, targetX, targetY, targetPosition = Position.Top, borderRadius = 5, centerX, centerY, offset = 20, stepPosition = 0.5 }) { + const [points, labelX, labelY, offsetX, offsetY] = getPoints({ + source: { x: sourceX, y: sourceY }, + sourcePosition, + target: { x: targetX, y: targetY }, + targetPosition, + center: { x: centerX, y: centerY }, + offset, + stepPosition + }); + const path = points.reduce((res, p, i) => { + let segment = ""; + if (i > 0 && i < points.length - 1) { + segment = getBend(points[i - 1], p, points[i + 1], borderRadius); + } else { + segment = `${i === 0 ? "M" : "L"}${p.x} ${p.y}`; + } + res += segment; + return res; + }, ""); + return [path, labelX, labelY, offsetX, offsetY]; +} +function isNodeInitialized(node) { + var _a; + return node && !!(node.internals.handleBounds || ((_a = node.handles) == null ? void 0 : _a.length)) && !!(node.measured.width || node.width || node.initialWidth); +} +function getEdgePosition(params) { + var _a; + const { sourceNode, targetNode } = params; + if (!isNodeInitialized(sourceNode) || !isNodeInitialized(targetNode)) { + return null; + } + const sourceHandleBounds = sourceNode.internals.handleBounds || toHandleBounds(sourceNode.handles); + const targetHandleBounds = targetNode.internals.handleBounds || toHandleBounds(targetNode.handles); + const sourceHandle = getHandle$1((sourceHandleBounds == null ? void 0 : sourceHandleBounds.source) ?? [], params.sourceHandle); + const targetHandle = getHandle$1( + // when connection type is loose we can define all handles as sources and connect source -> source + params.connectionMode === ConnectionMode.Strict ? (targetHandleBounds == null ? void 0 : targetHandleBounds.target) ?? [] : ((targetHandleBounds == null ? void 0 : targetHandleBounds.target) ?? []).concat((targetHandleBounds == null ? void 0 : targetHandleBounds.source) ?? []), + params.targetHandle + ); + if (!sourceHandle || !targetHandle) { + (_a = params.onError) == null ? void 0 : _a.call(params, "008", errorMessages["error008"](!sourceHandle ? "source" : "target", { + id: params.id, + sourceHandle: params.sourceHandle, + targetHandle: params.targetHandle + })); + return null; + } + const sourcePosition = (sourceHandle == null ? void 0 : sourceHandle.position) || Position.Bottom; + const targetPosition = (targetHandle == null ? void 0 : targetHandle.position) || Position.Top; + const source = getHandlePosition(sourceNode, sourceHandle, sourcePosition); + const target = getHandlePosition(targetNode, targetHandle, targetPosition); + return { + sourceX: source.x, + sourceY: source.y, + targetX: target.x, + targetY: target.y, + sourcePosition, + targetPosition + }; +} +function toHandleBounds(handles) { + if (!handles) { + return null; + } + const source = []; + const target = []; + for (const handle of handles) { + handle.width = handle.width ?? 1; + handle.height = handle.height ?? 1; + if (handle.type === "source") { + source.push(handle); + } else if (handle.type === "target") { + target.push(handle); + } + } + return { + source, + target + }; +} +function getHandlePosition(node, handle, fallbackPosition = Position.Left, center = false) { + const x = ((handle == null ? void 0 : handle.x) ?? 0) + node.internals.positionAbsolute.x; + const y = ((handle == null ? void 0 : handle.y) ?? 0) + node.internals.positionAbsolute.y; + const { width, height } = handle ?? getNodeDimensions(node); + if (center) { + return { x: x + width / 2, y: y + height / 2 }; + } + const position = (handle == null ? void 0 : handle.position) ?? fallbackPosition; + switch (position) { + case Position.Top: + return { x: x + width / 2, y }; + case Position.Right: + return { x: x + width, y: y + height / 2 }; + case Position.Bottom: + return { x: x + width / 2, y: y + height }; + case Position.Left: + return { x, y: y + height / 2 }; + } +} +function getHandle$1(bounds, handleId) { + if (!bounds) { + return null; + } + return (!handleId ? bounds[0] : bounds.find((d) => d.id === handleId)) || null; +} +function getMarkerId(marker, id2) { + if (!marker) { + return ""; + } + if (typeof marker === "string") { + return marker; + } + const idPrefix = id2 ? `${id2}__` : ""; + return `${idPrefix}${Object.keys(marker).sort().map((key) => `${key}=${marker[key]}`).join("&")}`; +} +function createMarkerIds(edges, { id: id2, defaultColor, defaultMarkerStart, defaultMarkerEnd }) { + const ids = /* @__PURE__ */ new Set(); + return edges.reduce((markers, edge) => { + [edge.markerStart || defaultMarkerStart, edge.markerEnd || defaultMarkerEnd].forEach((marker) => { + if (marker && typeof marker === "object") { + const markerId = getMarkerId(marker, id2); + if (!ids.has(markerId)) { + markers.push({ id: markerId, color: marker.color || defaultColor, ...marker }); + ids.add(markerId); + } + } + }); + return markers; + }, []).sort((a, b) => a.id.localeCompare(b.id)); +} +function getNodeToolbarTransform(nodeRect, viewport, position, offset, align) { + let alignmentOffset = 0.5; + if (align === "start") { + alignmentOffset = 0; + } else if (align === "end") { + alignmentOffset = 1; + } + let pos = [ + (nodeRect.x + nodeRect.width * alignmentOffset) * viewport.zoom + viewport.x, + nodeRect.y * viewport.zoom + viewport.y - offset + ]; + let shift = [-100 * alignmentOffset, -100]; + switch (position) { + case Position.Right: + pos = [ + (nodeRect.x + nodeRect.width) * viewport.zoom + viewport.x + offset, + (nodeRect.y + nodeRect.height * alignmentOffset) * viewport.zoom + viewport.y + ]; + shift = [0, -100 * alignmentOffset]; + break; + case Position.Bottom: + pos[1] = (nodeRect.y + nodeRect.height) * viewport.zoom + viewport.y + offset; + shift[1] = 0; + break; + case Position.Left: + pos = [ + nodeRect.x * viewport.zoom + viewport.x - offset, + (nodeRect.y + nodeRect.height * alignmentOffset) * viewport.zoom + viewport.y + ]; + shift = [-100, -100 * alignmentOffset]; + break; + } + return `translate(${pos[0]}px, ${pos[1]}px) translate(${shift[0]}%, ${shift[1]}%)`; +} +var alignXToPercent = { + left: 0, + center: 50, + right: 100 +}; +var alignYToPercent = { + top: 0, + center: 50, + bottom: 100 +}; +function getEdgeToolbarTransform(x, y, zoom, alignX = "center", alignY = "center") { + return `translate(${x}px, ${y}px) scale(${1 / zoom}) translate(${-(alignXToPercent[alignX] ?? 50)}%, ${-(alignYToPercent[alignY] ?? 50)}%)`; +} +var SELECTED_NODE_Z = 1e3; +var ROOT_PARENT_Z_INCREMENT = 10; +var defaultOptions = { + nodeOrigin: [0, 0], + nodeExtent: infiniteExtent, + elevateNodesOnSelect: true, + zIndexMode: "basic", + defaults: {} +}; +var adoptUserNodesDefaultOptions = { + ...defaultOptions, + checkEquality: true +}; +function mergeObjects(base, incoming) { + const result = { ...base }; + for (const key in incoming) { + if (incoming[key] !== void 0) { + result[key] = incoming[key]; + } + } + return result; +} +function updateAbsolutePositions(nodeLookup, parentLookup, options) { + const _options = mergeObjects(defaultOptions, options); + for (const node of nodeLookup.values()) { + if (node.parentId) { + updateChildNode(node, nodeLookup, parentLookup, _options); + } else { + const positionWithOrigin = getNodePositionWithOrigin(node, _options.nodeOrigin); + const extent = isCoordinateExtent(node.extent) ? node.extent : _options.nodeExtent; + const clampedPosition = clampPosition(positionWithOrigin, extent, getNodeDimensions(node)); + node.internals.positionAbsolute = clampedPosition; + } + } +} +function parseHandles(userNode, internalNode) { + if (!userNode.handles) { + return !userNode.measured ? void 0 : internalNode == null ? void 0 : internalNode.internals.handleBounds; + } + const source = []; + const target = []; + for (const handle of userNode.handles) { + const handleBounds = { + id: handle.id, + width: handle.width ?? 1, + height: handle.height ?? 1, + nodeId: userNode.id, + x: handle.x, + y: handle.y, + position: handle.position, + type: handle.type + }; + if (handle.type === "source") { + source.push(handleBounds); + } else if (handle.type === "target") { + target.push(handleBounds); + } + } + return { + source, + target + }; +} +function isManualZIndexMode(zIndexMode) { + return zIndexMode === "manual"; +} +function adoptUserNodes(nodes, nodeLookup, parentLookup, options = {}) { + var _a, _b; + const _options = mergeObjects(adoptUserNodesDefaultOptions, options); + const rootParentIndex = { i: 0 }; + const tmpLookup = new Map(nodeLookup); + const selectedNodeZ = (_options == null ? void 0 : _options.elevateNodesOnSelect) && !isManualZIndexMode(_options.zIndexMode) ? SELECTED_NODE_Z : 0; + let nodesInitialized = nodes.length > 0; + nodeLookup.clear(); + parentLookup.clear(); + for (const userNode of nodes) { + let internalNode = tmpLookup.get(userNode.id); + if (_options.checkEquality && userNode === (internalNode == null ? void 0 : internalNode.internals.userNode)) { + nodeLookup.set(userNode.id, internalNode); + } else { + const positionWithOrigin = getNodePositionWithOrigin(userNode, _options.nodeOrigin); + const extent = isCoordinateExtent(userNode.extent) ? userNode.extent : _options.nodeExtent; + const clampedPosition = clampPosition(positionWithOrigin, extent, getNodeDimensions(userNode)); + internalNode = { + ..._options.defaults, + ...userNode, + measured: { + width: (_a = userNode.measured) == null ? void 0 : _a.width, + height: (_b = userNode.measured) == null ? void 0 : _b.height + }, + internals: { + positionAbsolute: clampedPosition, + // if user re-initializes the node or removes `measured` for whatever reason, we reset the handleBounds so that the node gets re-measured + handleBounds: parseHandles(userNode, internalNode), + z: calculateZ(userNode, selectedNodeZ, _options.zIndexMode), + userNode + } + }; + nodeLookup.set(userNode.id, internalNode); + } + if ((internalNode.measured === void 0 || internalNode.measured.width === void 0 || internalNode.measured.height === void 0) && !internalNode.hidden) { + nodesInitialized = false; + } + if (userNode.parentId) { + updateChildNode(internalNode, nodeLookup, parentLookup, options, rootParentIndex); + } + } + return nodesInitialized; +} +function updateParentLookup(node, parentLookup) { + if (!node.parentId) { + return; + } + const childNodes = parentLookup.get(node.parentId); + if (childNodes) { + childNodes.set(node.id, node); + } else { + parentLookup.set(node.parentId, /* @__PURE__ */ new Map([[node.id, node]])); + } +} +function updateChildNode(node, nodeLookup, parentLookup, options, rootParentIndex) { + const { elevateNodesOnSelect, nodeOrigin, nodeExtent, zIndexMode } = mergeObjects(defaultOptions, options); + const parentId = node.parentId; + const parentNode = nodeLookup.get(parentId); + if (!parentNode) { + console.warn(`Parent node ${parentId} not found. Please make sure that parent nodes are in front of their child nodes in the nodes array.`); + return; + } + updateParentLookup(node, parentLookup); + if (rootParentIndex && !parentNode.parentId && parentNode.internals.rootParentIndex === void 0 && zIndexMode === "auto") { + parentNode.internals.rootParentIndex = ++rootParentIndex.i; + parentNode.internals.z = parentNode.internals.z + rootParentIndex.i * ROOT_PARENT_Z_INCREMENT; + } + if (rootParentIndex && parentNode.internals.rootParentIndex !== void 0) { + rootParentIndex.i = parentNode.internals.rootParentIndex; + } + const selectedNodeZ = elevateNodesOnSelect && !isManualZIndexMode(zIndexMode) ? SELECTED_NODE_Z : 0; + const { x, y, z } = calculateChildXYZ(node, parentNode, nodeOrigin, nodeExtent, selectedNodeZ, zIndexMode); + const { positionAbsolute } = node.internals; + const positionChanged = x !== positionAbsolute.x || y !== positionAbsolute.y; + if (positionChanged || z !== node.internals.z) { + nodeLookup.set(node.id, { + ...node, + internals: { + ...node.internals, + positionAbsolute: positionChanged ? { x, y } : positionAbsolute, + z + } + }); + } +} +function calculateZ(node, selectedNodeZ, zIndexMode) { + const zIndex = isNumeric(node.zIndex) ? node.zIndex : 0; + if (isManualZIndexMode(zIndexMode)) { + return zIndex; + } + return zIndex + (node.selected ? selectedNodeZ : 0); +} +function calculateChildXYZ(childNode, parentNode, nodeOrigin, nodeExtent, selectedNodeZ, zIndexMode) { + const { x: parentX, y: parentY } = parentNode.internals.positionAbsolute; + const childDimensions = getNodeDimensions(childNode); + const positionWithOrigin = getNodePositionWithOrigin(childNode, nodeOrigin); + const clampedPosition = isCoordinateExtent(childNode.extent) ? clampPosition(positionWithOrigin, childNode.extent, childDimensions) : positionWithOrigin; + let absolutePosition = clampPosition({ x: parentX + clampedPosition.x, y: parentY + clampedPosition.y }, nodeExtent, childDimensions); + if (childNode.extent === "parent") { + absolutePosition = clampPositionToParent(absolutePosition, childDimensions, parentNode); + } + const childZ = calculateZ(childNode, selectedNodeZ, zIndexMode); + const parentZ = parentNode.internals.z ?? 0; + return { + x: absolutePosition.x, + y: absolutePosition.y, + z: parentZ >= childZ ? parentZ + 1 : childZ + }; +} +function handleExpandParent(children2, nodeLookup, parentLookup, nodeOrigin = [0, 0]) { + var _a; + const changes = []; + const parentExpansions = /* @__PURE__ */ new Map(); + for (const child of children2) { + const parent = nodeLookup.get(child.parentId); + if (!parent) { + continue; + } + const parentRect = ((_a = parentExpansions.get(child.parentId)) == null ? void 0 : _a.expandedRect) ?? nodeToRect(parent); + const expandedRect = getBoundsOfRects(parentRect, child.rect); + parentExpansions.set(child.parentId, { expandedRect, parent }); + } + if (parentExpansions.size > 0) { + parentExpansions.forEach(({ expandedRect, parent }, parentId) => { + var _a2; + const positionAbsolute = parent.internals.positionAbsolute; + const dimensions = getNodeDimensions(parent); + const origin = parent.origin ?? nodeOrigin; + const xChange = expandedRect.x < positionAbsolute.x ? Math.round(Math.abs(positionAbsolute.x - expandedRect.x)) : 0; + const yChange = expandedRect.y < positionAbsolute.y ? Math.round(Math.abs(positionAbsolute.y - expandedRect.y)) : 0; + const newWidth = Math.max(dimensions.width, Math.round(expandedRect.width)); + const newHeight = Math.max(dimensions.height, Math.round(expandedRect.height)); + const widthChange = (newWidth - dimensions.width) * origin[0]; + const heightChange = (newHeight - dimensions.height) * origin[1]; + if (xChange > 0 || yChange > 0 || widthChange || heightChange) { + changes.push({ + id: parentId, + type: "position", + position: { + x: parent.position.x - xChange + widthChange, + y: parent.position.y - yChange + heightChange + } + }); + (_a2 = parentLookup.get(parentId)) == null ? void 0 : _a2.forEach((childNode) => { + if (!children2.some((child) => child.id === childNode.id)) { + changes.push({ + id: childNode.id, + type: "position", + position: { + x: childNode.position.x + xChange, + y: childNode.position.y + yChange + } + }); + } + }); + } + if (dimensions.width < expandedRect.width || dimensions.height < expandedRect.height || xChange || yChange) { + changes.push({ + id: parentId, + type: "dimensions", + setAttributes: true, + dimensions: { + width: newWidth + (xChange ? origin[0] * xChange - widthChange : 0), + height: newHeight + (yChange ? origin[1] * yChange - heightChange : 0) + } + }); + } + }); + } + return changes; +} +function updateNodeInternals(updates, nodeLookup, parentLookup, domNode, nodeOrigin, nodeExtent, zIndexMode) { + const viewportNode = domNode == null ? void 0 : domNode.querySelector(".xyflow__viewport"); + let updatedInternals = false; + if (!viewportNode) { + return { changes: [], updatedInternals }; + } + const changes = []; + const style2 = window.getComputedStyle(viewportNode); + const { m22: zoom } = new window.DOMMatrixReadOnly(style2.transform); + const parentExpandChildren = []; + for (const update of updates.values()) { + const node = nodeLookup.get(update.id); + if (!node) { + continue; + } + if (node.hidden) { + nodeLookup.set(node.id, { + ...node, + internals: { + ...node.internals, + handleBounds: void 0 + } + }); + updatedInternals = true; + continue; + } + const dimensions = getDimensions(update.nodeElement); + const dimensionChanged = node.measured.width !== dimensions.width || node.measured.height !== dimensions.height; + const doUpdate = !!(dimensions.width && dimensions.height && (dimensionChanged || !node.internals.handleBounds || update.force)); + if (doUpdate) { + const nodeBounds = update.nodeElement.getBoundingClientRect(); + const extent = isCoordinateExtent(node.extent) ? node.extent : nodeExtent; + let { positionAbsolute } = node.internals; + if (node.parentId && node.extent === "parent") { + positionAbsolute = clampPositionToParent(positionAbsolute, dimensions, nodeLookup.get(node.parentId)); + } else if (extent) { + positionAbsolute = clampPosition(positionAbsolute, extent, dimensions); + } + const newNode = { + ...node, + measured: dimensions, + internals: { + ...node.internals, + positionAbsolute, + handleBounds: { + source: getHandleBounds("source", update.nodeElement, nodeBounds, zoom, node.id), + target: getHandleBounds("target", update.nodeElement, nodeBounds, zoom, node.id) + } + } + }; + nodeLookup.set(node.id, newNode); + if (node.parentId) { + updateChildNode(newNode, nodeLookup, parentLookup, { nodeOrigin, zIndexMode }); + } + updatedInternals = true; + if (dimensionChanged) { + changes.push({ + id: node.id, + type: "dimensions", + dimensions + }); + if (node.expandParent && node.parentId) { + parentExpandChildren.push({ + id: node.id, + parentId: node.parentId, + rect: nodeToRect(newNode, nodeOrigin) + }); + } + } + } + } + if (parentExpandChildren.length > 0) { + const parentExpandChanges = handleExpandParent(parentExpandChildren, nodeLookup, parentLookup, nodeOrigin); + changes.push(...parentExpandChanges); + } + return { changes, updatedInternals }; +} +async function panBy({ delta, panZoom, transform: transform2, translateExtent, width, height }) { + if (!panZoom || !delta.x && !delta.y) { + return Promise.resolve(false); + } + const nextViewport = await panZoom.setViewportConstrained({ + x: transform2[0] + delta.x, + y: transform2[1] + delta.y, + zoom: transform2[2] + }, [ + [0, 0], + [width, height] + ], translateExtent); + const transformChanged = !!nextViewport && (nextViewport.x !== transform2[0] || nextViewport.y !== transform2[1] || nextViewport.k !== transform2[2]); + return Promise.resolve(transformChanged); +} +function addConnectionToLookup(type, connection, connectionKey, connectionLookup, nodeId, handleId) { + let key = nodeId; + const nodeMap = connectionLookup.get(key) || /* @__PURE__ */ new Map(); + connectionLookup.set(key, nodeMap.set(connectionKey, connection)); + key = `${nodeId}-${type}`; + const typeMap = connectionLookup.get(key) || /* @__PURE__ */ new Map(); + connectionLookup.set(key, typeMap.set(connectionKey, connection)); + if (handleId) { + key = `${nodeId}-${type}-${handleId}`; + const handleMap = connectionLookup.get(key) || /* @__PURE__ */ new Map(); + connectionLookup.set(key, handleMap.set(connectionKey, connection)); + } +} +function updateConnectionLookup(connectionLookup, edgeLookup, edges) { + connectionLookup.clear(); + edgeLookup.clear(); + for (const edge of edges) { + const { source: sourceNode, target: targetNode, sourceHandle = null, targetHandle = null } = edge; + const connection = { edgeId: edge.id, source: sourceNode, target: targetNode, sourceHandle, targetHandle }; + const sourceKey = `${sourceNode}-${sourceHandle}--${targetNode}-${targetHandle}`; + const targetKey = `${targetNode}-${targetHandle}--${sourceNode}-${sourceHandle}`; + addConnectionToLookup("source", connection, targetKey, connectionLookup, sourceNode, sourceHandle); + addConnectionToLookup("target", connection, sourceKey, connectionLookup, targetNode, targetHandle); + edgeLookup.set(edge.id, edge); + } +} +function shallowNodeData(a, b) { + if (a === null || b === null) { + return false; + } + const _a = Array.isArray(a) ? a : [a]; + const _b = Array.isArray(b) ? b : [b]; + if (_a.length !== _b.length) { + return false; + } + for (let i = 0; i < _a.length; i++) { + if (_a[i].id !== _b[i].id || _a[i].type !== _b[i].type || !Object.is(_a[i].data, _b[i].data)) { + return false; + } + } + return true; +} +function isParentSelected(node, nodeLookup) { + if (!node.parentId) { + return false; + } + const parentNode = nodeLookup.get(node.parentId); + if (!parentNode) { + return false; + } + if (parentNode.selected) { + return true; + } + return isParentSelected(parentNode, nodeLookup); +} +function hasSelector(target, selector2, domNode) { + var _a; + let current = target; + do { + if ((_a = current == null ? void 0 : current.matches) == null ? void 0 : _a.call(current, selector2)) + return true; + if (current === domNode) + return false; + current = current == null ? void 0 : current.parentElement; + } while (current); + return false; +} +function getDragItems(nodeLookup, nodesDraggable, mousePos, nodeId) { + const dragItems = /* @__PURE__ */ new Map(); + for (const [id2, node] of nodeLookup) { + if ((node.selected || node.id === nodeId) && (!node.parentId || !isParentSelected(node, nodeLookup)) && (node.draggable || nodesDraggable && typeof node.draggable === "undefined")) { + const internalNode = nodeLookup.get(id2); + if (internalNode) { + dragItems.set(id2, { + id: id2, + position: internalNode.position || { x: 0, y: 0 }, + distance: { + x: mousePos.x - internalNode.internals.positionAbsolute.x, + y: mousePos.y - internalNode.internals.positionAbsolute.y + }, + extent: internalNode.extent, + parentId: internalNode.parentId, + origin: internalNode.origin, + expandParent: internalNode.expandParent, + internals: { + positionAbsolute: internalNode.internals.positionAbsolute || { x: 0, y: 0 } + }, + measured: { + width: internalNode.measured.width ?? 0, + height: internalNode.measured.height ?? 0 + } + }); + } + } + } + return dragItems; +} +function getEventHandlerParams({ nodeId, dragItems, nodeLookup, dragging = true }) { + var _a, _b, _c; + const nodesFromDragItems = []; + for (const [id2, dragItem] of dragItems) { + const node2 = (_a = nodeLookup.get(id2)) == null ? void 0 : _a.internals.userNode; + if (node2) { + nodesFromDragItems.push({ + ...node2, + position: dragItem.position, + dragging + }); + } + } + if (!nodeId) { + return [nodesFromDragItems[0], nodesFromDragItems]; + } + const node = (_b = nodeLookup.get(nodeId)) == null ? void 0 : _b.internals.userNode; + return [ + !node ? nodesFromDragItems[0] : { + ...node, + position: ((_c = dragItems.get(nodeId)) == null ? void 0 : _c.position) || node.position, + dragging + }, + nodesFromDragItems + ]; +} +function calculateSnapOffset({ dragItems, snapGrid, x, y }) { + const refDragItem = dragItems.values().next().value; + if (!refDragItem) { + return null; + } + const refPos = { + x: x - refDragItem.distance.x, + y: y - refDragItem.distance.y + }; + const refPosSnapped = snapPosition(refPos, snapGrid); + return { + x: refPosSnapped.x - refPos.x, + y: refPosSnapped.y - refPos.y + }; +} +function XYDrag({ onNodeMouseDown, getStoreItems, onDragStart, onDrag, onDragStop }) { + let lastPos = { x: null, y: null }; + let autoPanId = 0; + let dragItems = /* @__PURE__ */ new Map(); + let autoPanStarted = false; + let mousePosition = { x: 0, y: 0 }; + let containerBounds = null; + let dragStarted = false; + let d3Selection = null; + let abortDrag = false; + let nodePositionsChanged = false; + let dragEvent = null; + function update({ noDragClassName, handleSelector, domNode, isSelectable, nodeId, nodeClickDistance = 0 }) { + d3Selection = select_default2(domNode); + function updateNodes({ x, y }) { + const { nodeLookup, nodeExtent, snapGrid, snapToGrid, nodeOrigin, onNodeDrag, onSelectionDrag, onError, updateNodePositions } = getStoreItems(); + lastPos = { x, y }; + let hasChange = false; + const isMultiDrag = dragItems.size > 1; + const nodesBox = isMultiDrag && nodeExtent ? rectToBox(getInternalNodesBounds(dragItems)) : null; + const multiDragSnapOffset = isMultiDrag && snapToGrid ? calculateSnapOffset({ + dragItems, + snapGrid, + x, + y + }) : null; + for (const [id2, dragItem] of dragItems) { + if (!nodeLookup.has(id2)) { + continue; + } + let nextPosition = { x: x - dragItem.distance.x, y: y - dragItem.distance.y }; + if (snapToGrid) { + nextPosition = multiDragSnapOffset ? { + x: Math.round(nextPosition.x + multiDragSnapOffset.x), + y: Math.round(nextPosition.y + multiDragSnapOffset.y) + } : snapPosition(nextPosition, snapGrid); + } + let adjustedNodeExtent = null; + if (isMultiDrag && nodeExtent && !dragItem.extent && nodesBox) { + const { positionAbsolute: positionAbsolute2 } = dragItem.internals; + const x1 = positionAbsolute2.x - nodesBox.x + nodeExtent[0][0]; + const x2 = positionAbsolute2.x + dragItem.measured.width - nodesBox.x2 + nodeExtent[1][0]; + const y1 = positionAbsolute2.y - nodesBox.y + nodeExtent[0][1]; + const y2 = positionAbsolute2.y + dragItem.measured.height - nodesBox.y2 + nodeExtent[1][1]; + adjustedNodeExtent = [ + [x1, y1], + [x2, y2] + ]; + } + const { position, positionAbsolute } = calculateNodePosition({ + nodeId: id2, + nextPosition, + nodeLookup, + nodeExtent: adjustedNodeExtent ? adjustedNodeExtent : nodeExtent, + nodeOrigin, + onError + }); + hasChange = hasChange || dragItem.position.x !== position.x || dragItem.position.y !== position.y; + dragItem.position = position; + dragItem.internals.positionAbsolute = positionAbsolute; + } + nodePositionsChanged = nodePositionsChanged || hasChange; + if (!hasChange) { + return; + } + updateNodePositions(dragItems, true); + if (dragEvent && (onDrag || onNodeDrag || !nodeId && onSelectionDrag)) { + const [currentNode, currentNodes] = getEventHandlerParams({ + nodeId, + dragItems, + nodeLookup + }); + onDrag == null ? void 0 : onDrag(dragEvent, dragItems, currentNode, currentNodes); + onNodeDrag == null ? void 0 : onNodeDrag(dragEvent, currentNode, currentNodes); + if (!nodeId) { + onSelectionDrag == null ? void 0 : onSelectionDrag(dragEvent, currentNodes); + } + } + } + async function autoPan() { + if (!containerBounds) { + return; + } + const { transform: transform2, panBy: panBy2, autoPanSpeed, autoPanOnNodeDrag } = getStoreItems(); + if (!autoPanOnNodeDrag) { + autoPanStarted = false; + cancelAnimationFrame(autoPanId); + return; + } + const [xMovement, yMovement] = calcAutoPan(mousePosition, containerBounds, autoPanSpeed); + if (xMovement !== 0 || yMovement !== 0) { + lastPos.x = (lastPos.x ?? 0) - xMovement / transform2[2]; + lastPos.y = (lastPos.y ?? 0) - yMovement / transform2[2]; + if (await panBy2({ x: xMovement, y: yMovement })) { + updateNodes(lastPos); + } + } + autoPanId = requestAnimationFrame(autoPan); + } + function startDrag(event) { + var _a; + const { nodeLookup, multiSelectionActive, nodesDraggable, transform: transform2, snapGrid, snapToGrid, selectNodesOnDrag, onNodeDragStart, onSelectionDragStart, unselectNodesAndEdges } = getStoreItems(); + dragStarted = true; + if ((!selectNodesOnDrag || !isSelectable) && !multiSelectionActive && nodeId) { + if (!((_a = nodeLookup.get(nodeId)) == null ? void 0 : _a.selected)) { + unselectNodesAndEdges(); + } + } + if (isSelectable && selectNodesOnDrag && nodeId) { + onNodeMouseDown == null ? void 0 : onNodeMouseDown(nodeId); + } + const pointerPos = getPointerPosition(event.sourceEvent, { transform: transform2, snapGrid, snapToGrid, containerBounds }); + lastPos = pointerPos; + dragItems = getDragItems(nodeLookup, nodesDraggable, pointerPos, nodeId); + if (dragItems.size > 0 && (onDragStart || onNodeDragStart || !nodeId && onSelectionDragStart)) { + const [currentNode, currentNodes] = getEventHandlerParams({ + nodeId, + dragItems, + nodeLookup + }); + onDragStart == null ? void 0 : onDragStart(event.sourceEvent, dragItems, currentNode, currentNodes); + onNodeDragStart == null ? void 0 : onNodeDragStart(event.sourceEvent, currentNode, currentNodes); + if (!nodeId) { + onSelectionDragStart == null ? void 0 : onSelectionDragStart(event.sourceEvent, currentNodes); + } + } + } + const d3DragInstance = drag_default().clickDistance(nodeClickDistance).on("start", (event) => { + const { domNode: domNode2, nodeDragThreshold, transform: transform2, snapGrid, snapToGrid } = getStoreItems(); + containerBounds = (domNode2 == null ? void 0 : domNode2.getBoundingClientRect()) || null; + abortDrag = false; + nodePositionsChanged = false; + dragEvent = event.sourceEvent; + if (nodeDragThreshold === 0) { + startDrag(event); + } + const pointerPos = getPointerPosition(event.sourceEvent, { transform: transform2, snapGrid, snapToGrid, containerBounds }); + lastPos = pointerPos; + mousePosition = getEventPosition(event.sourceEvent, containerBounds); + }).on("drag", (event) => { + const { autoPanOnNodeDrag, transform: transform2, snapGrid, snapToGrid, nodeDragThreshold, nodeLookup } = getStoreItems(); + const pointerPos = getPointerPosition(event.sourceEvent, { transform: transform2, snapGrid, snapToGrid, containerBounds }); + dragEvent = event.sourceEvent; + if (event.sourceEvent.type === "touchmove" && event.sourceEvent.touches.length > 1 || // if user deletes a node while dragging, we need to abort the drag to prevent errors + nodeId && !nodeLookup.has(nodeId)) { + abortDrag = true; + } + if (abortDrag) { + return; + } + if (!autoPanStarted && autoPanOnNodeDrag && dragStarted) { + autoPanStarted = true; + autoPan(); + } + if (!dragStarted) { + const currentMousePosition = getEventPosition(event.sourceEvent, containerBounds); + const x = currentMousePosition.x - mousePosition.x; + const y = currentMousePosition.y - mousePosition.y; + const distance2 = Math.sqrt(x * x + y * y); + if (distance2 > nodeDragThreshold) { + startDrag(event); + } + } + if ((lastPos.x !== pointerPos.xSnapped || lastPos.y !== pointerPos.ySnapped) && dragItems && dragStarted) { + mousePosition = getEventPosition(event.sourceEvent, containerBounds); + updateNodes(pointerPos); + } + }).on("end", (event) => { + if (!dragStarted || abortDrag) { + return; + } + autoPanStarted = false; + dragStarted = false; + cancelAnimationFrame(autoPanId); + if (dragItems.size > 0) { + const { nodeLookup, updateNodePositions, onNodeDragStop, onSelectionDragStop } = getStoreItems(); + if (nodePositionsChanged) { + updateNodePositions(dragItems, false); + nodePositionsChanged = false; + } + if (onDragStop || onNodeDragStop || !nodeId && onSelectionDragStop) { + const [currentNode, currentNodes] = getEventHandlerParams({ + nodeId, + dragItems, + nodeLookup, + dragging: false + }); + onDragStop == null ? void 0 : onDragStop(event.sourceEvent, dragItems, currentNode, currentNodes); + onNodeDragStop == null ? void 0 : onNodeDragStop(event.sourceEvent, currentNode, currentNodes); + if (!nodeId) { + onSelectionDragStop == null ? void 0 : onSelectionDragStop(event.sourceEvent, currentNodes); + } + } + } + }).filter((event) => { + const target = event.target; + const isDraggable = !event.button && (!noDragClassName || !hasSelector(target, `.${noDragClassName}`, domNode)) && (!handleSelector || hasSelector(target, handleSelector, domNode)); + return isDraggable; + }); + d3Selection.call(d3DragInstance); + } + function destroy() { + d3Selection == null ? void 0 : d3Selection.on(".drag", null); + } + return { + update, + destroy + }; +} +function getNodesWithinDistance(position, nodeLookup, distance2) { + const nodes = []; + const rect = { + x: position.x - distance2, + y: position.y - distance2, + width: distance2 * 2, + height: distance2 * 2 + }; + for (const node of nodeLookup.values()) { + if (getOverlappingArea(rect, nodeToRect(node)) > 0) { + nodes.push(node); + } + } + return nodes; +} +var ADDITIONAL_DISTANCE = 250; +function getClosestHandle(position, connectionRadius, nodeLookup, fromHandle) { + var _a, _b; + let closestHandles = []; + let minDistance = Infinity; + const closeNodes = getNodesWithinDistance(position, nodeLookup, connectionRadius + ADDITIONAL_DISTANCE); + for (const node of closeNodes) { + const allHandles = [...((_a = node.internals.handleBounds) == null ? void 0 : _a.source) ?? [], ...((_b = node.internals.handleBounds) == null ? void 0 : _b.target) ?? []]; + for (const handle of allHandles) { + if (fromHandle.nodeId === handle.nodeId && fromHandle.type === handle.type && fromHandle.id === handle.id) { + continue; + } + const { x, y } = getHandlePosition(node, handle, handle.position, true); + const distance2 = Math.sqrt(Math.pow(x - position.x, 2) + Math.pow(y - position.y, 2)); + if (distance2 > connectionRadius) { + continue; + } + if (distance2 < minDistance) { + closestHandles = [{ ...handle, x, y }]; + minDistance = distance2; + } else if (distance2 === minDistance) { + closestHandles.push({ ...handle, x, y }); + } + } + } + if (!closestHandles.length) { + return null; + } + if (closestHandles.length > 1) { + const oppositeHandleType = fromHandle.type === "source" ? "target" : "source"; + return closestHandles.find((handle) => handle.type === oppositeHandleType) ?? closestHandles[0]; + } + return closestHandles[0]; +} +function getHandle(nodeId, handleType, handleId, nodeLookup, connectionMode, withAbsolutePosition = false) { + var _a, _b, _c; + const node = nodeLookup.get(nodeId); + if (!node) { + return null; + } + const handles = connectionMode === "strict" ? (_a = node.internals.handleBounds) == null ? void 0 : _a[handleType] : [...((_b = node.internals.handleBounds) == null ? void 0 : _b.source) ?? [], ...((_c = node.internals.handleBounds) == null ? void 0 : _c.target) ?? []]; + const handle = (handleId ? handles == null ? void 0 : handles.find((h) => h.id === handleId) : handles == null ? void 0 : handles[0]) ?? null; + return handle && withAbsolutePosition ? { ...handle, ...getHandlePosition(node, handle, handle.position, true) } : handle; +} +function getHandleType(edgeUpdaterType, handleDomNode) { + if (edgeUpdaterType) { + return edgeUpdaterType; + } else if (handleDomNode == null ? void 0 : handleDomNode.classList.contains("target")) { + return "target"; + } else if (handleDomNode == null ? void 0 : handleDomNode.classList.contains("source")) { + return "source"; + } + return null; +} +function isConnectionValid(isInsideConnectionRadius, isHandleValid) { + let isValid = null; + if (isHandleValid) { + isValid = true; + } else if (isInsideConnectionRadius && !isHandleValid) { + isValid = false; + } + return isValid; +} +var alwaysValid = () => true; +function onPointerDown(event, { connectionMode, connectionRadius, handleId, nodeId, edgeUpdaterType, isTarget, domNode, nodeLookup, lib, autoPanOnConnect, flowId, panBy: panBy2, cancelConnection, onConnectStart, onConnect, onConnectEnd, isValidConnection = alwaysValid, onReconnectEnd, updateConnection, getTransform, getFromHandle, autoPanSpeed, dragThreshold = 1, handleDomNode }) { + const doc = getHostForElement(event.target); + let autoPanId = 0; + let closestHandle; + const { x, y } = getEventPosition(event); + const handleType = getHandleType(edgeUpdaterType, handleDomNode); + const containerBounds = domNode == null ? void 0 : domNode.getBoundingClientRect(); + let connectionStarted = false; + if (!containerBounds || !handleType) { + return; + } + const fromHandleInternal = getHandle(nodeId, handleType, handleId, nodeLookup, connectionMode); + if (!fromHandleInternal) { + return; + } + let position = getEventPosition(event, containerBounds); + let autoPanStarted = false; + let connection = null; + let isValid = false; + let resultHandleDomNode = null; + function autoPan() { + if (!autoPanOnConnect || !containerBounds) { + return; + } + const [x2, y2] = calcAutoPan(position, containerBounds, autoPanSpeed); + panBy2({ x: x2, y: y2 }); + autoPanId = requestAnimationFrame(autoPan); + } + const fromHandle = { + ...fromHandleInternal, + nodeId, + type: handleType, + position: fromHandleInternal.position + }; + const fromInternalNode = nodeLookup.get(nodeId); + const from = getHandlePosition(fromInternalNode, fromHandle, Position.Left, true); + let previousConnection = { + inProgress: true, + isValid: null, + from, + fromHandle, + fromPosition: fromHandle.position, + fromNode: fromInternalNode, + to: position, + toHandle: null, + toPosition: oppositePosition[fromHandle.position], + toNode: null, + pointer: position + }; + function startConnection() { + connectionStarted = true; + updateConnection(previousConnection); + onConnectStart == null ? void 0 : onConnectStart(event, { nodeId, handleId, handleType }); + } + if (dragThreshold === 0) { + startConnection(); + } + function onPointerMove(event2) { + if (!connectionStarted) { + const { x: evtX, y: evtY } = getEventPosition(event2); + const dx = evtX - x; + const dy = evtY - y; + const nextConnectionStarted = dx * dx + dy * dy > dragThreshold * dragThreshold; + if (!nextConnectionStarted) { + return; + } + startConnection(); + } + if (!getFromHandle() || !fromHandle) { + onPointerUp(event2); + return; + } + const transform2 = getTransform(); + position = getEventPosition(event2, containerBounds); + closestHandle = getClosestHandle(pointToRendererPoint(position, transform2, false, [1, 1]), connectionRadius, nodeLookup, fromHandle); + if (!autoPanStarted) { + autoPan(); + autoPanStarted = true; + } + const result = isValidHandle(event2, { + handle: closestHandle, + connectionMode, + fromNodeId: nodeId, + fromHandleId: handleId, + fromType: isTarget ? "target" : "source", + isValidConnection, + doc, + lib, + flowId, + nodeLookup + }); + resultHandleDomNode = result.handleDomNode; + connection = result.connection; + isValid = isConnectionValid(!!closestHandle, result.isValid); + const fromInternalNode2 = nodeLookup.get(nodeId); + const from2 = fromInternalNode2 ? getHandlePosition(fromInternalNode2, fromHandle, Position.Left, true) : previousConnection.from; + const newConnection = { + ...previousConnection, + from: from2, + isValid, + to: result.toHandle && isValid ? rendererPointToPoint({ x: result.toHandle.x, y: result.toHandle.y }, transform2) : position, + toHandle: result.toHandle, + toPosition: isValid && result.toHandle ? result.toHandle.position : oppositePosition[fromHandle.position], + toNode: result.toHandle ? nodeLookup.get(result.toHandle.nodeId) : null, + pointer: position + }; + updateConnection(newConnection); + previousConnection = newConnection; + } + function onPointerUp(event2) { + if ("touches" in event2 && event2.touches.length > 0) { + return; + } + if (connectionStarted) { + if ((closestHandle || resultHandleDomNode) && connection && isValid) { + onConnect == null ? void 0 : onConnect(connection); + } + const { inProgress, ...connectionState } = previousConnection; + const finalConnectionState = { + ...connectionState, + toPosition: previousConnection.toHandle ? previousConnection.toPosition : null + }; + onConnectEnd == null ? void 0 : onConnectEnd(event2, finalConnectionState); + if (edgeUpdaterType) { + onReconnectEnd == null ? void 0 : onReconnectEnd(event2, finalConnectionState); + } + } + cancelConnection(); + cancelAnimationFrame(autoPanId); + autoPanStarted = false; + isValid = false; + connection = null; + resultHandleDomNode = null; + doc.removeEventListener("mousemove", onPointerMove); + doc.removeEventListener("mouseup", onPointerUp); + doc.removeEventListener("touchmove", onPointerMove); + doc.removeEventListener("touchend", onPointerUp); + } + doc.addEventListener("mousemove", onPointerMove); + doc.addEventListener("mouseup", onPointerUp); + doc.addEventListener("touchmove", onPointerMove); + doc.addEventListener("touchend", onPointerUp); +} +function isValidHandle(event, { handle, connectionMode, fromNodeId, fromHandleId, fromType, doc, lib, flowId, isValidConnection = alwaysValid, nodeLookup }) { + const isTarget = fromType === "target"; + const handleDomNode = handle ? doc.querySelector(`.${lib}-flow__handle[data-id="${flowId}-${handle == null ? void 0 : handle.nodeId}-${handle == null ? void 0 : handle.id}-${handle == null ? void 0 : handle.type}"]`) : null; + const { x, y } = getEventPosition(event); + const handleBelow = doc.elementFromPoint(x, y); + const handleToCheck = (handleBelow == null ? void 0 : handleBelow.classList.contains(`${lib}-flow__handle`)) ? handleBelow : handleDomNode; + const result = { + handleDomNode: handleToCheck, + isValid: false, + connection: null, + toHandle: null + }; + if (handleToCheck) { + const handleType = getHandleType(void 0, handleToCheck); + const handleNodeId = handleToCheck.getAttribute("data-nodeid"); + const handleId = handleToCheck.getAttribute("data-handleid"); + const connectable = handleToCheck.classList.contains("connectable"); + const connectableEnd = handleToCheck.classList.contains("connectableend"); + if (!handleNodeId || !handleType) { + return result; + } + const connection = { + source: isTarget ? handleNodeId : fromNodeId, + sourceHandle: isTarget ? handleId : fromHandleId, + target: isTarget ? fromNodeId : handleNodeId, + targetHandle: isTarget ? fromHandleId : handleId + }; + result.connection = connection; + const isConnectable = connectable && connectableEnd; + const isValid = isConnectable && (connectionMode === ConnectionMode.Strict ? isTarget && handleType === "source" || !isTarget && handleType === "target" : handleNodeId !== fromNodeId || handleId !== fromHandleId); + result.isValid = isValid && isValidConnection(connection); + result.toHandle = getHandle(handleNodeId, handleType, handleId, nodeLookup, connectionMode, true); + } + return result; +} +var XYHandle = { + onPointerDown, + isValid: isValidHandle +}; +function XYMinimap({ domNode, panZoom, getTransform, getViewScale }) { + const selection2 = select_default2(domNode); + function update({ translateExtent, width, height, zoomStep = 1, pannable = true, zoomable = true, inversePan = false }) { + const zoomHandler = (event) => { + if (event.sourceEvent.type !== "wheel" || !panZoom) { + return; + } + const transform2 = getTransform(); + const factor = event.sourceEvent.ctrlKey && isMacOs() ? 10 : 1; + const pinchDelta = -event.sourceEvent.deltaY * (event.sourceEvent.deltaMode === 1 ? 0.05 : event.sourceEvent.deltaMode ? 1 : 2e-3) * zoomStep; + const nextZoom = transform2[2] * Math.pow(2, pinchDelta * factor); + panZoom.scaleTo(nextZoom); + }; + let panStart = [0, 0]; + const panStartHandler = (event) => { + if (event.sourceEvent.type === "mousedown" || event.sourceEvent.type === "touchstart") { + panStart = [ + event.sourceEvent.clientX ?? event.sourceEvent.touches[0].clientX, + event.sourceEvent.clientY ?? event.sourceEvent.touches[0].clientY + ]; + } + }; + const panHandler = (event) => { + const transform2 = getTransform(); + if (event.sourceEvent.type !== "mousemove" && event.sourceEvent.type !== "touchmove" || !panZoom) { + return; + } + const panCurrent = [ + event.sourceEvent.clientX ?? event.sourceEvent.touches[0].clientX, + event.sourceEvent.clientY ?? event.sourceEvent.touches[0].clientY + ]; + const panDelta = [panCurrent[0] - panStart[0], panCurrent[1] - panStart[1]]; + panStart = panCurrent; + const moveScale = getViewScale() * Math.max(transform2[2], Math.log(transform2[2])) * (inversePan ? -1 : 1); + const position = { + x: transform2[0] - panDelta[0] * moveScale, + y: transform2[1] - panDelta[1] * moveScale + }; + const extent = [ + [0, 0], + [width, height] + ]; + panZoom.setViewportConstrained({ + x: position.x, + y: position.y, + zoom: transform2[2] + }, extent, translateExtent); + }; + const zoomAndPanHandler = zoom_default2().on("start", panStartHandler).on("zoom", pannable ? panHandler : null).on("zoom.wheel", zoomable ? zoomHandler : null); + selection2.call(zoomAndPanHandler, {}); + } + function destroy() { + selection2.on("zoom", null); + } + return { + update, + destroy, + pointer: pointer_default + }; +} +var transformToViewport = (transform2) => ({ + x: transform2.x, + y: transform2.y, + zoom: transform2.k +}); +var viewportToTransform = ({ x, y, zoom }) => identity2.translate(x, y).scale(zoom); +var isWrappedWithClass = (event, className) => event.target.closest(`.${className}`); +var isRightClickPan = (panOnDrag, usedButton) => usedButton === 2 && Array.isArray(panOnDrag) && panOnDrag.includes(2); +var defaultEase = (t) => ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2; +var getD3Transition = (selection2, duration = 0, ease = defaultEase, onEnd = () => { +}) => { + const hasDuration = typeof duration === "number" && duration > 0; + if (!hasDuration) { + onEnd(); + } + return hasDuration ? selection2.transition().duration(duration).ease(ease).on("end", onEnd) : selection2; +}; +var wheelDelta = (event) => { + const factor = event.ctrlKey && isMacOs() ? 10 : 1; + return -event.deltaY * (event.deltaMode === 1 ? 0.05 : event.deltaMode ? 1 : 2e-3) * factor; +}; +function createPanOnScrollHandler({ zoomPanValues, noWheelClassName, d3Selection, d3Zoom, panOnScrollMode, panOnScrollSpeed, zoomOnPinch, onPanZoomStart, onPanZoom, onPanZoomEnd }) { + return (event) => { + if (isWrappedWithClass(event, noWheelClassName)) { + if (event.ctrlKey) { + event.preventDefault(); + } + return false; + } + event.preventDefault(); + event.stopImmediatePropagation(); + const currentZoom = d3Selection.property("__zoom").k || 1; + if (event.ctrlKey && zoomOnPinch) { + const point = pointer_default(event); + const pinchDelta = wheelDelta(event); + const zoom = currentZoom * Math.pow(2, pinchDelta); + d3Zoom.scaleTo(d3Selection, zoom, point, event); + return; + } + const deltaNormalize = event.deltaMode === 1 ? 20 : 1; + let deltaX = panOnScrollMode === PanOnScrollMode.Vertical ? 0 : event.deltaX * deltaNormalize; + let deltaY = panOnScrollMode === PanOnScrollMode.Horizontal ? 0 : event.deltaY * deltaNormalize; + if (!isMacOs() && event.shiftKey && panOnScrollMode !== PanOnScrollMode.Vertical) { + deltaX = event.deltaY * deltaNormalize; + deltaY = 0; + } + d3Zoom.translateBy( + d3Selection, + -(deltaX / currentZoom) * panOnScrollSpeed, + -(deltaY / currentZoom) * panOnScrollSpeed, + // @ts-ignore + { internal: true } + ); + const nextViewport = transformToViewport(d3Selection.property("__zoom")); + clearTimeout(zoomPanValues.panScrollTimeout); + if (!zoomPanValues.isPanScrolling) { + zoomPanValues.isPanScrolling = true; + onPanZoomStart == null ? void 0 : onPanZoomStart(event, nextViewport); + } else { + onPanZoom == null ? void 0 : onPanZoom(event, nextViewport); + zoomPanValues.panScrollTimeout = setTimeout(() => { + onPanZoomEnd == null ? void 0 : onPanZoomEnd(event, nextViewport); + zoomPanValues.isPanScrolling = false; + }, 150); + } + }; +} +function createZoomOnScrollHandler({ noWheelClassName, preventScrolling, d3ZoomHandler }) { + return function(event, d) { + const isWheel = event.type === "wheel"; + const preventZoom = !preventScrolling && isWheel && !event.ctrlKey; + const hasNoWheelClass = isWrappedWithClass(event, noWheelClassName); + if (event.ctrlKey && isWheel && hasNoWheelClass) { + event.preventDefault(); + } + if (preventZoom || hasNoWheelClass) { + return null; + } + event.preventDefault(); + d3ZoomHandler.call(this, event, d); + }; +} +function createPanZoomStartHandler({ zoomPanValues, onDraggingChange, onPanZoomStart }) { + return (event) => { + var _a, _b, _c; + if ((_a = event.sourceEvent) == null ? void 0 : _a.internal) { + return; + } + const viewport = transformToViewport(event.transform); + zoomPanValues.mouseButton = ((_b = event.sourceEvent) == null ? void 0 : _b.button) || 0; + zoomPanValues.isZoomingOrPanning = true; + zoomPanValues.prevViewport = viewport; + if (((_c = event.sourceEvent) == null ? void 0 : _c.type) === "mousedown") { + onDraggingChange(true); + } + if (onPanZoomStart) { + onPanZoomStart == null ? void 0 : onPanZoomStart(event.sourceEvent, viewport); + } + }; +} +function createPanZoomHandler({ zoomPanValues, panOnDrag, onPaneContextMenu, onTransformChange, onPanZoom }) { + return (event) => { + var _a, _b; + zoomPanValues.usedRightMouseButton = !!(onPaneContextMenu && isRightClickPan(panOnDrag, zoomPanValues.mouseButton ?? 0)); + if (!((_a = event.sourceEvent) == null ? void 0 : _a.sync)) { + onTransformChange([event.transform.x, event.transform.y, event.transform.k]); + } + if (onPanZoom && !((_b = event.sourceEvent) == null ? void 0 : _b.internal)) { + onPanZoom == null ? void 0 : onPanZoom(event.sourceEvent, transformToViewport(event.transform)); + } + }; +} +function createPanZoomEndHandler({ zoomPanValues, panOnDrag, panOnScroll, onDraggingChange, onPanZoomEnd, onPaneContextMenu }) { + return (event) => { + var _a; + if ((_a = event.sourceEvent) == null ? void 0 : _a.internal) { + return; + } + zoomPanValues.isZoomingOrPanning = false; + if (onPaneContextMenu && isRightClickPan(panOnDrag, zoomPanValues.mouseButton ?? 0) && !zoomPanValues.usedRightMouseButton && event.sourceEvent) { + onPaneContextMenu(event.sourceEvent); + } + zoomPanValues.usedRightMouseButton = false; + onDraggingChange(false); + if (onPanZoomEnd) { + const viewport = transformToViewport(event.transform); + zoomPanValues.prevViewport = viewport; + clearTimeout(zoomPanValues.timerId); + zoomPanValues.timerId = setTimeout( + () => { + onPanZoomEnd == null ? void 0 : onPanZoomEnd(event.sourceEvent, viewport); + }, + // we need a setTimeout for panOnScroll to supress multiple end events fired during scroll + panOnScroll ? 150 : 0 + ); + } + }; +} +function createFilter({ zoomActivationKeyPressed, zoomOnScroll, zoomOnPinch, panOnDrag, panOnScroll, zoomOnDoubleClick, userSelectionActive, noWheelClassName, noPanClassName, lib, connectionInProgress }) { + return (event) => { + var _a; + const zoomScroll = zoomActivationKeyPressed || zoomOnScroll; + const pinchZoom = zoomOnPinch && event.ctrlKey; + const isWheelEvent = event.type === "wheel"; + if (event.button === 1 && event.type === "mousedown" && (isWrappedWithClass(event, `${lib}-flow__node`) || isWrappedWithClass(event, `${lib}-flow__edge`))) { + return true; + } + if (!panOnDrag && !zoomScroll && !panOnScroll && !zoomOnDoubleClick && !zoomOnPinch) { + return false; + } + if (userSelectionActive) { + return false; + } + if (connectionInProgress && !isWheelEvent) { + return false; + } + if (isWrappedWithClass(event, noWheelClassName) && isWheelEvent) { + return false; + } + if (isWrappedWithClass(event, noPanClassName) && (!isWheelEvent || panOnScroll && isWheelEvent && !zoomActivationKeyPressed)) { + return false; + } + if (!zoomOnPinch && event.ctrlKey && isWheelEvent) { + return false; + } + if (!zoomOnPinch && event.type === "touchstart" && ((_a = event.touches) == null ? void 0 : _a.length) > 1) { + event.preventDefault(); + return false; + } + if (!zoomScroll && !panOnScroll && !pinchZoom && isWheelEvent) { + return false; + } + if (!panOnDrag && (event.type === "mousedown" || event.type === "touchstart")) { + return false; + } + if (Array.isArray(panOnDrag) && !panOnDrag.includes(event.button) && event.type === "mousedown") { + return false; + } + const buttonAllowed = Array.isArray(panOnDrag) && panOnDrag.includes(event.button) || !event.button || event.button <= 1; + return (!event.ctrlKey || isWheelEvent) && buttonAllowed; + }; +} +function XYPanZoom({ domNode, minZoom, maxZoom, translateExtent, viewport, onPanZoom, onPanZoomStart, onPanZoomEnd, onDraggingChange }) { + const zoomPanValues = { + isZoomingOrPanning: false, + usedRightMouseButton: false, + prevViewport: { x: 0, y: 0, zoom: 0 }, + mouseButton: 0, + timerId: void 0, + panScrollTimeout: void 0, + isPanScrolling: false + }; + const bbox = domNode.getBoundingClientRect(); + const d3ZoomInstance = zoom_default2().scaleExtent([minZoom, maxZoom]).translateExtent(translateExtent); + const d3Selection = select_default2(domNode).call(d3ZoomInstance); + setViewportConstrained({ + x: viewport.x, + y: viewport.y, + zoom: clamp(viewport.zoom, minZoom, maxZoom) + }, [ + [0, 0], + [bbox.width, bbox.height] + ], translateExtent); + const d3ZoomHandler = d3Selection.on("wheel.zoom"); + const d3DblClickZoomHandler = d3Selection.on("dblclick.zoom"); + d3ZoomInstance.wheelDelta(wheelDelta); + function setTransform(transform2, options) { + if (d3Selection) { + return new Promise((resolve) => { + d3ZoomInstance == null ? void 0 : d3ZoomInstance.interpolate((options == null ? void 0 : options.interpolate) === "linear" ? value_default : zoom_default).transform(getD3Transition(d3Selection, options == null ? void 0 : options.duration, options == null ? void 0 : options.ease, () => resolve(true)), transform2); + }); + } + return Promise.resolve(false); + } + function update({ noWheelClassName, noPanClassName, onPaneContextMenu, userSelectionActive, panOnScroll, panOnDrag, panOnScrollMode, panOnScrollSpeed, preventScrolling, zoomOnPinch, zoomOnScroll, zoomOnDoubleClick, zoomActivationKeyPressed, lib, onTransformChange, connectionInProgress, paneClickDistance, selectionOnDrag }) { + if (userSelectionActive && !zoomPanValues.isZoomingOrPanning) { + destroy(); + } + const isPanOnScroll = panOnScroll && !zoomActivationKeyPressed && !userSelectionActive; + d3ZoomInstance.clickDistance(selectionOnDrag ? Infinity : !isNumeric(paneClickDistance) || paneClickDistance < 0 ? 0 : paneClickDistance); + const wheelHandler = isPanOnScroll ? createPanOnScrollHandler({ + zoomPanValues, + noWheelClassName, + d3Selection, + d3Zoom: d3ZoomInstance, + panOnScrollMode, + panOnScrollSpeed, + zoomOnPinch, + onPanZoomStart, + onPanZoom, + onPanZoomEnd + }) : createZoomOnScrollHandler({ + noWheelClassName, + preventScrolling, + d3ZoomHandler + }); + d3Selection.on("wheel.zoom", wheelHandler, { passive: false }); + if (!userSelectionActive) { + const startHandler = createPanZoomStartHandler({ + zoomPanValues, + onDraggingChange, + onPanZoomStart + }); + d3ZoomInstance.on("start", startHandler); + const panZoomHandler = createPanZoomHandler({ + zoomPanValues, + panOnDrag, + onPaneContextMenu: !!onPaneContextMenu, + onPanZoom, + onTransformChange + }); + d3ZoomInstance.on("zoom", panZoomHandler); + const panZoomEndHandler = createPanZoomEndHandler({ + zoomPanValues, + panOnDrag, + panOnScroll, + onPaneContextMenu, + onPanZoomEnd, + onDraggingChange + }); + d3ZoomInstance.on("end", panZoomEndHandler); + } + const filter2 = createFilter({ + zoomActivationKeyPressed, + panOnDrag, + zoomOnScroll, + panOnScroll, + zoomOnDoubleClick, + zoomOnPinch, + userSelectionActive, + noPanClassName, + noWheelClassName, + lib, + connectionInProgress + }); + d3ZoomInstance.filter(filter2); + if (zoomOnDoubleClick) { + d3Selection.on("dblclick.zoom", d3DblClickZoomHandler); + } else { + d3Selection.on("dblclick.zoom", null); + } + } + function destroy() { + d3ZoomInstance.on("zoom", null); + } + async function setViewportConstrained(viewport2, extent, translateExtent2) { + const nextTransform = viewportToTransform(viewport2); + const contrainedTransform = d3ZoomInstance == null ? void 0 : d3ZoomInstance.constrain()(nextTransform, extent, translateExtent2); + if (contrainedTransform) { + await setTransform(contrainedTransform); + } + return new Promise((resolve) => resolve(contrainedTransform)); + } + async function setViewport(viewport2, options) { + const nextTransform = viewportToTransform(viewport2); + await setTransform(nextTransform, options); + return new Promise((resolve) => resolve(nextTransform)); + } + function syncViewport(viewport2) { + if (d3Selection) { + const nextTransform = viewportToTransform(viewport2); + const currentTransform = d3Selection.property("__zoom"); + if (currentTransform.k !== viewport2.zoom || currentTransform.x !== viewport2.x || currentTransform.y !== viewport2.y) { + d3ZoomInstance == null ? void 0 : d3ZoomInstance.transform(d3Selection, nextTransform, null, { sync: true }); + } + } + } + function getViewport() { + const transform2 = d3Selection ? transform(d3Selection.node()) : { x: 0, y: 0, k: 1 }; + return { x: transform2.x, y: transform2.y, zoom: transform2.k }; + } + function scaleTo(zoom, options) { + if (d3Selection) { + return new Promise((resolve) => { + d3ZoomInstance == null ? void 0 : d3ZoomInstance.interpolate((options == null ? void 0 : options.interpolate) === "linear" ? value_default : zoom_default).scaleTo(getD3Transition(d3Selection, options == null ? void 0 : options.duration, options == null ? void 0 : options.ease, () => resolve(true)), zoom); + }); + } + return Promise.resolve(false); + } + function scaleBy(factor, options) { + if (d3Selection) { + return new Promise((resolve) => { + d3ZoomInstance == null ? void 0 : d3ZoomInstance.interpolate((options == null ? void 0 : options.interpolate) === "linear" ? value_default : zoom_default).scaleBy(getD3Transition(d3Selection, options == null ? void 0 : options.duration, options == null ? void 0 : options.ease, () => resolve(true)), factor); + }); + } + return Promise.resolve(false); + } + function setScaleExtent(scaleExtent) { + d3ZoomInstance == null ? void 0 : d3ZoomInstance.scaleExtent(scaleExtent); + } + function setTranslateExtent(translateExtent2) { + d3ZoomInstance == null ? void 0 : d3ZoomInstance.translateExtent(translateExtent2); + } + function setClickDistance(distance2) { + const validDistance = !isNumeric(distance2) || distance2 < 0 ? 0 : distance2; + d3ZoomInstance == null ? void 0 : d3ZoomInstance.clickDistance(validDistance); + } + return { + update, + destroy, + setViewport, + setViewportConstrained, + getViewport, + scaleTo, + scaleBy, + setScaleExtent, + setTranslateExtent, + syncViewport, + setClickDistance + }; +} +var ResizeControlVariant; +(function(ResizeControlVariant2) { + ResizeControlVariant2["Line"] = "line"; + ResizeControlVariant2["Handle"] = "handle"; +})(ResizeControlVariant || (ResizeControlVariant = {})); +var XY_RESIZER_HANDLE_POSITIONS = ["top-left", "top-right", "bottom-left", "bottom-right"]; +var XY_RESIZER_LINE_POSITIONS = ["top", "right", "bottom", "left"]; +function getResizeDirection({ width, prevWidth, height, prevHeight, affectsX, affectsY }) { + const deltaWidth = width - prevWidth; + const deltaHeight = height - prevHeight; + const direction = [deltaWidth > 0 ? 1 : deltaWidth < 0 ? -1 : 0, deltaHeight > 0 ? 1 : deltaHeight < 0 ? -1 : 0]; + if (deltaWidth && affectsX) { + direction[0] = direction[0] * -1; + } + if (deltaHeight && affectsY) { + direction[1] = direction[1] * -1; + } + return direction; +} +function getControlDirection(controlPosition) { + const isHorizontal = controlPosition.includes("right") || controlPosition.includes("left"); + const isVertical = controlPosition.includes("bottom") || controlPosition.includes("top"); + const affectsX = controlPosition.includes("left"); + const affectsY = controlPosition.includes("top"); + return { + isHorizontal, + isVertical, + affectsX, + affectsY + }; +} +function getLowerExtentClamp(lowerExtent, lowerBound) { + return Math.max(0, lowerBound - lowerExtent); +} +function getUpperExtentClamp(upperExtent, upperBound) { + return Math.max(0, upperExtent - upperBound); +} +function getSizeClamp(size, minSize, maxSize) { + return Math.max(0, minSize - size, size - maxSize); +} +function xor(a, b) { + return a ? !b : b; +} +function getDimensionsAfterResize(startValues, controlDirection, pointerPosition, boundaries, keepAspectRatio, nodeOrigin, extent, childExtent) { + let { affectsX, affectsY } = controlDirection; + const { isHorizontal, isVertical } = controlDirection; + const isDiagonal = isHorizontal && isVertical; + const { xSnapped, ySnapped } = pointerPosition; + const { minWidth, maxWidth, minHeight, maxHeight } = boundaries; + const { x: startX, y: startY, width: startWidth, height: startHeight, aspectRatio } = startValues; + let distX = Math.floor(isHorizontal ? xSnapped - startValues.pointerX : 0); + let distY = Math.floor(isVertical ? ySnapped - startValues.pointerY : 0); + const newWidth = startWidth + (affectsX ? -distX : distX); + const newHeight = startHeight + (affectsY ? -distY : distY); + const originOffsetX = -nodeOrigin[0] * startWidth; + const originOffsetY = -nodeOrigin[1] * startHeight; + let clampX = getSizeClamp(newWidth, minWidth, maxWidth); + let clampY = getSizeClamp(newHeight, minHeight, maxHeight); + if (extent) { + let xExtentClamp = 0; + let yExtentClamp = 0; + if (affectsX && distX < 0) { + xExtentClamp = getLowerExtentClamp(startX + distX + originOffsetX, extent[0][0]); + } else if (!affectsX && distX > 0) { + xExtentClamp = getUpperExtentClamp(startX + newWidth + originOffsetX, extent[1][0]); + } + if (affectsY && distY < 0) { + yExtentClamp = getLowerExtentClamp(startY + distY + originOffsetY, extent[0][1]); + } else if (!affectsY && distY > 0) { + yExtentClamp = getUpperExtentClamp(startY + newHeight + originOffsetY, extent[1][1]); + } + clampX = Math.max(clampX, xExtentClamp); + clampY = Math.max(clampY, yExtentClamp); + } + if (childExtent) { + let xExtentClamp = 0; + let yExtentClamp = 0; + if (affectsX && distX > 0) { + xExtentClamp = getUpperExtentClamp(startX + distX, childExtent[0][0]); + } else if (!affectsX && distX < 0) { + xExtentClamp = getLowerExtentClamp(startX + newWidth, childExtent[1][0]); + } + if (affectsY && distY > 0) { + yExtentClamp = getUpperExtentClamp(startY + distY, childExtent[0][1]); + } else if (!affectsY && distY < 0) { + yExtentClamp = getLowerExtentClamp(startY + newHeight, childExtent[1][1]); + } + clampX = Math.max(clampX, xExtentClamp); + clampY = Math.max(clampY, yExtentClamp); + } + if (keepAspectRatio) { + if (isHorizontal) { + const aspectHeightClamp = getSizeClamp(newWidth / aspectRatio, minHeight, maxHeight) * aspectRatio; + clampX = Math.max(clampX, aspectHeightClamp); + if (extent) { + let aspectExtentClamp = 0; + if (!affectsX && !affectsY || affectsX && !affectsY && isDiagonal) { + aspectExtentClamp = getUpperExtentClamp(startY + originOffsetY + newWidth / aspectRatio, extent[1][1]) * aspectRatio; + } else { + aspectExtentClamp = getLowerExtentClamp(startY + originOffsetY + (affectsX ? distX : -distX) / aspectRatio, extent[0][1]) * aspectRatio; + } + clampX = Math.max(clampX, aspectExtentClamp); + } + if (childExtent) { + let aspectExtentClamp = 0; + if (!affectsX && !affectsY || affectsX && !affectsY && isDiagonal) { + aspectExtentClamp = getLowerExtentClamp(startY + newWidth / aspectRatio, childExtent[1][1]) * aspectRatio; + } else { + aspectExtentClamp = getUpperExtentClamp(startY + (affectsX ? distX : -distX) / aspectRatio, childExtent[0][1]) * aspectRatio; + } + clampX = Math.max(clampX, aspectExtentClamp); + } + } + if (isVertical) { + const aspectWidthClamp = getSizeClamp(newHeight * aspectRatio, minWidth, maxWidth) / aspectRatio; + clampY = Math.max(clampY, aspectWidthClamp); + if (extent) { + let aspectExtentClamp = 0; + if (!affectsX && !affectsY || affectsY && !affectsX && isDiagonal) { + aspectExtentClamp = getUpperExtentClamp(startX + newHeight * aspectRatio + originOffsetX, extent[1][0]) / aspectRatio; + } else { + aspectExtentClamp = getLowerExtentClamp(startX + (affectsY ? distY : -distY) * aspectRatio + originOffsetX, extent[0][0]) / aspectRatio; + } + clampY = Math.max(clampY, aspectExtentClamp); + } + if (childExtent) { + let aspectExtentClamp = 0; + if (!affectsX && !affectsY || affectsY && !affectsX && isDiagonal) { + aspectExtentClamp = getLowerExtentClamp(startX + newHeight * aspectRatio, childExtent[1][0]) / aspectRatio; + } else { + aspectExtentClamp = getUpperExtentClamp(startX + (affectsY ? distY : -distY) * aspectRatio, childExtent[0][0]) / aspectRatio; + } + clampY = Math.max(clampY, aspectExtentClamp); + } + } + } + distY = distY + (distY < 0 ? clampY : -clampY); + distX = distX + (distX < 0 ? clampX : -clampX); + if (keepAspectRatio) { + if (isDiagonal) { + if (newWidth > newHeight * aspectRatio) { + distY = (xor(affectsX, affectsY) ? -distX : distX) / aspectRatio; + } else { + distX = (xor(affectsX, affectsY) ? -distY : distY) * aspectRatio; + } + } else { + if (isHorizontal) { + distY = distX / aspectRatio; + affectsY = affectsX; + } else { + distX = distY * aspectRatio; + affectsX = affectsY; + } + } + } + const x = affectsX ? startX + distX : startX; + const y = affectsY ? startY + distY : startY; + return { + width: startWidth + (affectsX ? -distX : distX), + height: startHeight + (affectsY ? -distY : distY), + x: nodeOrigin[0] * distX * (!affectsX ? 1 : -1) + x, + y: nodeOrigin[1] * distY * (!affectsY ? 1 : -1) + y + }; +} +var initPrevValues = { width: 0, height: 0, x: 0, y: 0 }; +var initStartValues = { + ...initPrevValues, + pointerX: 0, + pointerY: 0, + aspectRatio: 1 +}; +function nodeToParentExtent(node) { + return [ + [0, 0], + [node.measured.width, node.measured.height] + ]; +} +function nodeToChildExtent(child, parent, nodeOrigin) { + const x = parent.position.x + child.position.x; + const y = parent.position.y + child.position.y; + const width = child.measured.width ?? 0; + const height = child.measured.height ?? 0; + const originOffsetX = nodeOrigin[0] * width; + const originOffsetY = nodeOrigin[1] * height; + return [ + [x - originOffsetX, y - originOffsetY], + [x + width - originOffsetX, y + height - originOffsetY] + ]; +} +function XYResizer({ domNode, nodeId, getStoreItems, onChange, onEnd }) { + const selection2 = select_default2(domNode); + let params = { + controlDirection: getControlDirection("bottom-right"), + boundaries: { + minWidth: 0, + minHeight: 0, + maxWidth: Number.MAX_VALUE, + maxHeight: Number.MAX_VALUE + }, + resizeDirection: void 0, + keepAspectRatio: false + }; + function update({ controlPosition, boundaries, keepAspectRatio, resizeDirection, onResizeStart, onResize, onResizeEnd, shouldResize }) { + let prevValues = { ...initPrevValues }; + let startValues = { ...initStartValues }; + params = { + boundaries, + resizeDirection, + keepAspectRatio, + controlDirection: getControlDirection(controlPosition) + }; + let node = void 0; + let containerBounds = null; + let childNodes = []; + let parentNode = void 0; + let parentExtent = void 0; + let childExtent = void 0; + let resizeDetected = false; + const dragHandler = drag_default().on("start", (event) => { + const { nodeLookup, transform: transform2, snapGrid, snapToGrid, nodeOrigin, paneDomNode } = getStoreItems(); + node = nodeLookup.get(nodeId); + if (!node) { + return; + } + containerBounds = (paneDomNode == null ? void 0 : paneDomNode.getBoundingClientRect()) ?? null; + const { xSnapped, ySnapped } = getPointerPosition(event.sourceEvent, { + transform: transform2, + snapGrid, + snapToGrid, + containerBounds + }); + prevValues = { + width: node.measured.width ?? 0, + height: node.measured.height ?? 0, + x: node.position.x ?? 0, + y: node.position.y ?? 0 + }; + startValues = { + ...prevValues, + pointerX: xSnapped, + pointerY: ySnapped, + aspectRatio: prevValues.width / prevValues.height + }; + parentNode = void 0; + if (node.parentId && (node.extent === "parent" || node.expandParent)) { + parentNode = nodeLookup.get(node.parentId); + parentExtent = parentNode && node.extent === "parent" ? nodeToParentExtent(parentNode) : void 0; + } + childNodes = []; + childExtent = void 0; + for (const [childId, child] of nodeLookup) { + if (child.parentId === nodeId) { + childNodes.push({ + id: childId, + position: { ...child.position }, + extent: child.extent + }); + if (child.extent === "parent" || child.expandParent) { + const extent = nodeToChildExtent(child, node, child.origin ?? nodeOrigin); + if (childExtent) { + childExtent = [ + [Math.min(extent[0][0], childExtent[0][0]), Math.min(extent[0][1], childExtent[0][1])], + [Math.max(extent[1][0], childExtent[1][0]), Math.max(extent[1][1], childExtent[1][1])] + ]; + } else { + childExtent = extent; + } + } + } + } + onResizeStart == null ? void 0 : onResizeStart(event, { ...prevValues }); + }).on("drag", (event) => { + const { transform: transform2, snapGrid, snapToGrid, nodeOrigin: storeNodeOrigin } = getStoreItems(); + const pointerPosition = getPointerPosition(event.sourceEvent, { + transform: transform2, + snapGrid, + snapToGrid, + containerBounds + }); + const childChanges = []; + if (!node) { + return; + } + const { x: prevX, y: prevY, width: prevWidth, height: prevHeight } = prevValues; + const change = {}; + const nodeOrigin = node.origin ?? storeNodeOrigin; + const { width, height, x, y } = getDimensionsAfterResize(startValues, params.controlDirection, pointerPosition, params.boundaries, params.keepAspectRatio, nodeOrigin, parentExtent, childExtent); + const isWidthChange = width !== prevWidth; + const isHeightChange = height !== prevHeight; + const isXPosChange = x !== prevX && isWidthChange; + const isYPosChange = y !== prevY && isHeightChange; + if (!isXPosChange && !isYPosChange && !isWidthChange && !isHeightChange) { + return; + } + if (isXPosChange || isYPosChange || nodeOrigin[0] === 1 || nodeOrigin[1] === 1) { + change.x = isXPosChange ? x : prevValues.x; + change.y = isYPosChange ? y : prevValues.y; + prevValues.x = change.x; + prevValues.y = change.y; + if (childNodes.length > 0) { + const xChange = x - prevX; + const yChange = y - prevY; + for (const childNode of childNodes) { + childNode.position = { + x: childNode.position.x - xChange + nodeOrigin[0] * (width - prevWidth), + y: childNode.position.y - yChange + nodeOrigin[1] * (height - prevHeight) + }; + childChanges.push(childNode); + } + } + } + if (isWidthChange || isHeightChange) { + change.width = isWidthChange && (!params.resizeDirection || params.resizeDirection === "horizontal") ? width : prevValues.width; + change.height = isHeightChange && (!params.resizeDirection || params.resizeDirection === "vertical") ? height : prevValues.height; + prevValues.width = change.width; + prevValues.height = change.height; + } + if (parentNode && node.expandParent) { + const xLimit = nodeOrigin[0] * (change.width ?? 0); + if (change.x && change.x < xLimit) { + prevValues.x = xLimit; + startValues.x = startValues.x - (change.x - xLimit); + } + const yLimit = nodeOrigin[1] * (change.height ?? 0); + if (change.y && change.y < yLimit) { + prevValues.y = yLimit; + startValues.y = startValues.y - (change.y - yLimit); + } + } + const direction = getResizeDirection({ + width: prevValues.width, + prevWidth, + height: prevValues.height, + prevHeight, + affectsX: params.controlDirection.affectsX, + affectsY: params.controlDirection.affectsY + }); + const nextValues = { ...prevValues, direction }; + const callResize = shouldResize == null ? void 0 : shouldResize(event, nextValues); + if (callResize === false) { + return; + } + resizeDetected = true; + onResize == null ? void 0 : onResize(event, nextValues); + onChange(change, childChanges); + }).on("end", (event) => { + if (!resizeDetected) { + return; + } + onResizeEnd == null ? void 0 : onResizeEnd(event, { ...prevValues }); + onEnd == null ? void 0 : onEnd({ ...prevValues }); + resizeDetected = false; + }); + selection2.call(dragHandler); + } + function destroy() { + selection2.on(".drag", null); + } + return { + update, + destroy + }; +} + +// node_modules/zustand/esm/traditional.mjs +var import_react = __toESM(require_react(), 1); +var import_with_selector = __toESM(require_with_selector(), 1); + +// node_modules/zustand/esm/vanilla.mjs +var createStoreImpl = (createState) => { + let state; + const listeners = /* @__PURE__ */ new Set(); + const setState = (partial, replace) => { + const nextState = typeof partial === "function" ? partial(state) : partial; + if (!Object.is(nextState, state)) { + const previousState = state; + state = (replace != null ? replace : typeof nextState !== "object" || nextState === null) ? nextState : Object.assign({}, state, nextState); + listeners.forEach((listener) => listener(state, previousState)); + } + }; + const getState = () => state; + const getInitialState2 = () => initialState; + const subscribe = (listener) => { + listeners.add(listener); + return () => listeners.delete(listener); + }; + const destroy = () => { + if ((import.meta.env ? import.meta.env.MODE : void 0) !== "production") { + console.warn( + "[DEPRECATED] The `destroy` method will be unsupported in a future version. Instead use unsubscribe function returned by subscribe. Everything will be garbage-collected if store is garbage-collected." + ); + } + listeners.clear(); + }; + const api = { setState, getState, getInitialState: getInitialState2, subscribe, destroy }; + const initialState = state = createState(setState, getState, api); + return api; +}; +var createStore = (createState) => createState ? createStoreImpl(createState) : createStoreImpl; + +// node_modules/zustand/esm/traditional.mjs +var { useDebugValue } = import_react.default; +var { useSyncExternalStoreWithSelector } = import_with_selector.default; +var identity3 = (arg) => arg; +function useStoreWithEqualityFn(api, selector2 = identity3, equalityFn) { + const slice = useSyncExternalStoreWithSelector( + api.subscribe, + api.getState, + api.getServerState || api.getInitialState, + selector2, + equalityFn + ); + useDebugValue(slice); + return slice; +} +var createWithEqualityFnImpl = (createState, defaultEqualityFn) => { + const api = createStore(createState); + const useBoundStoreWithEqualityFn = (selector2, equalityFn = defaultEqualityFn) => useStoreWithEqualityFn(api, selector2, equalityFn); + Object.assign(useBoundStoreWithEqualityFn, api); + return useBoundStoreWithEqualityFn; +}; +var createWithEqualityFn = (createState, defaultEqualityFn) => createState ? createWithEqualityFnImpl(createState, defaultEqualityFn) : createWithEqualityFnImpl; + +// node_modules/zustand/esm/shallow.mjs +function shallow$1(objA, objB) { + if (Object.is(objA, objB)) { + return true; + } + if (typeof objA !== "object" || objA === null || typeof objB !== "object" || objB === null) { + return false; + } + if (objA instanceof Map && objB instanceof Map) { + if (objA.size !== objB.size) return false; + for (const [key, value] of objA) { + if (!Object.is(value, objB.get(key))) { + return false; + } + } + return true; + } + if (objA instanceof Set && objB instanceof Set) { + if (objA.size !== objB.size) return false; + for (const value of objA) { + if (!objB.has(value)) { + return false; + } + } + return true; + } + const keysA = Object.keys(objA); + if (keysA.length !== Object.keys(objB).length) { + return false; + } + for (const keyA of keysA) { + if (!Object.prototype.hasOwnProperty.call(objB, keyA) || !Object.is(objA[keyA], objB[keyA])) { + return false; + } + } + return true; +} + +// node_modules/@xyflow/react/dist/esm/index.js +var import_react_dom = __toESM(require_react_dom()); +var StoreContext = (0, import_react2.createContext)(null); +var Provider$1 = StoreContext.Provider; +var zustandErrorMessage = errorMessages["error001"](); +function useStore(selector2, equalityFn) { + const store = (0, import_react2.useContext)(StoreContext); + if (store === null) { + throw new Error(zustandErrorMessage); + } + return useStoreWithEqualityFn(store, selector2, equalityFn); +} +function useStoreApi() { + const store = (0, import_react2.useContext)(StoreContext); + if (store === null) { + throw new Error(zustandErrorMessage); + } + return (0, import_react2.useMemo)(() => ({ + getState: store.getState, + setState: store.setState, + subscribe: store.subscribe + }), [store]); +} +var style = { display: "none" }; +var ariaLiveStyle = { + position: "absolute", + width: 1, + height: 1, + margin: -1, + border: 0, + padding: 0, + overflow: "hidden", + clip: "rect(0px, 0px, 0px, 0px)", + clipPath: "inset(100%)" +}; +var ARIA_NODE_DESC_KEY = "react-flow__node-desc"; +var ARIA_EDGE_DESC_KEY = "react-flow__edge-desc"; +var ARIA_LIVE_MESSAGE = "react-flow__aria-live"; +var ariaLiveSelector = (s) => s.ariaLiveMessage; +var ariaLabelConfigSelector = (s) => s.ariaLabelConfig; +function AriaLiveMessage({ rfId }) { + const ariaLiveMessage = useStore(ariaLiveSelector); + return (0, import_jsx_runtime.jsx)("div", { id: `${ARIA_LIVE_MESSAGE}-${rfId}`, "aria-live": "assertive", "aria-atomic": "true", style: ariaLiveStyle, children: ariaLiveMessage }); +} +function A11yDescriptions({ rfId, disableKeyboardA11y }) { + const ariaLabelConfig = useStore(ariaLabelConfigSelector); + return (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [(0, import_jsx_runtime.jsx)("div", { id: `${ARIA_NODE_DESC_KEY}-${rfId}`, style, children: disableKeyboardA11y ? ariaLabelConfig["node.a11yDescription.default"] : ariaLabelConfig["node.a11yDescription.keyboardDisabled"] }), (0, import_jsx_runtime.jsx)("div", { id: `${ARIA_EDGE_DESC_KEY}-${rfId}`, style, children: ariaLabelConfig["edge.a11yDescription.default"] }), !disableKeyboardA11y && (0, import_jsx_runtime.jsx)(AriaLiveMessage, { rfId })] }); +} +var Panel = (0, import_react2.forwardRef)(({ position = "top-left", children: children2, className, style: style2, ...rest }, ref) => { + const positionClasses = `${position}`.split("-"); + return (0, import_jsx_runtime.jsx)("div", { className: cc(["react-flow__panel", className, ...positionClasses]), style: style2, ref, ...rest, children: children2 }); +}); +Panel.displayName = "Panel"; +function Attribution({ proOptions, position = "bottom-right" }) { + if (proOptions == null ? void 0 : proOptions.hideAttribution) { + return null; + } + return (0, import_jsx_runtime.jsx)(Panel, { position, className: "react-flow__attribution", "data-message": "Please only hide this attribution when you are subscribed to React Flow Pro: https://pro.reactflow.dev", children: (0, import_jsx_runtime.jsx)("a", { href: "https://reactflow.dev", target: "_blank", rel: "noopener noreferrer", "aria-label": "React Flow attribution", children: "React Flow" }) }); +} +var selector$m = (s) => { + const selectedNodes = []; + const selectedEdges = []; + for (const [, node] of s.nodeLookup) { + if (node.selected) { + selectedNodes.push(node.internals.userNode); + } + } + for (const [, edge] of s.edgeLookup) { + if (edge.selected) { + selectedEdges.push(edge); + } + } + return { selectedNodes, selectedEdges }; +}; +var selectId = (obj) => obj.id; +function areEqual(a, b) { + return shallow$1(a.selectedNodes.map(selectId), b.selectedNodes.map(selectId)) && shallow$1(a.selectedEdges.map(selectId), b.selectedEdges.map(selectId)); +} +function SelectionListenerInner({ onSelectionChange }) { + const store = useStoreApi(); + const { selectedNodes, selectedEdges } = useStore(selector$m, areEqual); + (0, import_react2.useEffect)(() => { + const params = { nodes: selectedNodes, edges: selectedEdges }; + onSelectionChange == null ? void 0 : onSelectionChange(params); + store.getState().onSelectionChangeHandlers.forEach((fn) => fn(params)); + }, [selectedNodes, selectedEdges, onSelectionChange]); + return null; +} +var changeSelector = (s) => !!s.onSelectionChangeHandlers; +function SelectionListener({ onSelectionChange }) { + const storeHasSelectionChangeHandlers = useStore(changeSelector); + if (onSelectionChange || storeHasSelectionChangeHandlers) { + return (0, import_jsx_runtime.jsx)(SelectionListenerInner, { onSelectionChange }); + } + return null; +} +var defaultNodeOrigin = [0, 0]; +var defaultViewport = { x: 0, y: 0, zoom: 1 }; +var reactFlowFieldsToTrack = [ + "nodes", + "edges", + "defaultNodes", + "defaultEdges", + "onConnect", + "onConnectStart", + "onConnectEnd", + "onClickConnectStart", + "onClickConnectEnd", + "nodesDraggable", + "autoPanOnNodeFocus", + "nodesConnectable", + "nodesFocusable", + "edgesFocusable", + "edgesReconnectable", + "elevateNodesOnSelect", + "elevateEdgesOnSelect", + "minZoom", + "maxZoom", + "nodeExtent", + "onNodesChange", + "onEdgesChange", + "elementsSelectable", + "connectionMode", + "snapGrid", + "snapToGrid", + "translateExtent", + "connectOnClick", + "defaultEdgeOptions", + "fitView", + "fitViewOptions", + "onNodesDelete", + "onEdgesDelete", + "onDelete", + "onNodeDrag", + "onNodeDragStart", + "onNodeDragStop", + "onSelectionDrag", + "onSelectionDragStart", + "onSelectionDragStop", + "onMoveStart", + "onMove", + "onMoveEnd", + "noPanClassName", + "nodeOrigin", + "autoPanOnConnect", + "autoPanOnNodeDrag", + "onError", + "connectionRadius", + "isValidConnection", + "selectNodesOnDrag", + "nodeDragThreshold", + "connectionDragThreshold", + "onBeforeDelete", + "debug", + "autoPanSpeed", + "ariaLabelConfig", + "zIndexMode" +]; +var fieldsToTrack = [...reactFlowFieldsToTrack, "rfId"]; +var selector$l = (s) => ({ + setNodes: s.setNodes, + setEdges: s.setEdges, + setMinZoom: s.setMinZoom, + setMaxZoom: s.setMaxZoom, + setTranslateExtent: s.setTranslateExtent, + setNodeExtent: s.setNodeExtent, + reset: s.reset, + setDefaultNodesAndEdges: s.setDefaultNodesAndEdges +}); +var initPrevValues2 = { + /* + * these are values that are also passed directly to other components + * than the StoreUpdater. We can reduce the number of setStore calls + * by setting the same values here as prev fields. + */ + translateExtent: infiniteExtent, + nodeOrigin: defaultNodeOrigin, + minZoom: 0.5, + maxZoom: 2, + elementsSelectable: true, + noPanClassName: "nopan", + rfId: "1" +}; +function StoreUpdater(props) { + const { setNodes, setEdges, setMinZoom, setMaxZoom, setTranslateExtent, setNodeExtent, reset, setDefaultNodesAndEdges } = useStore(selector$l, shallow$1); + const store = useStoreApi(); + (0, import_react2.useEffect)(() => { + setDefaultNodesAndEdges(props.defaultNodes, props.defaultEdges); + return () => { + previousFields.current = initPrevValues2; + reset(); + }; + }, []); + const previousFields = (0, import_react2.useRef)(initPrevValues2); + (0, import_react2.useEffect)( + () => { + for (const fieldName of fieldsToTrack) { + const fieldValue = props[fieldName]; + const previousFieldValue = previousFields.current[fieldName]; + if (fieldValue === previousFieldValue) + continue; + if (typeof props[fieldName] === "undefined") + continue; + if (fieldName === "nodes") + setNodes(fieldValue); + else if (fieldName === "edges") + setEdges(fieldValue); + else if (fieldName === "minZoom") + setMinZoom(fieldValue); + else if (fieldName === "maxZoom") + setMaxZoom(fieldValue); + else if (fieldName === "translateExtent") + setTranslateExtent(fieldValue); + else if (fieldName === "nodeExtent") + setNodeExtent(fieldValue); + else if (fieldName === "ariaLabelConfig") + store.setState({ ariaLabelConfig: mergeAriaLabelConfig(fieldValue) }); + else if (fieldName === "fitView") + store.setState({ fitViewQueued: fieldValue }); + else if (fieldName === "fitViewOptions") + store.setState({ fitViewOptions: fieldValue }); + else + store.setState({ [fieldName]: fieldValue }); + } + previousFields.current = props; + }, + // Only re-run the effect if one of the fields we track changes + fieldsToTrack.map((fieldName) => props[fieldName]) + ); + return null; +} +function getMediaQuery() { + if (typeof window === "undefined" || !window.matchMedia) { + return null; + } + return window.matchMedia("(prefers-color-scheme: dark)"); +} +function useColorModeClass(colorMode) { + var _a; + const [colorModeClass, setColorModeClass] = (0, import_react2.useState)(colorMode === "system" ? null : colorMode); + (0, import_react2.useEffect)(() => { + if (colorMode !== "system") { + setColorModeClass(colorMode); + return; + } + const mediaQuery = getMediaQuery(); + const updateColorModeClass = () => setColorModeClass((mediaQuery == null ? void 0 : mediaQuery.matches) ? "dark" : "light"); + updateColorModeClass(); + mediaQuery == null ? void 0 : mediaQuery.addEventListener("change", updateColorModeClass); + return () => { + mediaQuery == null ? void 0 : mediaQuery.removeEventListener("change", updateColorModeClass); + }; + }, [colorMode]); + return colorModeClass !== null ? colorModeClass : ((_a = getMediaQuery()) == null ? void 0 : _a.matches) ? "dark" : "light"; +} +var defaultDoc = typeof document !== "undefined" ? document : null; +function useKeyPress(keyCode = null, options = { target: defaultDoc, actInsideInputWithModifier: true }) { + const [keyPressed, setKeyPressed] = (0, import_react2.useState)(false); + const modifierPressed = (0, import_react2.useRef)(false); + const pressedKeys = (0, import_react2.useRef)(/* @__PURE__ */ new Set([])); + const [keyCodes, keysToWatch] = (0, import_react2.useMemo)(() => { + if (keyCode !== null) { + const keyCodeArr = Array.isArray(keyCode) ? keyCode : [keyCode]; + const keys = keyCodeArr.filter((kc) => typeof kc === "string").map((kc) => kc.replace("+", "\n").replace("\n\n", "\n+").split("\n")); + const keysFlat = keys.reduce((res, item) => res.concat(...item), []); + return [keys, keysFlat]; + } + return [[], []]; + }, [keyCode]); + (0, import_react2.useEffect)(() => { + const target = (options == null ? void 0 : options.target) ?? defaultDoc; + const actInsideInputWithModifier = (options == null ? void 0 : options.actInsideInputWithModifier) ?? true; + if (keyCode !== null) { + const downHandler = (event) => { + var _a, _b; + modifierPressed.current = event.ctrlKey || event.metaKey || event.shiftKey || event.altKey; + const preventAction = (!modifierPressed.current || modifierPressed.current && !actInsideInputWithModifier) && isInputDOMNode(event); + if (preventAction) { + return false; + } + const keyOrCode = useKeyOrCode(event.code, keysToWatch); + pressedKeys.current.add(event[keyOrCode]); + if (isMatchingKey(keyCodes, pressedKeys.current, false)) { + const target2 = ((_b = (_a = event.composedPath) == null ? void 0 : _a.call(event)) == null ? void 0 : _b[0]) || event.target; + const isInteractiveElement = (target2 == null ? void 0 : target2.nodeName) === "BUTTON" || (target2 == null ? void 0 : target2.nodeName) === "A"; + if (options.preventDefault !== false && (modifierPressed.current || !isInteractiveElement)) { + event.preventDefault(); + } + setKeyPressed(true); + } + }; + const upHandler = (event) => { + const keyOrCode = useKeyOrCode(event.code, keysToWatch); + if (isMatchingKey(keyCodes, pressedKeys.current, true)) { + setKeyPressed(false); + pressedKeys.current.clear(); + } else { + pressedKeys.current.delete(event[keyOrCode]); + } + if (event.key === "Meta") { + pressedKeys.current.clear(); + } + modifierPressed.current = false; + }; + const resetHandler = () => { + pressedKeys.current.clear(); + setKeyPressed(false); + }; + target == null ? void 0 : target.addEventListener("keydown", downHandler); + target == null ? void 0 : target.addEventListener("keyup", upHandler); + window.addEventListener("blur", resetHandler); + window.addEventListener("contextmenu", resetHandler); + return () => { + target == null ? void 0 : target.removeEventListener("keydown", downHandler); + target == null ? void 0 : target.removeEventListener("keyup", upHandler); + window.removeEventListener("blur", resetHandler); + window.removeEventListener("contextmenu", resetHandler); + }; + } + }, [keyCode, setKeyPressed]); + return keyPressed; +} +function isMatchingKey(keyCodes, pressedKeys, isUp) { + return keyCodes.filter((keys) => isUp || keys.length === pressedKeys.size).some((keys) => keys.every((k) => pressedKeys.has(k))); +} +function useKeyOrCode(eventCode, keysToWatch) { + return keysToWatch.includes(eventCode) ? "code" : "key"; +} +var useViewportHelper = () => { + const store = useStoreApi(); + return (0, import_react2.useMemo)(() => { + return { + zoomIn: (options) => { + const { panZoom } = store.getState(); + return panZoom ? panZoom.scaleBy(1.2, { duration: options == null ? void 0 : options.duration }) : Promise.resolve(false); + }, + zoomOut: (options) => { + const { panZoom } = store.getState(); + return panZoom ? panZoom.scaleBy(1 / 1.2, { duration: options == null ? void 0 : options.duration }) : Promise.resolve(false); + }, + zoomTo: (zoomLevel, options) => { + const { panZoom } = store.getState(); + return panZoom ? panZoom.scaleTo(zoomLevel, { duration: options == null ? void 0 : options.duration }) : Promise.resolve(false); + }, + getZoom: () => store.getState().transform[2], + setViewport: async (viewport, options) => { + const { transform: [tX, tY, tZoom], panZoom } = store.getState(); + if (!panZoom) { + return Promise.resolve(false); + } + await panZoom.setViewport({ + x: viewport.x ?? tX, + y: viewport.y ?? tY, + zoom: viewport.zoom ?? tZoom + }, options); + return Promise.resolve(true); + }, + getViewport: () => { + const [x, y, zoom] = store.getState().transform; + return { x, y, zoom }; + }, + setCenter: async (x, y, options) => { + return store.getState().setCenter(x, y, options); + }, + fitBounds: async (bounds, options) => { + const { width, height, minZoom, maxZoom, panZoom } = store.getState(); + const viewport = getViewportForBounds(bounds, width, height, minZoom, maxZoom, (options == null ? void 0 : options.padding) ?? 0.1); + if (!panZoom) { + return Promise.resolve(false); + } + await panZoom.setViewport(viewport, { + duration: options == null ? void 0 : options.duration, + ease: options == null ? void 0 : options.ease, + interpolate: options == null ? void 0 : options.interpolate + }); + return Promise.resolve(true); + }, + screenToFlowPosition: (clientPosition, options = {}) => { + const { transform: transform2, snapGrid, snapToGrid, domNode } = store.getState(); + if (!domNode) { + return clientPosition; + } + const { x: domX, y: domY } = domNode.getBoundingClientRect(); + const correctedPosition = { + x: clientPosition.x - domX, + y: clientPosition.y - domY + }; + const _snapGrid = options.snapGrid ?? snapGrid; + const _snapToGrid = options.snapToGrid ?? snapToGrid; + return pointToRendererPoint(correctedPosition, transform2, _snapToGrid, _snapGrid); + }, + flowToScreenPosition: (flowPosition) => { + const { transform: transform2, domNode } = store.getState(); + if (!domNode) { + return flowPosition; + } + const { x: domX, y: domY } = domNode.getBoundingClientRect(); + const rendererPosition = rendererPointToPoint(flowPosition, transform2); + return { + x: rendererPosition.x + domX, + y: rendererPosition.y + domY + }; + } + }; + }, []); +}; +function applyChanges(changes, elements) { + const updatedElements = []; + const changesMap = /* @__PURE__ */ new Map(); + const addItemChanges = []; + for (const change of changes) { + if (change.type === "add") { + addItemChanges.push(change); + continue; + } else if (change.type === "remove" || change.type === "replace") { + changesMap.set(change.id, [change]); + } else { + const elementChanges = changesMap.get(change.id); + if (elementChanges) { + elementChanges.push(change); + } else { + changesMap.set(change.id, [change]); + } + } + } + for (const element of elements) { + const changes2 = changesMap.get(element.id); + if (!changes2) { + updatedElements.push(element); + continue; + } + if (changes2[0].type === "remove") { + continue; + } + if (changes2[0].type === "replace") { + updatedElements.push({ ...changes2[0].item }); + continue; + } + const updatedElement = { ...element }; + for (const change of changes2) { + applyChange(change, updatedElement); + } + updatedElements.push(updatedElement); + } + if (addItemChanges.length) { + addItemChanges.forEach((change) => { + if (change.index !== void 0) { + updatedElements.splice(change.index, 0, { ...change.item }); + } else { + updatedElements.push({ ...change.item }); + } + }); + } + return updatedElements; +} +function applyChange(change, element) { + switch (change.type) { + case "select": { + element.selected = change.selected; + break; + } + case "position": { + if (typeof change.position !== "undefined") { + element.position = change.position; + } + if (typeof change.dragging !== "undefined") { + element.dragging = change.dragging; + } + break; + } + case "dimensions": { + if (typeof change.dimensions !== "undefined") { + element.measured = { + ...change.dimensions + }; + if (change.setAttributes) { + if (change.setAttributes === true || change.setAttributes === "width") { + element.width = change.dimensions.width; + } + if (change.setAttributes === true || change.setAttributes === "height") { + element.height = change.dimensions.height; + } + } + } + if (typeof change.resizing === "boolean") { + element.resizing = change.resizing; + } + break; + } + } +} +function applyNodeChanges(changes, nodes) { + return applyChanges(changes, nodes); +} +function applyEdgeChanges(changes, edges) { + return applyChanges(changes, edges); +} +function createSelectionChange(id2, selected2) { + return { + id: id2, + type: "select", + selected: selected2 + }; +} +function getSelectionChanges(items, selectedIds = /* @__PURE__ */ new Set(), mutateItem = false) { + const changes = []; + for (const [id2, item] of items) { + const willBeSelected = selectedIds.has(id2); + if (!(item.selected === void 0 && !willBeSelected) && item.selected !== willBeSelected) { + if (mutateItem) { + item.selected = willBeSelected; + } + changes.push(createSelectionChange(item.id, willBeSelected)); + } + } + return changes; +} +function getElementsDiffChanges({ items = [], lookup }) { + var _a; + const changes = []; + const itemsLookup = new Map(items.map((item) => [item.id, item])); + for (const [index2, item] of items.entries()) { + const lookupItem = lookup.get(item.id); + const storeItem = ((_a = lookupItem == null ? void 0 : lookupItem.internals) == null ? void 0 : _a.userNode) ?? lookupItem; + if (storeItem !== void 0 && storeItem !== item) { + changes.push({ id: item.id, item, type: "replace" }); + } + if (storeItem === void 0) { + changes.push({ item, type: "add", index: index2 }); + } + } + for (const [id2] of lookup) { + const nextNode = itemsLookup.get(id2); + if (nextNode === void 0) { + changes.push({ id: id2, type: "remove" }); + } + } + return changes; +} +function elementToRemoveChange(item) { + return { + id: item.id, + type: "remove" + }; +} +var isNode = (element) => isNodeBase(element); +var isEdge = (element) => isEdgeBase(element); +function fixedForwardRef(render) { + return (0, import_react2.forwardRef)(render); +} +var useIsomorphicLayoutEffect = typeof window !== "undefined" ? import_react2.useLayoutEffect : import_react2.useEffect; +function useQueue(runQueue) { + const [serial, setSerial] = (0, import_react2.useState)(BigInt(0)); + const [queue] = (0, import_react2.useState)(() => createQueue(() => setSerial((n) => n + BigInt(1)))); + useIsomorphicLayoutEffect(() => { + const queueItems = queue.get(); + if (queueItems.length) { + runQueue(queueItems); + queue.reset(); + } + }, [serial]); + return queue; +} +function createQueue(cb) { + let queue = []; + return { + get: () => queue, + reset: () => { + queue = []; + }, + push: (item) => { + queue.push(item); + cb(); + } + }; +} +var BatchContext = (0, import_react2.createContext)(null); +function BatchProvider({ children: children2 }) { + const store = useStoreApi(); + const nodeQueueHandler = (0, import_react2.useCallback)((queueItems) => { + const { nodes = [], setNodes, hasDefaultNodes, onNodesChange, nodeLookup, fitViewQueued, onNodesChangeMiddlewareMap } = store.getState(); + let next = nodes; + for (const payload of queueItems) { + next = typeof payload === "function" ? payload(next) : payload; + } + let changes = getElementsDiffChanges({ + items: next, + lookup: nodeLookup + }); + for (const middleware of onNodesChangeMiddlewareMap.values()) { + changes = middleware(changes); + } + if (hasDefaultNodes) { + setNodes(next); + } + if (changes.length > 0) { + onNodesChange == null ? void 0 : onNodesChange(changes); + } else if (fitViewQueued) { + window.requestAnimationFrame(() => { + const { fitViewQueued: fitViewQueued2, nodes: nodes2, setNodes: setNodes2 } = store.getState(); + if (fitViewQueued2) { + setNodes2(nodes2); + } + }); + } + }, []); + const nodeQueue = useQueue(nodeQueueHandler); + const edgeQueueHandler = (0, import_react2.useCallback)((queueItems) => { + const { edges = [], setEdges, hasDefaultEdges, onEdgesChange, edgeLookup } = store.getState(); + let next = edges; + for (const payload of queueItems) { + next = typeof payload === "function" ? payload(next) : payload; + } + if (hasDefaultEdges) { + setEdges(next); + } else if (onEdgesChange) { + onEdgesChange(getElementsDiffChanges({ + items: next, + lookup: edgeLookup + })); + } + }, []); + const edgeQueue = useQueue(edgeQueueHandler); + const value = (0, import_react2.useMemo)(() => ({ nodeQueue, edgeQueue }), []); + return (0, import_jsx_runtime.jsx)(BatchContext.Provider, { value, children: children2 }); +} +function useBatchContext() { + const batchContext = (0, import_react2.useContext)(BatchContext); + if (!batchContext) { + throw new Error("useBatchContext must be used within a BatchProvider"); + } + return batchContext; +} +var selector$k = (s) => !!s.panZoom; +function useReactFlow() { + const viewportHelper = useViewportHelper(); + const store = useStoreApi(); + const batchContext = useBatchContext(); + const viewportInitialized = useStore(selector$k); + const generalHelper = (0, import_react2.useMemo)(() => { + const getInternalNode = (id2) => store.getState().nodeLookup.get(id2); + const setNodes = (payload) => { + batchContext.nodeQueue.push(payload); + }; + const setEdges = (payload) => { + batchContext.edgeQueue.push(payload); + }; + const getNodeRect = (node) => { + var _a, _b; + const { nodeLookup, nodeOrigin } = store.getState(); + const nodeToUse = isNode(node) ? node : nodeLookup.get(node.id); + const position = nodeToUse.parentId ? evaluateAbsolutePosition(nodeToUse.position, nodeToUse.measured, nodeToUse.parentId, nodeLookup, nodeOrigin) : nodeToUse.position; + const nodeWithPosition = { + ...nodeToUse, + position, + width: ((_a = nodeToUse.measured) == null ? void 0 : _a.width) ?? nodeToUse.width, + height: ((_b = nodeToUse.measured) == null ? void 0 : _b.height) ?? nodeToUse.height + }; + return nodeToRect(nodeWithPosition); + }; + const updateNode = (id2, nodeUpdate, options = { replace: false }) => { + setNodes((prevNodes) => prevNodes.map((node) => { + if (node.id === id2) { + const nextNode = typeof nodeUpdate === "function" ? nodeUpdate(node) : nodeUpdate; + return options.replace && isNode(nextNode) ? nextNode : { ...node, ...nextNode }; + } + return node; + })); + }; + const updateEdge = (id2, edgeUpdate, options = { replace: false }) => { + setEdges((prevEdges) => prevEdges.map((edge) => { + if (edge.id === id2) { + const nextEdge = typeof edgeUpdate === "function" ? edgeUpdate(edge) : edgeUpdate; + return options.replace && isEdge(nextEdge) ? nextEdge : { ...edge, ...nextEdge }; + } + return edge; + })); + }; + return { + getNodes: () => store.getState().nodes.map((n) => ({ ...n })), + getNode: (id2) => { + var _a; + return (_a = getInternalNode(id2)) == null ? void 0 : _a.internals.userNode; + }, + getInternalNode, + getEdges: () => { + const { edges = [] } = store.getState(); + return edges.map((e) => ({ ...e })); + }, + getEdge: (id2) => store.getState().edgeLookup.get(id2), + setNodes, + setEdges, + addNodes: (payload) => { + const newNodes = Array.isArray(payload) ? payload : [payload]; + batchContext.nodeQueue.push((nodes) => [...nodes, ...newNodes]); + }, + addEdges: (payload) => { + const newEdges = Array.isArray(payload) ? payload : [payload]; + batchContext.edgeQueue.push((edges) => [...edges, ...newEdges]); + }, + toObject: () => { + const { nodes = [], edges = [], transform: transform2 } = store.getState(); + const [x, y, zoom] = transform2; + return { + nodes: nodes.map((n) => ({ ...n })), + edges: edges.map((e) => ({ ...e })), + viewport: { + x, + y, + zoom + } + }; + }, + deleteElements: async ({ nodes: nodesToRemove = [], edges: edgesToRemove = [] }) => { + const { nodes, edges, onNodesDelete, onEdgesDelete, triggerNodeChanges, triggerEdgeChanges, onDelete, onBeforeDelete } = store.getState(); + const { nodes: matchingNodes, edges: matchingEdges } = await getElementsToRemove({ + nodesToRemove, + edgesToRemove, + nodes, + edges, + onBeforeDelete + }); + const hasMatchingEdges = matchingEdges.length > 0; + const hasMatchingNodes = matchingNodes.length > 0; + if (hasMatchingEdges) { + const edgeChanges = matchingEdges.map(elementToRemoveChange); + onEdgesDelete == null ? void 0 : onEdgesDelete(matchingEdges); + triggerEdgeChanges(edgeChanges); + } + if (hasMatchingNodes) { + const nodeChanges = matchingNodes.map(elementToRemoveChange); + onNodesDelete == null ? void 0 : onNodesDelete(matchingNodes); + triggerNodeChanges(nodeChanges); + } + if (hasMatchingNodes || hasMatchingEdges) { + onDelete == null ? void 0 : onDelete({ nodes: matchingNodes, edges: matchingEdges }); + } + return { deletedNodes: matchingNodes, deletedEdges: matchingEdges }; + }, + /** + * Partial is defined as "the 2 nodes/areas are intersecting partially". + * If a is contained in b or b is contained in a, they are both + * considered fully intersecting. + */ + getIntersectingNodes: (nodeOrRect, partially = true, nodes) => { + const isRect = isRectObject(nodeOrRect); + const nodeRect = isRect ? nodeOrRect : getNodeRect(nodeOrRect); + const hasNodesOption = nodes !== void 0; + if (!nodeRect) { + return []; + } + return (nodes || store.getState().nodes).filter((n) => { + const internalNode = store.getState().nodeLookup.get(n.id); + if (internalNode && !isRect && (n.id === nodeOrRect.id || !internalNode.internals.positionAbsolute)) { + return false; + } + const currNodeRect = nodeToRect(hasNodesOption ? n : internalNode); + const overlappingArea = getOverlappingArea(currNodeRect, nodeRect); + const partiallyVisible = partially && overlappingArea > 0; + return partiallyVisible || overlappingArea >= currNodeRect.width * currNodeRect.height || overlappingArea >= nodeRect.width * nodeRect.height; + }); + }, + isNodeIntersecting: (nodeOrRect, area, partially = true) => { + const isRect = isRectObject(nodeOrRect); + const nodeRect = isRect ? nodeOrRect : getNodeRect(nodeOrRect); + if (!nodeRect) { + return false; + } + const overlappingArea = getOverlappingArea(nodeRect, area); + const partiallyVisible = partially && overlappingArea > 0; + return partiallyVisible || overlappingArea >= area.width * area.height || overlappingArea >= nodeRect.width * nodeRect.height; + }, + updateNode, + updateNodeData: (id2, dataUpdate, options = { replace: false }) => { + updateNode(id2, (node) => { + const nextData = typeof dataUpdate === "function" ? dataUpdate(node) : dataUpdate; + return options.replace ? { ...node, data: nextData } : { ...node, data: { ...node.data, ...nextData } }; + }, options); + }, + updateEdge, + updateEdgeData: (id2, dataUpdate, options = { replace: false }) => { + updateEdge(id2, (edge) => { + const nextData = typeof dataUpdate === "function" ? dataUpdate(edge) : dataUpdate; + return options.replace ? { ...edge, data: nextData } : { ...edge, data: { ...edge.data, ...nextData } }; + }, options); + }, + getNodesBounds: (nodes) => { + const { nodeLookup, nodeOrigin } = store.getState(); + return getNodesBounds(nodes, { nodeLookup, nodeOrigin }); + }, + getHandleConnections: ({ type, id: id2, nodeId }) => { + var _a; + return Array.from(((_a = store.getState().connectionLookup.get(`${nodeId}-${type}${id2 ? `-${id2}` : ""}`)) == null ? void 0 : _a.values()) ?? []); + }, + getNodeConnections: ({ type, handleId, nodeId }) => { + var _a; + return Array.from(((_a = store.getState().connectionLookup.get(`${nodeId}${type ? handleId ? `-${type}-${handleId}` : `-${type}` : ""}`)) == null ? void 0 : _a.values()) ?? []); + }, + fitView: async (options) => { + const fitViewResolver = store.getState().fitViewResolver ?? withResolvers(); + store.setState({ fitViewQueued: true, fitViewOptions: options, fitViewResolver }); + batchContext.nodeQueue.push((nodes) => [...nodes]); + return fitViewResolver.promise; + } + }; + }, []); + return (0, import_react2.useMemo)(() => { + return { + ...generalHelper, + ...viewportHelper, + viewportInitialized + }; + }, [viewportInitialized]); +} +var selected = (item) => item.selected; +var win$1 = typeof window !== "undefined" ? window : void 0; +function useGlobalKeyHandler({ deleteKeyCode, multiSelectionKeyCode }) { + const store = useStoreApi(); + const { deleteElements } = useReactFlow(); + const deleteKeyPressed = useKeyPress(deleteKeyCode, { actInsideInputWithModifier: false }); + const multiSelectionKeyPressed = useKeyPress(multiSelectionKeyCode, { target: win$1 }); + (0, import_react2.useEffect)(() => { + if (deleteKeyPressed) { + const { edges, nodes } = store.getState(); + deleteElements({ nodes: nodes.filter(selected), edges: edges.filter(selected) }); + store.setState({ nodesSelectionActive: false }); + } + }, [deleteKeyPressed]); + (0, import_react2.useEffect)(() => { + store.setState({ multiSelectionActive: multiSelectionKeyPressed }); + }, [multiSelectionKeyPressed]); +} +function useResizeHandler(domNode) { + const store = useStoreApi(); + (0, import_react2.useEffect)(() => { + const updateDimensions = () => { + var _a, _b, _c, _d; + if (!domNode.current || !(((_b = (_a = domNode.current).checkVisibility) == null ? void 0 : _b.call(_a)) ?? true)) { + return false; + } + const size = getDimensions(domNode.current); + if (size.height === 0 || size.width === 0) { + (_d = (_c = store.getState()).onError) == null ? void 0 : _d.call(_c, "004", errorMessages["error004"]()); + } + store.setState({ width: size.width || 500, height: size.height || 500 }); + }; + if (domNode.current) { + updateDimensions(); + window.addEventListener("resize", updateDimensions); + const resizeObserver = new ResizeObserver(() => updateDimensions()); + resizeObserver.observe(domNode.current); + return () => { + window.removeEventListener("resize", updateDimensions); + if (resizeObserver && domNode.current) { + resizeObserver.unobserve(domNode.current); + } + }; + } + }, []); +} +var containerStyle = { + position: "absolute", + width: "100%", + height: "100%", + top: 0, + left: 0 +}; +var selector$j = (s) => ({ + userSelectionActive: s.userSelectionActive, + lib: s.lib, + connectionInProgress: s.connection.inProgress +}); +function ZoomPane({ onPaneContextMenu, zoomOnScroll = true, zoomOnPinch = true, panOnScroll = false, panOnScrollSpeed = 0.5, panOnScrollMode = PanOnScrollMode.Free, zoomOnDoubleClick = true, panOnDrag = true, defaultViewport: defaultViewport2, translateExtent, minZoom, maxZoom, zoomActivationKeyCode, preventScrolling = true, children: children2, noWheelClassName, noPanClassName, onViewportChange, isControlledViewport, paneClickDistance, selectionOnDrag }) { + const store = useStoreApi(); + const zoomPane = (0, import_react2.useRef)(null); + const { userSelectionActive, lib, connectionInProgress } = useStore(selector$j, shallow$1); + const zoomActivationKeyPressed = useKeyPress(zoomActivationKeyCode); + const panZoom = (0, import_react2.useRef)(); + useResizeHandler(zoomPane); + const onTransformChange = (0, import_react2.useCallback)((transform2) => { + onViewportChange == null ? void 0 : onViewportChange({ x: transform2[0], y: transform2[1], zoom: transform2[2] }); + if (!isControlledViewport) { + store.setState({ transform: transform2 }); + } + }, [onViewportChange, isControlledViewport]); + (0, import_react2.useEffect)(() => { + if (zoomPane.current) { + panZoom.current = XYPanZoom({ + domNode: zoomPane.current, + minZoom, + maxZoom, + translateExtent, + viewport: defaultViewport2, + onDraggingChange: (paneDragging) => store.setState({ paneDragging }), + onPanZoomStart: (event, vp) => { + const { onViewportChangeStart, onMoveStart } = store.getState(); + onMoveStart == null ? void 0 : onMoveStart(event, vp); + onViewportChangeStart == null ? void 0 : onViewportChangeStart(vp); + }, + onPanZoom: (event, vp) => { + const { onViewportChange: onViewportChange2, onMove } = store.getState(); + onMove == null ? void 0 : onMove(event, vp); + onViewportChange2 == null ? void 0 : onViewportChange2(vp); + }, + onPanZoomEnd: (event, vp) => { + const { onViewportChangeEnd, onMoveEnd } = store.getState(); + onMoveEnd == null ? void 0 : onMoveEnd(event, vp); + onViewportChangeEnd == null ? void 0 : onViewportChangeEnd(vp); + } + }); + const { x, y, zoom } = panZoom.current.getViewport(); + store.setState({ + panZoom: panZoom.current, + transform: [x, y, zoom], + domNode: zoomPane.current.closest(".react-flow") + }); + return () => { + var _a; + (_a = panZoom.current) == null ? void 0 : _a.destroy(); + }; + } + }, []); + (0, import_react2.useEffect)(() => { + var _a; + (_a = panZoom.current) == null ? void 0 : _a.update({ + onPaneContextMenu, + zoomOnScroll, + zoomOnPinch, + panOnScroll, + panOnScrollSpeed, + panOnScrollMode, + zoomOnDoubleClick, + panOnDrag, + zoomActivationKeyPressed, + preventScrolling, + noPanClassName, + userSelectionActive, + noWheelClassName, + lib, + onTransformChange, + connectionInProgress, + selectionOnDrag, + paneClickDistance + }); + }, [ + onPaneContextMenu, + zoomOnScroll, + zoomOnPinch, + panOnScroll, + panOnScrollSpeed, + panOnScrollMode, + zoomOnDoubleClick, + panOnDrag, + zoomActivationKeyPressed, + preventScrolling, + noPanClassName, + userSelectionActive, + noWheelClassName, + lib, + onTransformChange, + connectionInProgress, + selectionOnDrag, + paneClickDistance + ]); + return (0, import_jsx_runtime.jsx)("div", { className: "react-flow__renderer", ref: zoomPane, style: containerStyle, children: children2 }); +} +var selector$i = (s) => ({ + userSelectionActive: s.userSelectionActive, + userSelectionRect: s.userSelectionRect +}); +function UserSelection() { + const { userSelectionActive, userSelectionRect } = useStore(selector$i, shallow$1); + const isActive = userSelectionActive && userSelectionRect; + if (!isActive) { + return null; + } + return (0, import_jsx_runtime.jsx)("div", { className: "react-flow__selection react-flow__container", style: { + width: userSelectionRect.width, + height: userSelectionRect.height, + transform: `translate(${userSelectionRect.x}px, ${userSelectionRect.y}px)` + } }); +} +var wrapHandler = (handler, containerRef) => { + return (event) => { + if (event.target !== containerRef.current) { + return; + } + handler == null ? void 0 : handler(event); + }; +}; +var selector$h = (s) => ({ + userSelectionActive: s.userSelectionActive, + elementsSelectable: s.elementsSelectable, + connectionInProgress: s.connection.inProgress, + dragging: s.paneDragging +}); +function Pane({ isSelecting, selectionKeyPressed, selectionMode = SelectionMode.Full, panOnDrag, paneClickDistance, selectionOnDrag, onSelectionStart, onSelectionEnd, onPaneClick, onPaneContextMenu, onPaneScroll, onPaneMouseEnter, onPaneMouseMove, onPaneMouseLeave, children: children2 }) { + const store = useStoreApi(); + const { userSelectionActive, elementsSelectable, dragging, connectionInProgress } = useStore(selector$h, shallow$1); + const isSelectionEnabled = elementsSelectable && (isSelecting || userSelectionActive); + const container = (0, import_react2.useRef)(null); + const containerBounds = (0, import_react2.useRef)(); + const selectedNodeIds = (0, import_react2.useRef)(/* @__PURE__ */ new Set()); + const selectedEdgeIds = (0, import_react2.useRef)(/* @__PURE__ */ new Set()); + const selectionInProgress = (0, import_react2.useRef)(false); + const onClick = (event) => { + if (selectionInProgress.current || connectionInProgress) { + selectionInProgress.current = false; + return; + } + onPaneClick == null ? void 0 : onPaneClick(event); + store.getState().resetSelectedElements(); + store.setState({ nodesSelectionActive: false }); + }; + const onContextMenu = (event) => { + if (Array.isArray(panOnDrag) && (panOnDrag == null ? void 0 : panOnDrag.includes(2))) { + event.preventDefault(); + return; + } + onPaneContextMenu == null ? void 0 : onPaneContextMenu(event); + }; + const onWheel = onPaneScroll ? (event) => onPaneScroll(event) : void 0; + const onClickCapture = (event) => { + if (selectionInProgress.current) { + event.stopPropagation(); + selectionInProgress.current = false; + } + }; + const onPointerDownCapture = (event) => { + var _a, _b; + const { domNode } = store.getState(); + containerBounds.current = domNode == null ? void 0 : domNode.getBoundingClientRect(); + if (!containerBounds.current) + return; + const eventTargetIsContainer = event.target === container.current; + const isNoKeyEvent = !eventTargetIsContainer && !!event.target.closest(".nokey"); + const isSelectionActive = selectionOnDrag && eventTargetIsContainer || selectionKeyPressed; + if (isNoKeyEvent || !isSelecting || !isSelectionActive || event.button !== 0 || !event.isPrimary) { + return; + } + (_b = (_a = event.target) == null ? void 0 : _a.setPointerCapture) == null ? void 0 : _b.call(_a, event.pointerId); + selectionInProgress.current = false; + const { x, y } = getEventPosition(event.nativeEvent, containerBounds.current); + store.setState({ + userSelectionRect: { + width: 0, + height: 0, + startX: x, + startY: y, + x, + y + } + }); + if (!eventTargetIsContainer) { + event.stopPropagation(); + event.preventDefault(); + } + }; + const onPointerMove = (event) => { + const { userSelectionRect, transform: transform2, nodeLookup, edgeLookup, connectionLookup, triggerNodeChanges, triggerEdgeChanges, defaultEdgeOptions, resetSelectedElements } = store.getState(); + if (!containerBounds.current || !userSelectionRect) { + return; + } + const { x: mouseX, y: mouseY } = getEventPosition(event.nativeEvent, containerBounds.current); + const { startX, startY } = userSelectionRect; + if (!selectionInProgress.current) { + const requiredDistance = selectionKeyPressed ? 0 : paneClickDistance; + const distance2 = Math.hypot(mouseX - startX, mouseY - startY); + if (distance2 <= requiredDistance) { + return; + } + resetSelectedElements(); + onSelectionStart == null ? void 0 : onSelectionStart(event); + } + selectionInProgress.current = true; + const nextUserSelectRect = { + startX, + startY, + x: mouseX < startX ? mouseX : startX, + y: mouseY < startY ? mouseY : startY, + width: Math.abs(mouseX - startX), + height: Math.abs(mouseY - startY) + }; + const prevSelectedNodeIds = selectedNodeIds.current; + const prevSelectedEdgeIds = selectedEdgeIds.current; + selectedNodeIds.current = new Set(getNodesInside(nodeLookup, nextUserSelectRect, transform2, selectionMode === SelectionMode.Partial, true).map((node) => node.id)); + selectedEdgeIds.current = /* @__PURE__ */ new Set(); + const edgesSelectable = (defaultEdgeOptions == null ? void 0 : defaultEdgeOptions.selectable) ?? true; + for (const nodeId of selectedNodeIds.current) { + const connections = connectionLookup.get(nodeId); + if (!connections) + continue; + for (const { edgeId } of connections.values()) { + const edge = edgeLookup.get(edgeId); + if (edge && (edge.selectable ?? edgesSelectable)) { + selectedEdgeIds.current.add(edgeId); + } + } + } + if (!areSetsEqual(prevSelectedNodeIds, selectedNodeIds.current)) { + const changes = getSelectionChanges(nodeLookup, selectedNodeIds.current, true); + triggerNodeChanges(changes); + } + if (!areSetsEqual(prevSelectedEdgeIds, selectedEdgeIds.current)) { + const changes = getSelectionChanges(edgeLookup, selectedEdgeIds.current); + triggerEdgeChanges(changes); + } + store.setState({ + userSelectionRect: nextUserSelectRect, + userSelectionActive: true, + nodesSelectionActive: false + }); + }; + const onPointerUp = (event) => { + var _a, _b; + if (event.button !== 0) { + return; + } + (_b = (_a = event.target) == null ? void 0 : _a.releasePointerCapture) == null ? void 0 : _b.call(_a, event.pointerId); + if (!userSelectionActive && event.target === container.current && store.getState().userSelectionRect) { + onClick == null ? void 0 : onClick(event); + } + store.setState({ + userSelectionActive: false, + userSelectionRect: null + }); + if (selectionInProgress.current) { + onSelectionEnd == null ? void 0 : onSelectionEnd(event); + store.setState({ + nodesSelectionActive: selectedNodeIds.current.size > 0 + }); + } + }; + const draggable = panOnDrag === true || Array.isArray(panOnDrag) && panOnDrag.includes(0); + return (0, import_jsx_runtime.jsxs)("div", { className: cc(["react-flow__pane", { draggable, dragging, selection: isSelecting }]), onClick: isSelectionEnabled ? void 0 : wrapHandler(onClick, container), onContextMenu: wrapHandler(onContextMenu, container), onWheel: wrapHandler(onWheel, container), onPointerEnter: isSelectionEnabled ? void 0 : onPaneMouseEnter, onPointerMove: isSelectionEnabled ? onPointerMove : onPaneMouseMove, onPointerUp: isSelectionEnabled ? onPointerUp : void 0, onPointerDownCapture: isSelectionEnabled ? onPointerDownCapture : void 0, onClickCapture: isSelectionEnabled ? onClickCapture : void 0, onPointerLeave: onPaneMouseLeave, ref: container, style: containerStyle, children: [children2, (0, import_jsx_runtime.jsx)(UserSelection, {})] }); +} +function handleNodeClick({ id: id2, store, unselect = false, nodeRef }) { + const { addSelectedNodes, unselectNodesAndEdges, multiSelectionActive, nodeLookup, onError } = store.getState(); + const node = nodeLookup.get(id2); + if (!node) { + onError == null ? void 0 : onError("012", errorMessages["error012"](id2)); + return; + } + store.setState({ nodesSelectionActive: false }); + if (!node.selected) { + addSelectedNodes([id2]); + } else if (unselect || node.selected && multiSelectionActive) { + unselectNodesAndEdges({ nodes: [node], edges: [] }); + requestAnimationFrame(() => { + var _a; + return (_a = nodeRef == null ? void 0 : nodeRef.current) == null ? void 0 : _a.blur(); + }); + } +} +function useDrag({ nodeRef, disabled = false, noDragClassName, handleSelector, nodeId, isSelectable, nodeClickDistance }) { + const store = useStoreApi(); + const [dragging, setDragging] = (0, import_react2.useState)(false); + const xyDrag = (0, import_react2.useRef)(); + (0, import_react2.useEffect)(() => { + xyDrag.current = XYDrag({ + getStoreItems: () => store.getState(), + onNodeMouseDown: (id2) => { + handleNodeClick({ + id: id2, + store, + nodeRef + }); + }, + onDragStart: () => { + setDragging(true); + }, + onDragStop: () => { + setDragging(false); + } + }); + }, []); + (0, import_react2.useEffect)(() => { + var _a, _b; + if (disabled) { + (_a = xyDrag.current) == null ? void 0 : _a.destroy(); + } else if (nodeRef.current) { + (_b = xyDrag.current) == null ? void 0 : _b.update({ + noDragClassName, + handleSelector, + domNode: nodeRef.current, + isSelectable, + nodeId, + nodeClickDistance + }); + return () => { + var _a2; + (_a2 = xyDrag.current) == null ? void 0 : _a2.destroy(); + }; + } + }, [noDragClassName, handleSelector, disabled, isSelectable, nodeRef, nodeId]); + return dragging; +} +var selectedAndDraggable = (nodesDraggable) => (n) => n.selected && (n.draggable || nodesDraggable && typeof n.draggable === "undefined"); +function useMoveSelectedNodes() { + const store = useStoreApi(); + const moveSelectedNodes = (0, import_react2.useCallback)((params) => { + const { nodeExtent, snapToGrid, snapGrid, nodesDraggable, onError, updateNodePositions, nodeLookup, nodeOrigin } = store.getState(); + const nodeUpdates = /* @__PURE__ */ new Map(); + const isSelected = selectedAndDraggable(nodesDraggable); + const xVelo = snapToGrid ? snapGrid[0] : 5; + const yVelo = snapToGrid ? snapGrid[1] : 5; + const xDiff = params.direction.x * xVelo * params.factor; + const yDiff = params.direction.y * yVelo * params.factor; + for (const [, node] of nodeLookup) { + if (!isSelected(node)) { + continue; + } + let nextPosition = { + x: node.internals.positionAbsolute.x + xDiff, + y: node.internals.positionAbsolute.y + yDiff + }; + if (snapToGrid) { + nextPosition = snapPosition(nextPosition, snapGrid); + } + const { position, positionAbsolute } = calculateNodePosition({ + nodeId: node.id, + nextPosition, + nodeLookup, + nodeExtent, + nodeOrigin, + onError + }); + node.position = position; + node.internals.positionAbsolute = positionAbsolute; + nodeUpdates.set(node.id, node); + } + updateNodePositions(nodeUpdates); + }, []); + return moveSelectedNodes; +} +var NodeIdContext = (0, import_react2.createContext)(null); +var Provider = NodeIdContext.Provider; +NodeIdContext.Consumer; +var useNodeId = () => { + const nodeId = (0, import_react2.useContext)(NodeIdContext); + return nodeId; +}; +var selector$g = (s) => ({ + connectOnClick: s.connectOnClick, + noPanClassName: s.noPanClassName, + rfId: s.rfId +}); +var connectingSelector = (nodeId, handleId, type) => (state) => { + const { connectionClickStartHandle: clickHandle, connectionMode, connection } = state; + const { fromHandle, toHandle, isValid } = connection; + const connectingTo = (toHandle == null ? void 0 : toHandle.nodeId) === nodeId && (toHandle == null ? void 0 : toHandle.id) === handleId && (toHandle == null ? void 0 : toHandle.type) === type; + return { + connectingFrom: (fromHandle == null ? void 0 : fromHandle.nodeId) === nodeId && (fromHandle == null ? void 0 : fromHandle.id) === handleId && (fromHandle == null ? void 0 : fromHandle.type) === type, + connectingTo, + clickConnecting: (clickHandle == null ? void 0 : clickHandle.nodeId) === nodeId && (clickHandle == null ? void 0 : clickHandle.id) === handleId && (clickHandle == null ? void 0 : clickHandle.type) === type, + isPossibleEndHandle: connectionMode === ConnectionMode.Strict ? (fromHandle == null ? void 0 : fromHandle.type) !== type : nodeId !== (fromHandle == null ? void 0 : fromHandle.nodeId) || handleId !== (fromHandle == null ? void 0 : fromHandle.id), + connectionInProcess: !!fromHandle, + clickConnectionInProcess: !!clickHandle, + valid: connectingTo && isValid + }; +}; +function HandleComponent({ type = "source", position = Position.Top, isValidConnection, isConnectable = true, isConnectableStart = true, isConnectableEnd = true, id: id2, onConnect, children: children2, className, onMouseDown, onTouchStart, ...rest }, ref) { + var _a, _b; + const handleId = id2 || null; + const isTarget = type === "target"; + const store = useStoreApi(); + const nodeId = useNodeId(); + const { connectOnClick, noPanClassName, rfId } = useStore(selector$g, shallow$1); + const { connectingFrom, connectingTo, clickConnecting, isPossibleEndHandle, connectionInProcess, clickConnectionInProcess, valid } = useStore(connectingSelector(nodeId, handleId, type), shallow$1); + if (!nodeId) { + (_b = (_a = store.getState()).onError) == null ? void 0 : _b.call(_a, "010", errorMessages["error010"]()); + } + const onConnectExtended = (params) => { + const { defaultEdgeOptions, onConnect: onConnectAction, hasDefaultEdges } = store.getState(); + const edgeParams = { + ...defaultEdgeOptions, + ...params + }; + if (hasDefaultEdges) { + const { edges, setEdges } = store.getState(); + setEdges(addEdge(edgeParams, edges)); + } + onConnectAction == null ? void 0 : onConnectAction(edgeParams); + onConnect == null ? void 0 : onConnect(edgeParams); + }; + const onPointerDown2 = (event) => { + if (!nodeId) { + return; + } + const isMouseTriggered = isMouseEvent(event.nativeEvent); + if (isConnectableStart && (isMouseTriggered && event.button === 0 || !isMouseTriggered)) { + const currentStore = store.getState(); + XYHandle.onPointerDown(event.nativeEvent, { + handleDomNode: event.currentTarget, + autoPanOnConnect: currentStore.autoPanOnConnect, + connectionMode: currentStore.connectionMode, + connectionRadius: currentStore.connectionRadius, + domNode: currentStore.domNode, + nodeLookup: currentStore.nodeLookup, + lib: currentStore.lib, + isTarget, + handleId, + nodeId, + flowId: currentStore.rfId, + panBy: currentStore.panBy, + cancelConnection: currentStore.cancelConnection, + onConnectStart: currentStore.onConnectStart, + onConnectEnd: currentStore.onConnectEnd, + updateConnection: currentStore.updateConnection, + onConnect: onConnectExtended, + isValidConnection: isValidConnection || currentStore.isValidConnection, + getTransform: () => store.getState().transform, + getFromHandle: () => store.getState().connection.fromHandle, + autoPanSpeed: currentStore.autoPanSpeed, + dragThreshold: currentStore.connectionDragThreshold + }); + } + if (isMouseTriggered) { + onMouseDown == null ? void 0 : onMouseDown(event); + } else { + onTouchStart == null ? void 0 : onTouchStart(event); + } + }; + const onClick = (event) => { + const { onClickConnectStart, onClickConnectEnd, connectionClickStartHandle, connectionMode, isValidConnection: isValidConnectionStore, lib, rfId: flowId, nodeLookup, connection: connectionState } = store.getState(); + if (!nodeId || !connectionClickStartHandle && !isConnectableStart) { + return; + } + if (!connectionClickStartHandle) { + onClickConnectStart == null ? void 0 : onClickConnectStart(event.nativeEvent, { nodeId, handleId, handleType: type }); + store.setState({ connectionClickStartHandle: { nodeId, type, id: handleId } }); + return; + } + const doc = getHostForElement(event.target); + const isValidConnectionHandler = isValidConnection || isValidConnectionStore; + const { connection, isValid } = XYHandle.isValid(event.nativeEvent, { + handle: { + nodeId, + id: handleId, + type + }, + connectionMode, + fromNodeId: connectionClickStartHandle.nodeId, + fromHandleId: connectionClickStartHandle.id || null, + fromType: connectionClickStartHandle.type, + isValidConnection: isValidConnectionHandler, + flowId, + doc, + lib, + nodeLookup + }); + if (isValid && connection) { + onConnectExtended(connection); + } + const connectionClone = structuredClone(connectionState); + delete connectionClone.inProgress; + connectionClone.toPosition = connectionClone.toHandle ? connectionClone.toHandle.position : null; + onClickConnectEnd == null ? void 0 : onClickConnectEnd(event, connectionClone); + store.setState({ connectionClickStartHandle: null }); + }; + return (0, import_jsx_runtime.jsx)("div", { "data-handleid": handleId, "data-nodeid": nodeId, "data-handlepos": position, "data-id": `${rfId}-${nodeId}-${handleId}-${type}`, className: cc([ + "react-flow__handle", + `react-flow__handle-${position}`, + "nodrag", + noPanClassName, + className, + { + source: !isTarget, + target: isTarget, + connectable: isConnectable, + connectablestart: isConnectableStart, + connectableend: isConnectableEnd, + clickconnecting: clickConnecting, + connectingfrom: connectingFrom, + connectingto: connectingTo, + valid, + /* + * shows where you can start a connection from + * and where you can end it while connecting + */ + connectionindicator: isConnectable && (!connectionInProcess || isPossibleEndHandle) && (connectionInProcess || clickConnectionInProcess ? isConnectableEnd : isConnectableStart) + } + ]), onMouseDown: onPointerDown2, onTouchStart: onPointerDown2, onClick: connectOnClick ? onClick : void 0, ref, ...rest, children: children2 }); +} +var Handle = (0, import_react2.memo)(fixedForwardRef(HandleComponent)); +function InputNode({ data, isConnectable, sourcePosition = Position.Bottom }) { + return (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [data == null ? void 0 : data.label, (0, import_jsx_runtime.jsx)(Handle, { type: "source", position: sourcePosition, isConnectable })] }); +} +function DefaultNode({ data, isConnectable, targetPosition = Position.Top, sourcePosition = Position.Bottom }) { + return (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [(0, import_jsx_runtime.jsx)(Handle, { type: "target", position: targetPosition, isConnectable }), data == null ? void 0 : data.label, (0, import_jsx_runtime.jsx)(Handle, { type: "source", position: sourcePosition, isConnectable })] }); +} +function GroupNode() { + return null; +} +function OutputNode({ data, isConnectable, targetPosition = Position.Top }) { + return (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [(0, import_jsx_runtime.jsx)(Handle, { type: "target", position: targetPosition, isConnectable }), data == null ? void 0 : data.label] }); +} +var arrowKeyDiffs = { + ArrowUp: { x: 0, y: -1 }, + ArrowDown: { x: 0, y: 1 }, + ArrowLeft: { x: -1, y: 0 }, + ArrowRight: { x: 1, y: 0 } +}; +var builtinNodeTypes = { + input: InputNode, + default: DefaultNode, + output: OutputNode, + group: GroupNode +}; +function getNodeInlineStyleDimensions(node) { + var _a, _b, _c, _d; + if (node.internals.handleBounds === void 0) { + return { + width: node.width ?? node.initialWidth ?? ((_a = node.style) == null ? void 0 : _a.width), + height: node.height ?? node.initialHeight ?? ((_b = node.style) == null ? void 0 : _b.height) + }; + } + return { + width: node.width ?? ((_c = node.style) == null ? void 0 : _c.width), + height: node.height ?? ((_d = node.style) == null ? void 0 : _d.height) + }; +} +var selector$f = (s) => { + const { width, height, x, y } = getInternalNodesBounds(s.nodeLookup, { + filter: (node) => !!node.selected + }); + return { + width: isNumeric(width) ? width : null, + height: isNumeric(height) ? height : null, + userSelectionActive: s.userSelectionActive, + transformString: `translate(${s.transform[0]}px,${s.transform[1]}px) scale(${s.transform[2]}) translate(${x}px,${y}px)` + }; +}; +function NodesSelection({ onSelectionContextMenu, noPanClassName, disableKeyboardA11y }) { + const store = useStoreApi(); + const { width, height, transformString, userSelectionActive } = useStore(selector$f, shallow$1); + const moveSelectedNodes = useMoveSelectedNodes(); + const nodeRef = (0, import_react2.useRef)(null); + (0, import_react2.useEffect)(() => { + var _a; + if (!disableKeyboardA11y) { + (_a = nodeRef.current) == null ? void 0 : _a.focus({ + preventScroll: true + }); + } + }, [disableKeyboardA11y]); + useDrag({ + nodeRef + }); + if (userSelectionActive || !width || !height) { + return null; + } + const onContextMenu = onSelectionContextMenu ? (event) => { + const selectedNodes = store.getState().nodes.filter((n) => n.selected); + onSelectionContextMenu(event, selectedNodes); + } : void 0; + const onKeyDown = (event) => { + if (Object.prototype.hasOwnProperty.call(arrowKeyDiffs, event.key)) { + event.preventDefault(); + moveSelectedNodes({ + direction: arrowKeyDiffs[event.key], + factor: event.shiftKey ? 4 : 1 + }); + } + }; + return (0, import_jsx_runtime.jsx)("div", { className: cc(["react-flow__nodesselection", "react-flow__container", noPanClassName]), style: { + transform: transformString + }, children: (0, import_jsx_runtime.jsx)("div", { ref: nodeRef, className: "react-flow__nodesselection-rect", onContextMenu, tabIndex: disableKeyboardA11y ? void 0 : -1, onKeyDown: disableKeyboardA11y ? void 0 : onKeyDown, style: { + width, + height + } }) }); +} +var win = typeof window !== "undefined" ? window : void 0; +var selector$e = (s) => { + return { nodesSelectionActive: s.nodesSelectionActive, userSelectionActive: s.userSelectionActive }; +}; +function FlowRendererComponent({ children: children2, onPaneClick, onPaneMouseEnter, onPaneMouseMove, onPaneMouseLeave, onPaneContextMenu, onPaneScroll, paneClickDistance, deleteKeyCode, selectionKeyCode, selectionOnDrag, selectionMode, onSelectionStart, onSelectionEnd, multiSelectionKeyCode, panActivationKeyCode, zoomActivationKeyCode, elementsSelectable, zoomOnScroll, zoomOnPinch, panOnScroll: _panOnScroll, panOnScrollSpeed, panOnScrollMode, zoomOnDoubleClick, panOnDrag: _panOnDrag, defaultViewport: defaultViewport2, translateExtent, minZoom, maxZoom, preventScrolling, onSelectionContextMenu, noWheelClassName, noPanClassName, disableKeyboardA11y, onViewportChange, isControlledViewport }) { + const { nodesSelectionActive, userSelectionActive } = useStore(selector$e, shallow$1); + const selectionKeyPressed = useKeyPress(selectionKeyCode, { target: win }); + const panActivationKeyPressed = useKeyPress(panActivationKeyCode, { target: win }); + const panOnDrag = panActivationKeyPressed || _panOnDrag; + const panOnScroll = panActivationKeyPressed || _panOnScroll; + const _selectionOnDrag = selectionOnDrag && panOnDrag !== true; + const isSelecting = selectionKeyPressed || userSelectionActive || _selectionOnDrag; + useGlobalKeyHandler({ deleteKeyCode, multiSelectionKeyCode }); + return (0, import_jsx_runtime.jsx)(ZoomPane, { onPaneContextMenu, elementsSelectable, zoomOnScroll, zoomOnPinch, panOnScroll, panOnScrollSpeed, panOnScrollMode, zoomOnDoubleClick, panOnDrag: !selectionKeyPressed && panOnDrag, defaultViewport: defaultViewport2, translateExtent, minZoom, maxZoom, zoomActivationKeyCode, preventScrolling, noWheelClassName, noPanClassName, onViewportChange, isControlledViewport, paneClickDistance, selectionOnDrag: _selectionOnDrag, children: (0, import_jsx_runtime.jsxs)(Pane, { onSelectionStart, onSelectionEnd, onPaneClick, onPaneMouseEnter, onPaneMouseMove, onPaneMouseLeave, onPaneContextMenu, onPaneScroll, panOnDrag, isSelecting: !!isSelecting, selectionMode, selectionKeyPressed, paneClickDistance, selectionOnDrag: _selectionOnDrag, children: [children2, nodesSelectionActive && (0, import_jsx_runtime.jsx)(NodesSelection, { onSelectionContextMenu, noPanClassName, disableKeyboardA11y })] }) }); +} +FlowRendererComponent.displayName = "FlowRenderer"; +var FlowRenderer = (0, import_react2.memo)(FlowRendererComponent); +var selector$d = (onlyRenderVisible) => (s) => { + return onlyRenderVisible ? getNodesInside(s.nodeLookup, { x: 0, y: 0, width: s.width, height: s.height }, s.transform, true).map((node) => node.id) : Array.from(s.nodeLookup.keys()); +}; +function useVisibleNodeIds(onlyRenderVisible) { + const nodeIds = useStore((0, import_react2.useCallback)(selector$d(onlyRenderVisible), [onlyRenderVisible]), shallow$1); + return nodeIds; +} +var selector$c = (s) => s.updateNodeInternals; +function useResizeObserver() { + const updateNodeInternals2 = useStore(selector$c); + const [resizeObserver] = (0, import_react2.useState)(() => { + if (typeof ResizeObserver === "undefined") { + return null; + } + return new ResizeObserver((entries) => { + const updates = /* @__PURE__ */ new Map(); + entries.forEach((entry) => { + const id2 = entry.target.getAttribute("data-id"); + updates.set(id2, { + id: id2, + nodeElement: entry.target, + force: true + }); + }); + updateNodeInternals2(updates); + }); + }); + (0, import_react2.useEffect)(() => { + return () => { + resizeObserver == null ? void 0 : resizeObserver.disconnect(); + }; + }, [resizeObserver]); + return resizeObserver; +} +function useNodeObserver({ node, nodeType, hasDimensions, resizeObserver }) { + const store = useStoreApi(); + const nodeRef = (0, import_react2.useRef)(null); + const observedNode = (0, import_react2.useRef)(null); + const prevSourcePosition = (0, import_react2.useRef)(node.sourcePosition); + const prevTargetPosition = (0, import_react2.useRef)(node.targetPosition); + const prevType = (0, import_react2.useRef)(nodeType); + const isInitialized = hasDimensions && !!node.internals.handleBounds; + (0, import_react2.useEffect)(() => { + if (nodeRef.current && !node.hidden && (!isInitialized || observedNode.current !== nodeRef.current)) { + if (observedNode.current) { + resizeObserver == null ? void 0 : resizeObserver.unobserve(observedNode.current); + } + resizeObserver == null ? void 0 : resizeObserver.observe(nodeRef.current); + observedNode.current = nodeRef.current; + } + }, [isInitialized, node.hidden]); + (0, import_react2.useEffect)(() => { + return () => { + if (observedNode.current) { + resizeObserver == null ? void 0 : resizeObserver.unobserve(observedNode.current); + observedNode.current = null; + } + }; + }, []); + (0, import_react2.useEffect)(() => { + if (nodeRef.current) { + const typeChanged = prevType.current !== nodeType; + const sourcePosChanged = prevSourcePosition.current !== node.sourcePosition; + const targetPosChanged = prevTargetPosition.current !== node.targetPosition; + if (typeChanged || sourcePosChanged || targetPosChanged) { + prevType.current = nodeType; + prevSourcePosition.current = node.sourcePosition; + prevTargetPosition.current = node.targetPosition; + store.getState().updateNodeInternals(/* @__PURE__ */ new Map([[node.id, { id: node.id, nodeElement: nodeRef.current, force: true }]])); + } + } + }, [node.id, nodeType, node.sourcePosition, node.targetPosition]); + return nodeRef; +} +function NodeWrapper({ id: id2, onClick, onMouseEnter, onMouseMove, onMouseLeave, onContextMenu, onDoubleClick, nodesDraggable, elementsSelectable, nodesConnectable, nodesFocusable, resizeObserver, noDragClassName, noPanClassName, disableKeyboardA11y, rfId, nodeTypes, nodeClickDistance, onError }) { + const { node, internals, isParent } = useStore((s) => { + const node2 = s.nodeLookup.get(id2); + const isParent2 = s.parentLookup.has(id2); + return { + node: node2, + internals: node2.internals, + isParent: isParent2 + }; + }, shallow$1); + let nodeType = node.type || "default"; + let NodeComponent = (nodeTypes == null ? void 0 : nodeTypes[nodeType]) || builtinNodeTypes[nodeType]; + if (NodeComponent === void 0) { + onError == null ? void 0 : onError("003", errorMessages["error003"](nodeType)); + nodeType = "default"; + NodeComponent = (nodeTypes == null ? void 0 : nodeTypes["default"]) || builtinNodeTypes.default; + } + const isDraggable = !!(node.draggable || nodesDraggable && typeof node.draggable === "undefined"); + const isSelectable = !!(node.selectable || elementsSelectable && typeof node.selectable === "undefined"); + const isConnectable = !!(node.connectable || nodesConnectable && typeof node.connectable === "undefined"); + const isFocusable = !!(node.focusable || nodesFocusable && typeof node.focusable === "undefined"); + const store = useStoreApi(); + const hasDimensions = nodeHasDimensions(node); + const nodeRef = useNodeObserver({ node, nodeType, hasDimensions, resizeObserver }); + const dragging = useDrag({ + nodeRef, + disabled: node.hidden || !isDraggable, + noDragClassName, + handleSelector: node.dragHandle, + nodeId: id2, + isSelectable, + nodeClickDistance + }); + const moveSelectedNodes = useMoveSelectedNodes(); + if (node.hidden) { + return null; + } + const nodeDimensions = getNodeDimensions(node); + const inlineDimensions = getNodeInlineStyleDimensions(node); + const hasPointerEvents = isSelectable || isDraggable || onClick || onMouseEnter || onMouseMove || onMouseLeave; + const onMouseEnterHandler = onMouseEnter ? (event) => onMouseEnter(event, { ...internals.userNode }) : void 0; + const onMouseMoveHandler = onMouseMove ? (event) => onMouseMove(event, { ...internals.userNode }) : void 0; + const onMouseLeaveHandler = onMouseLeave ? (event) => onMouseLeave(event, { ...internals.userNode }) : void 0; + const onContextMenuHandler = onContextMenu ? (event) => onContextMenu(event, { ...internals.userNode }) : void 0; + const onDoubleClickHandler = onDoubleClick ? (event) => onDoubleClick(event, { ...internals.userNode }) : void 0; + const onSelectNodeHandler = (event) => { + const { selectNodesOnDrag, nodeDragThreshold } = store.getState(); + if (isSelectable && (!selectNodesOnDrag || !isDraggable || nodeDragThreshold > 0)) { + handleNodeClick({ + id: id2, + store, + nodeRef + }); + } + if (onClick) { + onClick(event, { ...internals.userNode }); + } + }; + const onKeyDown = (event) => { + if (isInputDOMNode(event.nativeEvent) || disableKeyboardA11y) { + return; + } + if (elementSelectionKeys.includes(event.key) && isSelectable) { + const unselect = event.key === "Escape"; + handleNodeClick({ + id: id2, + store, + unselect, + nodeRef + }); + } else if (isDraggable && node.selected && Object.prototype.hasOwnProperty.call(arrowKeyDiffs, event.key)) { + event.preventDefault(); + const { ariaLabelConfig } = store.getState(); + store.setState({ + ariaLiveMessage: ariaLabelConfig["node.a11yDescription.ariaLiveMessage"]({ + direction: event.key.replace("Arrow", "").toLowerCase(), + x: ~~internals.positionAbsolute.x, + y: ~~internals.positionAbsolute.y + }) + }); + moveSelectedNodes({ + direction: arrowKeyDiffs[event.key], + factor: event.shiftKey ? 4 : 1 + }); + } + }; + const onFocus = () => { + var _a; + if (disableKeyboardA11y || !((_a = nodeRef.current) == null ? void 0 : _a.matches(":focus-visible"))) { + return; + } + const { transform: transform2, width, height, autoPanOnNodeFocus, setCenter } = store.getState(); + if (!autoPanOnNodeFocus) { + return; + } + const withinViewport = getNodesInside(/* @__PURE__ */ new Map([[id2, node]]), { x: 0, y: 0, width, height }, transform2, true).length > 0; + if (!withinViewport) { + setCenter(node.position.x + nodeDimensions.width / 2, node.position.y + nodeDimensions.height / 2, { + zoom: transform2[2] + }); + } + }; + return (0, import_jsx_runtime.jsx)("div", { className: cc([ + "react-flow__node", + `react-flow__node-${nodeType}`, + { + // this is overwritable by passing `nopan` as a class name + [noPanClassName]: isDraggable + }, + node.className, + { + selected: node.selected, + selectable: isSelectable, + parent: isParent, + draggable: isDraggable, + dragging + } + ]), ref: nodeRef, style: { + zIndex: internals.z, + transform: `translate(${internals.positionAbsolute.x}px,${internals.positionAbsolute.y}px)`, + pointerEvents: hasPointerEvents ? "all" : "none", + visibility: hasDimensions ? "visible" : "hidden", + ...node.style, + ...inlineDimensions + }, "data-id": id2, "data-testid": `rf__node-${id2}`, onMouseEnter: onMouseEnterHandler, onMouseMove: onMouseMoveHandler, onMouseLeave: onMouseLeaveHandler, onContextMenu: onContextMenuHandler, onClick: onSelectNodeHandler, onDoubleClick: onDoubleClickHandler, onKeyDown: isFocusable ? onKeyDown : void 0, tabIndex: isFocusable ? 0 : void 0, onFocus: isFocusable ? onFocus : void 0, role: node.ariaRole ?? (isFocusable ? "group" : void 0), "aria-roledescription": "node", "aria-describedby": disableKeyboardA11y ? void 0 : `${ARIA_NODE_DESC_KEY}-${rfId}`, "aria-label": node.ariaLabel, ...node.domAttributes, children: (0, import_jsx_runtime.jsx)(Provider, { value: id2, children: (0, import_jsx_runtime.jsx)(NodeComponent, { id: id2, data: node.data, type: nodeType, positionAbsoluteX: internals.positionAbsolute.x, positionAbsoluteY: internals.positionAbsolute.y, selected: node.selected ?? false, selectable: isSelectable, draggable: isDraggable, deletable: node.deletable ?? true, isConnectable, sourcePosition: node.sourcePosition, targetPosition: node.targetPosition, dragging, dragHandle: node.dragHandle, zIndex: internals.z, parentId: node.parentId, ...nodeDimensions }) }) }); +} +var NodeWrapper$1 = (0, import_react2.memo)(NodeWrapper); +var selector$b = (s) => ({ + nodesDraggable: s.nodesDraggable, + nodesConnectable: s.nodesConnectable, + nodesFocusable: s.nodesFocusable, + elementsSelectable: s.elementsSelectable, + onError: s.onError +}); +function NodeRendererComponent(props) { + const { nodesDraggable, nodesConnectable, nodesFocusable, elementsSelectable, onError } = useStore(selector$b, shallow$1); + const nodeIds = useVisibleNodeIds(props.onlyRenderVisibleElements); + const resizeObserver = useResizeObserver(); + return (0, import_jsx_runtime.jsx)("div", { className: "react-flow__nodes", style: containerStyle, children: nodeIds.map((nodeId) => { + return ( + /* + * The split of responsibilities between NodeRenderer and + * NodeComponentWrapper may appear weird. However, it’s designed to + * minimize the cost of updates when individual nodes change. + * + * For example, when you’re dragging a single node, that node gets + * updated multiple times per second. If `NodeRenderer` were to update + * every time, it would have to re-run the `nodes.map()` loop every + * time. This gets pricey with hundreds of nodes, especially if every + * loop cycle does more than just rendering a JSX element! + * + * As a result of this choice, we took the following implementation + * decisions: + * - NodeRenderer subscribes *only* to node IDs – and therefore + * rerender *only* when visible nodes are added or removed. + * - NodeRenderer performs all operations the result of which can be + * shared between nodes (such as creating the `ResizeObserver` + * instance, or subscribing to `selector`). This means extra prop + * drilling into `NodeComponentWrapper`, but it means we need to run + * these operations only once – instead of once per node. + * - Any operations that you’d normally write inside `nodes.map` are + * moved into `NodeComponentWrapper`. This ensures they are + * memorized – so if `NodeRenderer` *has* to rerender, it only + * needs to regenerate the list of nodes, nothing else. + */ + (0, import_jsx_runtime.jsx)(NodeWrapper$1, { id: nodeId, nodeTypes: props.nodeTypes, nodeExtent: props.nodeExtent, onClick: props.onNodeClick, onMouseEnter: props.onNodeMouseEnter, onMouseMove: props.onNodeMouseMove, onMouseLeave: props.onNodeMouseLeave, onContextMenu: props.onNodeContextMenu, onDoubleClick: props.onNodeDoubleClick, noDragClassName: props.noDragClassName, noPanClassName: props.noPanClassName, rfId: props.rfId, disableKeyboardA11y: props.disableKeyboardA11y, resizeObserver, nodesDraggable, nodesConnectable, nodesFocusable, elementsSelectable, nodeClickDistance: props.nodeClickDistance, onError }, nodeId) + ); + }) }); +} +NodeRendererComponent.displayName = "NodeRenderer"; +var NodeRenderer = (0, import_react2.memo)(NodeRendererComponent); +function useVisibleEdgeIds(onlyRenderVisible) { + const edgeIds = useStore((0, import_react2.useCallback)((s) => { + if (!onlyRenderVisible) { + return s.edges.map((edge) => edge.id); + } + const visibleEdgeIds = []; + if (s.width && s.height) { + for (const edge of s.edges) { + const sourceNode = s.nodeLookup.get(edge.source); + const targetNode = s.nodeLookup.get(edge.target); + if (sourceNode && targetNode && isEdgeVisible({ + sourceNode, + targetNode, + width: s.width, + height: s.height, + transform: s.transform + })) { + visibleEdgeIds.push(edge.id); + } + } + } + return visibleEdgeIds; + }, [onlyRenderVisible]), shallow$1); + return edgeIds; +} +var ArrowSymbol = ({ color: color2 = "none", strokeWidth = 1 }) => { + const style2 = { + strokeWidth, + ...color2 && { stroke: color2 } + }; + return (0, import_jsx_runtime.jsx)("polyline", { className: "arrow", style: style2, strokeLinecap: "round", fill: "none", strokeLinejoin: "round", points: "-5,-4 0,0 -5,4" }); +}; +var ArrowClosedSymbol = ({ color: color2 = "none", strokeWidth = 1 }) => { + const style2 = { + strokeWidth, + ...color2 && { stroke: color2, fill: color2 } + }; + return (0, import_jsx_runtime.jsx)("polyline", { className: "arrowclosed", style: style2, strokeLinecap: "round", strokeLinejoin: "round", points: "-5,-4 0,0 -5,4 -5,-4" }); +}; +var MarkerSymbols = { + [MarkerType.Arrow]: ArrowSymbol, + [MarkerType.ArrowClosed]: ArrowClosedSymbol +}; +function useMarkerSymbol(type) { + const store = useStoreApi(); + const symbol = (0, import_react2.useMemo)(() => { + var _a, _b; + const symbolExists = Object.prototype.hasOwnProperty.call(MarkerSymbols, type); + if (!symbolExists) { + (_b = (_a = store.getState()).onError) == null ? void 0 : _b.call(_a, "009", errorMessages["error009"](type)); + return null; + } + return MarkerSymbols[type]; + }, [type]); + return symbol; +} +var Marker = ({ id: id2, type, color: color2, width = 12.5, height = 12.5, markerUnits = "strokeWidth", strokeWidth, orient = "auto-start-reverse" }) => { + const Symbol2 = useMarkerSymbol(type); + if (!Symbol2) { + return null; + } + return (0, import_jsx_runtime.jsx)("marker", { className: "react-flow__arrowhead", id: id2, markerWidth: `${width}`, markerHeight: `${height}`, viewBox: "-10 -10 20 20", markerUnits, orient, refX: "0", refY: "0", children: (0, import_jsx_runtime.jsx)(Symbol2, { color: color2, strokeWidth }) }); +}; +var MarkerDefinitions = ({ defaultColor, rfId }) => { + const edges = useStore((s) => s.edges); + const defaultEdgeOptions = useStore((s) => s.defaultEdgeOptions); + const markers = (0, import_react2.useMemo)(() => { + const markers2 = createMarkerIds(edges, { + id: rfId, + defaultColor, + defaultMarkerStart: defaultEdgeOptions == null ? void 0 : defaultEdgeOptions.markerStart, + defaultMarkerEnd: defaultEdgeOptions == null ? void 0 : defaultEdgeOptions.markerEnd + }); + return markers2; + }, [edges, defaultEdgeOptions, rfId, defaultColor]); + if (!markers.length) { + return null; + } + return (0, import_jsx_runtime.jsx)("svg", { className: "react-flow__marker", "aria-hidden": "true", children: (0, import_jsx_runtime.jsx)("defs", { children: markers.map((marker) => (0, import_jsx_runtime.jsx)(Marker, { id: marker.id, type: marker.type, color: marker.color, width: marker.width, height: marker.height, markerUnits: marker.markerUnits, strokeWidth: marker.strokeWidth, orient: marker.orient }, marker.id)) }) }); +}; +MarkerDefinitions.displayName = "MarkerDefinitions"; +var MarkerDefinitions$1 = (0, import_react2.memo)(MarkerDefinitions); +function EdgeTextComponent({ x, y, label, labelStyle, labelShowBg = true, labelBgStyle, labelBgPadding = [2, 4], labelBgBorderRadius = 2, children: children2, className, ...rest }) { + const [edgeTextBbox, setEdgeTextBbox] = (0, import_react2.useState)({ x: 1, y: 0, width: 0, height: 0 }); + const edgeTextClasses = cc(["react-flow__edge-textwrapper", className]); + const edgeTextRef = (0, import_react2.useRef)(null); + (0, import_react2.useEffect)(() => { + if (edgeTextRef.current) { + const textBbox = edgeTextRef.current.getBBox(); + setEdgeTextBbox({ + x: textBbox.x, + y: textBbox.y, + width: textBbox.width, + height: textBbox.height + }); + } + }, [label]); + if (!label) { + return null; + } + return (0, import_jsx_runtime.jsxs)("g", { transform: `translate(${x - edgeTextBbox.width / 2} ${y - edgeTextBbox.height / 2})`, className: edgeTextClasses, visibility: edgeTextBbox.width ? "visible" : "hidden", ...rest, children: [labelShowBg && (0, import_jsx_runtime.jsx)("rect", { width: edgeTextBbox.width + 2 * labelBgPadding[0], x: -labelBgPadding[0], y: -labelBgPadding[1], height: edgeTextBbox.height + 2 * labelBgPadding[1], className: "react-flow__edge-textbg", style: labelBgStyle, rx: labelBgBorderRadius, ry: labelBgBorderRadius }), (0, import_jsx_runtime.jsx)("text", { className: "react-flow__edge-text", y: edgeTextBbox.height / 2, dy: "0.3em", ref: edgeTextRef, style: labelStyle, children: label }), children2] }); +} +EdgeTextComponent.displayName = "EdgeText"; +var EdgeText = (0, import_react2.memo)(EdgeTextComponent); +function BaseEdge({ path, labelX, labelY, label, labelStyle, labelShowBg, labelBgStyle, labelBgPadding, labelBgBorderRadius, interactionWidth = 20, ...props }) { + return (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [(0, import_jsx_runtime.jsx)("path", { ...props, d: path, fill: "none", className: cc(["react-flow__edge-path", props.className]) }), interactionWidth ? (0, import_jsx_runtime.jsx)("path", { d: path, fill: "none", strokeOpacity: 0, strokeWidth: interactionWidth, className: "react-flow__edge-interaction" }) : null, label && isNumeric(labelX) && isNumeric(labelY) ? (0, import_jsx_runtime.jsx)(EdgeText, { x: labelX, y: labelY, label, labelStyle, labelShowBg, labelBgStyle, labelBgPadding, labelBgBorderRadius }) : null] }); +} +function getControl({ pos, x1, y1, x2, y2 }) { + if (pos === Position.Left || pos === Position.Right) { + return [0.5 * (x1 + x2), y1]; + } + return [x1, 0.5 * (y1 + y2)]; +} +function getSimpleBezierPath({ sourceX, sourceY, sourcePosition = Position.Bottom, targetX, targetY, targetPosition = Position.Top }) { + const [sourceControlX, sourceControlY] = getControl({ + pos: sourcePosition, + x1: sourceX, + y1: sourceY, + x2: targetX, + y2: targetY + }); + const [targetControlX, targetControlY] = getControl({ + pos: targetPosition, + x1: targetX, + y1: targetY, + x2: sourceX, + y2: sourceY + }); + const [labelX, labelY, offsetX, offsetY] = getBezierEdgeCenter({ + sourceX, + sourceY, + targetX, + targetY, + sourceControlX, + sourceControlY, + targetControlX, + targetControlY + }); + return [ + `M${sourceX},${sourceY} C${sourceControlX},${sourceControlY} ${targetControlX},${targetControlY} ${targetX},${targetY}`, + labelX, + labelY, + offsetX, + offsetY + ]; +} +function createSimpleBezierEdge(params) { + return (0, import_react2.memo)(({ id: id2, sourceX, sourceY, targetX, targetY, sourcePosition, targetPosition, label, labelStyle, labelShowBg, labelBgStyle, labelBgPadding, labelBgBorderRadius, style: style2, markerEnd, markerStart, interactionWidth }) => { + const [path, labelX, labelY] = getSimpleBezierPath({ + sourceX, + sourceY, + sourcePosition, + targetX, + targetY, + targetPosition + }); + const _id = params.isInternal ? void 0 : id2; + return (0, import_jsx_runtime.jsx)(BaseEdge, { id: _id, path, labelX, labelY, label, labelStyle, labelShowBg, labelBgStyle, labelBgPadding, labelBgBorderRadius, style: style2, markerEnd, markerStart, interactionWidth }); + }); +} +var SimpleBezierEdge = createSimpleBezierEdge({ isInternal: false }); +var SimpleBezierEdgeInternal = createSimpleBezierEdge({ isInternal: true }); +SimpleBezierEdge.displayName = "SimpleBezierEdge"; +SimpleBezierEdgeInternal.displayName = "SimpleBezierEdgeInternal"; +function createSmoothStepEdge(params) { + return (0, import_react2.memo)(({ id: id2, sourceX, sourceY, targetX, targetY, label, labelStyle, labelShowBg, labelBgStyle, labelBgPadding, labelBgBorderRadius, style: style2, sourcePosition = Position.Bottom, targetPosition = Position.Top, markerEnd, markerStart, pathOptions, interactionWidth }) => { + const [path, labelX, labelY] = getSmoothStepPath({ + sourceX, + sourceY, + sourcePosition, + targetX, + targetY, + targetPosition, + borderRadius: pathOptions == null ? void 0 : pathOptions.borderRadius, + offset: pathOptions == null ? void 0 : pathOptions.offset, + stepPosition: pathOptions == null ? void 0 : pathOptions.stepPosition + }); + const _id = params.isInternal ? void 0 : id2; + return (0, import_jsx_runtime.jsx)(BaseEdge, { id: _id, path, labelX, labelY, label, labelStyle, labelShowBg, labelBgStyle, labelBgPadding, labelBgBorderRadius, style: style2, markerEnd, markerStart, interactionWidth }); + }); +} +var SmoothStepEdge = createSmoothStepEdge({ isInternal: false }); +var SmoothStepEdgeInternal = createSmoothStepEdge({ isInternal: true }); +SmoothStepEdge.displayName = "SmoothStepEdge"; +SmoothStepEdgeInternal.displayName = "SmoothStepEdgeInternal"; +function createStepEdge(params) { + return (0, import_react2.memo)(({ id: id2, ...props }) => { + var _a; + const _id = params.isInternal ? void 0 : id2; + return (0, import_jsx_runtime.jsx)(SmoothStepEdge, { ...props, id: _id, pathOptions: (0, import_react2.useMemo)(() => { + var _a2; + return { borderRadius: 0, offset: (_a2 = props.pathOptions) == null ? void 0 : _a2.offset }; + }, [(_a = props.pathOptions) == null ? void 0 : _a.offset]) }); + }); +} +var StepEdge = createStepEdge({ isInternal: false }); +var StepEdgeInternal = createStepEdge({ isInternal: true }); +StepEdge.displayName = "StepEdge"; +StepEdgeInternal.displayName = "StepEdgeInternal"; +function createStraightEdge(params) { + return (0, import_react2.memo)(({ id: id2, sourceX, sourceY, targetX, targetY, label, labelStyle, labelShowBg, labelBgStyle, labelBgPadding, labelBgBorderRadius, style: style2, markerEnd, markerStart, interactionWidth }) => { + const [path, labelX, labelY] = getStraightPath({ sourceX, sourceY, targetX, targetY }); + const _id = params.isInternal ? void 0 : id2; + return (0, import_jsx_runtime.jsx)(BaseEdge, { id: _id, path, labelX, labelY, label, labelStyle, labelShowBg, labelBgStyle, labelBgPadding, labelBgBorderRadius, style: style2, markerEnd, markerStart, interactionWidth }); + }); +} +var StraightEdge = createStraightEdge({ isInternal: false }); +var StraightEdgeInternal = createStraightEdge({ isInternal: true }); +StraightEdge.displayName = "StraightEdge"; +StraightEdgeInternal.displayName = "StraightEdgeInternal"; +function createBezierEdge(params) { + return (0, import_react2.memo)(({ id: id2, sourceX, sourceY, targetX, targetY, sourcePosition = Position.Bottom, targetPosition = Position.Top, label, labelStyle, labelShowBg, labelBgStyle, labelBgPadding, labelBgBorderRadius, style: style2, markerEnd, markerStart, pathOptions, interactionWidth }) => { + const [path, labelX, labelY] = getBezierPath({ + sourceX, + sourceY, + sourcePosition, + targetX, + targetY, + targetPosition, + curvature: pathOptions == null ? void 0 : pathOptions.curvature + }); + const _id = params.isInternal ? void 0 : id2; + return (0, import_jsx_runtime.jsx)(BaseEdge, { id: _id, path, labelX, labelY, label, labelStyle, labelShowBg, labelBgStyle, labelBgPadding, labelBgBorderRadius, style: style2, markerEnd, markerStart, interactionWidth }); + }); +} +var BezierEdge = createBezierEdge({ isInternal: false }); +var BezierEdgeInternal = createBezierEdge({ isInternal: true }); +BezierEdge.displayName = "BezierEdge"; +BezierEdgeInternal.displayName = "BezierEdgeInternal"; +var builtinEdgeTypes = { + default: BezierEdgeInternal, + straight: StraightEdgeInternal, + step: StepEdgeInternal, + smoothstep: SmoothStepEdgeInternal, + simplebezier: SimpleBezierEdgeInternal +}; +var nullPosition = { + sourceX: null, + sourceY: null, + targetX: null, + targetY: null, + sourcePosition: null, + targetPosition: null +}; +var shiftX = (x, shift, position) => { + if (position === Position.Left) + return x - shift; + if (position === Position.Right) + return x + shift; + return x; +}; +var shiftY = (y, shift, position) => { + if (position === Position.Top) + return y - shift; + if (position === Position.Bottom) + return y + shift; + return y; +}; +var EdgeUpdaterClassName = "react-flow__edgeupdater"; +function EdgeAnchor({ position, centerX, centerY, radius = 10, onMouseDown, onMouseEnter, onMouseOut, type }) { + return (0, import_jsx_runtime.jsx)("circle", { onMouseDown, onMouseEnter, onMouseOut, className: cc([EdgeUpdaterClassName, `${EdgeUpdaterClassName}-${type}`]), cx: shiftX(centerX, radius, position), cy: shiftY(centerY, radius, position), r: radius, stroke: "transparent", fill: "transparent" }); +} +function EdgeUpdateAnchors({ isReconnectable, reconnectRadius, edge, sourceX, sourceY, targetX, targetY, sourcePosition, targetPosition, onReconnect, onReconnectStart, onReconnectEnd, setReconnecting, setUpdateHover }) { + const store = useStoreApi(); + const handleEdgeUpdater = (event, oppositeHandle) => { + if (event.button !== 0) { + return; + } + const { autoPanOnConnect, domNode, isValidConnection, connectionMode, connectionRadius, lib, onConnectStart, onConnectEnd, cancelConnection, nodeLookup, rfId: flowId, panBy: panBy2, updateConnection } = store.getState(); + const isTarget = oppositeHandle.type === "target"; + const _onReconnectEnd = (evt, connectionState) => { + setReconnecting(false); + onReconnectEnd == null ? void 0 : onReconnectEnd(evt, edge, oppositeHandle.type, connectionState); + }; + const onConnectEdge = (connection) => onReconnect == null ? void 0 : onReconnect(edge, connection); + const _onConnectStart = (_event, params) => { + setReconnecting(true); + onReconnectStart == null ? void 0 : onReconnectStart(event, edge, oppositeHandle.type); + onConnectStart == null ? void 0 : onConnectStart(_event, params); + }; + XYHandle.onPointerDown(event.nativeEvent, { + autoPanOnConnect, + connectionMode, + connectionRadius, + domNode, + handleId: oppositeHandle.id, + nodeId: oppositeHandle.nodeId, + nodeLookup, + isTarget, + edgeUpdaterType: oppositeHandle.type, + lib, + flowId, + cancelConnection, + panBy: panBy2, + isValidConnection, + onConnect: onConnectEdge, + onConnectStart: _onConnectStart, + onConnectEnd, + onReconnectEnd: _onReconnectEnd, + updateConnection, + getTransform: () => store.getState().transform, + getFromHandle: () => store.getState().connection.fromHandle, + dragThreshold: store.getState().connectionDragThreshold, + handleDomNode: event.currentTarget + }); + }; + const onReconnectSourceMouseDown = (event) => handleEdgeUpdater(event, { nodeId: edge.target, id: edge.targetHandle ?? null, type: "target" }); + const onReconnectTargetMouseDown = (event) => handleEdgeUpdater(event, { nodeId: edge.source, id: edge.sourceHandle ?? null, type: "source" }); + const onReconnectMouseEnter = () => setUpdateHover(true); + const onReconnectMouseOut = () => setUpdateHover(false); + return (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [(isReconnectable === true || isReconnectable === "source") && (0, import_jsx_runtime.jsx)(EdgeAnchor, { position: sourcePosition, centerX: sourceX, centerY: sourceY, radius: reconnectRadius, onMouseDown: onReconnectSourceMouseDown, onMouseEnter: onReconnectMouseEnter, onMouseOut: onReconnectMouseOut, type: "source" }), (isReconnectable === true || isReconnectable === "target") && (0, import_jsx_runtime.jsx)(EdgeAnchor, { position: targetPosition, centerX: targetX, centerY: targetY, radius: reconnectRadius, onMouseDown: onReconnectTargetMouseDown, onMouseEnter: onReconnectMouseEnter, onMouseOut: onReconnectMouseOut, type: "target" })] }); +} +function EdgeWrapper({ id: id2, edgesFocusable, edgesReconnectable, elementsSelectable, onClick, onDoubleClick, onContextMenu, onMouseEnter, onMouseMove, onMouseLeave, reconnectRadius, onReconnect, onReconnectStart, onReconnectEnd, rfId, edgeTypes, noPanClassName, onError, disableKeyboardA11y }) { + let edge = useStore((s) => s.edgeLookup.get(id2)); + const defaultEdgeOptions = useStore((s) => s.defaultEdgeOptions); + edge = defaultEdgeOptions ? { ...defaultEdgeOptions, ...edge } : edge; + let edgeType = edge.type || "default"; + let EdgeComponent = (edgeTypes == null ? void 0 : edgeTypes[edgeType]) || builtinEdgeTypes[edgeType]; + if (EdgeComponent === void 0) { + onError == null ? void 0 : onError("011", errorMessages["error011"](edgeType)); + edgeType = "default"; + EdgeComponent = (edgeTypes == null ? void 0 : edgeTypes["default"]) || builtinEdgeTypes.default; + } + const isFocusable = !!(edge.focusable || edgesFocusable && typeof edge.focusable === "undefined"); + const isReconnectable = typeof onReconnect !== "undefined" && (edge.reconnectable || edgesReconnectable && typeof edge.reconnectable === "undefined"); + const isSelectable = !!(edge.selectable || elementsSelectable && typeof edge.selectable === "undefined"); + const edgeRef = (0, import_react2.useRef)(null); + const [updateHover, setUpdateHover] = (0, import_react2.useState)(false); + const [reconnecting, setReconnecting] = (0, import_react2.useState)(false); + const store = useStoreApi(); + const { zIndex, sourceX, sourceY, targetX, targetY, sourcePosition, targetPosition } = useStore((0, import_react2.useCallback)((store2) => { + const sourceNode = store2.nodeLookup.get(edge.source); + const targetNode = store2.nodeLookup.get(edge.target); + if (!sourceNode || !targetNode) { + return { + zIndex: edge.zIndex, + ...nullPosition + }; + } + const edgePosition = getEdgePosition({ + id: id2, + sourceNode, + targetNode, + sourceHandle: edge.sourceHandle || null, + targetHandle: edge.targetHandle || null, + connectionMode: store2.connectionMode, + onError + }); + const zIndex2 = getElevatedEdgeZIndex({ + selected: edge.selected, + zIndex: edge.zIndex, + sourceNode, + targetNode, + elevateOnSelect: store2.elevateEdgesOnSelect, + zIndexMode: store2.zIndexMode + }); + return { + zIndex: zIndex2, + ...edgePosition || nullPosition + }; + }, [edge.source, edge.target, edge.sourceHandle, edge.targetHandle, edge.selected, edge.zIndex]), shallow$1); + const markerStartUrl = (0, import_react2.useMemo)(() => edge.markerStart ? `url('#${getMarkerId(edge.markerStart, rfId)}')` : void 0, [edge.markerStart, rfId]); + const markerEndUrl = (0, import_react2.useMemo)(() => edge.markerEnd ? `url('#${getMarkerId(edge.markerEnd, rfId)}')` : void 0, [edge.markerEnd, rfId]); + if (edge.hidden || sourceX === null || sourceY === null || targetX === null || targetY === null) { + return null; + } + const onEdgeClick = (event) => { + var _a; + const { addSelectedEdges, unselectNodesAndEdges, multiSelectionActive } = store.getState(); + if (isSelectable) { + store.setState({ nodesSelectionActive: false }); + if (edge.selected && multiSelectionActive) { + unselectNodesAndEdges({ nodes: [], edges: [edge] }); + (_a = edgeRef.current) == null ? void 0 : _a.blur(); + } else { + addSelectedEdges([id2]); + } + } + if (onClick) { + onClick(event, edge); + } + }; + const onEdgeDoubleClick = onDoubleClick ? (event) => { + onDoubleClick(event, { ...edge }); + } : void 0; + const onEdgeContextMenu = onContextMenu ? (event) => { + onContextMenu(event, { ...edge }); + } : void 0; + const onEdgeMouseEnter = onMouseEnter ? (event) => { + onMouseEnter(event, { ...edge }); + } : void 0; + const onEdgeMouseMove = onMouseMove ? (event) => { + onMouseMove(event, { ...edge }); + } : void 0; + const onEdgeMouseLeave = onMouseLeave ? (event) => { + onMouseLeave(event, { ...edge }); + } : void 0; + const onKeyDown = (event) => { + var _a; + if (!disableKeyboardA11y && elementSelectionKeys.includes(event.key) && isSelectable) { + const { unselectNodesAndEdges, addSelectedEdges } = store.getState(); + const unselect = event.key === "Escape"; + if (unselect) { + (_a = edgeRef.current) == null ? void 0 : _a.blur(); + unselectNodesAndEdges({ edges: [edge] }); + } else { + addSelectedEdges([id2]); + } + } + }; + return (0, import_jsx_runtime.jsx)("svg", { style: { zIndex }, children: (0, import_jsx_runtime.jsxs)("g", { className: cc([ + "react-flow__edge", + `react-flow__edge-${edgeType}`, + edge.className, + noPanClassName, + { + selected: edge.selected, + animated: edge.animated, + inactive: !isSelectable && !onClick, + updating: updateHover, + selectable: isSelectable + } + ]), onClick: onEdgeClick, onDoubleClick: onEdgeDoubleClick, onContextMenu: onEdgeContextMenu, onMouseEnter: onEdgeMouseEnter, onMouseMove: onEdgeMouseMove, onMouseLeave: onEdgeMouseLeave, onKeyDown: isFocusable ? onKeyDown : void 0, tabIndex: isFocusable ? 0 : void 0, role: edge.ariaRole ?? (isFocusable ? "group" : "img"), "aria-roledescription": "edge", "data-id": id2, "data-testid": `rf__edge-${id2}`, "aria-label": edge.ariaLabel === null ? void 0 : edge.ariaLabel || `Edge from ${edge.source} to ${edge.target}`, "aria-describedby": isFocusable ? `${ARIA_EDGE_DESC_KEY}-${rfId}` : void 0, ref: edgeRef, ...edge.domAttributes, children: [!reconnecting && (0, import_jsx_runtime.jsx)(EdgeComponent, { id: id2, source: edge.source, target: edge.target, type: edge.type, selected: edge.selected, animated: edge.animated, selectable: isSelectable, deletable: edge.deletable ?? true, label: edge.label, labelStyle: edge.labelStyle, labelShowBg: edge.labelShowBg, labelBgStyle: edge.labelBgStyle, labelBgPadding: edge.labelBgPadding, labelBgBorderRadius: edge.labelBgBorderRadius, sourceX, sourceY, targetX, targetY, sourcePosition, targetPosition, data: edge.data, style: edge.style, sourceHandleId: edge.sourceHandle, targetHandleId: edge.targetHandle, markerStart: markerStartUrl, markerEnd: markerEndUrl, pathOptions: "pathOptions" in edge ? edge.pathOptions : void 0, interactionWidth: edge.interactionWidth }), isReconnectable && (0, import_jsx_runtime.jsx)(EdgeUpdateAnchors, { edge, isReconnectable, reconnectRadius, onReconnect, onReconnectStart, onReconnectEnd, sourceX, sourceY, targetX, targetY, sourcePosition, targetPosition, setUpdateHover, setReconnecting })] }) }); +} +var EdgeWrapper$1 = (0, import_react2.memo)(EdgeWrapper); +var selector$a = (s) => ({ + edgesFocusable: s.edgesFocusable, + edgesReconnectable: s.edgesReconnectable, + elementsSelectable: s.elementsSelectable, + connectionMode: s.connectionMode, + onError: s.onError +}); +function EdgeRendererComponent({ defaultMarkerColor, onlyRenderVisibleElements, rfId, edgeTypes, noPanClassName, onReconnect, onEdgeContextMenu, onEdgeMouseEnter, onEdgeMouseMove, onEdgeMouseLeave, onEdgeClick, reconnectRadius, onEdgeDoubleClick, onReconnectStart, onReconnectEnd, disableKeyboardA11y }) { + const { edgesFocusable, edgesReconnectable, elementsSelectable, onError } = useStore(selector$a, shallow$1); + const edgeIds = useVisibleEdgeIds(onlyRenderVisibleElements); + return (0, import_jsx_runtime.jsxs)("div", { className: "react-flow__edges", children: [(0, import_jsx_runtime.jsx)(MarkerDefinitions$1, { defaultColor: defaultMarkerColor, rfId }), edgeIds.map((id2) => { + return (0, import_jsx_runtime.jsx)(EdgeWrapper$1, { id: id2, edgesFocusable, edgesReconnectable, elementsSelectable, noPanClassName, onReconnect, onContextMenu: onEdgeContextMenu, onMouseEnter: onEdgeMouseEnter, onMouseMove: onEdgeMouseMove, onMouseLeave: onEdgeMouseLeave, onClick: onEdgeClick, reconnectRadius, onDoubleClick: onEdgeDoubleClick, onReconnectStart, onReconnectEnd, rfId, onError, edgeTypes, disableKeyboardA11y }, id2); + })] }); +} +EdgeRendererComponent.displayName = "EdgeRenderer"; +var EdgeRenderer = (0, import_react2.memo)(EdgeRendererComponent); +var selector$9 = (s) => `translate(${s.transform[0]}px,${s.transform[1]}px) scale(${s.transform[2]})`; +function Viewport({ children: children2 }) { + const transform2 = useStore(selector$9); + return (0, import_jsx_runtime.jsx)("div", { className: "react-flow__viewport xyflow__viewport react-flow__container", style: { transform: transform2 }, children: children2 }); +} +function useOnInitHandler(onInit) { + const rfInstance = useReactFlow(); + const isInitialized = (0, import_react2.useRef)(false); + (0, import_react2.useEffect)(() => { + if (!isInitialized.current && rfInstance.viewportInitialized && onInit) { + setTimeout(() => onInit(rfInstance), 1); + isInitialized.current = true; + } + }, [onInit, rfInstance.viewportInitialized]); +} +var selector$8 = (state) => { + var _a; + return (_a = state.panZoom) == null ? void 0 : _a.syncViewport; +}; +function useViewportSync(viewport) { + const syncViewport = useStore(selector$8); + const store = useStoreApi(); + (0, import_react2.useEffect)(() => { + if (viewport) { + syncViewport == null ? void 0 : syncViewport(viewport); + store.setState({ transform: [viewport.x, viewport.y, viewport.zoom] }); + } + }, [viewport, syncViewport]); + return null; +} +function storeSelector$1(s) { + return s.connection.inProgress ? { ...s.connection, to: pointToRendererPoint(s.connection.to, s.transform) } : { ...s.connection }; +} +function getSelector(connectionSelector) { + if (connectionSelector) { + const combinedSelector = (s) => { + const connection = storeSelector$1(s); + return connectionSelector(connection); + }; + return combinedSelector; + } + return storeSelector$1; +} +function useConnection(connectionSelector) { + const combinedSelector = getSelector(connectionSelector); + return useStore(combinedSelector, shallow$1); +} +var selector$7 = (s) => ({ + nodesConnectable: s.nodesConnectable, + isValid: s.connection.isValid, + inProgress: s.connection.inProgress, + width: s.width, + height: s.height +}); +function ConnectionLineWrapper({ containerStyle: containerStyle2, style: style2, type, component }) { + const { nodesConnectable, width, height, isValid, inProgress } = useStore(selector$7, shallow$1); + const renderConnection = !!(width && nodesConnectable && inProgress); + if (!renderConnection) { + return null; + } + return (0, import_jsx_runtime.jsx)("svg", { style: containerStyle2, width, height, className: "react-flow__connectionline react-flow__container", children: (0, import_jsx_runtime.jsx)("g", { className: cc(["react-flow__connection", getConnectionStatus(isValid)]), children: (0, import_jsx_runtime.jsx)(ConnectionLine, { style: style2, type, CustomComponent: component, isValid }) }) }); +} +var ConnectionLine = ({ style: style2, type = ConnectionLineType.Bezier, CustomComponent, isValid }) => { + const { inProgress, from, fromNode, fromHandle, fromPosition, to, toNode, toHandle, toPosition, pointer } = useConnection(); + if (!inProgress) { + return; + } + if (CustomComponent) { + return (0, import_jsx_runtime.jsx)(CustomComponent, { connectionLineType: type, connectionLineStyle: style2, fromNode, fromHandle, fromX: from.x, fromY: from.y, toX: to.x, toY: to.y, fromPosition, toPosition, connectionStatus: getConnectionStatus(isValid), toNode, toHandle, pointer }); + } + let path = ""; + const pathParams = { + sourceX: from.x, + sourceY: from.y, + sourcePosition: fromPosition, + targetX: to.x, + targetY: to.y, + targetPosition: toPosition + }; + switch (type) { + case ConnectionLineType.Bezier: + [path] = getBezierPath(pathParams); + break; + case ConnectionLineType.SimpleBezier: + [path] = getSimpleBezierPath(pathParams); + break; + case ConnectionLineType.Step: + [path] = getSmoothStepPath({ + ...pathParams, + borderRadius: 0 + }); + break; + case ConnectionLineType.SmoothStep: + [path] = getSmoothStepPath(pathParams); + break; + default: + [path] = getStraightPath(pathParams); + } + return (0, import_jsx_runtime.jsx)("path", { d: path, fill: "none", className: "react-flow__connection-path", style: style2 }); +}; +ConnectionLine.displayName = "ConnectionLine"; +var emptyTypes = {}; +function useNodeOrEdgeTypesWarning(nodeOrEdgeTypes = emptyTypes) { + const typesRef = (0, import_react2.useRef)(nodeOrEdgeTypes); + const store = useStoreApi(); + (0, import_react2.useEffect)(() => { + var _a, _b; + if (true) { + const usedKeys = /* @__PURE__ */ new Set([...Object.keys(typesRef.current), ...Object.keys(nodeOrEdgeTypes)]); + for (const key of usedKeys) { + if (typesRef.current[key] !== nodeOrEdgeTypes[key]) { + (_b = (_a = store.getState()).onError) == null ? void 0 : _b.call(_a, "002", errorMessages["error002"]()); + break; + } + } + typesRef.current = nodeOrEdgeTypes; + } + }, [nodeOrEdgeTypes]); +} +function useStylesLoadedWarning() { + const store = useStoreApi(); + const checked = (0, import_react2.useRef)(false); + (0, import_react2.useEffect)(() => { + var _a, _b; + if (true) { + if (!checked.current) { + const pane = document.querySelector(".react-flow__pane"); + if (pane && !(window.getComputedStyle(pane).zIndex === "1")) { + (_b = (_a = store.getState()).onError) == null ? void 0 : _b.call(_a, "013", errorMessages["error013"]("react")); + } + checked.current = true; + } + } + }, []); +} +function GraphViewComponent({ nodeTypes, edgeTypes, onInit, onNodeClick, onEdgeClick, onNodeDoubleClick, onEdgeDoubleClick, onNodeMouseEnter, onNodeMouseMove, onNodeMouseLeave, onNodeContextMenu, onSelectionContextMenu, onSelectionStart, onSelectionEnd, connectionLineType, connectionLineStyle, connectionLineComponent, connectionLineContainerStyle, selectionKeyCode, selectionOnDrag, selectionMode, multiSelectionKeyCode, panActivationKeyCode, zoomActivationKeyCode, deleteKeyCode, onlyRenderVisibleElements, elementsSelectable, defaultViewport: defaultViewport2, translateExtent, minZoom, maxZoom, preventScrolling, defaultMarkerColor, zoomOnScroll, zoomOnPinch, panOnScroll, panOnScrollSpeed, panOnScrollMode, zoomOnDoubleClick, panOnDrag, onPaneClick, onPaneMouseEnter, onPaneMouseMove, onPaneMouseLeave, onPaneScroll, onPaneContextMenu, paneClickDistance, nodeClickDistance, onEdgeContextMenu, onEdgeMouseEnter, onEdgeMouseMove, onEdgeMouseLeave, reconnectRadius, onReconnect, onReconnectStart, onReconnectEnd, noDragClassName, noWheelClassName, noPanClassName, disableKeyboardA11y, nodeExtent, rfId, viewport, onViewportChange }) { + useNodeOrEdgeTypesWarning(nodeTypes); + useNodeOrEdgeTypesWarning(edgeTypes); + useStylesLoadedWarning(); + useOnInitHandler(onInit); + useViewportSync(viewport); + return (0, import_jsx_runtime.jsx)(FlowRenderer, { onPaneClick, onPaneMouseEnter, onPaneMouseMove, onPaneMouseLeave, onPaneContextMenu, onPaneScroll, paneClickDistance, deleteKeyCode, selectionKeyCode, selectionOnDrag, selectionMode, onSelectionStart, onSelectionEnd, multiSelectionKeyCode, panActivationKeyCode, zoomActivationKeyCode, elementsSelectable, zoomOnScroll, zoomOnPinch, zoomOnDoubleClick, panOnScroll, panOnScrollSpeed, panOnScrollMode, panOnDrag, defaultViewport: defaultViewport2, translateExtent, minZoom, maxZoom, onSelectionContextMenu, preventScrolling, noDragClassName, noWheelClassName, noPanClassName, disableKeyboardA11y, onViewportChange, isControlledViewport: !!viewport, children: (0, import_jsx_runtime.jsxs)(Viewport, { children: [(0, import_jsx_runtime.jsx)(EdgeRenderer, { edgeTypes, onEdgeClick, onEdgeDoubleClick, onReconnect, onReconnectStart, onReconnectEnd, onlyRenderVisibleElements, onEdgeContextMenu, onEdgeMouseEnter, onEdgeMouseMove, onEdgeMouseLeave, reconnectRadius, defaultMarkerColor, noPanClassName, disableKeyboardA11y, rfId }), (0, import_jsx_runtime.jsx)(ConnectionLineWrapper, { style: connectionLineStyle, type: connectionLineType, component: connectionLineComponent, containerStyle: connectionLineContainerStyle }), (0, import_jsx_runtime.jsx)("div", { className: "react-flow__edgelabel-renderer" }), (0, import_jsx_runtime.jsx)(NodeRenderer, { nodeTypes, onNodeClick, onNodeDoubleClick, onNodeMouseEnter, onNodeMouseMove, onNodeMouseLeave, onNodeContextMenu, nodeClickDistance, onlyRenderVisibleElements, noPanClassName, noDragClassName, disableKeyboardA11y, nodeExtent, rfId }), (0, import_jsx_runtime.jsx)("div", { className: "react-flow__viewport-portal" })] }) }); +} +GraphViewComponent.displayName = "GraphView"; +var GraphView = (0, import_react2.memo)(GraphViewComponent); +var getInitialState = ({ nodes, edges, defaultNodes, defaultEdges, width, height, fitView, fitViewOptions, minZoom = 0.5, maxZoom = 2, nodeOrigin, nodeExtent, zIndexMode = "basic" } = {}) => { + const nodeLookup = /* @__PURE__ */ new Map(); + const parentLookup = /* @__PURE__ */ new Map(); + const connectionLookup = /* @__PURE__ */ new Map(); + const edgeLookup = /* @__PURE__ */ new Map(); + const storeEdges = defaultEdges ?? edges ?? []; + const storeNodes = defaultNodes ?? nodes ?? []; + const storeNodeOrigin = nodeOrigin ?? [0, 0]; + const storeNodeExtent = nodeExtent ?? infiniteExtent; + updateConnectionLookup(connectionLookup, edgeLookup, storeEdges); + const nodesInitialized = adoptUserNodes(storeNodes, nodeLookup, parentLookup, { + nodeOrigin: storeNodeOrigin, + nodeExtent: storeNodeExtent, + zIndexMode + }); + let transform2 = [0, 0, 1]; + if (fitView && width && height) { + const bounds = getInternalNodesBounds(nodeLookup, { + filter: (node) => !!((node.width || node.initialWidth) && (node.height || node.initialHeight)) + }); + const { x, y, zoom } = getViewportForBounds(bounds, width, height, minZoom, maxZoom, (fitViewOptions == null ? void 0 : fitViewOptions.padding) ?? 0.1); + transform2 = [x, y, zoom]; + } + return { + rfId: "1", + width: width ?? 0, + height: height ?? 0, + transform: transform2, + nodes: storeNodes, + nodesInitialized, + nodeLookup, + parentLookup, + edges: storeEdges, + edgeLookup, + connectionLookup, + onNodesChange: null, + onEdgesChange: null, + hasDefaultNodes: defaultNodes !== void 0, + hasDefaultEdges: defaultEdges !== void 0, + panZoom: null, + minZoom, + maxZoom, + translateExtent: infiniteExtent, + nodeExtent: storeNodeExtent, + nodesSelectionActive: false, + userSelectionActive: false, + userSelectionRect: null, + connectionMode: ConnectionMode.Strict, + domNode: null, + paneDragging: false, + noPanClassName: "nopan", + nodeOrigin: storeNodeOrigin, + nodeDragThreshold: 1, + connectionDragThreshold: 1, + snapGrid: [15, 15], + snapToGrid: false, + nodesDraggable: true, + nodesConnectable: true, + nodesFocusable: true, + edgesFocusable: true, + edgesReconnectable: true, + elementsSelectable: true, + elevateNodesOnSelect: true, + elevateEdgesOnSelect: true, + selectNodesOnDrag: true, + multiSelectionActive: false, + fitViewQueued: fitView ?? false, + fitViewOptions, + fitViewResolver: null, + connection: { ...initialConnection }, + connectionClickStartHandle: null, + connectOnClick: true, + ariaLiveMessage: "", + autoPanOnConnect: true, + autoPanOnNodeDrag: true, + autoPanOnNodeFocus: true, + autoPanSpeed: 15, + connectionRadius: 20, + onError: devWarn, + isValidConnection: void 0, + onSelectionChangeHandlers: [], + lib: "react", + debug: false, + ariaLabelConfig: defaultAriaLabelConfig, + zIndexMode, + onNodesChangeMiddlewareMap: /* @__PURE__ */ new Map(), + onEdgesChangeMiddlewareMap: /* @__PURE__ */ new Map() + }; +}; +var createStore2 = ({ nodes, edges, defaultNodes, defaultEdges, width, height, fitView, fitViewOptions, minZoom, maxZoom, nodeOrigin, nodeExtent, zIndexMode }) => createWithEqualityFn((set3, get3) => { + async function resolveFitView() { + const { nodeLookup, panZoom, fitViewOptions: fitViewOptions2, fitViewResolver, width: width2, height: height2, minZoom: minZoom2, maxZoom: maxZoom2 } = get3(); + if (!panZoom) { + return; + } + await fitViewport({ + nodes: nodeLookup, + width: width2, + height: height2, + panZoom, + minZoom: minZoom2, + maxZoom: maxZoom2 + }, fitViewOptions2); + fitViewResolver == null ? void 0 : fitViewResolver.resolve(true); + set3({ fitViewResolver: null }); + } + return { + ...getInitialState({ + nodes, + edges, + width, + height, + fitView, + fitViewOptions, + minZoom, + maxZoom, + nodeOrigin, + nodeExtent, + defaultNodes, + defaultEdges, + zIndexMode + }), + setNodes: (nodes2) => { + const { nodeLookup, parentLookup, nodeOrigin: nodeOrigin2, elevateNodesOnSelect, fitViewQueued, zIndexMode: zIndexMode2 } = get3(); + const nodesInitialized = adoptUserNodes(nodes2, nodeLookup, parentLookup, { + nodeOrigin: nodeOrigin2, + nodeExtent, + elevateNodesOnSelect, + checkEquality: true, + zIndexMode: zIndexMode2 + }); + if (fitViewQueued && nodesInitialized) { + resolveFitView(); + set3({ nodes: nodes2, nodesInitialized, fitViewQueued: false, fitViewOptions: void 0 }); + } else { + set3({ nodes: nodes2, nodesInitialized }); + } + }, + setEdges: (edges2) => { + const { connectionLookup, edgeLookup } = get3(); + updateConnectionLookup(connectionLookup, edgeLookup, edges2); + set3({ edges: edges2 }); + }, + setDefaultNodesAndEdges: (nodes2, edges2) => { + if (nodes2) { + const { setNodes } = get3(); + setNodes(nodes2); + set3({ hasDefaultNodes: true }); + } + if (edges2) { + const { setEdges } = get3(); + setEdges(edges2); + set3({ hasDefaultEdges: true }); + } + }, + /* + * Every node gets registerd at a ResizeObserver. Whenever a node + * changes its dimensions, this function is called to measure the + * new dimensions and update the nodes. + */ + updateNodeInternals: (updates) => { + const { triggerNodeChanges, nodeLookup, parentLookup, domNode, nodeOrigin: nodeOrigin2, nodeExtent: nodeExtent2, debug, fitViewQueued, zIndexMode: zIndexMode2 } = get3(); + const { changes, updatedInternals } = updateNodeInternals(updates, nodeLookup, parentLookup, domNode, nodeOrigin2, nodeExtent2, zIndexMode2); + if (!updatedInternals) { + return; + } + updateAbsolutePositions(nodeLookup, parentLookup, { nodeOrigin: nodeOrigin2, nodeExtent: nodeExtent2, zIndexMode: zIndexMode2 }); + if (fitViewQueued) { + resolveFitView(); + set3({ fitViewQueued: false, fitViewOptions: void 0 }); + } else { + set3({}); + } + if ((changes == null ? void 0 : changes.length) > 0) { + if (debug) { + console.log("React Flow: trigger node changes", changes); + } + triggerNodeChanges == null ? void 0 : triggerNodeChanges(changes); + } + }, + updateNodePositions: (nodeDragItems, dragging = false) => { + const parentExpandChildren = []; + let changes = []; + const { nodeLookup, triggerNodeChanges, connection, updateConnection, onNodesChangeMiddlewareMap } = get3(); + for (const [id2, dragItem] of nodeDragItems) { + const node = nodeLookup.get(id2); + const expandParent = !!((node == null ? void 0 : node.expandParent) && (node == null ? void 0 : node.parentId) && (dragItem == null ? void 0 : dragItem.position)); + const change = { + id: id2, + type: "position", + position: expandParent ? { + x: Math.max(0, dragItem.position.x), + y: Math.max(0, dragItem.position.y) + } : dragItem.position, + dragging + }; + if (node && connection.inProgress && connection.fromNode.id === node.id) { + const updatedFrom = getHandlePosition(node, connection.fromHandle, Position.Left, true); + updateConnection({ ...connection, from: updatedFrom }); + } + if (expandParent && node.parentId) { + parentExpandChildren.push({ + id: id2, + parentId: node.parentId, + rect: { + ...dragItem.internals.positionAbsolute, + width: dragItem.measured.width ?? 0, + height: dragItem.measured.height ?? 0 + } + }); + } + changes.push(change); + } + if (parentExpandChildren.length > 0) { + const { parentLookup, nodeOrigin: nodeOrigin2 } = get3(); + const parentExpandChanges = handleExpandParent(parentExpandChildren, nodeLookup, parentLookup, nodeOrigin2); + changes.push(...parentExpandChanges); + } + for (const middleware of onNodesChangeMiddlewareMap.values()) { + changes = middleware(changes); + } + triggerNodeChanges(changes); + }, + triggerNodeChanges: (changes) => { + const { onNodesChange, setNodes, nodes: nodes2, hasDefaultNodes, debug } = get3(); + if (changes == null ? void 0 : changes.length) { + if (hasDefaultNodes) { + const updatedNodes = applyNodeChanges(changes, nodes2); + setNodes(updatedNodes); + } + if (debug) { + console.log("React Flow: trigger node changes", changes); + } + onNodesChange == null ? void 0 : onNodesChange(changes); + } + }, + triggerEdgeChanges: (changes) => { + const { onEdgesChange, setEdges, edges: edges2, hasDefaultEdges, debug } = get3(); + if (changes == null ? void 0 : changes.length) { + if (hasDefaultEdges) { + const updatedEdges = applyEdgeChanges(changes, edges2); + setEdges(updatedEdges); + } + if (debug) { + console.log("React Flow: trigger edge changes", changes); + } + onEdgesChange == null ? void 0 : onEdgesChange(changes); + } + }, + addSelectedNodes: (selectedNodeIds) => { + const { multiSelectionActive, edgeLookup, nodeLookup, triggerNodeChanges, triggerEdgeChanges } = get3(); + if (multiSelectionActive) { + const nodeChanges = selectedNodeIds.map((nodeId) => createSelectionChange(nodeId, true)); + triggerNodeChanges(nodeChanges); + return; + } + triggerNodeChanges(getSelectionChanges(nodeLookup, /* @__PURE__ */ new Set([...selectedNodeIds]), true)); + triggerEdgeChanges(getSelectionChanges(edgeLookup)); + }, + addSelectedEdges: (selectedEdgeIds) => { + const { multiSelectionActive, edgeLookup, nodeLookup, triggerNodeChanges, triggerEdgeChanges } = get3(); + if (multiSelectionActive) { + const changedEdges = selectedEdgeIds.map((edgeId) => createSelectionChange(edgeId, true)); + triggerEdgeChanges(changedEdges); + return; + } + triggerEdgeChanges(getSelectionChanges(edgeLookup, /* @__PURE__ */ new Set([...selectedEdgeIds]))); + triggerNodeChanges(getSelectionChanges(nodeLookup, /* @__PURE__ */ new Set(), true)); + }, + unselectNodesAndEdges: ({ nodes: nodes2, edges: edges2 } = {}) => { + const { edges: storeEdges, nodes: storeNodes, nodeLookup, triggerNodeChanges, triggerEdgeChanges } = get3(); + const nodesToUnselect = nodes2 ? nodes2 : storeNodes; + const edgesToUnselect = edges2 ? edges2 : storeEdges; + const nodeChanges = nodesToUnselect.map((n) => { + const internalNode = nodeLookup.get(n.id); + if (internalNode) { + internalNode.selected = false; + } + return createSelectionChange(n.id, false); + }); + const edgeChanges = edgesToUnselect.map((edge) => createSelectionChange(edge.id, false)); + triggerNodeChanges(nodeChanges); + triggerEdgeChanges(edgeChanges); + }, + setMinZoom: (minZoom2) => { + const { panZoom, maxZoom: maxZoom2 } = get3(); + panZoom == null ? void 0 : panZoom.setScaleExtent([minZoom2, maxZoom2]); + set3({ minZoom: minZoom2 }); + }, + setMaxZoom: (maxZoom2) => { + const { panZoom, minZoom: minZoom2 } = get3(); + panZoom == null ? void 0 : panZoom.setScaleExtent([minZoom2, maxZoom2]); + set3({ maxZoom: maxZoom2 }); + }, + setTranslateExtent: (translateExtent) => { + var _a; + (_a = get3().panZoom) == null ? void 0 : _a.setTranslateExtent(translateExtent); + set3({ translateExtent }); + }, + resetSelectedElements: () => { + const { edges: edges2, nodes: nodes2, triggerNodeChanges, triggerEdgeChanges, elementsSelectable } = get3(); + if (!elementsSelectable) { + return; + } + const nodeChanges = nodes2.reduce((res, node) => node.selected ? [...res, createSelectionChange(node.id, false)] : res, []); + const edgeChanges = edges2.reduce((res, edge) => edge.selected ? [...res, createSelectionChange(edge.id, false)] : res, []); + triggerNodeChanges(nodeChanges); + triggerEdgeChanges(edgeChanges); + }, + setNodeExtent: (nextNodeExtent) => { + const { nodes: nodes2, nodeLookup, parentLookup, nodeOrigin: nodeOrigin2, elevateNodesOnSelect, nodeExtent: nodeExtent2, zIndexMode: zIndexMode2 } = get3(); + if (nextNodeExtent[0][0] === nodeExtent2[0][0] && nextNodeExtent[0][1] === nodeExtent2[0][1] && nextNodeExtent[1][0] === nodeExtent2[1][0] && nextNodeExtent[1][1] === nodeExtent2[1][1]) { + return; + } + adoptUserNodes(nodes2, nodeLookup, parentLookup, { + nodeOrigin: nodeOrigin2, + nodeExtent: nextNodeExtent, + elevateNodesOnSelect, + checkEquality: false, + zIndexMode: zIndexMode2 + }); + set3({ nodeExtent: nextNodeExtent }); + }, + panBy: (delta) => { + const { transform: transform2, width: width2, height: height2, panZoom, translateExtent } = get3(); + return panBy({ delta, panZoom, transform: transform2, translateExtent, width: width2, height: height2 }); + }, + setCenter: async (x, y, options) => { + const { width: width2, height: height2, maxZoom: maxZoom2, panZoom } = get3(); + if (!panZoom) { + return Promise.resolve(false); + } + const nextZoom = typeof (options == null ? void 0 : options.zoom) !== "undefined" ? options.zoom : maxZoom2; + await panZoom.setViewport({ + x: width2 / 2 - x * nextZoom, + y: height2 / 2 - y * nextZoom, + zoom: nextZoom + }, { duration: options == null ? void 0 : options.duration, ease: options == null ? void 0 : options.ease, interpolate: options == null ? void 0 : options.interpolate }); + return Promise.resolve(true); + }, + cancelConnection: () => { + set3({ + connection: { ...initialConnection } + }); + }, + updateConnection: (connection) => { + set3({ connection }); + }, + reset: () => set3({ ...getInitialState() }) + }; +}, Object.is); +function ReactFlowProvider({ initialNodes: nodes, initialEdges: edges, defaultNodes, defaultEdges, initialWidth: width, initialHeight: height, initialMinZoom: minZoom, initialMaxZoom: maxZoom, initialFitViewOptions: fitViewOptions, fitView, nodeOrigin, nodeExtent, zIndexMode, children: children2 }) { + const [store] = (0, import_react2.useState)(() => createStore2({ + nodes, + edges, + defaultNodes, + defaultEdges, + width, + height, + fitView, + minZoom, + maxZoom, + fitViewOptions, + nodeOrigin, + nodeExtent, + zIndexMode + })); + return (0, import_jsx_runtime.jsx)(Provider$1, { value: store, children: (0, import_jsx_runtime.jsx)(BatchProvider, { children: children2 }) }); +} +function Wrapper({ children: children2, nodes, edges, defaultNodes, defaultEdges, width, height, fitView, fitViewOptions, minZoom, maxZoom, nodeOrigin, nodeExtent, zIndexMode }) { + const isWrapped = (0, import_react2.useContext)(StoreContext); + if (isWrapped) { + return (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children: children2 }); + } + return (0, import_jsx_runtime.jsx)(ReactFlowProvider, { initialNodes: nodes, initialEdges: edges, defaultNodes, defaultEdges, initialWidth: width, initialHeight: height, fitView, initialFitViewOptions: fitViewOptions, initialMinZoom: minZoom, initialMaxZoom: maxZoom, nodeOrigin, nodeExtent, zIndexMode, children: children2 }); +} +var wrapperStyle = { + width: "100%", + height: "100%", + overflow: "hidden", + position: "relative", + zIndex: 0 +}; +function ReactFlow({ nodes, edges, defaultNodes, defaultEdges, className, nodeTypes, edgeTypes, onNodeClick, onEdgeClick, onInit, onMove, onMoveStart, onMoveEnd, onConnect, onConnectStart, onConnectEnd, onClickConnectStart, onClickConnectEnd, onNodeMouseEnter, onNodeMouseMove, onNodeMouseLeave, onNodeContextMenu, onNodeDoubleClick, onNodeDragStart, onNodeDrag, onNodeDragStop, onNodesDelete, onEdgesDelete, onDelete, onSelectionChange, onSelectionDragStart, onSelectionDrag, onSelectionDragStop, onSelectionContextMenu, onSelectionStart, onSelectionEnd, onBeforeDelete, connectionMode, connectionLineType = ConnectionLineType.Bezier, connectionLineStyle, connectionLineComponent, connectionLineContainerStyle, deleteKeyCode = "Backspace", selectionKeyCode = "Shift", selectionOnDrag = false, selectionMode = SelectionMode.Full, panActivationKeyCode = "Space", multiSelectionKeyCode = isMacOs() ? "Meta" : "Control", zoomActivationKeyCode = isMacOs() ? "Meta" : "Control", snapToGrid, snapGrid, onlyRenderVisibleElements = false, selectNodesOnDrag, nodesDraggable, autoPanOnNodeFocus, nodesConnectable, nodesFocusable, nodeOrigin = defaultNodeOrigin, edgesFocusable, edgesReconnectable, elementsSelectable = true, defaultViewport: defaultViewport$1 = defaultViewport, minZoom = 0.5, maxZoom = 2, translateExtent = infiniteExtent, preventScrolling = true, nodeExtent, defaultMarkerColor = "#b1b1b7", zoomOnScroll = true, zoomOnPinch = true, panOnScroll = false, panOnScrollSpeed = 0.5, panOnScrollMode = PanOnScrollMode.Free, zoomOnDoubleClick = true, panOnDrag = true, onPaneClick, onPaneMouseEnter, onPaneMouseMove, onPaneMouseLeave, onPaneScroll, onPaneContextMenu, paneClickDistance = 1, nodeClickDistance = 0, children: children2, onReconnect, onReconnectStart, onReconnectEnd, onEdgeContextMenu, onEdgeDoubleClick, onEdgeMouseEnter, onEdgeMouseMove, onEdgeMouseLeave, reconnectRadius = 10, onNodesChange, onEdgesChange, noDragClassName = "nodrag", noWheelClassName = "nowheel", noPanClassName = "nopan", fitView, fitViewOptions, connectOnClick, attributionPosition, proOptions, defaultEdgeOptions, elevateNodesOnSelect = true, elevateEdgesOnSelect = false, disableKeyboardA11y = false, autoPanOnConnect, autoPanOnNodeDrag, autoPanSpeed, connectionRadius, isValidConnection, onError, style: style2, id: id2, nodeDragThreshold, connectionDragThreshold, viewport, onViewportChange, width, height, colorMode = "light", debug, onScroll, ariaLabelConfig, zIndexMode = "basic", ...rest }, ref) { + const rfId = id2 || "1"; + const colorModeClassName = useColorModeClass(colorMode); + const wrapperOnScroll = (0, import_react2.useCallback)((e) => { + e.currentTarget.scrollTo({ top: 0, left: 0, behavior: "instant" }); + onScroll == null ? void 0 : onScroll(e); + }, [onScroll]); + return (0, import_jsx_runtime.jsx)("div", { "data-testid": "rf__wrapper", ...rest, onScroll: wrapperOnScroll, style: { ...style2, ...wrapperStyle }, ref, className: cc(["react-flow", className, colorModeClassName]), id: id2, role: "application", children: (0, import_jsx_runtime.jsxs)(Wrapper, { nodes, edges, width, height, fitView, fitViewOptions, minZoom, maxZoom, nodeOrigin, nodeExtent, zIndexMode, children: [(0, import_jsx_runtime.jsx)(GraphView, { onInit, onNodeClick, onEdgeClick, onNodeMouseEnter, onNodeMouseMove, onNodeMouseLeave, onNodeContextMenu, onNodeDoubleClick, nodeTypes, edgeTypes, connectionLineType, connectionLineStyle, connectionLineComponent, connectionLineContainerStyle, selectionKeyCode, selectionOnDrag, selectionMode, deleteKeyCode, multiSelectionKeyCode, panActivationKeyCode, zoomActivationKeyCode, onlyRenderVisibleElements, defaultViewport: defaultViewport$1, translateExtent, minZoom, maxZoom, preventScrolling, zoomOnScroll, zoomOnPinch, zoomOnDoubleClick, panOnScroll, panOnScrollSpeed, panOnScrollMode, panOnDrag, onPaneClick, onPaneMouseEnter, onPaneMouseMove, onPaneMouseLeave, onPaneScroll, onPaneContextMenu, paneClickDistance, nodeClickDistance, onSelectionContextMenu, onSelectionStart, onSelectionEnd, onReconnect, onReconnectStart, onReconnectEnd, onEdgeContextMenu, onEdgeDoubleClick, onEdgeMouseEnter, onEdgeMouseMove, onEdgeMouseLeave, reconnectRadius, defaultMarkerColor, noDragClassName, noWheelClassName, noPanClassName, rfId, disableKeyboardA11y, nodeExtent, viewport, onViewportChange }), (0, import_jsx_runtime.jsx)(StoreUpdater, { nodes, edges, defaultNodes, defaultEdges, onConnect, onConnectStart, onConnectEnd, onClickConnectStart, onClickConnectEnd, nodesDraggable, autoPanOnNodeFocus, nodesConnectable, nodesFocusable, edgesFocusable, edgesReconnectable, elementsSelectable, elevateNodesOnSelect, elevateEdgesOnSelect, minZoom, maxZoom, nodeExtent, onNodesChange, onEdgesChange, snapToGrid, snapGrid, connectionMode, translateExtent, connectOnClick, defaultEdgeOptions, fitView, fitViewOptions, onNodesDelete, onEdgesDelete, onDelete, onNodeDragStart, onNodeDrag, onNodeDragStop, onSelectionDrag, onSelectionDragStart, onSelectionDragStop, onMove, onMoveStart, onMoveEnd, noPanClassName, nodeOrigin, rfId, autoPanOnConnect, autoPanOnNodeDrag, autoPanSpeed, onError, connectionRadius, isValidConnection, selectNodesOnDrag, nodeDragThreshold, connectionDragThreshold, onBeforeDelete, debug, ariaLabelConfig, zIndexMode }), (0, import_jsx_runtime.jsx)(SelectionListener, { onSelectionChange }), children2, (0, import_jsx_runtime.jsx)(Attribution, { proOptions, position: attributionPosition }), (0, import_jsx_runtime.jsx)(A11yDescriptions, { rfId, disableKeyboardA11y })] }) }); +} +var index = fixedForwardRef(ReactFlow); +var selector$6 = (s) => { + var _a; + return (_a = s.domNode) == null ? void 0 : _a.querySelector(".react-flow__edgelabel-renderer"); +}; +function EdgeLabelRenderer({ children: children2 }) { + const edgeLabelRenderer = useStore(selector$6); + if (!edgeLabelRenderer) { + return null; + } + return (0, import_react_dom.createPortal)(children2, edgeLabelRenderer); +} +var selector$5 = (s) => { + var _a; + return (_a = s.domNode) == null ? void 0 : _a.querySelector(".react-flow__viewport-portal"); +}; +function ViewportPortal({ children: children2 }) { + const viewPortalDiv = useStore(selector$5); + if (!viewPortalDiv) { + return null; + } + return (0, import_react_dom.createPortal)(children2, viewPortalDiv); +} +function useUpdateNodeInternals() { + const store = useStoreApi(); + return (0, import_react2.useCallback)((id2) => { + const { domNode, updateNodeInternals: updateNodeInternals2 } = store.getState(); + const updateIds = Array.isArray(id2) ? id2 : [id2]; + const updates = /* @__PURE__ */ new Map(); + updateIds.forEach((updateId) => { + const nodeElement = domNode == null ? void 0 : domNode.querySelector(`.react-flow__node[data-id="${updateId}"]`); + if (nodeElement) { + updates.set(updateId, { id: updateId, nodeElement, force: true }); + } + }); + requestAnimationFrame(() => updateNodeInternals2(updates, { triggerFitView: false })); + }, []); +} +var nodesSelector = (state) => state.nodes; +function useNodes() { + const nodes = useStore(nodesSelector, shallow$1); + return nodes; +} +var edgesSelector = (state) => state.edges; +function useEdges() { + const edges = useStore(edgesSelector, shallow$1); + return edges; +} +var viewportSelector = (state) => ({ + x: state.transform[0], + y: state.transform[1], + zoom: state.transform[2] +}); +function useViewport() { + const viewport = useStore(viewportSelector, shallow$1); + return viewport; +} +function useNodesState(initialNodes) { + const [nodes, setNodes] = (0, import_react2.useState)(initialNodes); + const onNodesChange = (0, import_react2.useCallback)((changes) => setNodes((nds) => applyNodeChanges(changes, nds)), []); + return [nodes, setNodes, onNodesChange]; +} +function useEdgesState(initialEdges) { + const [edges, setEdges] = (0, import_react2.useState)(initialEdges); + const onEdgesChange = (0, import_react2.useCallback)((changes) => setEdges((eds) => applyEdgeChanges(changes, eds)), []); + return [edges, setEdges, onEdgesChange]; +} +function useOnViewportChange({ onStart, onChange, onEnd }) { + const store = useStoreApi(); + (0, import_react2.useEffect)(() => { + store.setState({ onViewportChangeStart: onStart }); + }, [onStart]); + (0, import_react2.useEffect)(() => { + store.setState({ onViewportChange: onChange }); + }, [onChange]); + (0, import_react2.useEffect)(() => { + store.setState({ onViewportChangeEnd: onEnd }); + }, [onEnd]); +} +function useOnSelectionChange({ onChange }) { + const store = useStoreApi(); + (0, import_react2.useEffect)(() => { + const nextOnSelectionChangeHandlers = [...store.getState().onSelectionChangeHandlers, onChange]; + store.setState({ onSelectionChangeHandlers: nextOnSelectionChangeHandlers }); + return () => { + const nextHandlers = store.getState().onSelectionChangeHandlers.filter((fn) => fn !== onChange); + store.setState({ onSelectionChangeHandlers: nextHandlers }); + }; + }, [onChange]); +} +var selector$4 = (options) => (s) => { + if (!options.includeHiddenNodes) { + return s.nodesInitialized; + } + if (s.nodeLookup.size === 0) { + return false; + } + for (const [, { internals }] of s.nodeLookup) { + if (internals.handleBounds === void 0 || !nodeHasDimensions(internals.userNode)) { + return false; + } + } + return true; +}; +function useNodesInitialized(options = { + includeHiddenNodes: false +}) { + const initialized = useStore(selector$4(options)); + return initialized; +} +function useHandleConnections({ type, id: id2, nodeId, onConnect, onDisconnect }) { + console.warn("[DEPRECATED] `useHandleConnections` is deprecated. Instead use `useNodeConnections` https://reactflow.dev/api-reference/hooks/useNodeConnections"); + const _nodeId = useNodeId(); + const currentNodeId = nodeId ?? _nodeId; + const prevConnections = (0, import_react2.useRef)(null); + const connections = useStore((state) => state.connectionLookup.get(`${currentNodeId}-${type}${id2 ? `-${id2}` : ""}`), areConnectionMapsEqual); + (0, import_react2.useEffect)(() => { + if (prevConnections.current && prevConnections.current !== connections) { + const _connections = connections ?? /* @__PURE__ */ new Map(); + handleConnectionChange(prevConnections.current, _connections, onDisconnect); + handleConnectionChange(_connections, prevConnections.current, onConnect); + } + prevConnections.current = connections ?? /* @__PURE__ */ new Map(); + }, [connections, onConnect, onDisconnect]); + return (0, import_react2.useMemo)(() => Array.from((connections == null ? void 0 : connections.values()) ?? []), [connections]); +} +var error014 = errorMessages["error014"](); +function useNodeConnections({ id: id2, handleType, handleId, onConnect, onDisconnect } = {}) { + const nodeId = useNodeId(); + const currentNodeId = id2 ?? nodeId; + if (!currentNodeId) { + throw new Error(error014); + } + const prevConnections = (0, import_react2.useRef)(null); + const connections = useStore((state) => state.connectionLookup.get(`${currentNodeId}${handleType ? handleId ? `-${handleType}-${handleId}` : `-${handleType}` : ""}`), areConnectionMapsEqual); + (0, import_react2.useEffect)(() => { + if (prevConnections.current && prevConnections.current !== connections) { + const _connections = connections ?? /* @__PURE__ */ new Map(); + handleConnectionChange(prevConnections.current, _connections, onDisconnect); + handleConnectionChange(_connections, prevConnections.current, onConnect); + } + prevConnections.current = connections ?? /* @__PURE__ */ new Map(); + }, [connections, onConnect, onDisconnect]); + return (0, import_react2.useMemo)(() => Array.from((connections == null ? void 0 : connections.values()) ?? []), [connections]); +} +function useNodesData(nodeIds) { + const nodesData = useStore((0, import_react2.useCallback)((s) => { + const data = []; + const isArrayOfIds = Array.isArray(nodeIds); + const _nodeIds = isArrayOfIds ? nodeIds : [nodeIds]; + for (const nodeId of _nodeIds) { + const node = s.nodeLookup.get(nodeId); + if (node) { + data.push({ + id: node.id, + type: node.type, + data: node.data + }); + } + } + return isArrayOfIds ? data : data[0] ?? null; + }, [nodeIds]), shallowNodeData); + return nodesData; +} +function useInternalNode(id2) { + const node = useStore((0, import_react2.useCallback)((s) => s.nodeLookup.get(id2), [id2]), shallow$1); + return node; +} +function experimental_useOnNodesChangeMiddleware(fn) { + const store = useStoreApi(); + const [symbol] = (0, import_react2.useState)(() => Symbol()); + (0, import_react2.useEffect)(() => { + const { onNodesChangeMiddlewareMap } = store.getState(); + onNodesChangeMiddlewareMap.set(symbol, fn); + }, [fn]); + (0, import_react2.useEffect)(() => { + const { onNodesChangeMiddlewareMap } = store.getState(); + return () => { + onNodesChangeMiddlewareMap.delete(symbol); + }; + }, []); +} +function experimental_useOnEdgesChangeMiddleware(fn) { + const store = useStoreApi(); + const [symbol] = (0, import_react2.useState)(() => Symbol()); + (0, import_react2.useEffect)(() => { + const { onEdgesChangeMiddlewareMap } = store.getState(); + onEdgesChangeMiddlewareMap.set(symbol, fn); + }, [fn]); + (0, import_react2.useEffect)(() => { + const { onEdgesChangeMiddlewareMap } = store.getState(); + return () => { + onEdgesChangeMiddlewareMap.delete(symbol); + }; + }, []); +} +function LinePattern({ dimensions, lineWidth, variant, className }) { + return (0, import_jsx_runtime.jsx)("path", { strokeWidth: lineWidth, d: `M${dimensions[0] / 2} 0 V${dimensions[1]} M0 ${dimensions[1] / 2} H${dimensions[0]}`, className: cc(["react-flow__background-pattern", variant, className]) }); +} +function DotPattern({ radius, className }) { + return (0, import_jsx_runtime.jsx)("circle", { cx: radius, cy: radius, r: radius, className: cc(["react-flow__background-pattern", "dots", className]) }); +} +var BackgroundVariant; +(function(BackgroundVariant2) { + BackgroundVariant2["Lines"] = "lines"; + BackgroundVariant2["Dots"] = "dots"; + BackgroundVariant2["Cross"] = "cross"; +})(BackgroundVariant || (BackgroundVariant = {})); +var defaultSize = { + [BackgroundVariant.Dots]: 1, + [BackgroundVariant.Lines]: 1, + [BackgroundVariant.Cross]: 6 +}; +var selector$3 = (s) => ({ transform: s.transform, patternId: `pattern-${s.rfId}` }); +function BackgroundComponent({ + id: id2, + variant = BackgroundVariant.Dots, + // only used for dots and cross + gap = 20, + // only used for lines and cross + size, + lineWidth = 1, + offset = 0, + color: color2, + bgColor, + style: style2, + className, + patternClassName +}) { + const ref = (0, import_react2.useRef)(null); + const { transform: transform2, patternId } = useStore(selector$3, shallow$1); + const patternSize = size || defaultSize[variant]; + const isDots = variant === BackgroundVariant.Dots; + const isCross = variant === BackgroundVariant.Cross; + const gapXY = Array.isArray(gap) ? gap : [gap, gap]; + const scaledGap = [gapXY[0] * transform2[2] || 1, gapXY[1] * transform2[2] || 1]; + const scaledSize = patternSize * transform2[2]; + const offsetXY = Array.isArray(offset) ? offset : [offset, offset]; + const patternDimensions = isCross ? [scaledSize, scaledSize] : scaledGap; + const scaledOffset = [ + offsetXY[0] * transform2[2] || 1 + patternDimensions[0] / 2, + offsetXY[1] * transform2[2] || 1 + patternDimensions[1] / 2 + ]; + const _patternId = `${patternId}${id2 ? id2 : ""}`; + return (0, import_jsx_runtime.jsxs)("svg", { className: cc(["react-flow__background", className]), style: { + ...style2, + ...containerStyle, + "--xy-background-color-props": bgColor, + "--xy-background-pattern-color-props": color2 + }, ref, "data-testid": "rf__background", children: [(0, import_jsx_runtime.jsx)("pattern", { id: _patternId, x: transform2[0] % scaledGap[0], y: transform2[1] % scaledGap[1], width: scaledGap[0], height: scaledGap[1], patternUnits: "userSpaceOnUse", patternTransform: `translate(-${scaledOffset[0]},-${scaledOffset[1]})`, children: isDots ? (0, import_jsx_runtime.jsx)(DotPattern, { radius: scaledSize / 2, className: patternClassName }) : (0, import_jsx_runtime.jsx)(LinePattern, { dimensions: patternDimensions, lineWidth, variant, className: patternClassName }) }), (0, import_jsx_runtime.jsx)("rect", { x: "0", y: "0", width: "100%", height: "100%", fill: `url(#${_patternId})` })] }); +} +BackgroundComponent.displayName = "Background"; +var Background = (0, import_react2.memo)(BackgroundComponent); +function PlusIcon() { + return (0, import_jsx_runtime.jsx)("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 32 32", children: (0, import_jsx_runtime.jsx)("path", { d: "M32 18.133H18.133V32h-4.266V18.133H0v-4.266h13.867V0h4.266v13.867H32z" }) }); +} +function MinusIcon() { + return (0, import_jsx_runtime.jsx)("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 32 5", children: (0, import_jsx_runtime.jsx)("path", { d: "M0 0h32v4.2H0z" }) }); +} +function FitViewIcon() { + return (0, import_jsx_runtime.jsx)("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 32 30", children: (0, import_jsx_runtime.jsx)("path", { d: "M3.692 4.63c0-.53.4-.938.939-.938h5.215V0H4.708C2.13 0 0 2.054 0 4.63v5.216h3.692V4.631zM27.354 0h-5.2v3.692h5.17c.53 0 .984.4.984.939v5.215H32V4.631A4.624 4.624 0 0027.354 0zm.954 24.83c0 .532-.4.94-.939.94h-5.215v3.768h5.215c2.577 0 4.631-2.13 4.631-4.707v-5.139h-3.692v5.139zm-23.677.94c-.531 0-.939-.4-.939-.94v-5.138H0v5.139c0 2.577 2.13 4.707 4.708 4.707h5.138V25.77H4.631z" }) }); +} +function LockIcon() { + return (0, import_jsx_runtime.jsx)("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 25 32", children: (0, import_jsx_runtime.jsx)("path", { d: "M21.333 10.667H19.81V7.619C19.81 3.429 16.38 0 12.19 0 8 0 4.571 3.429 4.571 7.619v3.048H3.048A3.056 3.056 0 000 13.714v15.238A3.056 3.056 0 003.048 32h18.285a3.056 3.056 0 003.048-3.048V13.714a3.056 3.056 0 00-3.048-3.047zM12.19 24.533a3.056 3.056 0 01-3.047-3.047 3.056 3.056 0 013.047-3.048 3.056 3.056 0 013.048 3.048 3.056 3.056 0 01-3.048 3.047zm4.724-13.866H7.467V7.619c0-2.59 2.133-4.724 4.723-4.724 2.591 0 4.724 2.133 4.724 4.724v3.048z" }) }); +} +function UnlockIcon() { + return (0, import_jsx_runtime.jsx)("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 25 32", children: (0, import_jsx_runtime.jsx)("path", { d: "M21.333 10.667H19.81V7.619C19.81 3.429 16.38 0 12.19 0c-4.114 1.828-1.37 2.133.305 2.438 1.676.305 4.42 2.59 4.42 5.181v3.048H3.047A3.056 3.056 0 000 13.714v15.238A3.056 3.056 0 003.048 32h18.285a3.056 3.056 0 003.048-3.048V13.714a3.056 3.056 0 00-3.048-3.047zM12.19 24.533a3.056 3.056 0 01-3.047-3.047 3.056 3.056 0 013.047-3.048 3.056 3.056 0 013.048 3.048 3.056 3.056 0 01-3.048 3.047z" }) }); +} +function ControlButton({ children: children2, className, ...rest }) { + return (0, import_jsx_runtime.jsx)("button", { type: "button", className: cc(["react-flow__controls-button", className]), ...rest, children: children2 }); +} +var selector$2 = (s) => ({ + isInteractive: s.nodesDraggable || s.nodesConnectable || s.elementsSelectable, + minZoomReached: s.transform[2] <= s.minZoom, + maxZoomReached: s.transform[2] >= s.maxZoom, + ariaLabelConfig: s.ariaLabelConfig +}); +function ControlsComponent({ style: style2, showZoom = true, showFitView = true, showInteractive = true, fitViewOptions, onZoomIn, onZoomOut, onFitView, onInteractiveChange, className, children: children2, position = "bottom-left", orientation = "vertical", "aria-label": ariaLabel }) { + const store = useStoreApi(); + const { isInteractive, minZoomReached, maxZoomReached, ariaLabelConfig } = useStore(selector$2, shallow$1); + const { zoomIn, zoomOut, fitView } = useReactFlow(); + const onZoomInHandler = () => { + zoomIn(); + onZoomIn == null ? void 0 : onZoomIn(); + }; + const onZoomOutHandler = () => { + zoomOut(); + onZoomOut == null ? void 0 : onZoomOut(); + }; + const onFitViewHandler = () => { + fitView(fitViewOptions); + onFitView == null ? void 0 : onFitView(); + }; + const onToggleInteractivity = () => { + store.setState({ + nodesDraggable: !isInteractive, + nodesConnectable: !isInteractive, + elementsSelectable: !isInteractive + }); + onInteractiveChange == null ? void 0 : onInteractiveChange(!isInteractive); + }; + const orientationClass = orientation === "horizontal" ? "horizontal" : "vertical"; + return (0, import_jsx_runtime.jsxs)(Panel, { className: cc(["react-flow__controls", orientationClass, className]), position, style: style2, "data-testid": "rf__controls", "aria-label": ariaLabel ?? ariaLabelConfig["controls.ariaLabel"], children: [showZoom && (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [(0, import_jsx_runtime.jsx)(ControlButton, { onClick: onZoomInHandler, className: "react-flow__controls-zoomin", title: ariaLabelConfig["controls.zoomIn.ariaLabel"], "aria-label": ariaLabelConfig["controls.zoomIn.ariaLabel"], disabled: maxZoomReached, children: (0, import_jsx_runtime.jsx)(PlusIcon, {}) }), (0, import_jsx_runtime.jsx)(ControlButton, { onClick: onZoomOutHandler, className: "react-flow__controls-zoomout", title: ariaLabelConfig["controls.zoomOut.ariaLabel"], "aria-label": ariaLabelConfig["controls.zoomOut.ariaLabel"], disabled: minZoomReached, children: (0, import_jsx_runtime.jsx)(MinusIcon, {}) })] }), showFitView && (0, import_jsx_runtime.jsx)(ControlButton, { className: "react-flow__controls-fitview", onClick: onFitViewHandler, title: ariaLabelConfig["controls.fitView.ariaLabel"], "aria-label": ariaLabelConfig["controls.fitView.ariaLabel"], children: (0, import_jsx_runtime.jsx)(FitViewIcon, {}) }), showInteractive && (0, import_jsx_runtime.jsx)(ControlButton, { className: "react-flow__controls-interactive", onClick: onToggleInteractivity, title: ariaLabelConfig["controls.interactive.ariaLabel"], "aria-label": ariaLabelConfig["controls.interactive.ariaLabel"], children: isInteractive ? (0, import_jsx_runtime.jsx)(UnlockIcon, {}) : (0, import_jsx_runtime.jsx)(LockIcon, {}) }), children2] }); +} +ControlsComponent.displayName = "Controls"; +var Controls = (0, import_react2.memo)(ControlsComponent); +function MiniMapNodeComponent({ id: id2, x, y, width, height, style: style2, color: color2, strokeColor, strokeWidth, className, borderRadius, shapeRendering, selected: selected2, onClick }) { + const { background, backgroundColor } = style2 || {}; + const fill = color2 || background || backgroundColor; + return (0, import_jsx_runtime.jsx)("rect", { className: cc(["react-flow__minimap-node", { selected: selected2 }, className]), x, y, rx: borderRadius, ry: borderRadius, width, height, style: { + fill, + stroke: strokeColor, + strokeWidth + }, shapeRendering, onClick: onClick ? (event) => onClick(event, id2) : void 0 }); +} +var MiniMapNode = (0, import_react2.memo)(MiniMapNodeComponent); +var selectorNodeIds = (s) => s.nodes.map((node) => node.id); +var getAttrFunction = (func) => func instanceof Function ? func : () => func; +function MiniMapNodes({ + nodeStrokeColor, + nodeColor, + nodeClassName = "", + nodeBorderRadius = 5, + nodeStrokeWidth, + /* + * We need to rename the prop to be `CapitalCase` so that JSX will render it as + * a component properly. + */ + nodeComponent: NodeComponent = MiniMapNode, + onClick +}) { + const nodeIds = useStore(selectorNodeIds, shallow$1); + const nodeColorFunc = getAttrFunction(nodeColor); + const nodeStrokeColorFunc = getAttrFunction(nodeStrokeColor); + const nodeClassNameFunc = getAttrFunction(nodeClassName); + const shapeRendering = typeof window === "undefined" || !!window.chrome ? "crispEdges" : "geometricPrecision"; + return (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children: nodeIds.map((nodeId) => ( + /* + * The split of responsibilities between MiniMapNodes and + * NodeComponentWrapper may appear weird. However, it’s designed to + * minimize the cost of updates when individual nodes change. + * + * For more details, see a similar commit in `NodeRenderer/index.tsx`. + */ + (0, import_jsx_runtime.jsx)(NodeComponentWrapper, { id: nodeId, nodeColorFunc, nodeStrokeColorFunc, nodeClassNameFunc, nodeBorderRadius, nodeStrokeWidth, NodeComponent, onClick, shapeRendering }, nodeId) + )) }); +} +function NodeComponentWrapperInner({ id: id2, nodeColorFunc, nodeStrokeColorFunc, nodeClassNameFunc, nodeBorderRadius, nodeStrokeWidth, shapeRendering, NodeComponent, onClick }) { + const { node, x, y, width, height } = useStore((s) => { + const { internals } = s.nodeLookup.get(id2); + const node2 = internals.userNode; + const { x: x2, y: y2 } = internals.positionAbsolute; + const { width: width2, height: height2 } = getNodeDimensions(node2); + return { + node: node2, + x: x2, + y: y2, + width: width2, + height: height2 + }; + }, shallow$1); + if (!node || node.hidden || !nodeHasDimensions(node)) { + return null; + } + return (0, import_jsx_runtime.jsx)(NodeComponent, { x, y, width, height, style: node.style, selected: !!node.selected, className: nodeClassNameFunc(node), color: nodeColorFunc(node), borderRadius: nodeBorderRadius, strokeColor: nodeStrokeColorFunc(node), strokeWidth: nodeStrokeWidth, shapeRendering, onClick, id: node.id }); +} +var NodeComponentWrapper = (0, import_react2.memo)(NodeComponentWrapperInner); +var MiniMapNodes$1 = (0, import_react2.memo)(MiniMapNodes); +var defaultWidth = 200; +var defaultHeight = 150; +var filterHidden = (node) => !node.hidden; +var selector$1 = (s) => { + const viewBB = { + x: -s.transform[0] / s.transform[2], + y: -s.transform[1] / s.transform[2], + width: s.width / s.transform[2], + height: s.height / s.transform[2] + }; + return { + viewBB, + boundingRect: s.nodeLookup.size > 0 ? getBoundsOfRects(getInternalNodesBounds(s.nodeLookup, { filter: filterHidden }), viewBB) : viewBB, + rfId: s.rfId, + panZoom: s.panZoom, + translateExtent: s.translateExtent, + flowWidth: s.width, + flowHeight: s.height, + ariaLabelConfig: s.ariaLabelConfig + }; +}; +var ARIA_LABEL_KEY = "react-flow__minimap-desc"; +function MiniMapComponent({ + style: style2, + className, + nodeStrokeColor, + nodeColor, + nodeClassName = "", + nodeBorderRadius = 5, + nodeStrokeWidth, + /* + * We need to rename the prop to be `CapitalCase` so that JSX will render it as + * a component properly. + */ + nodeComponent, + bgColor, + maskColor, + maskStrokeColor, + maskStrokeWidth, + position = "bottom-right", + onClick, + onNodeClick, + pannable = false, + zoomable = false, + ariaLabel, + inversePan, + zoomStep = 1, + offsetScale = 5 +}) { + const store = useStoreApi(); + const svg = (0, import_react2.useRef)(null); + const { boundingRect, viewBB, rfId, panZoom, translateExtent, flowWidth, flowHeight, ariaLabelConfig } = useStore(selector$1, shallow$1); + const elementWidth = (style2 == null ? void 0 : style2.width) ?? defaultWidth; + const elementHeight = (style2 == null ? void 0 : style2.height) ?? defaultHeight; + const scaledWidth = boundingRect.width / elementWidth; + const scaledHeight = boundingRect.height / elementHeight; + const viewScale = Math.max(scaledWidth, scaledHeight); + const viewWidth = viewScale * elementWidth; + const viewHeight = viewScale * elementHeight; + const offset = offsetScale * viewScale; + const x = boundingRect.x - (viewWidth - boundingRect.width) / 2 - offset; + const y = boundingRect.y - (viewHeight - boundingRect.height) / 2 - offset; + const width = viewWidth + offset * 2; + const height = viewHeight + offset * 2; + const labelledBy = `${ARIA_LABEL_KEY}-${rfId}`; + const viewScaleRef = (0, import_react2.useRef)(0); + const minimapInstance = (0, import_react2.useRef)(); + viewScaleRef.current = viewScale; + (0, import_react2.useEffect)(() => { + if (svg.current && panZoom) { + minimapInstance.current = XYMinimap({ + domNode: svg.current, + panZoom, + getTransform: () => store.getState().transform, + getViewScale: () => viewScaleRef.current + }); + return () => { + var _a; + (_a = minimapInstance.current) == null ? void 0 : _a.destroy(); + }; + } + }, [panZoom]); + (0, import_react2.useEffect)(() => { + var _a; + (_a = minimapInstance.current) == null ? void 0 : _a.update({ + translateExtent, + width: flowWidth, + height: flowHeight, + inversePan, + pannable, + zoomStep, + zoomable + }); + }, [pannable, zoomable, inversePan, zoomStep, translateExtent, flowWidth, flowHeight]); + const onSvgClick = onClick ? (event) => { + var _a; + const [x2, y2] = ((_a = minimapInstance.current) == null ? void 0 : _a.pointer(event)) || [0, 0]; + onClick(event, { x: x2, y: y2 }); + } : void 0; + const onSvgNodeClick = onNodeClick ? (0, import_react2.useCallback)((event, nodeId) => { + const node = store.getState().nodeLookup.get(nodeId).internals.userNode; + onNodeClick(event, node); + }, []) : void 0; + const _ariaLabel = ariaLabel ?? ariaLabelConfig["minimap.ariaLabel"]; + return (0, import_jsx_runtime.jsx)(Panel, { position, style: { + ...style2, + "--xy-minimap-background-color-props": typeof bgColor === "string" ? bgColor : void 0, + "--xy-minimap-mask-background-color-props": typeof maskColor === "string" ? maskColor : void 0, + "--xy-minimap-mask-stroke-color-props": typeof maskStrokeColor === "string" ? maskStrokeColor : void 0, + "--xy-minimap-mask-stroke-width-props": typeof maskStrokeWidth === "number" ? maskStrokeWidth * viewScale : void 0, + "--xy-minimap-node-background-color-props": typeof nodeColor === "string" ? nodeColor : void 0, + "--xy-minimap-node-stroke-color-props": typeof nodeStrokeColor === "string" ? nodeStrokeColor : void 0, + "--xy-minimap-node-stroke-width-props": typeof nodeStrokeWidth === "number" ? nodeStrokeWidth : void 0 + }, className: cc(["react-flow__minimap", className]), "data-testid": "rf__minimap", children: (0, import_jsx_runtime.jsxs)("svg", { width: elementWidth, height: elementHeight, viewBox: `${x} ${y} ${width} ${height}`, className: "react-flow__minimap-svg", role: "img", "aria-labelledby": labelledBy, ref: svg, onClick: onSvgClick, children: [_ariaLabel && (0, import_jsx_runtime.jsx)("title", { id: labelledBy, children: _ariaLabel }), (0, import_jsx_runtime.jsx)(MiniMapNodes$1, { onClick: onSvgNodeClick, nodeColor, nodeStrokeColor, nodeBorderRadius, nodeClassName, nodeStrokeWidth, nodeComponent }), (0, import_jsx_runtime.jsx)("path", { className: "react-flow__minimap-mask", d: `M${x - offset},${y - offset}h${width + offset * 2}v${height + offset * 2}h${-width - offset * 2}z + M${viewBB.x},${viewBB.y}h${viewBB.width}v${viewBB.height}h${-viewBB.width}z`, fillRule: "evenodd", pointerEvents: "none" })] }) }); +} +MiniMapComponent.displayName = "MiniMap"; +var MiniMap = (0, import_react2.memo)(MiniMapComponent); +var scaleSelector = (calculateScale) => (store) => calculateScale ? `${Math.max(1 / store.transform[2], 1)}` : void 0; +var defaultPositions = { + [ResizeControlVariant.Line]: "right", + [ResizeControlVariant.Handle]: "bottom-right" +}; +function ResizeControl({ nodeId, position, variant = ResizeControlVariant.Handle, className, style: style2 = void 0, children: children2, color: color2, minWidth = 10, minHeight = 10, maxWidth = Number.MAX_VALUE, maxHeight = Number.MAX_VALUE, keepAspectRatio = false, resizeDirection, autoScale = true, shouldResize, onResizeStart, onResize, onResizeEnd }) { + const contextNodeId = useNodeId(); + const id2 = typeof nodeId === "string" ? nodeId : contextNodeId; + const store = useStoreApi(); + const resizeControlRef = (0, import_react2.useRef)(null); + const isHandleControl = variant === ResizeControlVariant.Handle; + const scale = useStore((0, import_react2.useCallback)(scaleSelector(isHandleControl && autoScale), [isHandleControl, autoScale]), shallow$1); + const resizer = (0, import_react2.useRef)(null); + const controlPosition = position ?? defaultPositions[variant]; + (0, import_react2.useEffect)(() => { + if (!resizeControlRef.current || !id2) { + return; + } + if (!resizer.current) { + resizer.current = XYResizer({ + domNode: resizeControlRef.current, + nodeId: id2, + getStoreItems: () => { + const { nodeLookup, transform: transform2, snapGrid, snapToGrid, nodeOrigin, domNode } = store.getState(); + return { + nodeLookup, + transform: transform2, + snapGrid, + snapToGrid, + nodeOrigin, + paneDomNode: domNode + }; + }, + onChange: (change, childChanges) => { + const { triggerNodeChanges, nodeLookup, parentLookup, nodeOrigin } = store.getState(); + const changes = []; + const nextPosition = { x: change.x, y: change.y }; + const node = nodeLookup.get(id2); + if (node && node.expandParent && node.parentId) { + const origin = node.origin ?? nodeOrigin; + const width = change.width ?? node.measured.width ?? 0; + const height = change.height ?? node.measured.height ?? 0; + const child = { + id: node.id, + parentId: node.parentId, + rect: { + width, + height, + ...evaluateAbsolutePosition({ + x: change.x ?? node.position.x, + y: change.y ?? node.position.y + }, { width, height }, node.parentId, nodeLookup, origin) + } + }; + const parentExpandChanges = handleExpandParent([child], nodeLookup, parentLookup, nodeOrigin); + changes.push(...parentExpandChanges); + nextPosition.x = change.x ? Math.max(origin[0] * width, change.x) : void 0; + nextPosition.y = change.y ? Math.max(origin[1] * height, change.y) : void 0; + } + if (nextPosition.x !== void 0 && nextPosition.y !== void 0) { + const positionChange = { + id: id2, + type: "position", + position: { ...nextPosition } + }; + changes.push(positionChange); + } + if (change.width !== void 0 && change.height !== void 0) { + const setAttributes = !resizeDirection ? true : resizeDirection === "horizontal" ? "width" : "height"; + const dimensionChange = { + id: id2, + type: "dimensions", + resizing: true, + setAttributes, + dimensions: { + width: change.width, + height: change.height + } + }; + changes.push(dimensionChange); + } + for (const childChange of childChanges) { + const positionChange = { + ...childChange, + type: "position" + }; + changes.push(positionChange); + } + triggerNodeChanges(changes); + }, + onEnd: ({ width, height }) => { + const dimensionChange = { + id: id2, + type: "dimensions", + resizing: false, + dimensions: { + width, + height + } + }; + store.getState().triggerNodeChanges([dimensionChange]); + } + }); + } + resizer.current.update({ + controlPosition, + boundaries: { + minWidth, + minHeight, + maxWidth, + maxHeight + }, + keepAspectRatio, + resizeDirection, + onResizeStart, + onResize, + onResizeEnd, + shouldResize + }); + return () => { + var _a; + (_a = resizer.current) == null ? void 0 : _a.destroy(); + }; + }, [ + controlPosition, + minWidth, + minHeight, + maxWidth, + maxHeight, + keepAspectRatio, + onResizeStart, + onResize, + onResizeEnd, + shouldResize + ]); + const positionClassNames = controlPosition.split("-"); + return (0, import_jsx_runtime.jsx)("div", { className: cc(["react-flow__resize-control", "nodrag", ...positionClassNames, variant, className]), ref: resizeControlRef, style: { + ...style2, + scale, + ...color2 && { [isHandleControl ? "backgroundColor" : "borderColor"]: color2 } + }, children: children2 }); +} +var NodeResizeControl = (0, import_react2.memo)(ResizeControl); +function NodeResizer({ nodeId, isVisible = true, handleClassName, handleStyle, lineClassName, lineStyle, color: color2, minWidth = 10, minHeight = 10, maxWidth = Number.MAX_VALUE, maxHeight = Number.MAX_VALUE, keepAspectRatio = false, autoScale = true, shouldResize, onResizeStart, onResize, onResizeEnd }) { + if (!isVisible) { + return null; + } + return (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [XY_RESIZER_LINE_POSITIONS.map((position) => (0, import_jsx_runtime.jsx)(NodeResizeControl, { className: lineClassName, style: lineStyle, nodeId, position, variant: ResizeControlVariant.Line, color: color2, minWidth, minHeight, maxWidth, maxHeight, onResizeStart, keepAspectRatio, autoScale, shouldResize, onResize, onResizeEnd }, position)), XY_RESIZER_HANDLE_POSITIONS.map((position) => (0, import_jsx_runtime.jsx)(NodeResizeControl, { className: handleClassName, style: handleStyle, nodeId, position, color: color2, minWidth, minHeight, maxWidth, maxHeight, onResizeStart, keepAspectRatio, autoScale, shouldResize, onResize, onResizeEnd }, position))] }); +} +var selector = (state) => { + var _a; + return (_a = state.domNode) == null ? void 0 : _a.querySelector(".react-flow__renderer"); +}; +function NodeToolbarPortal({ children: children2 }) { + const wrapperRef = useStore(selector); + if (!wrapperRef) { + return null; + } + return (0, import_react_dom.createPortal)(children2, wrapperRef); +} +var nodeEqualityFn = (a, b) => (a == null ? void 0 : a.internals.positionAbsolute.x) !== (b == null ? void 0 : b.internals.positionAbsolute.x) || (a == null ? void 0 : a.internals.positionAbsolute.y) !== (b == null ? void 0 : b.internals.positionAbsolute.y) || (a == null ? void 0 : a.measured.width) !== (b == null ? void 0 : b.measured.width) || (a == null ? void 0 : a.measured.height) !== (b == null ? void 0 : b.measured.height) || (a == null ? void 0 : a.selected) !== (b == null ? void 0 : b.selected) || (a == null ? void 0 : a.internals.z) !== (b == null ? void 0 : b.internals.z); +var nodesEqualityFn = (a, b) => { + if (a.size !== b.size) { + return false; + } + for (const [key, node] of a) { + if (nodeEqualityFn(node, b.get(key))) { + return false; + } + } + return true; +}; +var storeSelector = (state) => ({ + x: state.transform[0], + y: state.transform[1], + zoom: state.transform[2], + selectedNodesCount: state.nodes.filter((node) => node.selected).length +}); +function NodeToolbar({ nodeId, children: children2, className, style: style2, isVisible, position = Position.Top, offset = 10, align = "center", ...rest }) { + var _a; + const contextNodeId = useNodeId(); + const nodesSelector2 = (0, import_react2.useCallback)((state) => { + const nodeIds = Array.isArray(nodeId) ? nodeId : [nodeId || contextNodeId || ""]; + const internalNodes = nodeIds.reduce((res, id2) => { + const node = state.nodeLookup.get(id2); + if (node) { + res.set(node.id, node); + } + return res; + }, /* @__PURE__ */ new Map()); + return internalNodes; + }, [nodeId, contextNodeId]); + const nodes = useStore(nodesSelector2, nodesEqualityFn); + const { x, y, zoom, selectedNodesCount } = useStore(storeSelector, shallow$1); + const isActive = typeof isVisible === "boolean" ? isVisible : nodes.size === 1 && ((_a = nodes.values().next().value) == null ? void 0 : _a.selected) && selectedNodesCount === 1; + if (!isActive || !nodes.size) { + return null; + } + const nodeRect = getInternalNodesBounds(nodes); + const nodesArray = Array.from(nodes.values()); + const zIndex = Math.max(...nodesArray.map((node) => node.internals.z + 1)); + const wrapperStyle2 = { + position: "absolute", + transform: getNodeToolbarTransform(nodeRect, { x, y, zoom }, position, offset, align), + zIndex, + ...style2 + }; + return (0, import_jsx_runtime.jsx)(NodeToolbarPortal, { children: (0, import_jsx_runtime.jsx)("div", { style: wrapperStyle2, className: cc(["react-flow__node-toolbar", className]), ...rest, "data-id": nodesArray.reduce((acc, node) => `${acc}${node.id} `, "").trim(), children: children2 }) }); +} +var zoomSelector = (state) => state.transform[2]; +function EdgeToolbar({ edgeId, x, y, children: children2, className, style: style2, isVisible, alignX = "center", alignY = "center", ...rest }) { + const edgeSelector = (0, import_react2.useCallback)((state) => state.edgeLookup.get(edgeId), [edgeId]); + const edge = useStore(edgeSelector, shallow$1); + const isActive = typeof isVisible === "boolean" ? isVisible : edge == null ? void 0 : edge.selected; + const zoom = useStore(zoomSelector); + if (!isActive) { + return null; + } + const zIndex = ((edge == null ? void 0 : edge.zIndex) ?? 0) + 1; + const transform2 = getEdgeToolbarTransform(x, y, zoom, alignX, alignY); + return (0, import_jsx_runtime.jsx)(EdgeLabelRenderer, { children: (0, import_jsx_runtime.jsx)("div", { style: { + position: "absolute", + transform: transform2, + zIndex, + pointerEvents: "all", + transformOrigin: "0 0", + ...style2 + }, className: cc(["react-flow__edge-toolbar", className]), "data-id": (edge == null ? void 0 : edge.id) ?? "", ...rest, children: children2 }) }); +} +export { + Background, + BackgroundVariant, + BaseEdge, + BezierEdge, + ConnectionLineType, + ConnectionMode, + ControlButton, + Controls, + EdgeLabelRenderer, + EdgeText, + EdgeToolbar, + Handle, + MarkerType, + MiniMap, + MiniMapNode, + NodeResizeControl, + NodeResizer, + NodeToolbar, + PanOnScrollMode, + Panel, + Position, + index as ReactFlow, + ReactFlowProvider, + ResizeControlVariant, + SelectionMode, + SimpleBezierEdge, + SmoothStepEdge, + StepEdge, + StraightEdge, + ViewportPortal, + addEdge, + applyEdgeChanges, + applyNodeChanges, + experimental_useOnEdgesChangeMiddleware, + experimental_useOnNodesChangeMiddleware, + getBezierEdgeCenter, + getBezierPath, + getConnectedEdges, + getEdgeCenter, + getIncomers, + getNodesBounds, + getOutgoers, + getSimpleBezierPath, + getSmoothStepPath, + getStraightPath, + getViewportForBounds, + isEdge, + isNode, + reconnectEdge, + useConnection, + useEdges, + useEdgesState, + useHandleConnections, + useInternalNode, + useKeyPress, + useNodeConnections, + useNodeId, + useNodes, + useNodesData, + useNodesInitialized, + useNodesState, + useOnSelectionChange, + useOnViewportChange, + useReactFlow, + useStore, + useStoreApi, + useUpdateNodeInternals, + useViewport +}; +/*! Bundled license information: + +use-sync-external-store/cjs/use-sync-external-store-shim.development.js: + (** + * @license React + * use-sync-external-store-shim.development.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + *) + +use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js: + (** + * @license React + * use-sync-external-store-shim/with-selector.development.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + *) +*/ +//# sourceMappingURL=@xyflow_react.js.map diff --git a/visual_workflow_builder/frontend_v4/node_modules/.vite/deps/@xyflow_react.js.map b/visual_workflow_builder/frontend_v4/node_modules/.vite/deps/@xyflow_react.js.map new file mode 100644 index 000000000..6218b2e64 --- /dev/null +++ b/visual_workflow_builder/frontend_v4/node_modules/.vite/deps/@xyflow_react.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../use-sync-external-store/cjs/use-sync-external-store-shim.development.js", "../../use-sync-external-store/shim/index.js", "../../use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js", "../../use-sync-external-store/shim/with-selector.js", "../../@xyflow/react/dist/esm/index.js", "../../classcat/index.js", "../../d3-dispatch/src/dispatch.js", "../../d3-selection/src/namespaces.js", "../../d3-selection/src/namespace.js", "../../d3-selection/src/creator.js", "../../d3-selection/src/selector.js", "../../d3-selection/src/selection/select.js", "../../d3-selection/src/array.js", "../../d3-selection/src/selectorAll.js", "../../d3-selection/src/selection/selectAll.js", "../../d3-selection/src/matcher.js", "../../d3-selection/src/selection/selectChild.js", "../../d3-selection/src/selection/selectChildren.js", "../../d3-selection/src/selection/filter.js", "../../d3-selection/src/selection/sparse.js", "../../d3-selection/src/selection/enter.js", "../../d3-selection/src/constant.js", "../../d3-selection/src/selection/data.js", "../../d3-selection/src/selection/exit.js", "../../d3-selection/src/selection/join.js", "../../d3-selection/src/selection/merge.js", "../../d3-selection/src/selection/order.js", "../../d3-selection/src/selection/sort.js", "../../d3-selection/src/selection/call.js", "../../d3-selection/src/selection/nodes.js", "../../d3-selection/src/selection/node.js", "../../d3-selection/src/selection/size.js", "../../d3-selection/src/selection/empty.js", "../../d3-selection/src/selection/each.js", "../../d3-selection/src/selection/attr.js", "../../d3-selection/src/window.js", "../../d3-selection/src/selection/style.js", "../../d3-selection/src/selection/property.js", "../../d3-selection/src/selection/classed.js", "../../d3-selection/src/selection/text.js", "../../d3-selection/src/selection/html.js", "../../d3-selection/src/selection/raise.js", "../../d3-selection/src/selection/lower.js", "../../d3-selection/src/selection/append.js", "../../d3-selection/src/selection/insert.js", "../../d3-selection/src/selection/remove.js", "../../d3-selection/src/selection/clone.js", "../../d3-selection/src/selection/datum.js", "../../d3-selection/src/selection/on.js", "../../d3-selection/src/selection/dispatch.js", "../../d3-selection/src/selection/iterator.js", "../../d3-selection/src/selection/index.js", "../../d3-selection/src/select.js", "../../d3-selection/src/local.js", "../../d3-selection/src/sourceEvent.js", "../../d3-selection/src/pointer.js", "../../d3-drag/src/noevent.js", "../../d3-drag/src/nodrag.js", "../../d3-drag/src/constant.js", "../../d3-drag/src/event.js", "../../d3-drag/src/drag.js", "../../d3-color/src/define.js", "../../d3-color/src/color.js", "../../d3-color/src/math.js", "../../d3-color/src/lab.js", "../../d3-color/src/cubehelix.js", "../../d3-interpolate/src/basis.js", "../../d3-interpolate/src/basisClosed.js", "../../d3-interpolate/src/constant.js", "../../d3-interpolate/src/color.js", "../../d3-interpolate/src/rgb.js", "../../d3-interpolate/src/numberArray.js", "../../d3-interpolate/src/array.js", "../../d3-interpolate/src/date.js", "../../d3-interpolate/src/number.js", "../../d3-interpolate/src/object.js", "../../d3-interpolate/src/string.js", "../../d3-interpolate/src/value.js", "../../d3-interpolate/src/transform/decompose.js", "../../d3-interpolate/src/transform/parse.js", "../../d3-interpolate/src/transform/index.js", "../../d3-interpolate/src/zoom.js", "../../d3-interpolate/src/hsl.js", "../../d3-interpolate/src/hcl.js", "../../d3-interpolate/src/cubehelix.js", "../../d3-timer/src/timer.js", "../../d3-timer/src/timeout.js", "../../d3-transition/src/transition/schedule.js", "../../d3-transition/src/interrupt.js", "../../d3-transition/src/selection/interrupt.js", "../../d3-transition/src/transition/tween.js", "../../d3-transition/src/transition/interpolate.js", "../../d3-transition/src/transition/attr.js", "../../d3-transition/src/transition/attrTween.js", "../../d3-transition/src/transition/delay.js", "../../d3-transition/src/transition/duration.js", "../../d3-transition/src/transition/ease.js", "../../d3-transition/src/transition/easeVarying.js", "../../d3-transition/src/transition/filter.js", "../../d3-transition/src/transition/merge.js", "../../d3-transition/src/transition/on.js", "../../d3-transition/src/transition/remove.js", "../../d3-transition/src/transition/select.js", "../../d3-transition/src/transition/selectAll.js", "../../d3-transition/src/transition/selection.js", "../../d3-transition/src/transition/style.js", "../../d3-transition/src/transition/styleTween.js", "../../d3-transition/src/transition/text.js", "../../d3-transition/src/transition/textTween.js", "../../d3-transition/src/transition/transition.js", "../../d3-transition/src/transition/end.js", "../../d3-transition/src/transition/index.js", "../../d3-ease/src/cubic.js", "../../d3-ease/src/poly.js", "../../d3-ease/src/sin.js", "../../d3-ease/src/math.js", "../../d3-ease/src/bounce.js", "../../d3-ease/src/back.js", "../../d3-ease/src/elastic.js", "../../d3-transition/src/selection/transition.js", "../../d3-transition/src/selection/index.js", "../../d3-zoom/src/constant.js", "../../d3-zoom/src/event.js", "../../d3-zoom/src/transform.js", "../../d3-zoom/src/noevent.js", "../../d3-zoom/src/zoom.js", "../../@xyflow/system/dist/esm/index.js", "../../zustand/esm/traditional.mjs", "../../zustand/esm/vanilla.mjs", "../../zustand/esm/shallow.mjs"], + "sourcesContent": ["/**\n * @license React\n * use-sync-external-store-shim.development.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\n\"production\" !== process.env.NODE_ENV &&\n (function () {\n function is(x, y) {\n return (x === y && (0 !== x || 1 / x === 1 / y)) || (x !== x && y !== y);\n }\n function useSyncExternalStore$2(subscribe, getSnapshot) {\n didWarnOld18Alpha ||\n void 0 === React.startTransition ||\n ((didWarnOld18Alpha = !0),\n console.error(\n \"You are using an outdated, pre-release alpha of React 18 that does not support useSyncExternalStore. The use-sync-external-store shim will not work correctly. Upgrade to a newer pre-release.\"\n ));\n var value = getSnapshot();\n if (!didWarnUncachedGetSnapshot) {\n var cachedValue = getSnapshot();\n objectIs(value, cachedValue) ||\n (console.error(\n \"The result of getSnapshot should be cached to avoid an infinite loop\"\n ),\n (didWarnUncachedGetSnapshot = !0));\n }\n cachedValue = useState({\n inst: { value: value, getSnapshot: getSnapshot }\n });\n var inst = cachedValue[0].inst,\n forceUpdate = cachedValue[1];\n useLayoutEffect(\n function () {\n inst.value = value;\n inst.getSnapshot = getSnapshot;\n checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });\n },\n [subscribe, value, getSnapshot]\n );\n useEffect(\n function () {\n checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });\n return subscribe(function () {\n checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });\n });\n },\n [subscribe]\n );\n useDebugValue(value);\n return value;\n }\n function checkIfSnapshotChanged(inst) {\n var latestGetSnapshot = inst.getSnapshot;\n inst = inst.value;\n try {\n var nextValue = latestGetSnapshot();\n return !objectIs(inst, nextValue);\n } catch (error) {\n return !0;\n }\n }\n function useSyncExternalStore$1(subscribe, getSnapshot) {\n return getSnapshot();\n }\n \"undefined\" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&\n \"function\" ===\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart &&\n __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(Error());\n var React = require(\"react\"),\n objectIs = \"function\" === typeof Object.is ? Object.is : is,\n useState = React.useState,\n useEffect = React.useEffect,\n useLayoutEffect = React.useLayoutEffect,\n useDebugValue = React.useDebugValue,\n didWarnOld18Alpha = !1,\n didWarnUncachedGetSnapshot = !1,\n shim =\n \"undefined\" === typeof window ||\n \"undefined\" === typeof window.document ||\n \"undefined\" === typeof window.document.createElement\n ? useSyncExternalStore$1\n : useSyncExternalStore$2;\n exports.useSyncExternalStore =\n void 0 !== React.useSyncExternalStore ? React.useSyncExternalStore : shim;\n \"undefined\" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&\n \"function\" ===\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop &&\n __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error());\n })();\n", "'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('../cjs/use-sync-external-store-shim.production.js');\n} else {\n module.exports = require('../cjs/use-sync-external-store-shim.development.js');\n}\n", "/**\n * @license React\n * use-sync-external-store-shim/with-selector.development.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\n\"production\" !== process.env.NODE_ENV &&\n (function () {\n function is(x, y) {\n return (x === y && (0 !== x || 1 / x === 1 / y)) || (x !== x && y !== y);\n }\n \"undefined\" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&\n \"function\" ===\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart &&\n __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(Error());\n var React = require(\"react\"),\n shim = require(\"use-sync-external-store/shim\"),\n objectIs = \"function\" === typeof Object.is ? Object.is : is,\n useSyncExternalStore = shim.useSyncExternalStore,\n useRef = React.useRef,\n useEffect = React.useEffect,\n useMemo = React.useMemo,\n useDebugValue = React.useDebugValue;\n exports.useSyncExternalStoreWithSelector = function (\n subscribe,\n getSnapshot,\n getServerSnapshot,\n selector,\n isEqual\n ) {\n var instRef = useRef(null);\n if (null === instRef.current) {\n var inst = { hasValue: !1, value: null };\n instRef.current = inst;\n } else inst = instRef.current;\n instRef = useMemo(\n function () {\n function memoizedSelector(nextSnapshot) {\n if (!hasMemo) {\n hasMemo = !0;\n memoizedSnapshot = nextSnapshot;\n nextSnapshot = selector(nextSnapshot);\n if (void 0 !== isEqual && inst.hasValue) {\n var currentSelection = inst.value;\n if (isEqual(currentSelection, nextSnapshot))\n return (memoizedSelection = currentSelection);\n }\n return (memoizedSelection = nextSnapshot);\n }\n currentSelection = memoizedSelection;\n if (objectIs(memoizedSnapshot, nextSnapshot))\n return currentSelection;\n var nextSelection = selector(nextSnapshot);\n if (void 0 !== isEqual && isEqual(currentSelection, nextSelection))\n return (memoizedSnapshot = nextSnapshot), currentSelection;\n memoizedSnapshot = nextSnapshot;\n return (memoizedSelection = nextSelection);\n }\n var hasMemo = !1,\n memoizedSnapshot,\n memoizedSelection,\n maybeGetServerSnapshot =\n void 0 === getServerSnapshot ? null : getServerSnapshot;\n return [\n function () {\n return memoizedSelector(getSnapshot());\n },\n null === maybeGetServerSnapshot\n ? void 0\n : function () {\n return memoizedSelector(maybeGetServerSnapshot());\n }\n ];\n },\n [getSnapshot, getServerSnapshot, selector, isEqual]\n );\n var value = useSyncExternalStore(subscribe, instRef[0], instRef[1]);\n useEffect(\n function () {\n inst.hasValue = !0;\n inst.value = value;\n },\n [value]\n );\n useDebugValue(value);\n return value;\n };\n \"undefined\" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&\n \"function\" ===\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop &&\n __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error());\n })();\n", "'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('../cjs/use-sync-external-store-shim/with-selector.production.js');\n} else {\n module.exports = require('../cjs/use-sync-external-store-shim/with-selector.development.js');\n}\n", "\"use client\"\nimport { jsxs, Fragment, jsx } from 'react/jsx-runtime';\nimport { createContext, useContext, useMemo, forwardRef, useEffect, useRef, useState, useLayoutEffect, useCallback, memo } from 'react';\nimport cc from 'classcat';\nimport { errorMessages, mergeAriaLabelConfig, infiniteExtent, isInputDOMNode, getViewportForBounds, pointToRendererPoint, rendererPointToPoint, isNodeBase, isEdgeBase, getElementsToRemove, isRectObject, nodeToRect, getOverlappingArea, getNodesBounds, withResolvers, evaluateAbsolutePosition, getDimensions, XYPanZoom, PanOnScrollMode, SelectionMode, getEventPosition, getNodesInside, areSetsEqual, XYDrag, snapPosition, calculateNodePosition, Position, ConnectionMode, isMouseEvent, XYHandle, getHostForElement, addEdge, getInternalNodesBounds, isNumeric, nodeHasDimensions, getNodeDimensions, elementSelectionKeys, isEdgeVisible, MarkerType, createMarkerIds, getBezierEdgeCenter, getSmoothStepPath, getStraightPath, getBezierPath, getEdgePosition, getElevatedEdgeZIndex, getMarkerId, getConnectionStatus, ConnectionLineType, updateConnectionLookup, adoptUserNodes, initialConnection, devWarn, defaultAriaLabelConfig, updateNodeInternals, updateAbsolutePositions, getHandlePosition, handleExpandParent, panBy, fitViewport, isMacOs, areConnectionMapsEqual, handleConnectionChange, shallowNodeData, XYMinimap, getBoundsOfRects, ResizeControlVariant, XYResizer, XY_RESIZER_LINE_POSITIONS, XY_RESIZER_HANDLE_POSITIONS, getNodeToolbarTransform, getEdgeToolbarTransform } from '@xyflow/system';\nexport { ConnectionLineType, ConnectionMode, MarkerType, PanOnScrollMode, Position, ResizeControlVariant, SelectionMode, addEdge, getBezierEdgeCenter, getBezierPath, getConnectedEdges, getEdgeCenter, getIncomers, getNodesBounds, getOutgoers, getSmoothStepPath, getStraightPath, getViewportForBounds, reconnectEdge } from '@xyflow/system';\nimport { useStoreWithEqualityFn, createWithEqualityFn } from 'zustand/traditional';\nimport { shallow } from 'zustand/shallow';\nimport { createPortal } from 'react-dom';\n\nconst StoreContext = createContext(null);\nconst Provider$1 = StoreContext.Provider;\n\nconst zustandErrorMessage = errorMessages['error001']();\n/**\n * This hook can be used to subscribe to internal state changes of the React Flow\n * component. The `useStore` hook is re-exported from the [Zustand](https://github.com/pmndrs/zustand)\n * state management library, so you should check out their docs for more details.\n *\n * @public\n * @param selector - A selector function that returns a slice of the flow's internal state.\n * Extracting or transforming just the state you need is a good practice to avoid unnecessary\n * re-renders.\n * @param equalityFn - A function to compare the previous and next value. This is incredibly useful\n * for preventing unnecessary re-renders. Good sensible defaults are using `Object.is` or importing\n * `zustand/shallow`, but you can be as granular as you like.\n * @returns The selected state slice.\n *\n * @example\n * ```ts\n * const nodes = useStore((state) => state.nodes);\n * ```\n *\n * @remarks This hook should only be used if there is no other way to access the internal\n * state. For many of the common use cases, there are dedicated hooks available\n * such as {@link useReactFlow}, {@link useViewport}, etc.\n */\nfunction useStore(selector, equalityFn) {\n const store = useContext(StoreContext);\n if (store === null) {\n throw new Error(zustandErrorMessage);\n }\n return useStoreWithEqualityFn(store, selector, equalityFn);\n}\n/**\n * In some cases, you might need to access the store directly. This hook returns the store object which can be used on demand to access the state or dispatch actions.\n *\n * @returns The store object.\n * @example\n * ```ts\n * const store = useStoreApi();\n * ```\n *\n * @remarks This hook should only be used if there is no other way to access the internal\n * state. For many of the common use cases, there are dedicated hooks available\n * such as {@link useReactFlow}, {@link useViewport}, etc.\n */\nfunction useStoreApi() {\n const store = useContext(StoreContext);\n if (store === null) {\n throw new Error(zustandErrorMessage);\n }\n return useMemo(() => ({\n getState: store.getState,\n setState: store.setState,\n subscribe: store.subscribe,\n }), [store]);\n}\n\nconst style = { display: 'none' };\nconst ariaLiveStyle = {\n position: 'absolute',\n width: 1,\n height: 1,\n margin: -1,\n border: 0,\n padding: 0,\n overflow: 'hidden',\n clip: 'rect(0px, 0px, 0px, 0px)',\n clipPath: 'inset(100%)',\n};\nconst ARIA_NODE_DESC_KEY = 'react-flow__node-desc';\nconst ARIA_EDGE_DESC_KEY = 'react-flow__edge-desc';\nconst ARIA_LIVE_MESSAGE = 'react-flow__aria-live';\nconst ariaLiveSelector = (s) => s.ariaLiveMessage;\nconst ariaLabelConfigSelector = (s) => s.ariaLabelConfig;\nfunction AriaLiveMessage({ rfId }) {\n const ariaLiveMessage = useStore(ariaLiveSelector);\n return (jsx(\"div\", { id: `${ARIA_LIVE_MESSAGE}-${rfId}`, \"aria-live\": \"assertive\", \"aria-atomic\": \"true\", style: ariaLiveStyle, children: ariaLiveMessage }));\n}\nfunction A11yDescriptions({ rfId, disableKeyboardA11y }) {\n const ariaLabelConfig = useStore(ariaLabelConfigSelector);\n return (jsxs(Fragment, { children: [jsx(\"div\", { id: `${ARIA_NODE_DESC_KEY}-${rfId}`, style: style, children: disableKeyboardA11y\n ? ariaLabelConfig['node.a11yDescription.default']\n : ariaLabelConfig['node.a11yDescription.keyboardDisabled'] }), jsx(\"div\", { id: `${ARIA_EDGE_DESC_KEY}-${rfId}`, style: style, children: ariaLabelConfig['edge.a11yDescription.default'] }), !disableKeyboardA11y && jsx(AriaLiveMessage, { rfId: rfId })] }));\n}\n\n/**\n * The `` component helps you position content above the viewport.\n * It is used internally by the [``](/api-reference/components/minimap)\n * and [``](/api-reference/components/controls) components.\n *\n * @public\n *\n * @example\n * ```jsx\n *import { ReactFlow, Background, Panel } from '@xyflow/react';\n *\n *export default function Flow() {\n * return (\n * \n * top-left\n * top-center\n * top-right\n * bottom-left\n * bottom-center\n * bottom-right\n * \n * );\n *}\n *```\n */\nconst Panel = forwardRef(({ position = 'top-left', children, className, style, ...rest }, ref) => {\n const positionClasses = `${position}`.split('-');\n return (jsx(\"div\", { className: cc(['react-flow__panel', className, ...positionClasses]), style: style, ref: ref, ...rest, children: children }));\n});\nPanel.displayName = 'Panel';\n\nfunction Attribution({ proOptions, position = 'bottom-right' }) {\n if (proOptions?.hideAttribution) {\n return null;\n }\n return (jsx(Panel, { position: position, className: \"react-flow__attribution\", \"data-message\": \"Please only hide this attribution when you are subscribed to React Flow Pro: https://pro.reactflow.dev\", children: jsx(\"a\", { href: \"https://reactflow.dev\", target: \"_blank\", rel: \"noopener noreferrer\", \"aria-label\": \"React Flow attribution\", children: \"React Flow\" }) }));\n}\n\nconst selector$m = (s) => {\n const selectedNodes = [];\n const selectedEdges = [];\n for (const [, node] of s.nodeLookup) {\n if (node.selected) {\n selectedNodes.push(node.internals.userNode);\n }\n }\n for (const [, edge] of s.edgeLookup) {\n if (edge.selected) {\n selectedEdges.push(edge);\n }\n }\n return { selectedNodes, selectedEdges };\n};\nconst selectId = (obj) => obj.id;\nfunction areEqual(a, b) {\n return (shallow(a.selectedNodes.map(selectId), b.selectedNodes.map(selectId)) &&\n shallow(a.selectedEdges.map(selectId), b.selectedEdges.map(selectId)));\n}\nfunction SelectionListenerInner({ onSelectionChange, }) {\n const store = useStoreApi();\n const { selectedNodes, selectedEdges } = useStore(selector$m, areEqual);\n useEffect(() => {\n const params = { nodes: selectedNodes, edges: selectedEdges };\n onSelectionChange?.(params);\n store.getState().onSelectionChangeHandlers.forEach((fn) => fn(params));\n }, [selectedNodes, selectedEdges, onSelectionChange]);\n return null;\n}\nconst changeSelector = (s) => !!s.onSelectionChangeHandlers;\nfunction SelectionListener({ onSelectionChange, }) {\n const storeHasSelectionChangeHandlers = useStore(changeSelector);\n if (onSelectionChange || storeHasSelectionChangeHandlers) {\n return jsx(SelectionListenerInner, { onSelectionChange: onSelectionChange });\n }\n return null;\n}\n\nconst defaultNodeOrigin = [0, 0];\nconst defaultViewport = { x: 0, y: 0, zoom: 1 };\n\n/*\n * This component helps us to update the store with the values coming from the user.\n * We distinguish between values we can update directly with `useDirectStoreUpdater` (like `snapGrid`)\n * and values that have a dedicated setter function in the store (like `setNodes`).\n */\n// These fields exist in the global store, and we need to keep them up to date\nconst reactFlowFieldsToTrack = [\n 'nodes',\n 'edges',\n 'defaultNodes',\n 'defaultEdges',\n 'onConnect',\n 'onConnectStart',\n 'onConnectEnd',\n 'onClickConnectStart',\n 'onClickConnectEnd',\n 'nodesDraggable',\n 'autoPanOnNodeFocus',\n 'nodesConnectable',\n 'nodesFocusable',\n 'edgesFocusable',\n 'edgesReconnectable',\n 'elevateNodesOnSelect',\n 'elevateEdgesOnSelect',\n 'minZoom',\n 'maxZoom',\n 'nodeExtent',\n 'onNodesChange',\n 'onEdgesChange',\n 'elementsSelectable',\n 'connectionMode',\n 'snapGrid',\n 'snapToGrid',\n 'translateExtent',\n 'connectOnClick',\n 'defaultEdgeOptions',\n 'fitView',\n 'fitViewOptions',\n 'onNodesDelete',\n 'onEdgesDelete',\n 'onDelete',\n 'onNodeDrag',\n 'onNodeDragStart',\n 'onNodeDragStop',\n 'onSelectionDrag',\n 'onSelectionDragStart',\n 'onSelectionDragStop',\n 'onMoveStart',\n 'onMove',\n 'onMoveEnd',\n 'noPanClassName',\n 'nodeOrigin',\n 'autoPanOnConnect',\n 'autoPanOnNodeDrag',\n 'onError',\n 'connectionRadius',\n 'isValidConnection',\n 'selectNodesOnDrag',\n 'nodeDragThreshold',\n 'connectionDragThreshold',\n 'onBeforeDelete',\n 'debug',\n 'autoPanSpeed',\n 'ariaLabelConfig',\n 'zIndexMode',\n];\n// rfId doesn't exist in ReactFlowProps, but it's one of the fields we want to update\nconst fieldsToTrack = [...reactFlowFieldsToTrack, 'rfId'];\nconst selector$l = (s) => ({\n setNodes: s.setNodes,\n setEdges: s.setEdges,\n setMinZoom: s.setMinZoom,\n setMaxZoom: s.setMaxZoom,\n setTranslateExtent: s.setTranslateExtent,\n setNodeExtent: s.setNodeExtent,\n reset: s.reset,\n setDefaultNodesAndEdges: s.setDefaultNodesAndEdges,\n});\nconst initPrevValues = {\n /*\n * these are values that are also passed directly to other components\n * than the StoreUpdater. We can reduce the number of setStore calls\n * by setting the same values here as prev fields.\n */\n translateExtent: infiniteExtent,\n nodeOrigin: defaultNodeOrigin,\n minZoom: 0.5,\n maxZoom: 2,\n elementsSelectable: true,\n noPanClassName: 'nopan',\n rfId: '1',\n};\nfunction StoreUpdater(props) {\n const { setNodes, setEdges, setMinZoom, setMaxZoom, setTranslateExtent, setNodeExtent, reset, setDefaultNodesAndEdges, } = useStore(selector$l, shallow);\n const store = useStoreApi();\n useEffect(() => {\n setDefaultNodesAndEdges(props.defaultNodes, props.defaultEdges);\n return () => {\n // when we reset the store we also need to reset the previous fields\n previousFields.current = initPrevValues;\n reset();\n };\n }, []);\n const previousFields = useRef(initPrevValues);\n useEffect(() => {\n for (const fieldName of fieldsToTrack) {\n const fieldValue = props[fieldName];\n const previousFieldValue = previousFields.current[fieldName];\n if (fieldValue === previousFieldValue)\n continue;\n if (typeof props[fieldName] === 'undefined')\n continue;\n // Custom handling with dedicated setters for some fields\n if (fieldName === 'nodes')\n setNodes(fieldValue);\n else if (fieldName === 'edges')\n setEdges(fieldValue);\n else if (fieldName === 'minZoom')\n setMinZoom(fieldValue);\n else if (fieldName === 'maxZoom')\n setMaxZoom(fieldValue);\n else if (fieldName === 'translateExtent')\n setTranslateExtent(fieldValue);\n else if (fieldName === 'nodeExtent')\n setNodeExtent(fieldValue);\n else if (fieldName === 'ariaLabelConfig')\n store.setState({ ariaLabelConfig: mergeAriaLabelConfig(fieldValue) });\n // Renamed fields\n else if (fieldName === 'fitView')\n store.setState({ fitViewQueued: fieldValue });\n else if (fieldName === 'fitViewOptions')\n store.setState({ fitViewOptions: fieldValue });\n // General case\n else\n store.setState({ [fieldName]: fieldValue });\n }\n previousFields.current = props;\n }, \n // Only re-run the effect if one of the fields we track changes\n fieldsToTrack.map((fieldName) => props[fieldName]));\n return null;\n}\n\nfunction getMediaQuery() {\n if (typeof window === 'undefined' || !window.matchMedia) {\n return null;\n }\n return window.matchMedia('(prefers-color-scheme: dark)');\n}\n/**\n * Hook for receiving the current color mode class 'dark' or 'light'.\n *\n * @internal\n * @param colorMode - The color mode to use ('dark', 'light' or 'system')\n */\nfunction useColorModeClass(colorMode) {\n const [colorModeClass, setColorModeClass] = useState(colorMode === 'system' ? null : colorMode);\n useEffect(() => {\n if (colorMode !== 'system') {\n setColorModeClass(colorMode);\n return;\n }\n const mediaQuery = getMediaQuery();\n const updateColorModeClass = () => setColorModeClass(mediaQuery?.matches ? 'dark' : 'light');\n updateColorModeClass();\n mediaQuery?.addEventListener('change', updateColorModeClass);\n return () => {\n mediaQuery?.removeEventListener('change', updateColorModeClass);\n };\n }, [colorMode]);\n return colorModeClass !== null ? colorModeClass : getMediaQuery()?.matches ? 'dark' : 'light';\n}\n\nconst defaultDoc = typeof document !== 'undefined' ? document : null;\n/**\n * This hook lets you listen for specific key codes and tells you whether they are\n * currently pressed or not.\n *\n * @public\n * @param options - Options\n *\n * @example\n * ```tsx\n *import { useKeyPress } from '@xyflow/react';\n *\n *export default function () {\n * const spacePressed = useKeyPress('Space');\n * const cmdAndSPressed = useKeyPress(['Meta+s', 'Strg+s']);\n *\n * return (\n *
\n * {spacePressed &&

Space pressed!

}\n * {cmdAndSPressed &&

Cmd + S pressed!

}\n *
\n * );\n *}\n *```\n */\nfunction useKeyPress(\n/**\n * The key code (string or array of strings) specifies which key(s) should trigger\n * an action.\n *\n * A **string** can represent:\n * - A **single key**, e.g. `'a'`\n * - A **key combination**, using `'+'` to separate keys, e.g. `'a+d'`\n *\n * An **array of strings** represents **multiple possible key inputs**. For example, `['a', 'd+s']`\n * means the user can press either the single key `'a'` or the combination of `'d'` and `'s'`.\n * @default null\n */\nkeyCode = null, options = { target: defaultDoc, actInsideInputWithModifier: true }) {\n const [keyPressed, setKeyPressed] = useState(false);\n // we need to remember if a modifier key is pressed in order to track it\n const modifierPressed = useRef(false);\n // we need to remember the pressed keys in order to support combinations\n const pressedKeys = useRef(new Set([]));\n /*\n * keyCodes = array with single keys [['a']] or key combinations [['a', 's']]\n * keysToWatch = array with all keys flattened ['a', 'd', 'ShiftLeft']\n * used to check if we store event.code or event.key. When the code is in the list of keysToWatch\n * we use the code otherwise the key. Explainer: When you press the left \"command\" key, the code is \"MetaLeft\"\n * and the key is \"Meta\". We want users to be able to pass keys and codes so we assume that the key is meant when\n * we can't find it in the list of keysToWatch.\n */\n const [keyCodes, keysToWatch] = useMemo(() => {\n if (keyCode !== null) {\n const keyCodeArr = Array.isArray(keyCode) ? keyCode : [keyCode];\n const keys = keyCodeArr\n .filter((kc) => typeof kc === 'string')\n /*\n * we first replace all '+' with '\\n' which we will use to split the keys on\n * then we replace '\\n\\n' with '\\n+', this way we can also support the combination 'key++'\n * in the end we simply split on '\\n' to get the key array\n */\n .map((kc) => kc.replace('+', '\\n').replace('\\n\\n', '\\n+').split('\\n'));\n const keysFlat = keys.reduce((res, item) => res.concat(...item), []);\n return [keys, keysFlat];\n }\n return [[], []];\n }, [keyCode]);\n useEffect(() => {\n const target = options?.target ?? defaultDoc;\n const actInsideInputWithModifier = options?.actInsideInputWithModifier ?? true;\n if (keyCode !== null) {\n const downHandler = (event) => {\n modifierPressed.current = event.ctrlKey || event.metaKey || event.shiftKey || event.altKey;\n const preventAction = (!modifierPressed.current || (modifierPressed.current && !actInsideInputWithModifier)) &&\n isInputDOMNode(event);\n if (preventAction) {\n return false;\n }\n const keyOrCode = useKeyOrCode(event.code, keysToWatch);\n pressedKeys.current.add(event[keyOrCode]);\n if (isMatchingKey(keyCodes, pressedKeys.current, false)) {\n const target = (event.composedPath?.()?.[0] || event.target);\n const isInteractiveElement = target?.nodeName === 'BUTTON' || target?.nodeName === 'A';\n if (options.preventDefault !== false && (modifierPressed.current || !isInteractiveElement)) {\n event.preventDefault();\n }\n setKeyPressed(true);\n }\n };\n const upHandler = (event) => {\n const keyOrCode = useKeyOrCode(event.code, keysToWatch);\n if (isMatchingKey(keyCodes, pressedKeys.current, true)) {\n setKeyPressed(false);\n pressedKeys.current.clear();\n }\n else {\n pressedKeys.current.delete(event[keyOrCode]);\n }\n // fix for Mac: when cmd key is pressed, keyup is not triggered for any other key, see: https://stackoverflow.com/questions/27380018/when-cmd-key-is-kept-pressed-keyup-is-not-triggered-for-any-other-key\n if (event.key === 'Meta') {\n pressedKeys.current.clear();\n }\n modifierPressed.current = false;\n };\n const resetHandler = () => {\n pressedKeys.current.clear();\n setKeyPressed(false);\n };\n target?.addEventListener('keydown', downHandler);\n target?.addEventListener('keyup', upHandler);\n window.addEventListener('blur', resetHandler);\n window.addEventListener('contextmenu', resetHandler);\n return () => {\n target?.removeEventListener('keydown', downHandler);\n target?.removeEventListener('keyup', upHandler);\n window.removeEventListener('blur', resetHandler);\n window.removeEventListener('contextmenu', resetHandler);\n };\n }\n }, [keyCode, setKeyPressed]);\n return keyPressed;\n}\n// utils\nfunction isMatchingKey(keyCodes, pressedKeys, isUp) {\n return (keyCodes\n /*\n * we only want to compare same sizes of keyCode definitions\n * and pressed keys. When the user specified 'Meta' as a key somewhere\n * this would also be truthy without this filter when user presses 'Meta' + 'r'\n */\n .filter((keys) => isUp || keys.length === pressedKeys.size)\n /*\n * since we want to support multiple possibilities only one of the\n * combinations need to be part of the pressed keys\n */\n .some((keys) => keys.every((k) => pressedKeys.has(k))));\n}\nfunction useKeyOrCode(eventCode, keysToWatch) {\n return keysToWatch.includes(eventCode) ? 'code' : 'key';\n}\n\n/**\n * Hook for getting viewport helper functions.\n *\n * @internal\n * @returns viewport helper functions\n */\nconst useViewportHelper = () => {\n const store = useStoreApi();\n return useMemo(() => {\n return {\n zoomIn: (options) => {\n const { panZoom } = store.getState();\n return panZoom ? panZoom.scaleBy(1.2, { duration: options?.duration }) : Promise.resolve(false);\n },\n zoomOut: (options) => {\n const { panZoom } = store.getState();\n return panZoom ? panZoom.scaleBy(1 / 1.2, { duration: options?.duration }) : Promise.resolve(false);\n },\n zoomTo: (zoomLevel, options) => {\n const { panZoom } = store.getState();\n return panZoom ? panZoom.scaleTo(zoomLevel, { duration: options?.duration }) : Promise.resolve(false);\n },\n getZoom: () => store.getState().transform[2],\n setViewport: async (viewport, options) => {\n const { transform: [tX, tY, tZoom], panZoom, } = store.getState();\n if (!panZoom) {\n return Promise.resolve(false);\n }\n await panZoom.setViewport({\n x: viewport.x ?? tX,\n y: viewport.y ?? tY,\n zoom: viewport.zoom ?? tZoom,\n }, options);\n return Promise.resolve(true);\n },\n getViewport: () => {\n const [x, y, zoom] = store.getState().transform;\n return { x, y, zoom };\n },\n setCenter: async (x, y, options) => {\n return store.getState().setCenter(x, y, options);\n },\n fitBounds: async (bounds, options) => {\n const { width, height, minZoom, maxZoom, panZoom } = store.getState();\n const viewport = getViewportForBounds(bounds, width, height, minZoom, maxZoom, options?.padding ?? 0.1);\n if (!panZoom) {\n return Promise.resolve(false);\n }\n await panZoom.setViewport(viewport, {\n duration: options?.duration,\n ease: options?.ease,\n interpolate: options?.interpolate,\n });\n return Promise.resolve(true);\n },\n screenToFlowPosition: (clientPosition, options = {}) => {\n const { transform, snapGrid, snapToGrid, domNode } = store.getState();\n if (!domNode) {\n return clientPosition;\n }\n const { x: domX, y: domY } = domNode.getBoundingClientRect();\n const correctedPosition = {\n x: clientPosition.x - domX,\n y: clientPosition.y - domY,\n };\n const _snapGrid = options.snapGrid ?? snapGrid;\n const _snapToGrid = options.snapToGrid ?? snapToGrid;\n return pointToRendererPoint(correctedPosition, transform, _snapToGrid, _snapGrid);\n },\n flowToScreenPosition: (flowPosition) => {\n const { transform, domNode } = store.getState();\n if (!domNode) {\n return flowPosition;\n }\n const { x: domX, y: domY } = domNode.getBoundingClientRect();\n const rendererPosition = rendererPointToPoint(flowPosition, transform);\n return {\n x: rendererPosition.x + domX,\n y: rendererPosition.y + domY,\n };\n },\n };\n }, []);\n};\n\n/*\n * This function applies changes to nodes or edges that are triggered by React Flow internally.\n * When you drag a node for example, React Flow will send a position change update.\n * This function then applies the changes and returns the updated elements.\n */\nfunction applyChanges(changes, elements) {\n const updatedElements = [];\n /*\n * By storing a map of changes for each element, we can a quick lookup as we\n * iterate over the elements array!\n */\n const changesMap = new Map();\n const addItemChanges = [];\n for (const change of changes) {\n if (change.type === 'add') {\n addItemChanges.push(change);\n continue;\n }\n else if (change.type === 'remove' || change.type === 'replace') {\n /*\n * For a 'remove' change we can safely ignore any other changes queued for\n * the same element, it's going to be removed anyway!\n */\n changesMap.set(change.id, [change]);\n }\n else {\n const elementChanges = changesMap.get(change.id);\n if (elementChanges) {\n /*\n * If we have some changes queued already, we can do a mutable update of\n * that array and save ourselves some copying.\n */\n elementChanges.push(change);\n }\n else {\n changesMap.set(change.id, [change]);\n }\n }\n }\n for (const element of elements) {\n const changes = changesMap.get(element.id);\n /*\n * When there are no changes for an element we can just push it unmodified,\n * no need to copy it.\n */\n if (!changes) {\n updatedElements.push(element);\n continue;\n }\n // If we have a 'remove' change queued, it'll be the only change in the array\n if (changes[0].type === 'remove') {\n continue;\n }\n if (changes[0].type === 'replace') {\n updatedElements.push({ ...changes[0].item });\n continue;\n }\n /**\n * For other types of changes, we want to start with a shallow copy of the\n * object so React knows this element has changed. Sequential changes will\n * each _mutate_ this object, so there's only ever one copy.\n */\n const updatedElement = { ...element };\n for (const change of changes) {\n applyChange(change, updatedElement);\n }\n updatedElements.push(updatedElement);\n }\n /*\n * we need to wait for all changes to be applied before adding new items\n * to be able to add them at the correct index\n */\n if (addItemChanges.length) {\n addItemChanges.forEach((change) => {\n if (change.index !== undefined) {\n updatedElements.splice(change.index, 0, { ...change.item });\n }\n else {\n updatedElements.push({ ...change.item });\n }\n });\n }\n return updatedElements;\n}\n// Applies a single change to an element. This is a *mutable* update.\nfunction applyChange(change, element) {\n switch (change.type) {\n case 'select': {\n element.selected = change.selected;\n break;\n }\n case 'position': {\n if (typeof change.position !== 'undefined') {\n element.position = change.position;\n }\n if (typeof change.dragging !== 'undefined') {\n element.dragging = change.dragging;\n }\n break;\n }\n case 'dimensions': {\n if (typeof change.dimensions !== 'undefined') {\n element.measured = {\n ...change.dimensions,\n };\n if (change.setAttributes) {\n if (change.setAttributes === true || change.setAttributes === 'width') {\n element.width = change.dimensions.width;\n }\n if (change.setAttributes === true || change.setAttributes === 'height') {\n element.height = change.dimensions.height;\n }\n }\n }\n if (typeof change.resizing === 'boolean') {\n element.resizing = change.resizing;\n }\n break;\n }\n }\n}\n/**\n * Drop in function that applies node changes to an array of nodes.\n * @public\n * @param changes - Array of changes to apply.\n * @param nodes - Array of nodes to apply the changes to.\n * @returns Array of updated nodes.\n * @example\n *```tsx\n *import { useState, useCallback } from 'react';\n *import { ReactFlow, applyNodeChanges, type Node, type Edge, type OnNodesChange } from '@xyflow/react';\n *\n *export default function Flow() {\n * const [nodes, setNodes] = useState([]);\n * const [edges, setEdges] = useState([]);\n * const onNodesChange: OnNodesChange = useCallback(\n * (changes) => {\n * setNodes((oldNodes) => applyNodeChanges(changes, oldNodes));\n * },\n * [setNodes],\n * );\n *\n * return (\n * \n * );\n *}\n *```\n * @remarks Various events on the component can produce an {@link NodeChange}\n * that describes how to update the edges of your flow in some way.\n * If you don't need any custom behaviour, this util can be used to take an array\n * of these changes and apply them to your edges.\n */\nfunction applyNodeChanges(changes, nodes) {\n return applyChanges(changes, nodes);\n}\n/**\n * Drop in function that applies edge changes to an array of edges.\n * @public\n * @param changes - Array of changes to apply.\n * @param edges - Array of edge to apply the changes to.\n * @returns Array of updated edges.\n * @example\n * ```tsx\n *import { useState, useCallback } from 'react';\n *import { ReactFlow, applyEdgeChanges } from '@xyflow/react';\n *\n *export default function Flow() {\n * const [nodes, setNodes] = useState([]);\n * const [edges, setEdges] = useState([]);\n * const onEdgesChange = useCallback(\n * (changes) => {\n * setEdges((oldEdges) => applyEdgeChanges(changes, oldEdges));\n * },\n * [setEdges],\n * );\n *\n * return (\n * \n * );\n *}\n *```\n * @remarks Various events on the component can produce an {@link EdgeChange}\n * that describes how to update the edges of your flow in some way.\n * If you don't need any custom behaviour, this util can be used to take an array\n * of these changes and apply them to your edges.\n */\nfunction applyEdgeChanges(changes, edges) {\n return applyChanges(changes, edges);\n}\nfunction createSelectionChange(id, selected) {\n return {\n id,\n type: 'select',\n selected,\n };\n}\nfunction getSelectionChanges(items, selectedIds = new Set(), mutateItem = false) {\n const changes = [];\n for (const [id, item] of items) {\n const willBeSelected = selectedIds.has(id);\n // we don't want to set all items to selected=false on the first selection\n if (!(item.selected === undefined && !willBeSelected) && item.selected !== willBeSelected) {\n if (mutateItem) {\n /*\n * this hack is needed for nodes. When the user dragged a node, it's selected.\n * When another node gets dragged, we need to deselect the previous one,\n * in order to have only one selected node at a time - the onNodesChange callback comes too late here :/\n */\n item.selected = willBeSelected;\n }\n changes.push(createSelectionChange(item.id, willBeSelected));\n }\n }\n return changes;\n}\nfunction getElementsDiffChanges({ items = [], lookup, }) {\n const changes = [];\n const itemsLookup = new Map(items.map((item) => [item.id, item]));\n for (const [index, item] of items.entries()) {\n const lookupItem = lookup.get(item.id);\n const storeItem = lookupItem?.internals?.userNode ?? lookupItem;\n if (storeItem !== undefined && storeItem !== item) {\n changes.push({ id: item.id, item: item, type: 'replace' });\n }\n if (storeItem === undefined) {\n changes.push({ item: item, type: 'add', index });\n }\n }\n for (const [id] of lookup) {\n const nextNode = itemsLookup.get(id);\n if (nextNode === undefined) {\n changes.push({ id, type: 'remove' });\n }\n }\n return changes;\n}\nfunction elementToRemoveChange(item) {\n return {\n id: item.id,\n type: 'remove',\n };\n}\n\n/**\n * Test whether an object is usable as an [`Node`](/api-reference/types/node).\n * In TypeScript this is a type guard that will narrow the type of whatever you pass in to\n * [`Node`](/api-reference/types/node) if it returns `true`.\n *\n * @public\n * @remarks In TypeScript this is a type guard that will narrow the type of whatever you pass in to Node if it returns true\n * @param element - The element to test.\n * @returns Tests whether the provided value can be used as a `Node`. If you're using TypeScript,\n * this function acts as a type guard and will narrow the type of the value to `Node` if it returns\n * `true`.\n *\n * @example\n * ```js\n *import { isNode } from '@xyflow/react';\n *\n *if (isNode(node)) {\n * // ...\n *}\n *```\n */\nconst isNode = (element) => isNodeBase(element);\n/**\n * Test whether an object is usable as an [`Edge`](/api-reference/types/edge).\n * In TypeScript this is a type guard that will narrow the type of whatever you pass in to\n * [`Edge`](/api-reference/types/edge) if it returns `true`.\n *\n * @public\n * @remarks In TypeScript this is a type guard that will narrow the type of whatever you pass in to Edge if it returns true\n * @param element - The element to test\n * @returns Tests whether the provided value can be used as an `Edge`. If you're using TypeScript,\n * this function acts as a type guard and will narrow the type of the value to `Edge` if it returns\n * `true`.\n *\n * @example\n * ```js\n *import { isEdge } from '@xyflow/react';\n *\n *if (isEdge(edge)) {\n * // ...\n *}\n *```\n */\nconst isEdge = (element) => isEdgeBase(element);\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nfunction fixedForwardRef(render) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return forwardRef(render);\n}\n\n// we need this hook to prevent a warning when using react-flow in SSR\nconst useIsomorphicLayoutEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect;\n\n/**\n * This hook returns a queue that can be used to batch updates.\n *\n * @param runQueue - a function that gets called when the queue is flushed\n * @internal\n *\n * @returns a Queue object\n */\nfunction useQueue(runQueue) {\n /*\n * Because we're using a ref above, we need some way to let React know when to\n * actually process the queue. We increment this number any time we mutate the\n * queue, creating a new state to trigger the layout effect below.\n * Using a boolean dirty flag here instead would lead to issues related to\n * automatic batching. (https://github.com/xyflow/xyflow/issues/4779)\n */\n const [serial, setSerial] = useState(BigInt(0));\n /*\n * A reference of all the batched updates to process before the next render. We\n * want a reference here so multiple synchronous calls to `setNodes` etc can be\n * batched together.\n */\n const [queue] = useState(() => createQueue(() => setSerial(n => n + BigInt(1))));\n /*\n * Layout effects are guaranteed to run before the next render which means we\n * shouldn't run into any issues with stale state or weird issues that come from\n * rendering things one frame later than expected (we used to use `setTimeout`).\n */\n useIsomorphicLayoutEffect(() => {\n const queueItems = queue.get();\n if (queueItems.length) {\n runQueue(queueItems);\n queue.reset();\n }\n }, [serial]);\n return queue;\n}\nfunction createQueue(cb) {\n let queue = [];\n return {\n get: () => queue,\n reset: () => {\n queue = [];\n },\n push: (item) => {\n queue.push(item);\n cb();\n },\n };\n}\n\nconst BatchContext = createContext(null);\n/**\n * This is a context provider that holds and processes the node and edge update queues\n * that are needed to handle setNodes, addNodes, setEdges and addEdges.\n *\n * @internal\n */\nfunction BatchProvider({ children, }) {\n const store = useStoreApi();\n const nodeQueueHandler = useCallback((queueItems) => {\n const { nodes = [], setNodes, hasDefaultNodes, onNodesChange, nodeLookup, fitViewQueued, onNodesChangeMiddlewareMap, } = store.getState();\n /*\n * This is essentially an `Array.reduce` in imperative clothing. Processing\n * this queue is a relatively hot path so we'd like to avoid the overhead of\n * array methods where we can.\n */\n let next = nodes;\n for (const payload of queueItems) {\n next = typeof payload === 'function' ? payload(next) : payload;\n }\n let changes = getElementsDiffChanges({\n items: next,\n lookup: nodeLookup,\n });\n for (const middleware of onNodesChangeMiddlewareMap.values()) {\n changes = middleware(changes);\n }\n if (hasDefaultNodes) {\n setNodes(next);\n }\n // We only want to fire onNodesChange if there are changes to the nodes\n if (changes.length > 0) {\n onNodesChange?.(changes);\n }\n else if (fitViewQueued) {\n // If there are no changes to the nodes, we still need to call setNodes\n // to trigger a re-render and fitView.\n window.requestAnimationFrame(() => {\n const { fitViewQueued, nodes, setNodes } = store.getState();\n if (fitViewQueued) {\n setNodes(nodes);\n }\n });\n }\n }, []);\n const nodeQueue = useQueue(nodeQueueHandler);\n const edgeQueueHandler = useCallback((queueItems) => {\n const { edges = [], setEdges, hasDefaultEdges, onEdgesChange, edgeLookup } = store.getState();\n let next = edges;\n for (const payload of queueItems) {\n next = typeof payload === 'function' ? payload(next) : payload;\n }\n if (hasDefaultEdges) {\n setEdges(next);\n }\n else if (onEdgesChange) {\n onEdgesChange(getElementsDiffChanges({\n items: next,\n lookup: edgeLookup,\n }));\n }\n }, []);\n const edgeQueue = useQueue(edgeQueueHandler);\n const value = useMemo(() => ({ nodeQueue, edgeQueue }), []);\n return jsx(BatchContext.Provider, { value: value, children: children });\n}\nfunction useBatchContext() {\n const batchContext = useContext(BatchContext);\n if (!batchContext) {\n throw new Error('useBatchContext must be used within a BatchProvider');\n }\n return batchContext;\n}\n\nconst selector$k = (s) => !!s.panZoom;\n/**\n * This hook returns a ReactFlowInstance that can be used to update nodes and edges, manipulate the viewport, or query the current state of the flow.\n *\n * @public\n * @example\n * ```jsx\n *import { useCallback, useState } from 'react';\n *import { useReactFlow } from '@xyflow/react';\n *\n *export function NodeCounter() {\n * const reactFlow = useReactFlow();\n * const [count, setCount] = useState(0);\n * const countNodes = useCallback(() => {\n * setCount(reactFlow.getNodes().length);\n * // you need to pass it as a dependency if you are using it with useEffect or useCallback\n * // because at the first render, it's not initialized yet and some functions might not work.\n * }, [reactFlow]);\n *\n * return (\n *
\n * \n *

There are {count} nodes in the flow.

\n *
\n * );\n *}\n *```\n */\nfunction useReactFlow() {\n const viewportHelper = useViewportHelper();\n const store = useStoreApi();\n const batchContext = useBatchContext();\n const viewportInitialized = useStore(selector$k);\n const generalHelper = useMemo(() => {\n const getInternalNode = (id) => store.getState().nodeLookup.get(id);\n const setNodes = (payload) => {\n batchContext.nodeQueue.push(payload);\n };\n const setEdges = (payload) => {\n batchContext.edgeQueue.push(payload);\n };\n const getNodeRect = (node) => {\n const { nodeLookup, nodeOrigin } = store.getState();\n const nodeToUse = isNode(node) ? node : nodeLookup.get(node.id);\n const position = nodeToUse.parentId\n ? evaluateAbsolutePosition(nodeToUse.position, nodeToUse.measured, nodeToUse.parentId, nodeLookup, nodeOrigin)\n : nodeToUse.position;\n const nodeWithPosition = {\n ...nodeToUse,\n position,\n width: nodeToUse.measured?.width ?? nodeToUse.width,\n height: nodeToUse.measured?.height ?? nodeToUse.height,\n };\n return nodeToRect(nodeWithPosition);\n };\n const updateNode = (id, nodeUpdate, options = { replace: false }) => {\n setNodes((prevNodes) => prevNodes.map((node) => {\n if (node.id === id) {\n const nextNode = typeof nodeUpdate === 'function' ? nodeUpdate(node) : nodeUpdate;\n return options.replace && isNode(nextNode) ? nextNode : { ...node, ...nextNode };\n }\n return node;\n }));\n };\n const updateEdge = (id, edgeUpdate, options = { replace: false }) => {\n setEdges((prevEdges) => prevEdges.map((edge) => {\n if (edge.id === id) {\n const nextEdge = typeof edgeUpdate === 'function' ? edgeUpdate(edge) : edgeUpdate;\n return options.replace && isEdge(nextEdge) ? nextEdge : { ...edge, ...nextEdge };\n }\n return edge;\n }));\n };\n return {\n getNodes: () => store.getState().nodes.map((n) => ({ ...n })),\n getNode: (id) => getInternalNode(id)?.internals.userNode,\n getInternalNode,\n getEdges: () => {\n const { edges = [] } = store.getState();\n return edges.map((e) => ({ ...e }));\n },\n getEdge: (id) => store.getState().edgeLookup.get(id),\n setNodes,\n setEdges,\n addNodes: (payload) => {\n const newNodes = Array.isArray(payload) ? payload : [payload];\n batchContext.nodeQueue.push((nodes) => [...nodes, ...newNodes]);\n },\n addEdges: (payload) => {\n const newEdges = Array.isArray(payload) ? payload : [payload];\n batchContext.edgeQueue.push((edges) => [...edges, ...newEdges]);\n },\n toObject: () => {\n const { nodes = [], edges = [], transform } = store.getState();\n const [x, y, zoom] = transform;\n return {\n nodes: nodes.map((n) => ({ ...n })),\n edges: edges.map((e) => ({ ...e })),\n viewport: {\n x,\n y,\n zoom,\n },\n };\n },\n deleteElements: async ({ nodes: nodesToRemove = [], edges: edgesToRemove = [] }) => {\n const { nodes, edges, onNodesDelete, onEdgesDelete, triggerNodeChanges, triggerEdgeChanges, onDelete, onBeforeDelete, } = store.getState();\n const { nodes: matchingNodes, edges: matchingEdges } = await getElementsToRemove({\n nodesToRemove,\n edgesToRemove,\n nodes,\n edges,\n onBeforeDelete,\n });\n const hasMatchingEdges = matchingEdges.length > 0;\n const hasMatchingNodes = matchingNodes.length > 0;\n if (hasMatchingEdges) {\n const edgeChanges = matchingEdges.map(elementToRemoveChange);\n onEdgesDelete?.(matchingEdges);\n triggerEdgeChanges(edgeChanges);\n }\n if (hasMatchingNodes) {\n const nodeChanges = matchingNodes.map(elementToRemoveChange);\n onNodesDelete?.(matchingNodes);\n triggerNodeChanges(nodeChanges);\n }\n if (hasMatchingNodes || hasMatchingEdges) {\n onDelete?.({ nodes: matchingNodes, edges: matchingEdges });\n }\n return { deletedNodes: matchingNodes, deletedEdges: matchingEdges };\n },\n /**\n * Partial is defined as \"the 2 nodes/areas are intersecting partially\".\n * If a is contained in b or b is contained in a, they are both\n * considered fully intersecting.\n */\n getIntersectingNodes: (nodeOrRect, partially = true, nodes) => {\n const isRect = isRectObject(nodeOrRect);\n const nodeRect = isRect ? nodeOrRect : getNodeRect(nodeOrRect);\n const hasNodesOption = nodes !== undefined;\n if (!nodeRect) {\n return [];\n }\n return (nodes || store.getState().nodes).filter((n) => {\n const internalNode = store.getState().nodeLookup.get(n.id);\n if (internalNode && !isRect && (n.id === nodeOrRect.id || !internalNode.internals.positionAbsolute)) {\n return false;\n }\n const currNodeRect = nodeToRect(hasNodesOption ? n : internalNode);\n const overlappingArea = getOverlappingArea(currNodeRect, nodeRect);\n const partiallyVisible = partially && overlappingArea > 0;\n return (partiallyVisible ||\n overlappingArea >= currNodeRect.width * currNodeRect.height ||\n overlappingArea >= nodeRect.width * nodeRect.height);\n });\n },\n isNodeIntersecting: (nodeOrRect, area, partially = true) => {\n const isRect = isRectObject(nodeOrRect);\n const nodeRect = isRect ? nodeOrRect : getNodeRect(nodeOrRect);\n if (!nodeRect) {\n return false;\n }\n const overlappingArea = getOverlappingArea(nodeRect, area);\n const partiallyVisible = partially && overlappingArea > 0;\n return (partiallyVisible ||\n overlappingArea >= area.width * area.height ||\n overlappingArea >= nodeRect.width * nodeRect.height);\n },\n updateNode,\n updateNodeData: (id, dataUpdate, options = { replace: false }) => {\n updateNode(id, (node) => {\n const nextData = typeof dataUpdate === 'function' ? dataUpdate(node) : dataUpdate;\n return options.replace ? { ...node, data: nextData } : { ...node, data: { ...node.data, ...nextData } };\n }, options);\n },\n updateEdge,\n updateEdgeData: (id, dataUpdate, options = { replace: false }) => {\n updateEdge(id, (edge) => {\n const nextData = typeof dataUpdate === 'function' ? dataUpdate(edge) : dataUpdate;\n return options.replace ? { ...edge, data: nextData } : { ...edge, data: { ...edge.data, ...nextData } };\n }, options);\n },\n getNodesBounds: (nodes) => {\n const { nodeLookup, nodeOrigin } = store.getState();\n return getNodesBounds(nodes, { nodeLookup, nodeOrigin });\n },\n getHandleConnections: ({ type, id, nodeId }) => Array.from(store\n .getState()\n .connectionLookup.get(`${nodeId}-${type}${id ? `-${id}` : ''}`)\n ?.values() ?? []),\n getNodeConnections: ({ type, handleId, nodeId }) => Array.from(store\n .getState()\n .connectionLookup.get(`${nodeId}${type ? (handleId ? `-${type}-${handleId}` : `-${type}`) : ''}`)\n ?.values() ?? []),\n fitView: async (options) => {\n // We either create a new Promise or reuse the existing one\n // Even if fitView is called multiple times in a row, we only end up with a single Promise\n const fitViewResolver = store.getState().fitViewResolver ?? withResolvers();\n // We schedule a fitView by setting fitViewQueued and triggering a setNodes\n store.setState({ fitViewQueued: true, fitViewOptions: options, fitViewResolver });\n batchContext.nodeQueue.push((nodes) => [...nodes]);\n return fitViewResolver.promise;\n },\n };\n }, []);\n return useMemo(() => {\n return {\n ...generalHelper,\n ...viewportHelper,\n viewportInitialized,\n };\n }, [viewportInitialized]);\n}\n\nconst selected = (item) => item.selected;\nconst win$1 = typeof window !== 'undefined' ? window : undefined;\n/**\n * Hook for handling global key events.\n *\n * @internal\n */\nfunction useGlobalKeyHandler({ deleteKeyCode, multiSelectionKeyCode, }) {\n const store = useStoreApi();\n const { deleteElements } = useReactFlow();\n const deleteKeyPressed = useKeyPress(deleteKeyCode, { actInsideInputWithModifier: false });\n const multiSelectionKeyPressed = useKeyPress(multiSelectionKeyCode, { target: win$1 });\n useEffect(() => {\n if (deleteKeyPressed) {\n const { edges, nodes } = store.getState();\n deleteElements({ nodes: nodes.filter(selected), edges: edges.filter(selected) });\n store.setState({ nodesSelectionActive: false });\n }\n }, [deleteKeyPressed]);\n useEffect(() => {\n store.setState({ multiSelectionActive: multiSelectionKeyPressed });\n }, [multiSelectionKeyPressed]);\n}\n\n/**\n * Hook for handling resize events.\n *\n * @internal\n */\nfunction useResizeHandler(domNode) {\n const store = useStoreApi();\n useEffect(() => {\n const updateDimensions = () => {\n if (!domNode.current || !(domNode.current.checkVisibility?.() ?? true)) {\n return false;\n }\n const size = getDimensions(domNode.current);\n if (size.height === 0 || size.width === 0) {\n store.getState().onError?.('004', errorMessages['error004']());\n }\n store.setState({ width: size.width || 500, height: size.height || 500 });\n };\n if (domNode.current) {\n updateDimensions();\n window.addEventListener('resize', updateDimensions);\n const resizeObserver = new ResizeObserver(() => updateDimensions());\n resizeObserver.observe(domNode.current);\n return () => {\n window.removeEventListener('resize', updateDimensions);\n if (resizeObserver && domNode.current) {\n resizeObserver.unobserve(domNode.current);\n }\n };\n }\n }, []);\n}\n\nconst containerStyle = {\n position: 'absolute',\n width: '100%',\n height: '100%',\n top: 0,\n left: 0,\n};\n\nconst selector$j = (s) => ({\n userSelectionActive: s.userSelectionActive,\n lib: s.lib,\n connectionInProgress: s.connection.inProgress,\n});\nfunction ZoomPane({ onPaneContextMenu, zoomOnScroll = true, zoomOnPinch = true, panOnScroll = false, panOnScrollSpeed = 0.5, panOnScrollMode = PanOnScrollMode.Free, zoomOnDoubleClick = true, panOnDrag = true, defaultViewport, translateExtent, minZoom, maxZoom, zoomActivationKeyCode, preventScrolling = true, children, noWheelClassName, noPanClassName, onViewportChange, isControlledViewport, paneClickDistance, selectionOnDrag, }) {\n const store = useStoreApi();\n const zoomPane = useRef(null);\n const { userSelectionActive, lib, connectionInProgress } = useStore(selector$j, shallow);\n const zoomActivationKeyPressed = useKeyPress(zoomActivationKeyCode);\n const panZoom = useRef();\n useResizeHandler(zoomPane);\n const onTransformChange = useCallback((transform) => {\n onViewportChange?.({ x: transform[0], y: transform[1], zoom: transform[2] });\n if (!isControlledViewport) {\n store.setState({ transform });\n }\n }, [onViewportChange, isControlledViewport]);\n useEffect(() => {\n if (zoomPane.current) {\n panZoom.current = XYPanZoom({\n domNode: zoomPane.current,\n minZoom,\n maxZoom,\n translateExtent,\n viewport: defaultViewport,\n onDraggingChange: (paneDragging) => store.setState({ paneDragging }),\n onPanZoomStart: (event, vp) => {\n const { onViewportChangeStart, onMoveStart } = store.getState();\n onMoveStart?.(event, vp);\n onViewportChangeStart?.(vp);\n },\n onPanZoom: (event, vp) => {\n const { onViewportChange, onMove } = store.getState();\n onMove?.(event, vp);\n onViewportChange?.(vp);\n },\n onPanZoomEnd: (event, vp) => {\n const { onViewportChangeEnd, onMoveEnd } = store.getState();\n onMoveEnd?.(event, vp);\n onViewportChangeEnd?.(vp);\n },\n });\n const { x, y, zoom } = panZoom.current.getViewport();\n store.setState({\n panZoom: panZoom.current,\n transform: [x, y, zoom],\n domNode: zoomPane.current.closest('.react-flow'),\n });\n return () => {\n panZoom.current?.destroy();\n };\n }\n }, []);\n useEffect(() => {\n panZoom.current?.update({\n onPaneContextMenu,\n zoomOnScroll,\n zoomOnPinch,\n panOnScroll,\n panOnScrollSpeed,\n panOnScrollMode,\n zoomOnDoubleClick,\n panOnDrag,\n zoomActivationKeyPressed,\n preventScrolling,\n noPanClassName,\n userSelectionActive,\n noWheelClassName,\n lib,\n onTransformChange,\n connectionInProgress,\n selectionOnDrag,\n paneClickDistance,\n });\n }, [\n onPaneContextMenu,\n zoomOnScroll,\n zoomOnPinch,\n panOnScroll,\n panOnScrollSpeed,\n panOnScrollMode,\n zoomOnDoubleClick,\n panOnDrag,\n zoomActivationKeyPressed,\n preventScrolling,\n noPanClassName,\n userSelectionActive,\n noWheelClassName,\n lib,\n onTransformChange,\n connectionInProgress,\n selectionOnDrag,\n paneClickDistance,\n ]);\n return (jsx(\"div\", { className: \"react-flow__renderer\", ref: zoomPane, style: containerStyle, children: children }));\n}\n\nconst selector$i = (s) => ({\n userSelectionActive: s.userSelectionActive,\n userSelectionRect: s.userSelectionRect,\n});\nfunction UserSelection() {\n const { userSelectionActive, userSelectionRect } = useStore(selector$i, shallow);\n const isActive = userSelectionActive && userSelectionRect;\n if (!isActive) {\n return null;\n }\n return (jsx(\"div\", { className: \"react-flow__selection react-flow__container\", style: {\n width: userSelectionRect.width,\n height: userSelectionRect.height,\n transform: `translate(${userSelectionRect.x}px, ${userSelectionRect.y}px)`,\n } }));\n}\n\nconst wrapHandler = (handler, containerRef) => {\n return (event) => {\n if (event.target !== containerRef.current) {\n return;\n }\n handler?.(event);\n };\n};\nconst selector$h = (s) => ({\n userSelectionActive: s.userSelectionActive,\n elementsSelectable: s.elementsSelectable,\n connectionInProgress: s.connection.inProgress,\n dragging: s.paneDragging,\n});\nfunction Pane({ isSelecting, selectionKeyPressed, selectionMode = SelectionMode.Full, panOnDrag, paneClickDistance, selectionOnDrag, onSelectionStart, onSelectionEnd, onPaneClick, onPaneContextMenu, onPaneScroll, onPaneMouseEnter, onPaneMouseMove, onPaneMouseLeave, children, }) {\n const store = useStoreApi();\n const { userSelectionActive, elementsSelectable, dragging, connectionInProgress } = useStore(selector$h, shallow);\n const isSelectionEnabled = elementsSelectable && (isSelecting || userSelectionActive);\n const container = useRef(null);\n const containerBounds = useRef();\n const selectedNodeIds = useRef(new Set());\n const selectedEdgeIds = useRef(new Set());\n // Used to prevent click events when the user lets go of the selectionKey during a selection\n const selectionInProgress = useRef(false);\n const onClick = (event) => {\n // We prevent click events when the user let go of the selectionKey during a selection\n // We also prevent click events when a connection is in progress\n if (selectionInProgress.current || connectionInProgress) {\n selectionInProgress.current = false;\n return;\n }\n onPaneClick?.(event);\n store.getState().resetSelectedElements();\n store.setState({ nodesSelectionActive: false });\n };\n const onContextMenu = (event) => {\n if (Array.isArray(panOnDrag) && panOnDrag?.includes(2)) {\n event.preventDefault();\n return;\n }\n onPaneContextMenu?.(event);\n };\n const onWheel = onPaneScroll ? (event) => onPaneScroll(event) : undefined;\n const onClickCapture = (event) => {\n if (selectionInProgress.current) {\n event.stopPropagation();\n selectionInProgress.current = false;\n }\n };\n // We are using capture here in order to prevent other pointer events\n // to be able to create a selection above a node or an edge\n const onPointerDownCapture = (event) => {\n const { domNode } = store.getState();\n containerBounds.current = domNode?.getBoundingClientRect();\n if (!containerBounds.current)\n return;\n const eventTargetIsContainer = event.target === container.current;\n // if a child element has the 'nokey' class, we don't want to swallow the event and don't start a selection\n const isNoKeyEvent = !eventTargetIsContainer && !!event.target.closest('.nokey');\n const isSelectionActive = (selectionOnDrag && eventTargetIsContainer) || selectionKeyPressed;\n if (isNoKeyEvent || !isSelecting || !isSelectionActive || event.button !== 0 || !event.isPrimary) {\n return;\n }\n event.target?.setPointerCapture?.(event.pointerId);\n selectionInProgress.current = false;\n const { x, y } = getEventPosition(event.nativeEvent, containerBounds.current);\n store.setState({\n userSelectionRect: {\n width: 0,\n height: 0,\n startX: x,\n startY: y,\n x,\n y,\n },\n });\n if (!eventTargetIsContainer) {\n event.stopPropagation();\n event.preventDefault();\n }\n };\n const onPointerMove = (event) => {\n const { userSelectionRect, transform, nodeLookup, edgeLookup, connectionLookup, triggerNodeChanges, triggerEdgeChanges, defaultEdgeOptions, resetSelectedElements, } = store.getState();\n if (!containerBounds.current || !userSelectionRect) {\n return;\n }\n const { x: mouseX, y: mouseY } = getEventPosition(event.nativeEvent, containerBounds.current);\n const { startX, startY } = userSelectionRect;\n if (!selectionInProgress.current) {\n const requiredDistance = selectionKeyPressed ? 0 : paneClickDistance;\n const distance = Math.hypot(mouseX - startX, mouseY - startY);\n if (distance <= requiredDistance) {\n return;\n }\n resetSelectedElements();\n onSelectionStart?.(event);\n }\n selectionInProgress.current = true;\n const nextUserSelectRect = {\n startX,\n startY,\n x: mouseX < startX ? mouseX : startX,\n y: mouseY < startY ? mouseY : startY,\n width: Math.abs(mouseX - startX),\n height: Math.abs(mouseY - startY),\n };\n const prevSelectedNodeIds = selectedNodeIds.current;\n const prevSelectedEdgeIds = selectedEdgeIds.current;\n selectedNodeIds.current = new Set(getNodesInside(nodeLookup, nextUserSelectRect, transform, selectionMode === SelectionMode.Partial, true).map((node) => node.id));\n selectedEdgeIds.current = new Set();\n const edgesSelectable = defaultEdgeOptions?.selectable ?? true;\n // We look for all edges connected to the selected nodes\n for (const nodeId of selectedNodeIds.current) {\n const connections = connectionLookup.get(nodeId);\n if (!connections)\n continue;\n for (const { edgeId } of connections.values()) {\n const edge = edgeLookup.get(edgeId);\n if (edge && (edge.selectable ?? edgesSelectable)) {\n selectedEdgeIds.current.add(edgeId);\n }\n }\n }\n if (!areSetsEqual(prevSelectedNodeIds, selectedNodeIds.current)) {\n const changes = getSelectionChanges(nodeLookup, selectedNodeIds.current, true);\n triggerNodeChanges(changes);\n }\n if (!areSetsEqual(prevSelectedEdgeIds, selectedEdgeIds.current)) {\n const changes = getSelectionChanges(edgeLookup, selectedEdgeIds.current);\n triggerEdgeChanges(changes);\n }\n store.setState({\n userSelectionRect: nextUserSelectRect,\n userSelectionActive: true,\n nodesSelectionActive: false,\n });\n };\n const onPointerUp = (event) => {\n if (event.button !== 0) {\n return;\n }\n event.target?.releasePointerCapture?.(event.pointerId);\n /*\n * We only want to trigger click functions when in selection mode if\n * the user did not move the mouse.\n */\n if (!userSelectionActive && event.target === container.current && store.getState().userSelectionRect) {\n onClick?.(event);\n }\n store.setState({\n userSelectionActive: false,\n userSelectionRect: null,\n });\n if (selectionInProgress.current) {\n onSelectionEnd?.(event);\n store.setState({\n nodesSelectionActive: selectedNodeIds.current.size > 0,\n });\n }\n };\n const draggable = panOnDrag === true || (Array.isArray(panOnDrag) && panOnDrag.includes(0));\n return (jsxs(\"div\", { className: cc(['react-flow__pane', { draggable, dragging, selection: isSelecting }]), onClick: isSelectionEnabled ? undefined : wrapHandler(onClick, container), onContextMenu: wrapHandler(onContextMenu, container), onWheel: wrapHandler(onWheel, container), onPointerEnter: isSelectionEnabled ? undefined : onPaneMouseEnter, onPointerMove: isSelectionEnabled ? onPointerMove : onPaneMouseMove, onPointerUp: isSelectionEnabled ? onPointerUp : undefined, onPointerDownCapture: isSelectionEnabled ? onPointerDownCapture : undefined, onClickCapture: isSelectionEnabled ? onClickCapture : undefined, onPointerLeave: onPaneMouseLeave, ref: container, style: containerStyle, children: [children, jsx(UserSelection, {})] }));\n}\n\n/*\n * this handler is called by\n * 1. the click handler when node is not draggable or selectNodesOnDrag = false\n * or\n * 2. the on drag start handler when node is draggable and selectNodesOnDrag = true\n */\nfunction handleNodeClick({ id, store, unselect = false, nodeRef, }) {\n const { addSelectedNodes, unselectNodesAndEdges, multiSelectionActive, nodeLookup, onError } = store.getState();\n const node = nodeLookup.get(id);\n if (!node) {\n onError?.('012', errorMessages['error012'](id));\n return;\n }\n store.setState({ nodesSelectionActive: false });\n if (!node.selected) {\n addSelectedNodes([id]);\n }\n else if (unselect || (node.selected && multiSelectionActive)) {\n unselectNodesAndEdges({ nodes: [node], edges: [] });\n requestAnimationFrame(() => nodeRef?.current?.blur());\n }\n}\n\n/**\n * Hook for calling XYDrag helper from @xyflow/system.\n *\n * @internal\n */\nfunction useDrag({ nodeRef, disabled = false, noDragClassName, handleSelector, nodeId, isSelectable, nodeClickDistance, }) {\n const store = useStoreApi();\n const [dragging, setDragging] = useState(false);\n const xyDrag = useRef();\n useEffect(() => {\n xyDrag.current = XYDrag({\n getStoreItems: () => store.getState(),\n onNodeMouseDown: (id) => {\n handleNodeClick({\n id,\n store,\n nodeRef,\n });\n },\n onDragStart: () => {\n setDragging(true);\n },\n onDragStop: () => {\n setDragging(false);\n },\n });\n }, []);\n useEffect(() => {\n if (disabled) {\n xyDrag.current?.destroy();\n }\n else if (nodeRef.current) {\n xyDrag.current?.update({\n noDragClassName,\n handleSelector,\n domNode: nodeRef.current,\n isSelectable,\n nodeId,\n nodeClickDistance,\n });\n return () => {\n xyDrag.current?.destroy();\n };\n }\n }, [noDragClassName, handleSelector, disabled, isSelectable, nodeRef, nodeId]);\n return dragging;\n}\n\nconst selectedAndDraggable = (nodesDraggable) => (n) => n.selected && (n.draggable || (nodesDraggable && typeof n.draggable === 'undefined'));\n/**\n * Hook for updating node positions by passing a direction and factor\n *\n * @internal\n * @returns function for updating node positions\n */\nfunction useMoveSelectedNodes() {\n const store = useStoreApi();\n const moveSelectedNodes = useCallback((params) => {\n const { nodeExtent, snapToGrid, snapGrid, nodesDraggable, onError, updateNodePositions, nodeLookup, nodeOrigin } = store.getState();\n const nodeUpdates = new Map();\n const isSelected = selectedAndDraggable(nodesDraggable);\n /*\n * by default a node moves 5px on each key press\n * if snap grid is enabled, we use that for the velocity\n */\n const xVelo = snapToGrid ? snapGrid[0] : 5;\n const yVelo = snapToGrid ? snapGrid[1] : 5;\n const xDiff = params.direction.x * xVelo * params.factor;\n const yDiff = params.direction.y * yVelo * params.factor;\n for (const [, node] of nodeLookup) {\n if (!isSelected(node)) {\n continue;\n }\n let nextPosition = {\n x: node.internals.positionAbsolute.x + xDiff,\n y: node.internals.positionAbsolute.y + yDiff,\n };\n if (snapToGrid) {\n nextPosition = snapPosition(nextPosition, snapGrid);\n }\n const { position, positionAbsolute } = calculateNodePosition({\n nodeId: node.id,\n nextPosition,\n nodeLookup,\n nodeExtent,\n nodeOrigin,\n onError,\n });\n node.position = position;\n node.internals.positionAbsolute = positionAbsolute;\n nodeUpdates.set(node.id, node);\n }\n updateNodePositions(nodeUpdates);\n }, []);\n return moveSelectedNodes;\n}\n\nconst NodeIdContext = createContext(null);\nconst Provider = NodeIdContext.Provider;\nNodeIdContext.Consumer;\n/**\n * You can use this hook to get the id of the node it is used inside. It is useful\n * if you need the node's id deeper in the render tree but don't want to manually\n * drill down the id as a prop.\n *\n * @public\n * @returns The id for a node in the flow.\n *\n * @example\n *```jsx\n *import { useNodeId } from '@xyflow/react';\n *\n *export default function CustomNode() {\n * return (\n *
\n * This node has an id of \n * \n *
\n * );\n *}\n *\n *function NodeIdDisplay() {\n * const nodeId = useNodeId();\n *\n * return {nodeId};\n *}\n *```\n */\nconst useNodeId = () => {\n const nodeId = useContext(NodeIdContext);\n return nodeId;\n};\n\nconst selector$g = (s) => ({\n connectOnClick: s.connectOnClick,\n noPanClassName: s.noPanClassName,\n rfId: s.rfId,\n});\nconst connectingSelector = (nodeId, handleId, type) => (state) => {\n const { connectionClickStartHandle: clickHandle, connectionMode, connection } = state;\n const { fromHandle, toHandle, isValid } = connection;\n const connectingTo = toHandle?.nodeId === nodeId && toHandle?.id === handleId && toHandle?.type === type;\n return {\n connectingFrom: fromHandle?.nodeId === nodeId && fromHandle?.id === handleId && fromHandle?.type === type,\n connectingTo,\n clickConnecting: clickHandle?.nodeId === nodeId && clickHandle?.id === handleId && clickHandle?.type === type,\n isPossibleEndHandle: connectionMode === ConnectionMode.Strict\n ? fromHandle?.type !== type\n : nodeId !== fromHandle?.nodeId || handleId !== fromHandle?.id,\n connectionInProcess: !!fromHandle,\n clickConnectionInProcess: !!clickHandle,\n valid: connectingTo && isValid,\n };\n};\nfunction HandleComponent({ type = 'source', position = Position.Top, isValidConnection, isConnectable = true, isConnectableStart = true, isConnectableEnd = true, id, onConnect, children, className, onMouseDown, onTouchStart, ...rest }, ref) {\n const handleId = id || null;\n const isTarget = type === 'target';\n const store = useStoreApi();\n const nodeId = useNodeId();\n const { connectOnClick, noPanClassName, rfId } = useStore(selector$g, shallow);\n const { connectingFrom, connectingTo, clickConnecting, isPossibleEndHandle, connectionInProcess, clickConnectionInProcess, valid, } = useStore(connectingSelector(nodeId, handleId, type), shallow);\n if (!nodeId) {\n store.getState().onError?.('010', errorMessages['error010']());\n }\n const onConnectExtended = (params) => {\n const { defaultEdgeOptions, onConnect: onConnectAction, hasDefaultEdges } = store.getState();\n const edgeParams = {\n ...defaultEdgeOptions,\n ...params,\n };\n if (hasDefaultEdges) {\n const { edges, setEdges } = store.getState();\n setEdges(addEdge(edgeParams, edges));\n }\n onConnectAction?.(edgeParams);\n onConnect?.(edgeParams);\n };\n const onPointerDown = (event) => {\n if (!nodeId) {\n return;\n }\n const isMouseTriggered = isMouseEvent(event.nativeEvent);\n if (isConnectableStart &&\n ((isMouseTriggered && event.button === 0) || !isMouseTriggered)) {\n const currentStore = store.getState();\n XYHandle.onPointerDown(event.nativeEvent, {\n handleDomNode: event.currentTarget,\n autoPanOnConnect: currentStore.autoPanOnConnect,\n connectionMode: currentStore.connectionMode,\n connectionRadius: currentStore.connectionRadius,\n domNode: currentStore.domNode,\n nodeLookup: currentStore.nodeLookup,\n lib: currentStore.lib,\n isTarget,\n handleId,\n nodeId,\n flowId: currentStore.rfId,\n panBy: currentStore.panBy,\n cancelConnection: currentStore.cancelConnection,\n onConnectStart: currentStore.onConnectStart,\n onConnectEnd: currentStore.onConnectEnd,\n updateConnection: currentStore.updateConnection,\n onConnect: onConnectExtended,\n isValidConnection: isValidConnection || currentStore.isValidConnection,\n getTransform: () => store.getState().transform,\n getFromHandle: () => store.getState().connection.fromHandle,\n autoPanSpeed: currentStore.autoPanSpeed,\n dragThreshold: currentStore.connectionDragThreshold,\n });\n }\n if (isMouseTriggered) {\n onMouseDown?.(event);\n }\n else {\n onTouchStart?.(event);\n }\n };\n const onClick = (event) => {\n const { onClickConnectStart, onClickConnectEnd, connectionClickStartHandle, connectionMode, isValidConnection: isValidConnectionStore, lib, rfId: flowId, nodeLookup, connection: connectionState, } = store.getState();\n if (!nodeId || (!connectionClickStartHandle && !isConnectableStart)) {\n return;\n }\n if (!connectionClickStartHandle) {\n onClickConnectStart?.(event.nativeEvent, { nodeId, handleId, handleType: type });\n store.setState({ connectionClickStartHandle: { nodeId, type, id: handleId } });\n return;\n }\n const doc = getHostForElement(event.target);\n const isValidConnectionHandler = isValidConnection || isValidConnectionStore;\n const { connection, isValid } = XYHandle.isValid(event.nativeEvent, {\n handle: {\n nodeId,\n id: handleId,\n type,\n },\n connectionMode,\n fromNodeId: connectionClickStartHandle.nodeId,\n fromHandleId: connectionClickStartHandle.id || null,\n fromType: connectionClickStartHandle.type,\n isValidConnection: isValidConnectionHandler,\n flowId,\n doc,\n lib,\n nodeLookup,\n });\n if (isValid && connection) {\n onConnectExtended(connection);\n }\n const connectionClone = structuredClone(connectionState);\n delete connectionClone.inProgress;\n connectionClone.toPosition = connectionClone.toHandle ? connectionClone.toHandle.position : null;\n onClickConnectEnd?.(event, connectionClone);\n store.setState({ connectionClickStartHandle: null });\n };\n return (jsx(\"div\", { \"data-handleid\": handleId, \"data-nodeid\": nodeId, \"data-handlepos\": position, \"data-id\": `${rfId}-${nodeId}-${handleId}-${type}`, className: cc([\n 'react-flow__handle',\n `react-flow__handle-${position}`,\n 'nodrag',\n noPanClassName,\n className,\n {\n source: !isTarget,\n target: isTarget,\n connectable: isConnectable,\n connectablestart: isConnectableStart,\n connectableend: isConnectableEnd,\n clickconnecting: clickConnecting,\n connectingfrom: connectingFrom,\n connectingto: connectingTo,\n valid,\n /*\n * shows where you can start a connection from\n * and where you can end it while connecting\n */\n connectionindicator: isConnectable &&\n (!connectionInProcess || isPossibleEndHandle) &&\n (connectionInProcess || clickConnectionInProcess ? isConnectableEnd : isConnectableStart),\n },\n ]), onMouseDown: onPointerDown, onTouchStart: onPointerDown, onClick: connectOnClick ? onClick : undefined, ref: ref, ...rest, children: children }));\n}\n/**\n * The `` component is used in your [custom nodes](/learn/customization/custom-nodes)\n * to define connection points.\n *\n *@public\n *\n *@example\n *\n *```jsx\n *import { Handle, Position } from '@xyflow/react';\n *\n *export function CustomNode({ data }) {\n * return (\n * <>\n *
\n * {data.label}\n *
\n *\n * \n * \n * \n * );\n *};\n *```\n */\nconst Handle = memo(fixedForwardRef(HandleComponent));\n\nfunction InputNode({ data, isConnectable, sourcePosition = Position.Bottom }) {\n return (jsxs(Fragment, { children: [data?.label, jsx(Handle, { type: \"source\", position: sourcePosition, isConnectable: isConnectable })] }));\n}\n\nfunction DefaultNode({ data, isConnectable, targetPosition = Position.Top, sourcePosition = Position.Bottom, }) {\n return (jsxs(Fragment, { children: [jsx(Handle, { type: \"target\", position: targetPosition, isConnectable: isConnectable }), data?.label, jsx(Handle, { type: \"source\", position: sourcePosition, isConnectable: isConnectable })] }));\n}\n\nfunction GroupNode() {\n return null;\n}\n\nfunction OutputNode({ data, isConnectable, targetPosition = Position.Top }) {\n return (jsxs(Fragment, { children: [jsx(Handle, { type: \"target\", position: targetPosition, isConnectable: isConnectable }), data?.label] }));\n}\n\nconst arrowKeyDiffs = {\n ArrowUp: { x: 0, y: -1 },\n ArrowDown: { x: 0, y: 1 },\n ArrowLeft: { x: -1, y: 0 },\n ArrowRight: { x: 1, y: 0 },\n};\nconst builtinNodeTypes = {\n input: InputNode,\n default: DefaultNode,\n output: OutputNode,\n group: GroupNode,\n};\nfunction getNodeInlineStyleDimensions(node) {\n if (node.internals.handleBounds === undefined) {\n return {\n width: node.width ?? node.initialWidth ?? node.style?.width,\n height: node.height ?? node.initialHeight ?? node.style?.height,\n };\n }\n return {\n width: node.width ?? node.style?.width,\n height: node.height ?? node.style?.height,\n };\n}\n\nconst selector$f = (s) => {\n const { width, height, x, y } = getInternalNodesBounds(s.nodeLookup, {\n filter: (node) => !!node.selected,\n });\n return {\n width: isNumeric(width) ? width : null,\n height: isNumeric(height) ? height : null,\n userSelectionActive: s.userSelectionActive,\n transformString: `translate(${s.transform[0]}px,${s.transform[1]}px) scale(${s.transform[2]}) translate(${x}px,${y}px)`,\n };\n};\nfunction NodesSelection({ onSelectionContextMenu, noPanClassName, disableKeyboardA11y, }) {\n const store = useStoreApi();\n const { width, height, transformString, userSelectionActive } = useStore(selector$f, shallow);\n const moveSelectedNodes = useMoveSelectedNodes();\n const nodeRef = useRef(null);\n useEffect(() => {\n if (!disableKeyboardA11y) {\n nodeRef.current?.focus({\n preventScroll: true,\n });\n }\n }, [disableKeyboardA11y]);\n useDrag({\n nodeRef,\n });\n if (userSelectionActive || !width || !height) {\n return null;\n }\n const onContextMenu = onSelectionContextMenu\n ? (event) => {\n const selectedNodes = store.getState().nodes.filter((n) => n.selected);\n onSelectionContextMenu(event, selectedNodes);\n }\n : undefined;\n const onKeyDown = (event) => {\n if (Object.prototype.hasOwnProperty.call(arrowKeyDiffs, event.key)) {\n event.preventDefault();\n moveSelectedNodes({\n direction: arrowKeyDiffs[event.key],\n factor: event.shiftKey ? 4 : 1,\n });\n }\n };\n return (jsx(\"div\", { className: cc(['react-flow__nodesselection', 'react-flow__container', noPanClassName]), style: {\n transform: transformString,\n }, children: jsx(\"div\", { ref: nodeRef, className: \"react-flow__nodesselection-rect\", onContextMenu: onContextMenu, tabIndex: disableKeyboardA11y ? undefined : -1, onKeyDown: disableKeyboardA11y ? undefined : onKeyDown, style: {\n width,\n height,\n } }) }));\n}\n\nconst win = typeof window !== 'undefined' ? window : undefined;\nconst selector$e = (s) => {\n return { nodesSelectionActive: s.nodesSelectionActive, userSelectionActive: s.userSelectionActive };\n};\nfunction FlowRendererComponent({ children, onPaneClick, onPaneMouseEnter, onPaneMouseMove, onPaneMouseLeave, onPaneContextMenu, onPaneScroll, paneClickDistance, deleteKeyCode, selectionKeyCode, selectionOnDrag, selectionMode, onSelectionStart, onSelectionEnd, multiSelectionKeyCode, panActivationKeyCode, zoomActivationKeyCode, elementsSelectable, zoomOnScroll, zoomOnPinch, panOnScroll: _panOnScroll, panOnScrollSpeed, panOnScrollMode, zoomOnDoubleClick, panOnDrag: _panOnDrag, defaultViewport, translateExtent, minZoom, maxZoom, preventScrolling, onSelectionContextMenu, noWheelClassName, noPanClassName, disableKeyboardA11y, onViewportChange, isControlledViewport, }) {\n const { nodesSelectionActive, userSelectionActive } = useStore(selector$e, shallow);\n const selectionKeyPressed = useKeyPress(selectionKeyCode, { target: win });\n const panActivationKeyPressed = useKeyPress(panActivationKeyCode, { target: win });\n const panOnDrag = panActivationKeyPressed || _panOnDrag;\n const panOnScroll = panActivationKeyPressed || _panOnScroll;\n const _selectionOnDrag = selectionOnDrag && panOnDrag !== true;\n const isSelecting = selectionKeyPressed || userSelectionActive || _selectionOnDrag;\n useGlobalKeyHandler({ deleteKeyCode, multiSelectionKeyCode });\n return (jsx(ZoomPane, { onPaneContextMenu: onPaneContextMenu, elementsSelectable: elementsSelectable, zoomOnScroll: zoomOnScroll, zoomOnPinch: zoomOnPinch, panOnScroll: panOnScroll, panOnScrollSpeed: panOnScrollSpeed, panOnScrollMode: panOnScrollMode, zoomOnDoubleClick: zoomOnDoubleClick, panOnDrag: !selectionKeyPressed && panOnDrag, defaultViewport: defaultViewport, translateExtent: translateExtent, minZoom: minZoom, maxZoom: maxZoom, zoomActivationKeyCode: zoomActivationKeyCode, preventScrolling: preventScrolling, noWheelClassName: noWheelClassName, noPanClassName: noPanClassName, onViewportChange: onViewportChange, isControlledViewport: isControlledViewport, paneClickDistance: paneClickDistance, selectionOnDrag: _selectionOnDrag, children: jsxs(Pane, { onSelectionStart: onSelectionStart, onSelectionEnd: onSelectionEnd, onPaneClick: onPaneClick, onPaneMouseEnter: onPaneMouseEnter, onPaneMouseMove: onPaneMouseMove, onPaneMouseLeave: onPaneMouseLeave, onPaneContextMenu: onPaneContextMenu, onPaneScroll: onPaneScroll, panOnDrag: panOnDrag, isSelecting: !!isSelecting, selectionMode: selectionMode, selectionKeyPressed: selectionKeyPressed, paneClickDistance: paneClickDistance, selectionOnDrag: _selectionOnDrag, children: [children, nodesSelectionActive && (jsx(NodesSelection, { onSelectionContextMenu: onSelectionContextMenu, noPanClassName: noPanClassName, disableKeyboardA11y: disableKeyboardA11y }))] }) }));\n}\nFlowRendererComponent.displayName = 'FlowRenderer';\nconst FlowRenderer = memo(FlowRendererComponent);\n\nconst selector$d = (onlyRenderVisible) => (s) => {\n return onlyRenderVisible\n ? getNodesInside(s.nodeLookup, { x: 0, y: 0, width: s.width, height: s.height }, s.transform, true).map((node) => node.id)\n : Array.from(s.nodeLookup.keys());\n};\n/**\n * Hook for getting the visible node ids from the store.\n *\n * @internal\n * @param onlyRenderVisible\n * @returns array with visible node ids\n */\nfunction useVisibleNodeIds(onlyRenderVisible) {\n const nodeIds = useStore(useCallback(selector$d(onlyRenderVisible), [onlyRenderVisible]), shallow);\n return nodeIds;\n}\n\nconst selector$c = (s) => s.updateNodeInternals;\nfunction useResizeObserver() {\n const updateNodeInternals = useStore(selector$c);\n const [resizeObserver] = useState(() => {\n if (typeof ResizeObserver === 'undefined') {\n return null;\n }\n return new ResizeObserver((entries) => {\n const updates = new Map();\n entries.forEach((entry) => {\n const id = entry.target.getAttribute('data-id');\n updates.set(id, {\n id,\n nodeElement: entry.target,\n force: true,\n });\n });\n updateNodeInternals(updates);\n });\n });\n useEffect(() => {\n return () => {\n resizeObserver?.disconnect();\n };\n }, [resizeObserver]);\n return resizeObserver;\n}\n\n/**\n * Hook to handle the resize observation + internal updates for the passed node.\n *\n * @internal\n * @returns nodeRef - reference to the node element\n */\nfunction useNodeObserver({ node, nodeType, hasDimensions, resizeObserver, }) {\n const store = useStoreApi();\n const nodeRef = useRef(null);\n const observedNode = useRef(null);\n const prevSourcePosition = useRef(node.sourcePosition);\n const prevTargetPosition = useRef(node.targetPosition);\n const prevType = useRef(nodeType);\n const isInitialized = hasDimensions && !!node.internals.handleBounds;\n useEffect(() => {\n if (nodeRef.current && !node.hidden && (!isInitialized || observedNode.current !== nodeRef.current)) {\n if (observedNode.current) {\n resizeObserver?.unobserve(observedNode.current);\n }\n resizeObserver?.observe(nodeRef.current);\n observedNode.current = nodeRef.current;\n }\n }, [isInitialized, node.hidden]);\n useEffect(() => {\n return () => {\n if (observedNode.current) {\n resizeObserver?.unobserve(observedNode.current);\n observedNode.current = null;\n }\n };\n }, []);\n useEffect(() => {\n if (nodeRef.current) {\n /*\n * when the user programmatically changes the source or handle position, we need to update the internals\n * to make sure the edges are updated correctly\n */\n const typeChanged = prevType.current !== nodeType;\n const sourcePosChanged = prevSourcePosition.current !== node.sourcePosition;\n const targetPosChanged = prevTargetPosition.current !== node.targetPosition;\n if (typeChanged || sourcePosChanged || targetPosChanged) {\n prevType.current = nodeType;\n prevSourcePosition.current = node.sourcePosition;\n prevTargetPosition.current = node.targetPosition;\n store\n .getState()\n .updateNodeInternals(new Map([[node.id, { id: node.id, nodeElement: nodeRef.current, force: true }]]));\n }\n }\n }, [node.id, nodeType, node.sourcePosition, node.targetPosition]);\n return nodeRef;\n}\n\nfunction NodeWrapper({ id, onClick, onMouseEnter, onMouseMove, onMouseLeave, onContextMenu, onDoubleClick, nodesDraggable, elementsSelectable, nodesConnectable, nodesFocusable, resizeObserver, noDragClassName, noPanClassName, disableKeyboardA11y, rfId, nodeTypes, nodeClickDistance, onError, }) {\n const { node, internals, isParent } = useStore((s) => {\n const node = s.nodeLookup.get(id);\n const isParent = s.parentLookup.has(id);\n return {\n node,\n internals: node.internals,\n isParent,\n };\n }, shallow);\n let nodeType = node.type || 'default';\n let NodeComponent = nodeTypes?.[nodeType] || builtinNodeTypes[nodeType];\n if (NodeComponent === undefined) {\n onError?.('003', errorMessages['error003'](nodeType));\n nodeType = 'default';\n NodeComponent = nodeTypes?.['default'] || builtinNodeTypes.default;\n }\n const isDraggable = !!(node.draggable || (nodesDraggable && typeof node.draggable === 'undefined'));\n const isSelectable = !!(node.selectable || (elementsSelectable && typeof node.selectable === 'undefined'));\n const isConnectable = !!(node.connectable || (nodesConnectable && typeof node.connectable === 'undefined'));\n const isFocusable = !!(node.focusable || (nodesFocusable && typeof node.focusable === 'undefined'));\n const store = useStoreApi();\n const hasDimensions = nodeHasDimensions(node);\n const nodeRef = useNodeObserver({ node, nodeType, hasDimensions, resizeObserver });\n const dragging = useDrag({\n nodeRef,\n disabled: node.hidden || !isDraggable,\n noDragClassName,\n handleSelector: node.dragHandle,\n nodeId: id,\n isSelectable,\n nodeClickDistance,\n });\n const moveSelectedNodes = useMoveSelectedNodes();\n if (node.hidden) {\n return null;\n }\n const nodeDimensions = getNodeDimensions(node);\n const inlineDimensions = getNodeInlineStyleDimensions(node);\n const hasPointerEvents = isSelectable || isDraggable || onClick || onMouseEnter || onMouseMove || onMouseLeave;\n const onMouseEnterHandler = onMouseEnter\n ? (event) => onMouseEnter(event, { ...internals.userNode })\n : undefined;\n const onMouseMoveHandler = onMouseMove\n ? (event) => onMouseMove(event, { ...internals.userNode })\n : undefined;\n const onMouseLeaveHandler = onMouseLeave\n ? (event) => onMouseLeave(event, { ...internals.userNode })\n : undefined;\n const onContextMenuHandler = onContextMenu\n ? (event) => onContextMenu(event, { ...internals.userNode })\n : undefined;\n const onDoubleClickHandler = onDoubleClick\n ? (event) => onDoubleClick(event, { ...internals.userNode })\n : undefined;\n const onSelectNodeHandler = (event) => {\n const { selectNodesOnDrag, nodeDragThreshold } = store.getState();\n if (isSelectable && (!selectNodesOnDrag || !isDraggable || nodeDragThreshold > 0)) {\n /*\n * this handler gets called by XYDrag on drag start when selectNodesOnDrag=true\n * here we only need to call it when selectNodesOnDrag=false\n */\n handleNodeClick({\n id,\n store,\n nodeRef,\n });\n }\n if (onClick) {\n onClick(event, { ...internals.userNode });\n }\n };\n const onKeyDown = (event) => {\n if (isInputDOMNode(event.nativeEvent) || disableKeyboardA11y) {\n return;\n }\n if (elementSelectionKeys.includes(event.key) && isSelectable) {\n const unselect = event.key === 'Escape';\n handleNodeClick({\n id,\n store,\n unselect,\n nodeRef,\n });\n }\n else if (isDraggable && node.selected && Object.prototype.hasOwnProperty.call(arrowKeyDiffs, event.key)) {\n // prevent default scrolling behavior on arrow key press when node is moved\n event.preventDefault();\n const { ariaLabelConfig } = store.getState();\n store.setState({\n ariaLiveMessage: ariaLabelConfig['node.a11yDescription.ariaLiveMessage']({\n direction: event.key.replace('Arrow', '').toLowerCase(),\n x: ~~internals.positionAbsolute.x,\n y: ~~internals.positionAbsolute.y,\n }),\n });\n moveSelectedNodes({\n direction: arrowKeyDiffs[event.key],\n factor: event.shiftKey ? 4 : 1,\n });\n }\n };\n const onFocus = () => {\n if (disableKeyboardA11y || !nodeRef.current?.matches(':focus-visible')) {\n return;\n }\n const { transform, width, height, autoPanOnNodeFocus, setCenter } = store.getState();\n if (!autoPanOnNodeFocus) {\n return;\n }\n const withinViewport = getNodesInside(new Map([[id, node]]), { x: 0, y: 0, width, height }, transform, true).length > 0;\n if (!withinViewport) {\n setCenter(node.position.x + nodeDimensions.width / 2, node.position.y + nodeDimensions.height / 2, {\n zoom: transform[2],\n });\n }\n };\n return (jsx(\"div\", { className: cc([\n 'react-flow__node',\n `react-flow__node-${nodeType}`,\n {\n // this is overwritable by passing `nopan` as a class name\n [noPanClassName]: isDraggable,\n },\n node.className,\n {\n selected: node.selected,\n selectable: isSelectable,\n parent: isParent,\n draggable: isDraggable,\n dragging,\n },\n ]), ref: nodeRef, style: {\n zIndex: internals.z,\n transform: `translate(${internals.positionAbsolute.x}px,${internals.positionAbsolute.y}px)`,\n pointerEvents: hasPointerEvents ? 'all' : 'none',\n visibility: hasDimensions ? 'visible' : 'hidden',\n ...node.style,\n ...inlineDimensions,\n }, \"data-id\": id, \"data-testid\": `rf__node-${id}`, onMouseEnter: onMouseEnterHandler, onMouseMove: onMouseMoveHandler, onMouseLeave: onMouseLeaveHandler, onContextMenu: onContextMenuHandler, onClick: onSelectNodeHandler, onDoubleClick: onDoubleClickHandler, onKeyDown: isFocusable ? onKeyDown : undefined, tabIndex: isFocusable ? 0 : undefined, onFocus: isFocusable ? onFocus : undefined, role: node.ariaRole ?? (isFocusable ? 'group' : undefined), \"aria-roledescription\": \"node\", \"aria-describedby\": disableKeyboardA11y ? undefined : `${ARIA_NODE_DESC_KEY}-${rfId}`, \"aria-label\": node.ariaLabel, ...node.domAttributes, children: jsx(Provider, { value: id, children: jsx(NodeComponent, { id: id, data: node.data, type: nodeType, positionAbsoluteX: internals.positionAbsolute.x, positionAbsoluteY: internals.positionAbsolute.y, selected: node.selected ?? false, selectable: isSelectable, draggable: isDraggable, deletable: node.deletable ?? true, isConnectable: isConnectable, sourcePosition: node.sourcePosition, targetPosition: node.targetPosition, dragging: dragging, dragHandle: node.dragHandle, zIndex: internals.z, parentId: node.parentId, ...nodeDimensions }) }) }));\n}\nvar NodeWrapper$1 = memo(NodeWrapper);\n\nconst selector$b = (s) => ({\n nodesDraggable: s.nodesDraggable,\n nodesConnectable: s.nodesConnectable,\n nodesFocusable: s.nodesFocusable,\n elementsSelectable: s.elementsSelectable,\n onError: s.onError,\n});\nfunction NodeRendererComponent(props) {\n const { nodesDraggable, nodesConnectable, nodesFocusable, elementsSelectable, onError } = useStore(selector$b, shallow);\n const nodeIds = useVisibleNodeIds(props.onlyRenderVisibleElements);\n const resizeObserver = useResizeObserver();\n return (jsx(\"div\", { className: \"react-flow__nodes\", style: containerStyle, children: nodeIds.map((nodeId) => {\n return (\n /*\n * The split of responsibilities between NodeRenderer and\n * NodeComponentWrapper may appear weird. However, it’s designed to\n * minimize the cost of updates when individual nodes change.\n *\n * For example, when you’re dragging a single node, that node gets\n * updated multiple times per second. If `NodeRenderer` were to update\n * every time, it would have to re-run the `nodes.map()` loop every\n * time. This gets pricey with hundreds of nodes, especially if every\n * loop cycle does more than just rendering a JSX element!\n *\n * As a result of this choice, we took the following implementation\n * decisions:\n * - NodeRenderer subscribes *only* to node IDs – and therefore\n * rerender *only* when visible nodes are added or removed.\n * - NodeRenderer performs all operations the result of which can be\n * shared between nodes (such as creating the `ResizeObserver`\n * instance, or subscribing to `selector`). This means extra prop\n * drilling into `NodeComponentWrapper`, but it means we need to run\n * these operations only once – instead of once per node.\n * - Any operations that you’d normally write inside `nodes.map` are\n * moved into `NodeComponentWrapper`. This ensures they are\n * memorized – so if `NodeRenderer` *has* to rerender, it only\n * needs to regenerate the list of nodes, nothing else.\n */\n jsx(NodeWrapper$1, { id: nodeId, nodeTypes: props.nodeTypes, nodeExtent: props.nodeExtent, onClick: props.onNodeClick, onMouseEnter: props.onNodeMouseEnter, onMouseMove: props.onNodeMouseMove, onMouseLeave: props.onNodeMouseLeave, onContextMenu: props.onNodeContextMenu, onDoubleClick: props.onNodeDoubleClick, noDragClassName: props.noDragClassName, noPanClassName: props.noPanClassName, rfId: props.rfId, disableKeyboardA11y: props.disableKeyboardA11y, resizeObserver: resizeObserver, nodesDraggable: nodesDraggable, nodesConnectable: nodesConnectable, nodesFocusable: nodesFocusable, elementsSelectable: elementsSelectable, nodeClickDistance: props.nodeClickDistance, onError: onError }, nodeId));\n }) }));\n}\nNodeRendererComponent.displayName = 'NodeRenderer';\nconst NodeRenderer = memo(NodeRendererComponent);\n\n/**\n * Hook for getting the visible edge ids from the store.\n *\n * @internal\n * @param onlyRenderVisible\n * @returns array with visible edge ids\n */\nfunction useVisibleEdgeIds(onlyRenderVisible) {\n const edgeIds = useStore(useCallback((s) => {\n if (!onlyRenderVisible) {\n return s.edges.map((edge) => edge.id);\n }\n const visibleEdgeIds = [];\n if (s.width && s.height) {\n for (const edge of s.edges) {\n const sourceNode = s.nodeLookup.get(edge.source);\n const targetNode = s.nodeLookup.get(edge.target);\n if (sourceNode &&\n targetNode &&\n isEdgeVisible({\n sourceNode,\n targetNode,\n width: s.width,\n height: s.height,\n transform: s.transform,\n })) {\n visibleEdgeIds.push(edge.id);\n }\n }\n }\n return visibleEdgeIds;\n }, [onlyRenderVisible]), shallow);\n return edgeIds;\n}\n\nconst ArrowSymbol = ({ color = 'none', strokeWidth = 1 }) => {\n const style = {\n strokeWidth,\n ...(color && { stroke: color }),\n };\n return (jsx(\"polyline\", { className: \"arrow\", style: style, strokeLinecap: \"round\", fill: \"none\", strokeLinejoin: \"round\", points: \"-5,-4 0,0 -5,4\" }));\n};\nconst ArrowClosedSymbol = ({ color = 'none', strokeWidth = 1 }) => {\n const style = {\n strokeWidth,\n ...(color && { stroke: color, fill: color }),\n };\n return (jsx(\"polyline\", { className: \"arrowclosed\", style: style, strokeLinecap: \"round\", strokeLinejoin: \"round\", points: \"-5,-4 0,0 -5,4 -5,-4\" }));\n};\nconst MarkerSymbols = {\n [MarkerType.Arrow]: ArrowSymbol,\n [MarkerType.ArrowClosed]: ArrowClosedSymbol,\n};\nfunction useMarkerSymbol(type) {\n const store = useStoreApi();\n const symbol = useMemo(() => {\n const symbolExists = Object.prototype.hasOwnProperty.call(MarkerSymbols, type);\n if (!symbolExists) {\n store.getState().onError?.('009', errorMessages['error009'](type));\n return null;\n }\n return MarkerSymbols[type];\n }, [type]);\n return symbol;\n}\n\nconst Marker = ({ id, type, color, width = 12.5, height = 12.5, markerUnits = 'strokeWidth', strokeWidth, orient = 'auto-start-reverse', }) => {\n const Symbol = useMarkerSymbol(type);\n if (!Symbol) {\n return null;\n }\n return (jsx(\"marker\", { className: \"react-flow__arrowhead\", id: id, markerWidth: `${width}`, markerHeight: `${height}`, viewBox: \"-10 -10 20 20\", markerUnits: markerUnits, orient: orient, refX: \"0\", refY: \"0\", children: jsx(Symbol, { color: color, strokeWidth: strokeWidth }) }));\n};\n/*\n * when you have multiple flows on a page and you hide the first one, the other ones have no markers anymore\n * when they do have markers with the same ids. To prevent this the user can pass a unique id to the react flow wrapper\n * that we can then use for creating our unique marker ids\n */\nconst MarkerDefinitions = ({ defaultColor, rfId }) => {\n const edges = useStore((s) => s.edges);\n const defaultEdgeOptions = useStore((s) => s.defaultEdgeOptions);\n const markers = useMemo(() => {\n const markers = createMarkerIds(edges, {\n id: rfId,\n defaultColor,\n defaultMarkerStart: defaultEdgeOptions?.markerStart,\n defaultMarkerEnd: defaultEdgeOptions?.markerEnd,\n });\n return markers;\n }, [edges, defaultEdgeOptions, rfId, defaultColor]);\n if (!markers.length) {\n return null;\n }\n return (jsx(\"svg\", { className: \"react-flow__marker\", \"aria-hidden\": \"true\", children: jsx(\"defs\", { children: markers.map((marker) => (jsx(Marker, { id: marker.id, type: marker.type, color: marker.color, width: marker.width, height: marker.height, markerUnits: marker.markerUnits, strokeWidth: marker.strokeWidth, orient: marker.orient }, marker.id))) }) }));\n};\nMarkerDefinitions.displayName = 'MarkerDefinitions';\nvar MarkerDefinitions$1 = memo(MarkerDefinitions);\n\nfunction EdgeTextComponent({ x, y, label, labelStyle, labelShowBg = true, labelBgStyle, labelBgPadding = [2, 4], labelBgBorderRadius = 2, children, className, ...rest }) {\n const [edgeTextBbox, setEdgeTextBbox] = useState({ x: 1, y: 0, width: 0, height: 0 });\n const edgeTextClasses = cc(['react-flow__edge-textwrapper', className]);\n const edgeTextRef = useRef(null);\n useEffect(() => {\n if (edgeTextRef.current) {\n const textBbox = edgeTextRef.current.getBBox();\n setEdgeTextBbox({\n x: textBbox.x,\n y: textBbox.y,\n width: textBbox.width,\n height: textBbox.height,\n });\n }\n }, [label]);\n if (!label) {\n return null;\n }\n return (jsxs(\"g\", { transform: `translate(${x - edgeTextBbox.width / 2} ${y - edgeTextBbox.height / 2})`, className: edgeTextClasses, visibility: edgeTextBbox.width ? 'visible' : 'hidden', ...rest, children: [labelShowBg && (jsx(\"rect\", { width: edgeTextBbox.width + 2 * labelBgPadding[0], x: -labelBgPadding[0], y: -labelBgPadding[1], height: edgeTextBbox.height + 2 * labelBgPadding[1], className: \"react-flow__edge-textbg\", style: labelBgStyle, rx: labelBgBorderRadius, ry: labelBgBorderRadius })), jsx(\"text\", { className: \"react-flow__edge-text\", y: edgeTextBbox.height / 2, dy: \"0.3em\", ref: edgeTextRef, style: labelStyle, children: label }), children] }));\n}\nEdgeTextComponent.displayName = 'EdgeText';\n/**\n * You can use the `` component as a helper component to display text\n * within your custom edges.\n *\n * @public\n *\n * @example\n * ```jsx\n * import { EdgeText } from '@xyflow/react';\n *\n * export function CustomEdgeLabel({ label }) {\n * return (\n * \n * );\n * }\n *```\n */\nconst EdgeText = memo(EdgeTextComponent);\n\n/**\n * The `` component gets used internally for all the edges. It can be\n * used inside a custom edge and handles the invisible helper edge and the edge label\n * for you.\n *\n * @public\n * @example\n * ```jsx\n *import { BaseEdge } from '@xyflow/react';\n *\n *export function CustomEdge({ sourceX, sourceY, targetX, targetY, ...props }) {\n * const [edgePath] = getStraightPath({\n * sourceX,\n * sourceY,\n * targetX,\n * targetY,\n * });\n *\n * return ;\n *}\n *```\n *\n * @remarks If you want to use an edge marker with the [``](/api-reference/components/base-edge) component,\n * you can pass the `markerStart` or `markerEnd` props passed to your custom edge\n * through to the [``](/api-reference/components/base-edge) component.\n * You can see all the props passed to a custom edge by looking at the [`EdgeProps`](/api-reference/types/edge-props) type.\n */\nfunction BaseEdge({ path, labelX, labelY, label, labelStyle, labelShowBg, labelBgStyle, labelBgPadding, labelBgBorderRadius, interactionWidth = 20, ...props }) {\n return (jsxs(Fragment, { children: [jsx(\"path\", { ...props, d: path, fill: \"none\", className: cc(['react-flow__edge-path', props.className]) }), interactionWidth ? (jsx(\"path\", { d: path, fill: \"none\", strokeOpacity: 0, strokeWidth: interactionWidth, className: \"react-flow__edge-interaction\" })) : null, label && isNumeric(labelX) && isNumeric(labelY) ? (jsx(EdgeText, { x: labelX, y: labelY, label: label, labelStyle: labelStyle, labelShowBg: labelShowBg, labelBgStyle: labelBgStyle, labelBgPadding: labelBgPadding, labelBgBorderRadius: labelBgBorderRadius })) : null] }));\n}\n\nfunction getControl({ pos, x1, y1, x2, y2 }) {\n if (pos === Position.Left || pos === Position.Right) {\n return [0.5 * (x1 + x2), y1];\n }\n return [x1, 0.5 * (y1 + y2)];\n}\n/**\n * The `getSimpleBezierPath` util returns everything you need to render a simple\n * bezier edge between two nodes.\n * @public\n * @returns\n * - `path`: the path to use in an SVG `` element.\n * - `labelX`: the `x` position you can use to render a label for this edge.\n * - `labelY`: the `y` position you can use to render a label for this edge.\n * - `offsetX`: the absolute difference between the source `x` position and the `x` position of the\n * middle of this path.\n * - `offsetY`: the absolute difference between the source `y` position and the `y` position of the\n * middle of this path.\n */\nfunction getSimpleBezierPath({ sourceX, sourceY, sourcePosition = Position.Bottom, targetX, targetY, targetPosition = Position.Top, }) {\n const [sourceControlX, sourceControlY] = getControl({\n pos: sourcePosition,\n x1: sourceX,\n y1: sourceY,\n x2: targetX,\n y2: targetY,\n });\n const [targetControlX, targetControlY] = getControl({\n pos: targetPosition,\n x1: targetX,\n y1: targetY,\n x2: sourceX,\n y2: sourceY,\n });\n const [labelX, labelY, offsetX, offsetY] = getBezierEdgeCenter({\n sourceX,\n sourceY,\n targetX,\n targetY,\n sourceControlX,\n sourceControlY,\n targetControlX,\n targetControlY,\n });\n return [\n `M${sourceX},${sourceY} C${sourceControlX},${sourceControlY} ${targetControlX},${targetControlY} ${targetX},${targetY}`,\n labelX,\n labelY,\n offsetX,\n offsetY,\n ];\n}\nfunction createSimpleBezierEdge(params) {\n // eslint-disable-next-line react/display-name\n return memo(({ id, sourceX, sourceY, targetX, targetY, sourcePosition, targetPosition, label, labelStyle, labelShowBg, labelBgStyle, labelBgPadding, labelBgBorderRadius, style, markerEnd, markerStart, interactionWidth, }) => {\n const [path, labelX, labelY] = getSimpleBezierPath({\n sourceX,\n sourceY,\n sourcePosition,\n targetX,\n targetY,\n targetPosition,\n });\n const _id = params.isInternal ? undefined : id;\n return (jsx(BaseEdge, { id: _id, path: path, labelX: labelX, labelY: labelY, label: label, labelStyle: labelStyle, labelShowBg: labelShowBg, labelBgStyle: labelBgStyle, labelBgPadding: labelBgPadding, labelBgBorderRadius: labelBgBorderRadius, style: style, markerEnd: markerEnd, markerStart: markerStart, interactionWidth: interactionWidth }));\n });\n}\nconst SimpleBezierEdge = createSimpleBezierEdge({ isInternal: false });\nconst SimpleBezierEdgeInternal = createSimpleBezierEdge({ isInternal: true });\nSimpleBezierEdge.displayName = 'SimpleBezierEdge';\nSimpleBezierEdgeInternal.displayName = 'SimpleBezierEdgeInternal';\n\nfunction createSmoothStepEdge(params) {\n // eslint-disable-next-line react/display-name\n return memo(({ id, sourceX, sourceY, targetX, targetY, label, labelStyle, labelShowBg, labelBgStyle, labelBgPadding, labelBgBorderRadius, style, sourcePosition = Position.Bottom, targetPosition = Position.Top, markerEnd, markerStart, pathOptions, interactionWidth, }) => {\n const [path, labelX, labelY] = getSmoothStepPath({\n sourceX,\n sourceY,\n sourcePosition,\n targetX,\n targetY,\n targetPosition,\n borderRadius: pathOptions?.borderRadius,\n offset: pathOptions?.offset,\n stepPosition: pathOptions?.stepPosition,\n });\n const _id = params.isInternal ? undefined : id;\n return (jsx(BaseEdge, { id: _id, path: path, labelX: labelX, labelY: labelY, label: label, labelStyle: labelStyle, labelShowBg: labelShowBg, labelBgStyle: labelBgStyle, labelBgPadding: labelBgPadding, labelBgBorderRadius: labelBgBorderRadius, style: style, markerEnd: markerEnd, markerStart: markerStart, interactionWidth: interactionWidth }));\n });\n}\n/**\n * Component that can be used inside a custom edge to render a smooth step edge.\n *\n * @public\n * @example\n *\n * ```tsx\n * import { SmoothStepEdge } from '@xyflow/react';\n *\n * function CustomEdge({ sourceX, sourceY, targetX, targetY, sourcePosition, targetPosition }) {\n * return (\n * \n * );\n * }\n * ```\n */\nconst SmoothStepEdge = createSmoothStepEdge({ isInternal: false });\n/**\n * @internal\n */\nconst SmoothStepEdgeInternal = createSmoothStepEdge({ isInternal: true });\nSmoothStepEdge.displayName = 'SmoothStepEdge';\nSmoothStepEdgeInternal.displayName = 'SmoothStepEdgeInternal';\n\nfunction createStepEdge(params) {\n // eslint-disable-next-line react/display-name\n return memo(({ id, ...props }) => {\n const _id = params.isInternal ? undefined : id;\n return (jsx(SmoothStepEdge, { ...props, id: _id, pathOptions: useMemo(() => ({ borderRadius: 0, offset: props.pathOptions?.offset }), [props.pathOptions?.offset]) }));\n });\n}\n/**\n * Component that can be used inside a custom edge to render a step edge.\n *\n * @public\n * @example\n *\n * ```tsx\n * import { StepEdge } from '@xyflow/react';\n *\n * function CustomEdge({ sourceX, sourceY, targetX, targetY, sourcePosition, targetPosition }) {\n * return (\n * \n * );\n * }\n * ```\n */\nconst StepEdge = createStepEdge({ isInternal: false });\n/**\n * @internal\n */\nconst StepEdgeInternal = createStepEdge({ isInternal: true });\nStepEdge.displayName = 'StepEdge';\nStepEdgeInternal.displayName = 'StepEdgeInternal';\n\nfunction createStraightEdge(params) {\n // eslint-disable-next-line react/display-name\n return memo(({ id, sourceX, sourceY, targetX, targetY, label, labelStyle, labelShowBg, labelBgStyle, labelBgPadding, labelBgBorderRadius, style, markerEnd, markerStart, interactionWidth, }) => {\n const [path, labelX, labelY] = getStraightPath({ sourceX, sourceY, targetX, targetY });\n const _id = params.isInternal ? undefined : id;\n return (jsx(BaseEdge, { id: _id, path: path, labelX: labelX, labelY: labelY, label: label, labelStyle: labelStyle, labelShowBg: labelShowBg, labelBgStyle: labelBgStyle, labelBgPadding: labelBgPadding, labelBgBorderRadius: labelBgBorderRadius, style: style, markerEnd: markerEnd, markerStart: markerStart, interactionWidth: interactionWidth }));\n });\n}\n/**\n * Component that can be used inside a custom edge to render a straight line.\n *\n * @public\n * @example\n *\n * ```tsx\n * import { StraightEdge } from '@xyflow/react';\n *\n * function CustomEdge({ sourceX, sourceY, targetX, targetY }) {\n * return (\n * \n * );\n * }\n * ```\n */\nconst StraightEdge = createStraightEdge({ isInternal: false });\n/**\n * @internal\n */\nconst StraightEdgeInternal = createStraightEdge({ isInternal: true });\nStraightEdge.displayName = 'StraightEdge';\nStraightEdgeInternal.displayName = 'StraightEdgeInternal';\n\nfunction createBezierEdge(params) {\n // eslint-disable-next-line react/display-name\n return memo(({ id, sourceX, sourceY, targetX, targetY, sourcePosition = Position.Bottom, targetPosition = Position.Top, label, labelStyle, labelShowBg, labelBgStyle, labelBgPadding, labelBgBorderRadius, style, markerEnd, markerStart, pathOptions, interactionWidth, }) => {\n const [path, labelX, labelY] = getBezierPath({\n sourceX,\n sourceY,\n sourcePosition,\n targetX,\n targetY,\n targetPosition,\n curvature: pathOptions?.curvature,\n });\n const _id = params.isInternal ? undefined : id;\n return (jsx(BaseEdge, { id: _id, path: path, labelX: labelX, labelY: labelY, label: label, labelStyle: labelStyle, labelShowBg: labelShowBg, labelBgStyle: labelBgStyle, labelBgPadding: labelBgPadding, labelBgBorderRadius: labelBgBorderRadius, style: style, markerEnd: markerEnd, markerStart: markerStart, interactionWidth: interactionWidth }));\n });\n}\n/**\n * Component that can be used inside a custom edge to render a bezier curve.\n *\n * @public\n * @example\n *\n * ```tsx\n * import { BezierEdge } from '@xyflow/react';\n *\n * function CustomEdge({ sourceX, sourceY, targetX, targetY, sourcePosition, targetPosition }) {\n * return (\n * \n * );\n * }\n * ```\n */\nconst BezierEdge = createBezierEdge({ isInternal: false });\n/**\n * @internal\n */\nconst BezierEdgeInternal = createBezierEdge({ isInternal: true });\nBezierEdge.displayName = 'BezierEdge';\nBezierEdgeInternal.displayName = 'BezierEdgeInternal';\n\nconst builtinEdgeTypes = {\n default: BezierEdgeInternal,\n straight: StraightEdgeInternal,\n step: StepEdgeInternal,\n smoothstep: SmoothStepEdgeInternal,\n simplebezier: SimpleBezierEdgeInternal,\n};\nconst nullPosition = {\n sourceX: null,\n sourceY: null,\n targetX: null,\n targetY: null,\n sourcePosition: null,\n targetPosition: null,\n};\n\nconst shiftX = (x, shift, position) => {\n if (position === Position.Left)\n return x - shift;\n if (position === Position.Right)\n return x + shift;\n return x;\n};\nconst shiftY = (y, shift, position) => {\n if (position === Position.Top)\n return y - shift;\n if (position === Position.Bottom)\n return y + shift;\n return y;\n};\nconst EdgeUpdaterClassName = 'react-flow__edgeupdater';\n/**\n * @internal\n */\nfunction EdgeAnchor({ position, centerX, centerY, radius = 10, onMouseDown, onMouseEnter, onMouseOut, type, }) {\n return (jsx(\"circle\", { onMouseDown: onMouseDown, onMouseEnter: onMouseEnter, onMouseOut: onMouseOut, className: cc([EdgeUpdaterClassName, `${EdgeUpdaterClassName}-${type}`]), cx: shiftX(centerX, radius, position), cy: shiftY(centerY, radius, position), r: radius, stroke: \"transparent\", fill: \"transparent\" }));\n}\n\nfunction EdgeUpdateAnchors({ isReconnectable, reconnectRadius, edge, sourceX, sourceY, targetX, targetY, sourcePosition, targetPosition, onReconnect, onReconnectStart, onReconnectEnd, setReconnecting, setUpdateHover, }) {\n const store = useStoreApi();\n const handleEdgeUpdater = (event, oppositeHandle) => {\n // avoid triggering edge updater if mouse btn is not left\n if (event.button !== 0) {\n return;\n }\n const { autoPanOnConnect, domNode, isValidConnection, connectionMode, connectionRadius, lib, onConnectStart, onConnectEnd, cancelConnection, nodeLookup, rfId: flowId, panBy, updateConnection, } = store.getState();\n const isTarget = oppositeHandle.type === 'target';\n const _onReconnectEnd = (evt, connectionState) => {\n setReconnecting(false);\n onReconnectEnd?.(evt, edge, oppositeHandle.type, connectionState);\n };\n const onConnectEdge = (connection) => onReconnect?.(edge, connection);\n const _onConnectStart = (_event, params) => {\n setReconnecting(true);\n onReconnectStart?.(event, edge, oppositeHandle.type);\n onConnectStart?.(_event, params);\n };\n XYHandle.onPointerDown(event.nativeEvent, {\n autoPanOnConnect,\n connectionMode,\n connectionRadius,\n domNode,\n handleId: oppositeHandle.id,\n nodeId: oppositeHandle.nodeId,\n nodeLookup,\n isTarget,\n edgeUpdaterType: oppositeHandle.type,\n lib,\n flowId,\n cancelConnection,\n panBy,\n isValidConnection,\n onConnect: onConnectEdge,\n onConnectStart: _onConnectStart,\n onConnectEnd,\n onReconnectEnd: _onReconnectEnd,\n updateConnection,\n getTransform: () => store.getState().transform,\n getFromHandle: () => store.getState().connection.fromHandle,\n dragThreshold: store.getState().connectionDragThreshold,\n handleDomNode: event.currentTarget,\n });\n };\n const onReconnectSourceMouseDown = (event) => handleEdgeUpdater(event, { nodeId: edge.target, id: edge.targetHandle ?? null, type: 'target' });\n const onReconnectTargetMouseDown = (event) => handleEdgeUpdater(event, { nodeId: edge.source, id: edge.sourceHandle ?? null, type: 'source' });\n const onReconnectMouseEnter = () => setUpdateHover(true);\n const onReconnectMouseOut = () => setUpdateHover(false);\n return (jsxs(Fragment, { children: [(isReconnectable === true || isReconnectable === 'source') && (jsx(EdgeAnchor, { position: sourcePosition, centerX: sourceX, centerY: sourceY, radius: reconnectRadius, onMouseDown: onReconnectSourceMouseDown, onMouseEnter: onReconnectMouseEnter, onMouseOut: onReconnectMouseOut, type: \"source\" })), (isReconnectable === true || isReconnectable === 'target') && (jsx(EdgeAnchor, { position: targetPosition, centerX: targetX, centerY: targetY, radius: reconnectRadius, onMouseDown: onReconnectTargetMouseDown, onMouseEnter: onReconnectMouseEnter, onMouseOut: onReconnectMouseOut, type: \"target\" }))] }));\n}\n\nfunction EdgeWrapper({ id, edgesFocusable, edgesReconnectable, elementsSelectable, onClick, onDoubleClick, onContextMenu, onMouseEnter, onMouseMove, onMouseLeave, reconnectRadius, onReconnect, onReconnectStart, onReconnectEnd, rfId, edgeTypes, noPanClassName, onError, disableKeyboardA11y, }) {\n let edge = useStore((s) => s.edgeLookup.get(id));\n const defaultEdgeOptions = useStore((s) => s.defaultEdgeOptions);\n edge = defaultEdgeOptions ? { ...defaultEdgeOptions, ...edge } : edge;\n let edgeType = edge.type || 'default';\n let EdgeComponent = edgeTypes?.[edgeType] || builtinEdgeTypes[edgeType];\n if (EdgeComponent === undefined) {\n onError?.('011', errorMessages['error011'](edgeType));\n edgeType = 'default';\n EdgeComponent = edgeTypes?.['default'] || builtinEdgeTypes.default;\n }\n const isFocusable = !!(edge.focusable || (edgesFocusable && typeof edge.focusable === 'undefined'));\n const isReconnectable = typeof onReconnect !== 'undefined' &&\n (edge.reconnectable || (edgesReconnectable && typeof edge.reconnectable === 'undefined'));\n const isSelectable = !!(edge.selectable || (elementsSelectable && typeof edge.selectable === 'undefined'));\n const edgeRef = useRef(null);\n const [updateHover, setUpdateHover] = useState(false);\n const [reconnecting, setReconnecting] = useState(false);\n const store = useStoreApi();\n const { zIndex, sourceX, sourceY, targetX, targetY, sourcePosition, targetPosition } = useStore(useCallback((store) => {\n const sourceNode = store.nodeLookup.get(edge.source);\n const targetNode = store.nodeLookup.get(edge.target);\n if (!sourceNode || !targetNode) {\n return {\n zIndex: edge.zIndex,\n ...nullPosition,\n };\n }\n const edgePosition = getEdgePosition({\n id,\n sourceNode,\n targetNode,\n sourceHandle: edge.sourceHandle || null,\n targetHandle: edge.targetHandle || null,\n connectionMode: store.connectionMode,\n onError,\n });\n const zIndex = getElevatedEdgeZIndex({\n selected: edge.selected,\n zIndex: edge.zIndex,\n sourceNode,\n targetNode,\n elevateOnSelect: store.elevateEdgesOnSelect,\n zIndexMode: store.zIndexMode,\n });\n return {\n zIndex,\n ...(edgePosition || nullPosition),\n };\n }, [edge.source, edge.target, edge.sourceHandle, edge.targetHandle, edge.selected, edge.zIndex]), shallow);\n const markerStartUrl = useMemo(() => (edge.markerStart ? `url('#${getMarkerId(edge.markerStart, rfId)}')` : undefined), [edge.markerStart, rfId]);\n const markerEndUrl = useMemo(() => (edge.markerEnd ? `url('#${getMarkerId(edge.markerEnd, rfId)}')` : undefined), [edge.markerEnd, rfId]);\n if (edge.hidden || sourceX === null || sourceY === null || targetX === null || targetY === null) {\n return null;\n }\n const onEdgeClick = (event) => {\n const { addSelectedEdges, unselectNodesAndEdges, multiSelectionActive } = store.getState();\n if (isSelectable) {\n store.setState({ nodesSelectionActive: false });\n if (edge.selected && multiSelectionActive) {\n unselectNodesAndEdges({ nodes: [], edges: [edge] });\n edgeRef.current?.blur();\n }\n else {\n addSelectedEdges([id]);\n }\n }\n if (onClick) {\n onClick(event, edge);\n }\n };\n const onEdgeDoubleClick = onDoubleClick\n ? (event) => {\n onDoubleClick(event, { ...edge });\n }\n : undefined;\n const onEdgeContextMenu = onContextMenu\n ? (event) => {\n onContextMenu(event, { ...edge });\n }\n : undefined;\n const onEdgeMouseEnter = onMouseEnter\n ? (event) => {\n onMouseEnter(event, { ...edge });\n }\n : undefined;\n const onEdgeMouseMove = onMouseMove\n ? (event) => {\n onMouseMove(event, { ...edge });\n }\n : undefined;\n const onEdgeMouseLeave = onMouseLeave\n ? (event) => {\n onMouseLeave(event, { ...edge });\n }\n : undefined;\n const onKeyDown = (event) => {\n if (!disableKeyboardA11y && elementSelectionKeys.includes(event.key) && isSelectable) {\n const { unselectNodesAndEdges, addSelectedEdges } = store.getState();\n const unselect = event.key === 'Escape';\n if (unselect) {\n edgeRef.current?.blur();\n unselectNodesAndEdges({ edges: [edge] });\n }\n else {\n addSelectedEdges([id]);\n }\n }\n };\n return (jsx(\"svg\", { style: { zIndex }, children: jsxs(\"g\", { className: cc([\n 'react-flow__edge',\n `react-flow__edge-${edgeType}`,\n edge.className,\n noPanClassName,\n {\n selected: edge.selected,\n animated: edge.animated,\n inactive: !isSelectable && !onClick,\n updating: updateHover,\n selectable: isSelectable,\n },\n ]), onClick: onEdgeClick, onDoubleClick: onEdgeDoubleClick, onContextMenu: onEdgeContextMenu, onMouseEnter: onEdgeMouseEnter, onMouseMove: onEdgeMouseMove, onMouseLeave: onEdgeMouseLeave, onKeyDown: isFocusable ? onKeyDown : undefined, tabIndex: isFocusable ? 0 : undefined, role: edge.ariaRole ?? (isFocusable ? 'group' : 'img'), \"aria-roledescription\": \"edge\", \"data-id\": id, \"data-testid\": `rf__edge-${id}`, \"aria-label\": edge.ariaLabel === null ? undefined : edge.ariaLabel || `Edge from ${edge.source} to ${edge.target}`, \"aria-describedby\": isFocusable ? `${ARIA_EDGE_DESC_KEY}-${rfId}` : undefined, ref: edgeRef, ...edge.domAttributes, children: [!reconnecting && (jsx(EdgeComponent, { id: id, source: edge.source, target: edge.target, type: edge.type, selected: edge.selected, animated: edge.animated, selectable: isSelectable, deletable: edge.deletable ?? true, label: edge.label, labelStyle: edge.labelStyle, labelShowBg: edge.labelShowBg, labelBgStyle: edge.labelBgStyle, labelBgPadding: edge.labelBgPadding, labelBgBorderRadius: edge.labelBgBorderRadius, sourceX: sourceX, sourceY: sourceY, targetX: targetX, targetY: targetY, sourcePosition: sourcePosition, targetPosition: targetPosition, data: edge.data, style: edge.style, sourceHandleId: edge.sourceHandle, targetHandleId: edge.targetHandle, markerStart: markerStartUrl, markerEnd: markerEndUrl, pathOptions: 'pathOptions' in edge ? edge.pathOptions : undefined, interactionWidth: edge.interactionWidth })), isReconnectable && (jsx(EdgeUpdateAnchors, { edge: edge, isReconnectable: isReconnectable, reconnectRadius: reconnectRadius, onReconnect: onReconnect, onReconnectStart: onReconnectStart, onReconnectEnd: onReconnectEnd, sourceX: sourceX, sourceY: sourceY, targetX: targetX, targetY: targetY, sourcePosition: sourcePosition, targetPosition: targetPosition, setUpdateHover: setUpdateHover, setReconnecting: setReconnecting }))] }) }));\n}\nvar EdgeWrapper$1 = memo(EdgeWrapper);\n\nconst selector$a = (s) => ({\n edgesFocusable: s.edgesFocusable,\n edgesReconnectable: s.edgesReconnectable,\n elementsSelectable: s.elementsSelectable,\n connectionMode: s.connectionMode,\n onError: s.onError,\n});\nfunction EdgeRendererComponent({ defaultMarkerColor, onlyRenderVisibleElements, rfId, edgeTypes, noPanClassName, onReconnect, onEdgeContextMenu, onEdgeMouseEnter, onEdgeMouseMove, onEdgeMouseLeave, onEdgeClick, reconnectRadius, onEdgeDoubleClick, onReconnectStart, onReconnectEnd, disableKeyboardA11y, }) {\n const { edgesFocusable, edgesReconnectable, elementsSelectable, onError } = useStore(selector$a, shallow);\n const edgeIds = useVisibleEdgeIds(onlyRenderVisibleElements);\n return (jsxs(\"div\", { className: \"react-flow__edges\", children: [jsx(MarkerDefinitions$1, { defaultColor: defaultMarkerColor, rfId: rfId }), edgeIds.map((id) => {\n return (jsx(EdgeWrapper$1, { id: id, edgesFocusable: edgesFocusable, edgesReconnectable: edgesReconnectable, elementsSelectable: elementsSelectable, noPanClassName: noPanClassName, onReconnect: onReconnect, onContextMenu: onEdgeContextMenu, onMouseEnter: onEdgeMouseEnter, onMouseMove: onEdgeMouseMove, onMouseLeave: onEdgeMouseLeave, onClick: onEdgeClick, reconnectRadius: reconnectRadius, onDoubleClick: onEdgeDoubleClick, onReconnectStart: onReconnectStart, onReconnectEnd: onReconnectEnd, rfId: rfId, onError: onError, edgeTypes: edgeTypes, disableKeyboardA11y: disableKeyboardA11y }, id));\n })] }));\n}\nEdgeRendererComponent.displayName = 'EdgeRenderer';\nconst EdgeRenderer = memo(EdgeRendererComponent);\n\nconst selector$9 = (s) => `translate(${s.transform[0]}px,${s.transform[1]}px) scale(${s.transform[2]})`;\nfunction Viewport({ children }) {\n const transform = useStore(selector$9);\n return (jsx(\"div\", { className: \"react-flow__viewport xyflow__viewport react-flow__container\", style: { transform }, children: children }));\n}\n\n/**\n * Hook for calling onInit handler.\n *\n * @internal\n */\nfunction useOnInitHandler(onInit) {\n const rfInstance = useReactFlow();\n const isInitialized = useRef(false);\n useEffect(() => {\n if (!isInitialized.current && rfInstance.viewportInitialized && onInit) {\n setTimeout(() => onInit(rfInstance), 1);\n isInitialized.current = true;\n }\n }, [onInit, rfInstance.viewportInitialized]);\n}\n\nconst selector$8 = (state) => state.panZoom?.syncViewport;\n/**\n * Hook for syncing the viewport with the panzoom instance.\n *\n * @internal\n * @param viewport\n */\nfunction useViewportSync(viewport) {\n const syncViewport = useStore(selector$8);\n const store = useStoreApi();\n useEffect(() => {\n if (viewport) {\n syncViewport?.(viewport);\n store.setState({ transform: [viewport.x, viewport.y, viewport.zoom] });\n }\n }, [viewport, syncViewport]);\n return null;\n}\n\nfunction storeSelector$1(s) {\n return s.connection.inProgress\n ? { ...s.connection, to: pointToRendererPoint(s.connection.to, s.transform) }\n : { ...s.connection };\n}\nfunction getSelector(connectionSelector) {\n if (connectionSelector) {\n const combinedSelector = (s) => {\n const connection = storeSelector$1(s);\n return connectionSelector(connection);\n };\n return combinedSelector;\n }\n return storeSelector$1;\n}\n/**\n * The `useConnection` hook returns the current connection when there is an active\n * connection interaction. If no connection interaction is active, it returns null\n * for every property. A typical use case for this hook is to colorize handles\n * based on a certain condition (e.g. if the connection is valid or not).\n *\n * @public\n * @param connectionSelector - An optional selector function used to extract a slice of the\n * `ConnectionState` data. Using a selector can prevent component re-renders where data you don't\n * otherwise care about might change. If a selector is not provided, the entire `ConnectionState`\n * object is returned unchanged.\n * @example\n *\n * ```tsx\n *import { useConnection } from '@xyflow/react';\n *\n *function App() {\n * const connection = useConnection();\n *\n * return (\n *
{connection ? `Someone is trying to make a connection from ${connection.fromNode} to this one.` : 'There are currently no incoming connections!'}\n *\n *
\n * );\n * }\n * ```\n *\n * @returns ConnectionState\n */\nfunction useConnection(connectionSelector) {\n const combinedSelector = getSelector(connectionSelector);\n return useStore(combinedSelector, shallow);\n}\n\nconst selector$7 = (s) => ({\n nodesConnectable: s.nodesConnectable,\n isValid: s.connection.isValid,\n inProgress: s.connection.inProgress,\n width: s.width,\n height: s.height,\n});\nfunction ConnectionLineWrapper({ containerStyle, style, type, component, }) {\n const { nodesConnectable, width, height, isValid, inProgress } = useStore(selector$7, shallow);\n const renderConnection = !!(width && nodesConnectable && inProgress);\n if (!renderConnection) {\n return null;\n }\n return (jsx(\"svg\", { style: containerStyle, width: width, height: height, className: \"react-flow__connectionline react-flow__container\", children: jsx(\"g\", { className: cc(['react-flow__connection', getConnectionStatus(isValid)]), children: jsx(ConnectionLine, { style: style, type: type, CustomComponent: component, isValid: isValid }) }) }));\n}\nconst ConnectionLine = ({ style, type = ConnectionLineType.Bezier, CustomComponent, isValid, }) => {\n const { inProgress, from, fromNode, fromHandle, fromPosition, to, toNode, toHandle, toPosition, pointer } = useConnection();\n if (!inProgress) {\n return;\n }\n if (CustomComponent) {\n return (jsx(CustomComponent, { connectionLineType: type, connectionLineStyle: style, fromNode: fromNode, fromHandle: fromHandle, fromX: from.x, fromY: from.y, toX: to.x, toY: to.y, fromPosition: fromPosition, toPosition: toPosition, connectionStatus: getConnectionStatus(isValid), toNode: toNode, toHandle: toHandle, pointer: pointer }));\n }\n let path = '';\n const pathParams = {\n sourceX: from.x,\n sourceY: from.y,\n sourcePosition: fromPosition,\n targetX: to.x,\n targetY: to.y,\n targetPosition: toPosition,\n };\n switch (type) {\n case ConnectionLineType.Bezier:\n [path] = getBezierPath(pathParams);\n break;\n case ConnectionLineType.SimpleBezier:\n [path] = getSimpleBezierPath(pathParams);\n break;\n case ConnectionLineType.Step:\n [path] = getSmoothStepPath({\n ...pathParams,\n borderRadius: 0,\n });\n break;\n case ConnectionLineType.SmoothStep:\n [path] = getSmoothStepPath(pathParams);\n break;\n default:\n [path] = getStraightPath(pathParams);\n }\n return jsx(\"path\", { d: path, fill: \"none\", className: \"react-flow__connection-path\", style: style });\n};\nConnectionLine.displayName = 'ConnectionLine';\n\nconst emptyTypes = {};\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction useNodeOrEdgeTypesWarning(nodeOrEdgeTypes = emptyTypes) {\n const typesRef = useRef(nodeOrEdgeTypes);\n const store = useStoreApi();\n useEffect(() => {\n if (process.env.NODE_ENV === 'development') {\n const usedKeys = new Set([...Object.keys(typesRef.current), ...Object.keys(nodeOrEdgeTypes)]);\n for (const key of usedKeys) {\n if (typesRef.current[key] !== nodeOrEdgeTypes[key]) {\n store.getState().onError?.('002', errorMessages['error002']());\n break;\n }\n }\n typesRef.current = nodeOrEdgeTypes;\n }\n }, [nodeOrEdgeTypes]);\n}\n\nfunction useStylesLoadedWarning() {\n const store = useStoreApi();\n const checked = useRef(false);\n useEffect(() => {\n if (process.env.NODE_ENV === 'development') {\n if (!checked.current) {\n const pane = document.querySelector('.react-flow__pane');\n if (pane && !(window.getComputedStyle(pane).zIndex === '1')) {\n store.getState().onError?.('013', errorMessages['error013']('react'));\n }\n checked.current = true;\n }\n }\n }, []);\n}\n\nfunction GraphViewComponent({ nodeTypes, edgeTypes, onInit, onNodeClick, onEdgeClick, onNodeDoubleClick, onEdgeDoubleClick, onNodeMouseEnter, onNodeMouseMove, onNodeMouseLeave, onNodeContextMenu, onSelectionContextMenu, onSelectionStart, onSelectionEnd, connectionLineType, connectionLineStyle, connectionLineComponent, connectionLineContainerStyle, selectionKeyCode, selectionOnDrag, selectionMode, multiSelectionKeyCode, panActivationKeyCode, zoomActivationKeyCode, deleteKeyCode, onlyRenderVisibleElements, elementsSelectable, defaultViewport, translateExtent, minZoom, maxZoom, preventScrolling, defaultMarkerColor, zoomOnScroll, zoomOnPinch, panOnScroll, panOnScrollSpeed, panOnScrollMode, zoomOnDoubleClick, panOnDrag, onPaneClick, onPaneMouseEnter, onPaneMouseMove, onPaneMouseLeave, onPaneScroll, onPaneContextMenu, paneClickDistance, nodeClickDistance, onEdgeContextMenu, onEdgeMouseEnter, onEdgeMouseMove, onEdgeMouseLeave, reconnectRadius, onReconnect, onReconnectStart, onReconnectEnd, noDragClassName, noWheelClassName, noPanClassName, disableKeyboardA11y, nodeExtent, rfId, viewport, onViewportChange, }) {\n useNodeOrEdgeTypesWarning(nodeTypes);\n useNodeOrEdgeTypesWarning(edgeTypes);\n useStylesLoadedWarning();\n useOnInitHandler(onInit);\n useViewportSync(viewport);\n return (jsx(FlowRenderer, { onPaneClick: onPaneClick, onPaneMouseEnter: onPaneMouseEnter, onPaneMouseMove: onPaneMouseMove, onPaneMouseLeave: onPaneMouseLeave, onPaneContextMenu: onPaneContextMenu, onPaneScroll: onPaneScroll, paneClickDistance: paneClickDistance, deleteKeyCode: deleteKeyCode, selectionKeyCode: selectionKeyCode, selectionOnDrag: selectionOnDrag, selectionMode: selectionMode, onSelectionStart: onSelectionStart, onSelectionEnd: onSelectionEnd, multiSelectionKeyCode: multiSelectionKeyCode, panActivationKeyCode: panActivationKeyCode, zoomActivationKeyCode: zoomActivationKeyCode, elementsSelectable: elementsSelectable, zoomOnScroll: zoomOnScroll, zoomOnPinch: zoomOnPinch, zoomOnDoubleClick: zoomOnDoubleClick, panOnScroll: panOnScroll, panOnScrollSpeed: panOnScrollSpeed, panOnScrollMode: panOnScrollMode, panOnDrag: panOnDrag, defaultViewport: defaultViewport, translateExtent: translateExtent, minZoom: minZoom, maxZoom: maxZoom, onSelectionContextMenu: onSelectionContextMenu, preventScrolling: preventScrolling, noDragClassName: noDragClassName, noWheelClassName: noWheelClassName, noPanClassName: noPanClassName, disableKeyboardA11y: disableKeyboardA11y, onViewportChange: onViewportChange, isControlledViewport: !!viewport, children: jsxs(Viewport, { children: [jsx(EdgeRenderer, { edgeTypes: edgeTypes, onEdgeClick: onEdgeClick, onEdgeDoubleClick: onEdgeDoubleClick, onReconnect: onReconnect, onReconnectStart: onReconnectStart, onReconnectEnd: onReconnectEnd, onlyRenderVisibleElements: onlyRenderVisibleElements, onEdgeContextMenu: onEdgeContextMenu, onEdgeMouseEnter: onEdgeMouseEnter, onEdgeMouseMove: onEdgeMouseMove, onEdgeMouseLeave: onEdgeMouseLeave, reconnectRadius: reconnectRadius, defaultMarkerColor: defaultMarkerColor, noPanClassName: noPanClassName, disableKeyboardA11y: disableKeyboardA11y, rfId: rfId }), jsx(ConnectionLineWrapper, { style: connectionLineStyle, type: connectionLineType, component: connectionLineComponent, containerStyle: connectionLineContainerStyle }), jsx(\"div\", { className: \"react-flow__edgelabel-renderer\" }), jsx(NodeRenderer, { nodeTypes: nodeTypes, onNodeClick: onNodeClick, onNodeDoubleClick: onNodeDoubleClick, onNodeMouseEnter: onNodeMouseEnter, onNodeMouseMove: onNodeMouseMove, onNodeMouseLeave: onNodeMouseLeave, onNodeContextMenu: onNodeContextMenu, nodeClickDistance: nodeClickDistance, onlyRenderVisibleElements: onlyRenderVisibleElements, noPanClassName: noPanClassName, noDragClassName: noDragClassName, disableKeyboardA11y: disableKeyboardA11y, nodeExtent: nodeExtent, rfId: rfId }), jsx(\"div\", { className: \"react-flow__viewport-portal\" })] }) }));\n}\nGraphViewComponent.displayName = 'GraphView';\nconst GraphView = memo(GraphViewComponent);\n\nconst getInitialState = ({ nodes, edges, defaultNodes, defaultEdges, width, height, fitView, fitViewOptions, minZoom = 0.5, maxZoom = 2, nodeOrigin, nodeExtent, zIndexMode = 'basic', } = {}) => {\n const nodeLookup = new Map();\n const parentLookup = new Map();\n const connectionLookup = new Map();\n const edgeLookup = new Map();\n const storeEdges = defaultEdges ?? edges ?? [];\n const storeNodes = defaultNodes ?? nodes ?? [];\n const storeNodeOrigin = nodeOrigin ?? [0, 0];\n const storeNodeExtent = nodeExtent ?? infiniteExtent;\n updateConnectionLookup(connectionLookup, edgeLookup, storeEdges);\n const nodesInitialized = adoptUserNodes(storeNodes, nodeLookup, parentLookup, {\n nodeOrigin: storeNodeOrigin,\n nodeExtent: storeNodeExtent,\n zIndexMode,\n });\n let transform = [0, 0, 1];\n if (fitView && width && height) {\n const bounds = getInternalNodesBounds(nodeLookup, {\n filter: (node) => !!((node.width || node.initialWidth) && (node.height || node.initialHeight)),\n });\n const { x, y, zoom } = getViewportForBounds(bounds, width, height, minZoom, maxZoom, fitViewOptions?.padding ?? 0.1);\n transform = [x, y, zoom];\n }\n return {\n rfId: '1',\n width: width ?? 0,\n height: height ?? 0,\n transform,\n nodes: storeNodes,\n nodesInitialized,\n nodeLookup,\n parentLookup,\n edges: storeEdges,\n edgeLookup,\n connectionLookup,\n onNodesChange: null,\n onEdgesChange: null,\n hasDefaultNodes: defaultNodes !== undefined,\n hasDefaultEdges: defaultEdges !== undefined,\n panZoom: null,\n minZoom,\n maxZoom,\n translateExtent: infiniteExtent,\n nodeExtent: storeNodeExtent,\n nodesSelectionActive: false,\n userSelectionActive: false,\n userSelectionRect: null,\n connectionMode: ConnectionMode.Strict,\n domNode: null,\n paneDragging: false,\n noPanClassName: 'nopan',\n nodeOrigin: storeNodeOrigin,\n nodeDragThreshold: 1,\n connectionDragThreshold: 1,\n snapGrid: [15, 15],\n snapToGrid: false,\n nodesDraggable: true,\n nodesConnectable: true,\n nodesFocusable: true,\n edgesFocusable: true,\n edgesReconnectable: true,\n elementsSelectable: true,\n elevateNodesOnSelect: true,\n elevateEdgesOnSelect: true,\n selectNodesOnDrag: true,\n multiSelectionActive: false,\n fitViewQueued: fitView ?? false,\n fitViewOptions,\n fitViewResolver: null,\n connection: { ...initialConnection },\n connectionClickStartHandle: null,\n connectOnClick: true,\n ariaLiveMessage: '',\n autoPanOnConnect: true,\n autoPanOnNodeDrag: true,\n autoPanOnNodeFocus: true,\n autoPanSpeed: 15,\n connectionRadius: 20,\n onError: devWarn,\n isValidConnection: undefined,\n onSelectionChangeHandlers: [],\n lib: 'react',\n debug: false,\n ariaLabelConfig: defaultAriaLabelConfig,\n zIndexMode,\n onNodesChangeMiddlewareMap: new Map(),\n onEdgesChangeMiddlewareMap: new Map(),\n };\n};\n\nconst createStore = ({ nodes, edges, defaultNodes, defaultEdges, width, height, fitView, fitViewOptions, minZoom, maxZoom, nodeOrigin, nodeExtent, zIndexMode, }) => createWithEqualityFn((set, get) => {\n async function resolveFitView() {\n const { nodeLookup, panZoom, fitViewOptions, fitViewResolver, width, height, minZoom, maxZoom } = get();\n if (!panZoom) {\n return;\n }\n await fitViewport({\n nodes: nodeLookup,\n width,\n height,\n panZoom,\n minZoom,\n maxZoom,\n }, fitViewOptions);\n fitViewResolver?.resolve(true);\n /**\n * wait for the fitViewport to resolve before deleting the resolver,\n * we want to reuse the old resolver if the user calls fitView again in the mean time\n */\n set({ fitViewResolver: null });\n }\n return {\n ...getInitialState({\n nodes,\n edges,\n width,\n height,\n fitView,\n fitViewOptions,\n minZoom,\n maxZoom,\n nodeOrigin,\n nodeExtent,\n defaultNodes,\n defaultEdges,\n zIndexMode,\n }),\n setNodes: (nodes) => {\n const { nodeLookup, parentLookup, nodeOrigin, elevateNodesOnSelect, fitViewQueued, zIndexMode } = get();\n /*\n * setNodes() is called exclusively in response to user actions:\n * - either when the `` prop is updated in the controlled ReactFlow setup,\n * - or when the user calls something like `reactFlowInstance.setNodes()` in an uncontrolled ReactFlow setup.\n *\n * When this happens, we take the note objects passed by the user and extend them with fields\n * relevant for internal React Flow operations.\n */\n const nodesInitialized = adoptUserNodes(nodes, nodeLookup, parentLookup, {\n nodeOrigin,\n nodeExtent,\n elevateNodesOnSelect,\n checkEquality: true,\n zIndexMode,\n });\n if (fitViewQueued && nodesInitialized) {\n resolveFitView();\n set({ nodes, nodesInitialized, fitViewQueued: false, fitViewOptions: undefined });\n }\n else {\n set({ nodes, nodesInitialized });\n }\n },\n setEdges: (edges) => {\n const { connectionLookup, edgeLookup } = get();\n updateConnectionLookup(connectionLookup, edgeLookup, edges);\n set({ edges });\n },\n setDefaultNodesAndEdges: (nodes, edges) => {\n if (nodes) {\n const { setNodes } = get();\n setNodes(nodes);\n set({ hasDefaultNodes: true });\n }\n if (edges) {\n const { setEdges } = get();\n setEdges(edges);\n set({ hasDefaultEdges: true });\n }\n },\n /*\n * Every node gets registerd at a ResizeObserver. Whenever a node\n * changes its dimensions, this function is called to measure the\n * new dimensions and update the nodes.\n */\n updateNodeInternals: (updates) => {\n const { triggerNodeChanges, nodeLookup, parentLookup, domNode, nodeOrigin, nodeExtent, debug, fitViewQueued, zIndexMode, } = get();\n const { changes, updatedInternals } = updateNodeInternals(updates, nodeLookup, parentLookup, domNode, nodeOrigin, nodeExtent, zIndexMode);\n if (!updatedInternals) {\n return;\n }\n updateAbsolutePositions(nodeLookup, parentLookup, { nodeOrigin, nodeExtent, zIndexMode });\n if (fitViewQueued) {\n resolveFitView();\n set({ fitViewQueued: false, fitViewOptions: undefined });\n }\n else {\n // we always want to trigger useStore calls whenever updateNodeInternals is called\n set({});\n }\n if (changes?.length > 0) {\n if (debug) {\n console.log('React Flow: trigger node changes', changes);\n }\n triggerNodeChanges?.(changes);\n }\n },\n updateNodePositions: (nodeDragItems, dragging = false) => {\n const parentExpandChildren = [];\n let changes = [];\n const { nodeLookup, triggerNodeChanges, connection, updateConnection, onNodesChangeMiddlewareMap } = get();\n for (const [id, dragItem] of nodeDragItems) {\n // we are using the nodelookup to be sure to use the current expandParent and parentId value\n const node = nodeLookup.get(id);\n const expandParent = !!(node?.expandParent && node?.parentId && dragItem?.position);\n const change = {\n id,\n type: 'position',\n position: expandParent\n ? {\n x: Math.max(0, dragItem.position.x),\n y: Math.max(0, dragItem.position.y),\n }\n : dragItem.position,\n dragging,\n };\n if (node && connection.inProgress && connection.fromNode.id === node.id) {\n const updatedFrom = getHandlePosition(node, connection.fromHandle, Position.Left, true);\n updateConnection({ ...connection, from: updatedFrom });\n }\n if (expandParent && node.parentId) {\n parentExpandChildren.push({\n id,\n parentId: node.parentId,\n rect: {\n ...dragItem.internals.positionAbsolute,\n width: dragItem.measured.width ?? 0,\n height: dragItem.measured.height ?? 0,\n },\n });\n }\n changes.push(change);\n }\n if (parentExpandChildren.length > 0) {\n const { parentLookup, nodeOrigin } = get();\n const parentExpandChanges = handleExpandParent(parentExpandChildren, nodeLookup, parentLookup, nodeOrigin);\n changes.push(...parentExpandChanges);\n }\n for (const middleware of onNodesChangeMiddlewareMap.values()) {\n changes = middleware(changes);\n }\n triggerNodeChanges(changes);\n },\n triggerNodeChanges: (changes) => {\n const { onNodesChange, setNodes, nodes, hasDefaultNodes, debug } = get();\n if (changes?.length) {\n if (hasDefaultNodes) {\n const updatedNodes = applyNodeChanges(changes, nodes);\n setNodes(updatedNodes);\n }\n if (debug) {\n console.log('React Flow: trigger node changes', changes);\n }\n onNodesChange?.(changes);\n }\n },\n triggerEdgeChanges: (changes) => {\n const { onEdgesChange, setEdges, edges, hasDefaultEdges, debug } = get();\n if (changes?.length) {\n if (hasDefaultEdges) {\n const updatedEdges = applyEdgeChanges(changes, edges);\n setEdges(updatedEdges);\n }\n if (debug) {\n console.log('React Flow: trigger edge changes', changes);\n }\n onEdgesChange?.(changes);\n }\n },\n addSelectedNodes: (selectedNodeIds) => {\n const { multiSelectionActive, edgeLookup, nodeLookup, triggerNodeChanges, triggerEdgeChanges } = get();\n if (multiSelectionActive) {\n const nodeChanges = selectedNodeIds.map((nodeId) => createSelectionChange(nodeId, true));\n triggerNodeChanges(nodeChanges);\n return;\n }\n triggerNodeChanges(getSelectionChanges(nodeLookup, new Set([...selectedNodeIds]), true));\n triggerEdgeChanges(getSelectionChanges(edgeLookup));\n },\n addSelectedEdges: (selectedEdgeIds) => {\n const { multiSelectionActive, edgeLookup, nodeLookup, triggerNodeChanges, triggerEdgeChanges } = get();\n if (multiSelectionActive) {\n const changedEdges = selectedEdgeIds.map((edgeId) => createSelectionChange(edgeId, true));\n triggerEdgeChanges(changedEdges);\n return;\n }\n triggerEdgeChanges(getSelectionChanges(edgeLookup, new Set([...selectedEdgeIds])));\n triggerNodeChanges(getSelectionChanges(nodeLookup, new Set(), true));\n },\n unselectNodesAndEdges: ({ nodes, edges } = {}) => {\n const { edges: storeEdges, nodes: storeNodes, nodeLookup, triggerNodeChanges, triggerEdgeChanges } = get();\n const nodesToUnselect = nodes ? nodes : storeNodes;\n const edgesToUnselect = edges ? edges : storeEdges;\n const nodeChanges = nodesToUnselect.map((n) => {\n const internalNode = nodeLookup.get(n.id);\n if (internalNode) {\n /*\n * we need to unselect the internal node that was selected previously before we\n * send the change to the user to prevent it to be selected while dragging the new node\n */\n internalNode.selected = false;\n }\n return createSelectionChange(n.id, false);\n });\n const edgeChanges = edgesToUnselect.map((edge) => createSelectionChange(edge.id, false));\n triggerNodeChanges(nodeChanges);\n triggerEdgeChanges(edgeChanges);\n },\n setMinZoom: (minZoom) => {\n const { panZoom, maxZoom } = get();\n panZoom?.setScaleExtent([minZoom, maxZoom]);\n set({ minZoom });\n },\n setMaxZoom: (maxZoom) => {\n const { panZoom, minZoom } = get();\n panZoom?.setScaleExtent([minZoom, maxZoom]);\n set({ maxZoom });\n },\n setTranslateExtent: (translateExtent) => {\n get().panZoom?.setTranslateExtent(translateExtent);\n set({ translateExtent });\n },\n resetSelectedElements: () => {\n const { edges, nodes, triggerNodeChanges, triggerEdgeChanges, elementsSelectable } = get();\n if (!elementsSelectable) {\n return;\n }\n const nodeChanges = nodes.reduce((res, node) => (node.selected ? [...res, createSelectionChange(node.id, false)] : res), []);\n const edgeChanges = edges.reduce((res, edge) => (edge.selected ? [...res, createSelectionChange(edge.id, false)] : res), []);\n triggerNodeChanges(nodeChanges);\n triggerEdgeChanges(edgeChanges);\n },\n setNodeExtent: (nextNodeExtent) => {\n const { nodes, nodeLookup, parentLookup, nodeOrigin, elevateNodesOnSelect, nodeExtent, zIndexMode } = get();\n if (nextNodeExtent[0][0] === nodeExtent[0][0] &&\n nextNodeExtent[0][1] === nodeExtent[0][1] &&\n nextNodeExtent[1][0] === nodeExtent[1][0] &&\n nextNodeExtent[1][1] === nodeExtent[1][1]) {\n return;\n }\n adoptUserNodes(nodes, nodeLookup, parentLookup, {\n nodeOrigin,\n nodeExtent: nextNodeExtent,\n elevateNodesOnSelect,\n checkEquality: false,\n zIndexMode,\n });\n set({ nodeExtent: nextNodeExtent });\n },\n panBy: (delta) => {\n const { transform, width, height, panZoom, translateExtent } = get();\n return panBy({ delta, panZoom, transform, translateExtent, width, height });\n },\n setCenter: async (x, y, options) => {\n const { width, height, maxZoom, panZoom } = get();\n if (!panZoom) {\n return Promise.resolve(false);\n }\n const nextZoom = typeof options?.zoom !== 'undefined' ? options.zoom : maxZoom;\n await panZoom.setViewport({\n x: width / 2 - x * nextZoom,\n y: height / 2 - y * nextZoom,\n zoom: nextZoom,\n }, { duration: options?.duration, ease: options?.ease, interpolate: options?.interpolate });\n return Promise.resolve(true);\n },\n cancelConnection: () => {\n set({\n connection: { ...initialConnection },\n });\n },\n updateConnection: (connection) => {\n set({ connection });\n },\n reset: () => set({ ...getInitialState() }),\n };\n}, Object.is);\n\n/**\n * The `` component is a [context provider](https://react.dev/learn/passing-data-deeply-with-context#)\n * that makes it possible to access a flow's internal state outside of the\n * [``](/api-reference/react-flow) component. Many of the hooks we\n * provide rely on this component to work.\n * @public\n *\n * @example\n * ```tsx\n *import { ReactFlow, ReactFlowProvider, useNodes } from '@xyflow/react'\n *\n *export default function Flow() {\n * return (\n * \n * \n * \n * \n * );\n *}\n *\n *function Sidebar() {\n * // This hook will only work if the component it's used in is a child of a\n * // .\n * const nodes = useNodes()\n *\n * return ;\n *}\n *```\n *\n * @remarks If you're using a router and want your flow's state to persist across routes,\n * it's vital that you place the `` component _outside_ of\n * your router. If you have multiple flows on the same page you will need to use a separate\n * `` for each flow.\n */\nfunction ReactFlowProvider({ initialNodes: nodes, initialEdges: edges, defaultNodes, defaultEdges, initialWidth: width, initialHeight: height, initialMinZoom: minZoom, initialMaxZoom: maxZoom, initialFitViewOptions: fitViewOptions, fitView, nodeOrigin, nodeExtent, zIndexMode, children, }) {\n const [store] = useState(() => createStore({\n nodes,\n edges,\n defaultNodes,\n defaultEdges,\n width,\n height,\n fitView,\n minZoom,\n maxZoom,\n fitViewOptions,\n nodeOrigin,\n nodeExtent,\n zIndexMode,\n }));\n return (jsx(Provider$1, { value: store, children: jsx(BatchProvider, { children: children }) }));\n}\n\nfunction Wrapper({ children, nodes, edges, defaultNodes, defaultEdges, width, height, fitView, fitViewOptions, minZoom, maxZoom, nodeOrigin, nodeExtent, zIndexMode, }) {\n const isWrapped = useContext(StoreContext);\n if (isWrapped) {\n /*\n * we need to wrap it with a fragment because it's not allowed for children to be a ReactNode\n * https://github.com/DefinitelyTyped/DefinitelyTyped/issues/18051\n */\n return jsx(Fragment, { children: children });\n }\n return (jsx(ReactFlowProvider, { initialNodes: nodes, initialEdges: edges, defaultNodes: defaultNodes, defaultEdges: defaultEdges, initialWidth: width, initialHeight: height, fitView: fitView, initialFitViewOptions: fitViewOptions, initialMinZoom: minZoom, initialMaxZoom: maxZoom, nodeOrigin: nodeOrigin, nodeExtent: nodeExtent, zIndexMode: zIndexMode, children: children }));\n}\n\nconst wrapperStyle = {\n width: '100%',\n height: '100%',\n overflow: 'hidden',\n position: 'relative',\n zIndex: 0,\n};\nfunction ReactFlow({ nodes, edges, defaultNodes, defaultEdges, className, nodeTypes, edgeTypes, onNodeClick, onEdgeClick, onInit, onMove, onMoveStart, onMoveEnd, onConnect, onConnectStart, onConnectEnd, onClickConnectStart, onClickConnectEnd, onNodeMouseEnter, onNodeMouseMove, onNodeMouseLeave, onNodeContextMenu, onNodeDoubleClick, onNodeDragStart, onNodeDrag, onNodeDragStop, onNodesDelete, onEdgesDelete, onDelete, onSelectionChange, onSelectionDragStart, onSelectionDrag, onSelectionDragStop, onSelectionContextMenu, onSelectionStart, onSelectionEnd, onBeforeDelete, connectionMode, connectionLineType = ConnectionLineType.Bezier, connectionLineStyle, connectionLineComponent, connectionLineContainerStyle, deleteKeyCode = 'Backspace', selectionKeyCode = 'Shift', selectionOnDrag = false, selectionMode = SelectionMode.Full, panActivationKeyCode = 'Space', multiSelectionKeyCode = isMacOs() ? 'Meta' : 'Control', zoomActivationKeyCode = isMacOs() ? 'Meta' : 'Control', snapToGrid, snapGrid, onlyRenderVisibleElements = false, selectNodesOnDrag, nodesDraggable, autoPanOnNodeFocus, nodesConnectable, nodesFocusable, nodeOrigin = defaultNodeOrigin, edgesFocusable, edgesReconnectable, elementsSelectable = true, defaultViewport: defaultViewport$1 = defaultViewport, minZoom = 0.5, maxZoom = 2, translateExtent = infiniteExtent, preventScrolling = true, nodeExtent, defaultMarkerColor = '#b1b1b7', zoomOnScroll = true, zoomOnPinch = true, panOnScroll = false, panOnScrollSpeed = 0.5, panOnScrollMode = PanOnScrollMode.Free, zoomOnDoubleClick = true, panOnDrag = true, onPaneClick, onPaneMouseEnter, onPaneMouseMove, onPaneMouseLeave, onPaneScroll, onPaneContextMenu, paneClickDistance = 1, nodeClickDistance = 0, children, onReconnect, onReconnectStart, onReconnectEnd, onEdgeContextMenu, onEdgeDoubleClick, onEdgeMouseEnter, onEdgeMouseMove, onEdgeMouseLeave, reconnectRadius = 10, onNodesChange, onEdgesChange, noDragClassName = 'nodrag', noWheelClassName = 'nowheel', noPanClassName = 'nopan', fitView, fitViewOptions, connectOnClick, attributionPosition, proOptions, defaultEdgeOptions, elevateNodesOnSelect = true, elevateEdgesOnSelect = false, disableKeyboardA11y = false, autoPanOnConnect, autoPanOnNodeDrag, autoPanSpeed, connectionRadius, isValidConnection, onError, style, id, nodeDragThreshold, connectionDragThreshold, viewport, onViewportChange, width, height, colorMode = 'light', debug, onScroll, ariaLabelConfig, zIndexMode = 'basic', ...rest }, ref) {\n const rfId = id || '1';\n const colorModeClassName = useColorModeClass(colorMode);\n // Undo scroll events, preventing viewport from shifting when nodes outside of it are focused\n const wrapperOnScroll = useCallback((e) => {\n e.currentTarget.scrollTo({ top: 0, left: 0, behavior: 'instant' });\n onScroll?.(e);\n }, [onScroll]);\n return (jsx(\"div\", { \"data-testid\": \"rf__wrapper\", ...rest, onScroll: wrapperOnScroll, style: { ...style, ...wrapperStyle }, ref: ref, className: cc(['react-flow', className, colorModeClassName]), id: id, role: \"application\", children: jsxs(Wrapper, { nodes: nodes, edges: edges, width: width, height: height, fitView: fitView, fitViewOptions: fitViewOptions, minZoom: minZoom, maxZoom: maxZoom, nodeOrigin: nodeOrigin, nodeExtent: nodeExtent, zIndexMode: zIndexMode, children: [jsx(GraphView, { onInit: onInit, onNodeClick: onNodeClick, onEdgeClick: onEdgeClick, onNodeMouseEnter: onNodeMouseEnter, onNodeMouseMove: onNodeMouseMove, onNodeMouseLeave: onNodeMouseLeave, onNodeContextMenu: onNodeContextMenu, onNodeDoubleClick: onNodeDoubleClick, nodeTypes: nodeTypes, edgeTypes: edgeTypes, connectionLineType: connectionLineType, connectionLineStyle: connectionLineStyle, connectionLineComponent: connectionLineComponent, connectionLineContainerStyle: connectionLineContainerStyle, selectionKeyCode: selectionKeyCode, selectionOnDrag: selectionOnDrag, selectionMode: selectionMode, deleteKeyCode: deleteKeyCode, multiSelectionKeyCode: multiSelectionKeyCode, panActivationKeyCode: panActivationKeyCode, zoomActivationKeyCode: zoomActivationKeyCode, onlyRenderVisibleElements: onlyRenderVisibleElements, defaultViewport: defaultViewport$1, translateExtent: translateExtent, minZoom: minZoom, maxZoom: maxZoom, preventScrolling: preventScrolling, zoomOnScroll: zoomOnScroll, zoomOnPinch: zoomOnPinch, zoomOnDoubleClick: zoomOnDoubleClick, panOnScroll: panOnScroll, panOnScrollSpeed: panOnScrollSpeed, panOnScrollMode: panOnScrollMode, panOnDrag: panOnDrag, onPaneClick: onPaneClick, onPaneMouseEnter: onPaneMouseEnter, onPaneMouseMove: onPaneMouseMove, onPaneMouseLeave: onPaneMouseLeave, onPaneScroll: onPaneScroll, onPaneContextMenu: onPaneContextMenu, paneClickDistance: paneClickDistance, nodeClickDistance: nodeClickDistance, onSelectionContextMenu: onSelectionContextMenu, onSelectionStart: onSelectionStart, onSelectionEnd: onSelectionEnd, onReconnect: onReconnect, onReconnectStart: onReconnectStart, onReconnectEnd: onReconnectEnd, onEdgeContextMenu: onEdgeContextMenu, onEdgeDoubleClick: onEdgeDoubleClick, onEdgeMouseEnter: onEdgeMouseEnter, onEdgeMouseMove: onEdgeMouseMove, onEdgeMouseLeave: onEdgeMouseLeave, reconnectRadius: reconnectRadius, defaultMarkerColor: defaultMarkerColor, noDragClassName: noDragClassName, noWheelClassName: noWheelClassName, noPanClassName: noPanClassName, rfId: rfId, disableKeyboardA11y: disableKeyboardA11y, nodeExtent: nodeExtent, viewport: viewport, onViewportChange: onViewportChange }), jsx(StoreUpdater, { nodes: nodes, edges: edges, defaultNodes: defaultNodes, defaultEdges: defaultEdges, onConnect: onConnect, onConnectStart: onConnectStart, onConnectEnd: onConnectEnd, onClickConnectStart: onClickConnectStart, onClickConnectEnd: onClickConnectEnd, nodesDraggable: nodesDraggable, autoPanOnNodeFocus: autoPanOnNodeFocus, nodesConnectable: nodesConnectable, nodesFocusable: nodesFocusable, edgesFocusable: edgesFocusable, edgesReconnectable: edgesReconnectable, elementsSelectable: elementsSelectable, elevateNodesOnSelect: elevateNodesOnSelect, elevateEdgesOnSelect: elevateEdgesOnSelect, minZoom: minZoom, maxZoom: maxZoom, nodeExtent: nodeExtent, onNodesChange: onNodesChange, onEdgesChange: onEdgesChange, snapToGrid: snapToGrid, snapGrid: snapGrid, connectionMode: connectionMode, translateExtent: translateExtent, connectOnClick: connectOnClick, defaultEdgeOptions: defaultEdgeOptions, fitView: fitView, fitViewOptions: fitViewOptions, onNodesDelete: onNodesDelete, onEdgesDelete: onEdgesDelete, onDelete: onDelete, onNodeDragStart: onNodeDragStart, onNodeDrag: onNodeDrag, onNodeDragStop: onNodeDragStop, onSelectionDrag: onSelectionDrag, onSelectionDragStart: onSelectionDragStart, onSelectionDragStop: onSelectionDragStop, onMove: onMove, onMoveStart: onMoveStart, onMoveEnd: onMoveEnd, noPanClassName: noPanClassName, nodeOrigin: nodeOrigin, rfId: rfId, autoPanOnConnect: autoPanOnConnect, autoPanOnNodeDrag: autoPanOnNodeDrag, autoPanSpeed: autoPanSpeed, onError: onError, connectionRadius: connectionRadius, isValidConnection: isValidConnection, selectNodesOnDrag: selectNodesOnDrag, nodeDragThreshold: nodeDragThreshold, connectionDragThreshold: connectionDragThreshold, onBeforeDelete: onBeforeDelete, debug: debug, ariaLabelConfig: ariaLabelConfig, zIndexMode: zIndexMode }), jsx(SelectionListener, { onSelectionChange: onSelectionChange }), children, jsx(Attribution, { proOptions: proOptions, position: attributionPosition }), jsx(A11yDescriptions, { rfId: rfId, disableKeyboardA11y: disableKeyboardA11y })] }) }));\n}\n/**\n * The `` component is the heart of your React Flow application.\n * It renders your nodes and edges and handles user interaction\n *\n * @public\n *\n * @example\n * ```tsx\n *import { ReactFlow } from '@xyflow/react'\n *\n *export default function Flow() {\n * return ();\n *}\n *```\n */\nvar index = fixedForwardRef(ReactFlow);\n\nconst selector$6 = (s) => s.domNode?.querySelector('.react-flow__edgelabel-renderer');\n/**\n * Edges are SVG-based. If you want to render more complex labels you can use the\n * `` component to access a div based renderer. This component\n * is a portal that renders the label in a `
` that is positioned on top of\n * the edges. You can see an example usage of the component in the\n * [edge label renderer example](/examples/edges/edge-label-renderer).\n * @public\n *\n * @example\n * ```jsx\n * import React from 'react';\n * import { getBezierPath, EdgeLabelRenderer, BaseEdge } from '@xyflow/react';\n *\n * export function CustomEdge({ id, data, ...props }) {\n * const [edgePath, labelX, labelY] = getBezierPath(props);\n *\n * return (\n * <>\n * \n * \n * \n * {data.label}\n *
\n *
\n * \n * );\n * };\n * ```\n *\n * @remarks The `` has no pointer events by default. If you want to\n * add mouse interactions you need to set the style `pointerEvents: all` and add\n * the `nopan` class on the label or the element you want to interact with.\n */\nfunction EdgeLabelRenderer({ children }) {\n const edgeLabelRenderer = useStore(selector$6);\n if (!edgeLabelRenderer) {\n return null;\n }\n return createPortal(children, edgeLabelRenderer);\n}\n\nconst selector$5 = (s) => s.domNode?.querySelector('.react-flow__viewport-portal');\n/**\n * The `` component can be used to add components to the same viewport\n * of the flow where nodes and edges are rendered. This is useful when you want to render\n * your own components that are adhere to the same coordinate system as the nodes & edges\n * and are also affected by zooming and panning\n * @public\n * @example\n *\n * ```jsx\n *import React from 'react';\n *import { ViewportPortal } from '@xyflow/react';\n *\n *export default function () {\n * return (\n * \n * \n * This div is positioned at [100, 100] on the flow.\n * \n * \n * );\n *}\n *```\n */\nfunction ViewportPortal({ children }) {\n const viewPortalDiv = useStore(selector$5);\n if (!viewPortalDiv) {\n return null;\n }\n return createPortal(children, viewPortalDiv);\n}\n\n/**\n * When you programmatically add or remove handles to a node or update a node's\n * handle position, you need to let React Flow know about it using this hook. This\n * will update the internal dimensions of the node and properly reposition handles\n * on the canvas if necessary.\n *\n * @public\n * @returns Use this function to tell React Flow to update the internal state of one or more nodes\n * that you have changed programmatically.\n *\n * @example\n * ```jsx\n *import { useCallback, useState } from 'react';\n *import { Handle, useUpdateNodeInternals } from '@xyflow/react';\n *\n *export default function RandomHandleNode({ id }) {\n * const updateNodeInternals = useUpdateNodeInternals();\n * const [handleCount, setHandleCount] = useState(0);\n * const randomizeHandleCount = useCallback(() => {\n * setHandleCount(Math.floor(Math.random() * 10));\n * updateNodeInternals(id);\n * }, [id, updateNodeInternals]);\n *\n * return (\n * <>\n * {Array.from({ length: handleCount }).map((_, index) => (\n * \n * ))}\n *\n *
\n * \n *

There are {handleCount} handles on this node.

\n *
\n * \n * );\n *}\n *```\n * @remarks This hook can only be used in a component that is a child of a\n *{@link ReactFlowProvider} or a {@link ReactFlow} component.\n */\nfunction useUpdateNodeInternals() {\n const store = useStoreApi();\n return useCallback((id) => {\n const { domNode, updateNodeInternals } = store.getState();\n const updateIds = Array.isArray(id) ? id : [id];\n const updates = new Map();\n updateIds.forEach((updateId) => {\n const nodeElement = domNode?.querySelector(`.react-flow__node[data-id=\"${updateId}\"]`);\n if (nodeElement) {\n updates.set(updateId, { id: updateId, nodeElement, force: true });\n }\n });\n requestAnimationFrame(() => updateNodeInternals(updates, { triggerFitView: false }));\n }, []);\n}\n\nconst nodesSelector = (state) => state.nodes;\n/**\n * This hook returns an array of the current nodes. Components that use this hook\n * will re-render **whenever any node changes**, including when a node is selected\n * or moved.\n *\n * @public\n * @returns An array of all nodes currently in the flow.\n *\n * @example\n * ```jsx\n *import { useNodes } from '@xyflow/react';\n *\n *export default function() {\n * const nodes = useNodes();\n *\n * return
There are currently {nodes.length} nodes!
;\n *}\n *```\n */\nfunction useNodes() {\n const nodes = useStore(nodesSelector, shallow);\n return nodes;\n}\n\nconst edgesSelector = (state) => state.edges;\n/**\n * This hook returns an array of the current edges. Components that use this hook\n * will re-render **whenever any edge changes**.\n *\n * @public\n * @returns An array of all edges currently in the flow.\n *\n * @example\n * ```tsx\n *import { useEdges } from '@xyflow/react';\n *\n *export default function () {\n * const edges = useEdges();\n *\n * return
There are currently {edges.length} edges!
;\n *}\n *```\n */\nfunction useEdges() {\n const edges = useStore(edgesSelector, shallow);\n return edges;\n}\n\nconst viewportSelector = (state) => ({\n x: state.transform[0],\n y: state.transform[1],\n zoom: state.transform[2],\n});\n/**\n * The `useViewport` hook is a convenient way to read the current state of the\n * {@link Viewport} in a component. Components that use this hook\n * will re-render **whenever the viewport changes**.\n *\n * @public\n * @returns The current viewport.\n *\n * @example\n *\n *```jsx\n *import { useViewport } from '@xyflow/react';\n *\n *export default function ViewportDisplay() {\n * const { x, y, zoom } = useViewport();\n *\n * return (\n *
\n *

\n * The viewport is currently at ({x}, {y}) and zoomed to {zoom}.\n *

\n *
\n * );\n *}\n *```\n *\n * @remarks This hook can only be used in a component that is a child of a\n *{@link ReactFlowProvider} or a {@link ReactFlow} component.\n */\nfunction useViewport() {\n const viewport = useStore(viewportSelector, shallow);\n return viewport;\n}\n\n/**\n * This hook makes it easy to prototype a controlled flow where you manage the\n * state of nodes and edges outside the `ReactFlowInstance`. You can think of it\n * like React's `useState` hook with an additional helper callback.\n *\n * @public\n * @returns\n * - `nodes`: The current array of nodes. You might pass this directly to the `nodes` prop of your\n * `` component, or you may want to manipulate it first to perform some layouting,\n * for example.\n * - `setNodes`: A function that you can use to update the nodes. You can pass it a new array of\n * nodes or a callback that receives the current array of nodes and returns a new array of nodes.\n * This is the same as the second element of the tuple returned by React's `useState` hook.\n * - `onNodesChange`: A handy callback that can take an array of `NodeChanges` and update the nodes\n * state accordingly. You'll typically pass this directly to the `onNodesChange` prop of your\n * `` component.\n * @example\n *\n *```tsx\n *import { ReactFlow, useNodesState, useEdgesState } from '@xyflow/react';\n *\n *const initialNodes = [];\n *const initialEdges = [];\n *\n *export default function () {\n * const [nodes, setNodes, onNodesChange] = useNodesState(initialNodes);\n * const [edges, setEdges, onEdgesChange] = useEdgesState(initialEdges);\n *\n * return (\n * \n * );\n *}\n *```\n *\n * @remarks This hook was created to make prototyping easier and our documentation\n * examples clearer. Although it is OK to use this hook in production, in\n * practice you may want to use a more sophisticated state management solution\n * like Zustand {@link https://reactflow.dev/docs/guides/state-management/} instead.\n *\n */\nfunction useNodesState(initialNodes) {\n const [nodes, setNodes] = useState(initialNodes);\n const onNodesChange = useCallback((changes) => setNodes((nds) => applyNodeChanges(changes, nds)), []);\n return [nodes, setNodes, onNodesChange];\n}\n/**\n * This hook makes it easy to prototype a controlled flow where you manage the\n * state of nodes and edges outside the `ReactFlowInstance`. You can think of it\n * like React's `useState` hook with an additional helper callback.\n *\n * @public\n * @returns\n * - `edges`: The current array of edges. You might pass this directly to the `edges` prop of your\n * `` component, or you may want to manipulate it first to perform some layouting,\n * for example.\n *\n * - `setEdges`: A function that you can use to update the edges. You can pass it a new array of\n * edges or a callback that receives the current array of edges and returns a new array of edges.\n * This is the same as the second element of the tuple returned by React's `useState` hook.\n *\n * - `onEdgesChange`: A handy callback that can take an array of `EdgeChanges` and update the edges\n * state accordingly. You'll typically pass this directly to the `onEdgesChange` prop of your\n * `` component.\n * @example\n *\n *```tsx\n *import { ReactFlow, useNodesState, useEdgesState } from '@xyflow/react';\n *\n *const initialNodes = [];\n *const initialEdges = [];\n *\n *export default function () {\n * const [nodes, setNodes, onNodesChange] = useNodesState(initialNodes);\n * const [edges, setEdges, onEdgesChange] = useEdgesState(initialEdges);\n *\n * return (\n * \n * );\n *}\n *```\n *\n * @remarks This hook was created to make prototyping easier and our documentation\n * examples clearer. Although it is OK to use this hook in production, in\n * practice you may want to use a more sophisticated state management solution\n * like Zustand {@link https://reactflow.dev/docs/guides/state-management/} instead.\n *\n */\nfunction useEdgesState(initialEdges) {\n const [edges, setEdges] = useState(initialEdges);\n const onEdgesChange = useCallback((changes) => setEdges((eds) => applyEdgeChanges(changes, eds)), []);\n return [edges, setEdges, onEdgesChange];\n}\n\n/**\n * The `useOnViewportChange` hook lets you listen for changes to the viewport such\n * as panning and zooming. You can provide a callback for each phase of a viewport\n * change: `onStart`, `onChange`, and `onEnd`.\n *\n * @public\n * @example\n * ```jsx\n *import { useCallback } from 'react';\n *import { useOnViewportChange } from '@xyflow/react';\n *\n *function ViewportChangeLogger() {\n * useOnViewportChange({\n * onStart: (viewport: Viewport) => console.log('start', viewport),\n * onChange: (viewport: Viewport) => console.log('change', viewport),\n * onEnd: (viewport: Viewport) => console.log('end', viewport),\n * });\n *\n * return null;\n *}\n *```\n */\nfunction useOnViewportChange({ onStart, onChange, onEnd }) {\n const store = useStoreApi();\n useEffect(() => {\n store.setState({ onViewportChangeStart: onStart });\n }, [onStart]);\n useEffect(() => {\n store.setState({ onViewportChange: onChange });\n }, [onChange]);\n useEffect(() => {\n store.setState({ onViewportChangeEnd: onEnd });\n }, [onEnd]);\n}\n\n/**\n * This hook lets you listen for changes to both node and edge selection. As the\n *name implies, the callback you provide will be called whenever the selection of\n *_either_ nodes or edges changes.\n *\n * @public\n * @example\n * ```jsx\n *import { useState } from 'react';\n *import { ReactFlow, useOnSelectionChange } from '@xyflow/react';\n *\n *function SelectionDisplay() {\n * const [selectedNodes, setSelectedNodes] = useState([]);\n * const [selectedEdges, setSelectedEdges] = useState([]);\n *\n * // the passed handler has to be memoized, otherwise the hook will not work correctly\n * const onChange = useCallback(({ nodes, edges }) => {\n * setSelectedNodes(nodes.map((node) => node.id));\n * setSelectedEdges(edges.map((edge) => edge.id));\n * }, []);\n *\n * useOnSelectionChange({\n * onChange,\n * });\n *\n * return (\n *
\n *

Selected nodes: {selectedNodes.join(', ')}

\n *

Selected edges: {selectedEdges.join(', ')}

\n *
\n * );\n *}\n *```\n *\n * @remarks You need to memoize the passed `onChange` handler, otherwise the hook will not work correctly.\n */\nfunction useOnSelectionChange({ onChange, }) {\n const store = useStoreApi();\n useEffect(() => {\n const nextOnSelectionChangeHandlers = [...store.getState().onSelectionChangeHandlers, onChange];\n store.setState({ onSelectionChangeHandlers: nextOnSelectionChangeHandlers });\n return () => {\n const nextHandlers = store.getState().onSelectionChangeHandlers.filter((fn) => fn !== onChange);\n store.setState({ onSelectionChangeHandlers: nextHandlers });\n };\n }, [onChange]);\n}\n\nconst selector$4 = (options) => (s) => {\n if (!options.includeHiddenNodes) {\n return s.nodesInitialized;\n }\n if (s.nodeLookup.size === 0) {\n return false;\n }\n for (const [, { internals }] of s.nodeLookup) {\n if (internals.handleBounds === undefined || !nodeHasDimensions(internals.userNode)) {\n return false;\n }\n }\n return true;\n};\n/**\n * This hook tells you whether all the nodes in a flow have been measured and given\n *a width and height. When you add a node to the flow, this hook will return\n *`false` and then `true` again once the node has been measured.\n *\n * @public\n * @returns Whether or not the nodes have been initialized by the `` component and\n * given a width and height.\n *\n * @example\n * ```jsx\n *import { useReactFlow, useNodesInitialized } from '@xyflow/react';\n *import { useEffect, useState } from 'react';\n *\n *const options = {\n * includeHiddenNodes: false,\n *};\n *\n *export default function useLayout() {\n * const { getNodes } = useReactFlow();\n * const nodesInitialized = useNodesInitialized(options);\n * const [layoutedNodes, setLayoutedNodes] = useState(getNodes());\n *\n * useEffect(() => {\n * if (nodesInitialized) {\n * setLayoutedNodes(yourLayoutingFunction(getNodes()));\n * }\n * }, [nodesInitialized]);\n *\n * return layoutedNodes;\n *}\n *```\n */\nfunction useNodesInitialized(options = {\n includeHiddenNodes: false,\n}) {\n const initialized = useStore(selector$4(options));\n return initialized;\n}\n\n/**\n * Hook to check if a is connected to another and get the connections.\n *\n * @public\n * @deprecated Use `useNodeConnections` instead.\n * @returns An array with handle connections.\n */\nfunction useHandleConnections({ type, id, nodeId, onConnect, onDisconnect, }) {\n console.warn('[DEPRECATED] `useHandleConnections` is deprecated. Instead use `useNodeConnections` https://reactflow.dev/api-reference/hooks/useNodeConnections');\n const _nodeId = useNodeId();\n const currentNodeId = nodeId ?? _nodeId;\n const prevConnections = useRef(null);\n const connections = useStore((state) => state.connectionLookup.get(`${currentNodeId}-${type}${id ? `-${id}` : ''}`), areConnectionMapsEqual);\n useEffect(() => {\n // @todo dicuss if onConnect/onDisconnect should be called when the component mounts/unmounts\n if (prevConnections.current && prevConnections.current !== connections) {\n const _connections = connections ?? new Map();\n handleConnectionChange(prevConnections.current, _connections, onDisconnect);\n handleConnectionChange(_connections, prevConnections.current, onConnect);\n }\n prevConnections.current = connections ?? new Map();\n }, [connections, onConnect, onDisconnect]);\n return useMemo(() => Array.from(connections?.values() ?? []), [connections]);\n}\n\nconst error014 = errorMessages['error014']();\n/**\n * This hook returns an array of connections on a specific node, handle type ('source', 'target') or handle ID.\n *\n * @public\n * @returns An array with connections.\n *\n * @example\n * ```jsx\n *import { useNodeConnections } from '@xyflow/react';\n *\n *export default function () {\n * const connections = useNodeConnections({\n * handleType: 'target',\n * handleId: 'my-handle',\n * });\n *\n * return (\n *
There are currently {connections.length} incoming connections!
\n * );\n *}\n *```\n */\nfunction useNodeConnections({ id, handleType, handleId, onConnect, onDisconnect, } = {}) {\n const nodeId = useNodeId();\n const currentNodeId = id ?? nodeId;\n if (!currentNodeId) {\n throw new Error(error014);\n }\n const prevConnections = useRef(null);\n const connections = useStore((state) => state.connectionLookup.get(`${currentNodeId}${handleType ? (handleId ? `-${handleType}-${handleId}` : `-${handleType}`) : ''}`), areConnectionMapsEqual);\n useEffect(() => {\n // @todo discuss if onConnect/onDisconnect should be called when the component mounts/unmounts\n if (prevConnections.current && prevConnections.current !== connections) {\n const _connections = connections ?? new Map();\n handleConnectionChange(prevConnections.current, _connections, onDisconnect);\n handleConnectionChange(_connections, prevConnections.current, onConnect);\n }\n prevConnections.current = connections ?? new Map();\n }, [connections, onConnect, onDisconnect]);\n return useMemo(() => Array.from(connections?.values() ?? []), [connections]);\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction useNodesData(nodeIds) {\n const nodesData = useStore(useCallback((s) => {\n const data = [];\n const isArrayOfIds = Array.isArray(nodeIds);\n const _nodeIds = isArrayOfIds ? nodeIds : [nodeIds];\n for (const nodeId of _nodeIds) {\n const node = s.nodeLookup.get(nodeId);\n if (node) {\n data.push({\n id: node.id,\n type: node.type,\n data: node.data,\n });\n }\n }\n return isArrayOfIds ? data : data[0] ?? null;\n }, [nodeIds]), shallowNodeData);\n return nodesData;\n}\n\n/**\n * This hook returns the internal representation of a specific node.\n * Components that use this hook will re-render **whenever the node changes**,\n * including when a node is selected or moved.\n *\n * @public\n * @param id - The ID of a node you want to observe.\n * @returns The `InternalNode` object for the node with the given ID.\n *\n * @example\n * ```tsx\n *import { useInternalNode } from '@xyflow/react';\n *\n *export default function () {\n * const internalNode = useInternalNode('node-1');\n * const absolutePosition = internalNode.internals.positionAbsolute;\n *\n * return (\n *
\n * The absolute position of the node is at:\n *

x: {absolutePosition.x}

\n *

y: {absolutePosition.y}

\n *
\n * );\n *}\n *```\n */\nfunction useInternalNode(id) {\n const node = useStore(useCallback((s) => s.nodeLookup.get(id), [id]), shallow);\n return node;\n}\n\n/**\n * Registers a middleware function to transform node changes.\n *\n * @public\n * @param fn - Middleware function. Should be memoized with useCallback to avoid re-registration.\n */\nfunction experimental_useOnNodesChangeMiddleware(fn) {\n const store = useStoreApi();\n const [symbol] = useState(() => Symbol());\n useEffect(() => {\n const { onNodesChangeMiddlewareMap } = store.getState();\n onNodesChangeMiddlewareMap.set(symbol, fn);\n }, [fn]);\n useEffect(() => {\n const { onNodesChangeMiddlewareMap } = store.getState();\n return () => {\n onNodesChangeMiddlewareMap.delete(symbol);\n };\n }, []);\n}\n\n/**\n * Registers a middleware function to transform edge changes.\n *\n * @public\n * @param fn - Middleware function. Should be memoized with useCallback to avoid re-registration.\n */\nfunction experimental_useOnEdgesChangeMiddleware(fn) {\n const store = useStoreApi();\n const [symbol] = useState(() => Symbol());\n useEffect(() => {\n const { onEdgesChangeMiddlewareMap } = store.getState();\n onEdgesChangeMiddlewareMap.set(symbol, fn);\n }, [fn]);\n useEffect(() => {\n const { onEdgesChangeMiddlewareMap } = store.getState();\n return () => {\n onEdgesChangeMiddlewareMap.delete(symbol);\n };\n }, []);\n}\n\nfunction LinePattern({ dimensions, lineWidth, variant, className }) {\n return (jsx(\"path\", { strokeWidth: lineWidth, d: `M${dimensions[0] / 2} 0 V${dimensions[1]} M0 ${dimensions[1] / 2} H${dimensions[0]}`, className: cc(['react-flow__background-pattern', variant, className]) }));\n}\nfunction DotPattern({ radius, className }) {\n return (jsx(\"circle\", { cx: radius, cy: radius, r: radius, className: cc(['react-flow__background-pattern', 'dots', className]) }));\n}\n\n/**\n * The three variants are exported as an enum for convenience. You can either import\n * the enum and use it like `BackgroundVariant.Lines` or you can use the raw string\n * value directly.\n * @public\n */\nvar BackgroundVariant;\n(function (BackgroundVariant) {\n BackgroundVariant[\"Lines\"] = \"lines\";\n BackgroundVariant[\"Dots\"] = \"dots\";\n BackgroundVariant[\"Cross\"] = \"cross\";\n})(BackgroundVariant || (BackgroundVariant = {}));\n\nconst defaultSize = {\n [BackgroundVariant.Dots]: 1,\n [BackgroundVariant.Lines]: 1,\n [BackgroundVariant.Cross]: 6,\n};\nconst selector$3 = (s) => ({ transform: s.transform, patternId: `pattern-${s.rfId}` });\nfunction BackgroundComponent({ id, variant = BackgroundVariant.Dots, \n// only used for dots and cross\ngap = 20, \n// only used for lines and cross\nsize, lineWidth = 1, offset = 0, color, bgColor, style, className, patternClassName, }) {\n const ref = useRef(null);\n const { transform, patternId } = useStore(selector$3, shallow);\n const patternSize = size || defaultSize[variant];\n const isDots = variant === BackgroundVariant.Dots;\n const isCross = variant === BackgroundVariant.Cross;\n const gapXY = Array.isArray(gap) ? gap : [gap, gap];\n const scaledGap = [gapXY[0] * transform[2] || 1, gapXY[1] * transform[2] || 1];\n const scaledSize = patternSize * transform[2];\n const offsetXY = Array.isArray(offset) ? offset : [offset, offset];\n const patternDimensions = isCross ? [scaledSize, scaledSize] : scaledGap;\n const scaledOffset = [\n offsetXY[0] * transform[2] || 1 + patternDimensions[0] / 2,\n offsetXY[1] * transform[2] || 1 + patternDimensions[1] / 2,\n ];\n const _patternId = `${patternId}${id ? id : ''}`;\n return (jsxs(\"svg\", { className: cc(['react-flow__background', className]), style: {\n ...style,\n ...containerStyle,\n '--xy-background-color-props': bgColor,\n '--xy-background-pattern-color-props': color,\n }, ref: ref, \"data-testid\": \"rf__background\", children: [jsx(\"pattern\", { id: _patternId, x: transform[0] % scaledGap[0], y: transform[1] % scaledGap[1], width: scaledGap[0], height: scaledGap[1], patternUnits: \"userSpaceOnUse\", patternTransform: `translate(-${scaledOffset[0]},-${scaledOffset[1]})`, children: isDots ? (jsx(DotPattern, { radius: scaledSize / 2, className: patternClassName })) : (jsx(LinePattern, { dimensions: patternDimensions, lineWidth: lineWidth, variant: variant, className: patternClassName })) }), jsx(\"rect\", { x: \"0\", y: \"0\", width: \"100%\", height: \"100%\", fill: `url(#${_patternId})` })] }));\n}\nBackgroundComponent.displayName = 'Background';\n/**\n * The `` component makes it convenient to render different types of backgrounds common in node-based UIs. It comes with three variants: lines, dots and cross.\n *\n * @example\n *\n * A simple example of how to use the Background component.\n *\n * ```tsx\n * import { useState } from 'react';\n * import { ReactFlow, Background, BackgroundVariant } from '@xyflow/react';\n *\n * export default function Flow() {\n * return (\n * \n * \n * \n * );\n * }\n * ```\n *\n * @example\n *\n * In this example you can see how to combine multiple backgrounds\n *\n * ```tsx\n * import { ReactFlow, Background, BackgroundVariant } from '@xyflow/react';\n * import '@xyflow/react/dist/style.css';\n *\n * export default function Flow() {\n * return (\n * \n * \n * \n * \n * );\n * }\n * ```\n *\n * @remarks\n *\n * When combining multiple components it’s important to give each of them a unique id prop!\n *\n */\nconst Background = memo(BackgroundComponent);\n\nfunction PlusIcon() {\n return (jsx(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", viewBox: \"0 0 32 32\", children: jsx(\"path\", { d: \"M32 18.133H18.133V32h-4.266V18.133H0v-4.266h13.867V0h4.266v13.867H32z\" }) }));\n}\n\nfunction MinusIcon() {\n return (jsx(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", viewBox: \"0 0 32 5\", children: jsx(\"path\", { d: \"M0 0h32v4.2H0z\" }) }));\n}\n\nfunction FitViewIcon() {\n return (jsx(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", viewBox: \"0 0 32 30\", children: jsx(\"path\", { d: \"M3.692 4.63c0-.53.4-.938.939-.938h5.215V0H4.708C2.13 0 0 2.054 0 4.63v5.216h3.692V4.631zM27.354 0h-5.2v3.692h5.17c.53 0 .984.4.984.939v5.215H32V4.631A4.624 4.624 0 0027.354 0zm.954 24.83c0 .532-.4.94-.939.94h-5.215v3.768h5.215c2.577 0 4.631-2.13 4.631-4.707v-5.139h-3.692v5.139zm-23.677.94c-.531 0-.939-.4-.939-.94v-5.138H0v5.139c0 2.577 2.13 4.707 4.708 4.707h5.138V25.77H4.631z\" }) }));\n}\n\nfunction LockIcon() {\n return (jsx(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", viewBox: \"0 0 25 32\", children: jsx(\"path\", { d: \"M21.333 10.667H19.81V7.619C19.81 3.429 16.38 0 12.19 0 8 0 4.571 3.429 4.571 7.619v3.048H3.048A3.056 3.056 0 000 13.714v15.238A3.056 3.056 0 003.048 32h18.285a3.056 3.056 0 003.048-3.048V13.714a3.056 3.056 0 00-3.048-3.047zM12.19 24.533a3.056 3.056 0 01-3.047-3.047 3.056 3.056 0 013.047-3.048 3.056 3.056 0 013.048 3.048 3.056 3.056 0 01-3.048 3.047zm4.724-13.866H7.467V7.619c0-2.59 2.133-4.724 4.723-4.724 2.591 0 4.724 2.133 4.724 4.724v3.048z\" }) }));\n}\n\nfunction UnlockIcon() {\n return (jsx(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", viewBox: \"0 0 25 32\", children: jsx(\"path\", { d: \"M21.333 10.667H19.81V7.619C19.81 3.429 16.38 0 12.19 0c-4.114 1.828-1.37 2.133.305 2.438 1.676.305 4.42 2.59 4.42 5.181v3.048H3.047A3.056 3.056 0 000 13.714v15.238A3.056 3.056 0 003.048 32h18.285a3.056 3.056 0 003.048-3.048V13.714a3.056 3.056 0 00-3.048-3.047zM12.19 24.533a3.056 3.056 0 01-3.047-3.047 3.056 3.056 0 013.047-3.048 3.056 3.056 0 013.048 3.048 3.056 3.056 0 01-3.048 3.047z\" }) }));\n}\n\n/**\n * You can add buttons to the control panel by using the `` component\n * and pass it as a child to the [``](/api-reference/components/controls) component.\n *\n * @public\n * @example\n *```jsx\n *import { MagicWand } from '@radix-ui/react-icons'\n *import { ReactFlow, Controls, ControlButton } from '@xyflow/react'\n *\n *export default function Flow() {\n * return (\n * \n * \n * alert('Something magical just happened. ✨')}>\n * \n * \n * \n * \n * )\n *}\n *```\n */\nfunction ControlButton({ children, className, ...rest }) {\n return (jsx(\"button\", { type: \"button\", className: cc(['react-flow__controls-button', className]), ...rest, children: children }));\n}\n\nconst selector$2 = (s) => ({\n isInteractive: s.nodesDraggable || s.nodesConnectable || s.elementsSelectable,\n minZoomReached: s.transform[2] <= s.minZoom,\n maxZoomReached: s.transform[2] >= s.maxZoom,\n ariaLabelConfig: s.ariaLabelConfig,\n});\nfunction ControlsComponent({ style, showZoom = true, showFitView = true, showInteractive = true, fitViewOptions, onZoomIn, onZoomOut, onFitView, onInteractiveChange, className, children, position = 'bottom-left', orientation = 'vertical', 'aria-label': ariaLabel, }) {\n const store = useStoreApi();\n const { isInteractive, minZoomReached, maxZoomReached, ariaLabelConfig } = useStore(selector$2, shallow);\n const { zoomIn, zoomOut, fitView } = useReactFlow();\n const onZoomInHandler = () => {\n zoomIn();\n onZoomIn?.();\n };\n const onZoomOutHandler = () => {\n zoomOut();\n onZoomOut?.();\n };\n const onFitViewHandler = () => {\n fitView(fitViewOptions);\n onFitView?.();\n };\n const onToggleInteractivity = () => {\n store.setState({\n nodesDraggable: !isInteractive,\n nodesConnectable: !isInteractive,\n elementsSelectable: !isInteractive,\n });\n onInteractiveChange?.(!isInteractive);\n };\n const orientationClass = orientation === 'horizontal' ? 'horizontal' : 'vertical';\n return (jsxs(Panel, { className: cc(['react-flow__controls', orientationClass, className]), position: position, style: style, \"data-testid\": \"rf__controls\", \"aria-label\": ariaLabel ?? ariaLabelConfig['controls.ariaLabel'], children: [showZoom && (jsxs(Fragment, { children: [jsx(ControlButton, { onClick: onZoomInHandler, className: \"react-flow__controls-zoomin\", title: ariaLabelConfig['controls.zoomIn.ariaLabel'], \"aria-label\": ariaLabelConfig['controls.zoomIn.ariaLabel'], disabled: maxZoomReached, children: jsx(PlusIcon, {}) }), jsx(ControlButton, { onClick: onZoomOutHandler, className: \"react-flow__controls-zoomout\", title: ariaLabelConfig['controls.zoomOut.ariaLabel'], \"aria-label\": ariaLabelConfig['controls.zoomOut.ariaLabel'], disabled: minZoomReached, children: jsx(MinusIcon, {}) })] })), showFitView && (jsx(ControlButton, { className: \"react-flow__controls-fitview\", onClick: onFitViewHandler, title: ariaLabelConfig['controls.fitView.ariaLabel'], \"aria-label\": ariaLabelConfig['controls.fitView.ariaLabel'], children: jsx(FitViewIcon, {}) })), showInteractive && (jsx(ControlButton, { className: \"react-flow__controls-interactive\", onClick: onToggleInteractivity, title: ariaLabelConfig['controls.interactive.ariaLabel'], \"aria-label\": ariaLabelConfig['controls.interactive.ariaLabel'], children: isInteractive ? jsx(UnlockIcon, {}) : jsx(LockIcon, {}) })), children] }));\n}\nControlsComponent.displayName = 'Controls';\n/**\n * The `` component renders a small panel that contains convenient\n * buttons to zoom in, zoom out, fit the view, and lock the viewport.\n *\n * @public\n * @example\n *```tsx\n *import { ReactFlow, Controls } from '@xyflow/react'\n *\n *export default function Flow() {\n * return (\n * \n * \n * \n * )\n *}\n *```\n *\n * @remarks To extend or customise the controls, you can use the [``](/api-reference/components/control-button) component\n *\n */\nconst Controls = memo(ControlsComponent);\n\nfunction MiniMapNodeComponent({ id, x, y, width, height, style, color, strokeColor, strokeWidth, className, borderRadius, shapeRendering, selected, onClick, }) {\n const { background, backgroundColor } = style || {};\n const fill = (color || background || backgroundColor);\n return (jsx(\"rect\", { className: cc(['react-flow__minimap-node', { selected }, className]), x: x, y: y, rx: borderRadius, ry: borderRadius, width: width, height: height, style: {\n fill,\n stroke: strokeColor,\n strokeWidth,\n }, shapeRendering: shapeRendering, onClick: onClick ? (event) => onClick(event, id) : undefined }));\n}\nconst MiniMapNode = memo(MiniMapNodeComponent);\n\nconst selectorNodeIds = (s) => s.nodes.map((node) => node.id);\nconst getAttrFunction = (func) => func instanceof Function ? func : () => func;\nfunction MiniMapNodes({ nodeStrokeColor, nodeColor, nodeClassName = '', nodeBorderRadius = 5, nodeStrokeWidth, \n/*\n * We need to rename the prop to be `CapitalCase` so that JSX will render it as\n * a component properly.\n */\nnodeComponent: NodeComponent = MiniMapNode, onClick, }) {\n const nodeIds = useStore(selectorNodeIds, shallow);\n const nodeColorFunc = getAttrFunction(nodeColor);\n const nodeStrokeColorFunc = getAttrFunction(nodeStrokeColor);\n const nodeClassNameFunc = getAttrFunction(nodeClassName);\n const shapeRendering = typeof window === 'undefined' || !!window.chrome ? 'crispEdges' : 'geometricPrecision';\n return (jsx(Fragment, { children: nodeIds.map((nodeId) => (\n /*\n * The split of responsibilities between MiniMapNodes and\n * NodeComponentWrapper may appear weird. However, it’s designed to\n * minimize the cost of updates when individual nodes change.\n *\n * For more details, see a similar commit in `NodeRenderer/index.tsx`.\n */\n jsx(NodeComponentWrapper, { id: nodeId, nodeColorFunc: nodeColorFunc, nodeStrokeColorFunc: nodeStrokeColorFunc, nodeClassNameFunc: nodeClassNameFunc, nodeBorderRadius: nodeBorderRadius, nodeStrokeWidth: nodeStrokeWidth, NodeComponent: NodeComponent, onClick: onClick, shapeRendering: shapeRendering }, nodeId))) }));\n}\nfunction NodeComponentWrapperInner({ id, nodeColorFunc, nodeStrokeColorFunc, nodeClassNameFunc, nodeBorderRadius, nodeStrokeWidth, shapeRendering, NodeComponent, onClick, }) {\n const { node, x, y, width, height } = useStore((s) => {\n const { internals } = s.nodeLookup.get(id);\n const node = internals.userNode;\n const { x, y } = internals.positionAbsolute;\n const { width, height } = getNodeDimensions(node);\n return {\n node,\n x,\n y,\n width,\n height,\n };\n }, shallow);\n if (!node || node.hidden || !nodeHasDimensions(node)) {\n return null;\n }\n return (jsx(NodeComponent, { x: x, y: y, width: width, height: height, style: node.style, selected: !!node.selected, className: nodeClassNameFunc(node), color: nodeColorFunc(node), borderRadius: nodeBorderRadius, strokeColor: nodeStrokeColorFunc(node), strokeWidth: nodeStrokeWidth, shapeRendering: shapeRendering, onClick: onClick, id: node.id }));\n}\nconst NodeComponentWrapper = memo(NodeComponentWrapperInner);\nvar MiniMapNodes$1 = memo(MiniMapNodes);\n\nconst defaultWidth = 200;\nconst defaultHeight = 150;\nconst filterHidden = (node) => !node.hidden;\nconst selector$1 = (s) => {\n const viewBB = {\n x: -s.transform[0] / s.transform[2],\n y: -s.transform[1] / s.transform[2],\n width: s.width / s.transform[2],\n height: s.height / s.transform[2],\n };\n return {\n viewBB,\n boundingRect: s.nodeLookup.size > 0\n ? getBoundsOfRects(getInternalNodesBounds(s.nodeLookup, { filter: filterHidden }), viewBB)\n : viewBB,\n rfId: s.rfId,\n panZoom: s.panZoom,\n translateExtent: s.translateExtent,\n flowWidth: s.width,\n flowHeight: s.height,\n ariaLabelConfig: s.ariaLabelConfig,\n };\n};\nconst ARIA_LABEL_KEY = 'react-flow__minimap-desc';\nfunction MiniMapComponent({ style, className, nodeStrokeColor, nodeColor, nodeClassName = '', nodeBorderRadius = 5, nodeStrokeWidth, \n/*\n * We need to rename the prop to be `CapitalCase` so that JSX will render it as\n * a component properly.\n */\nnodeComponent, bgColor, maskColor, maskStrokeColor, maskStrokeWidth, position = 'bottom-right', onClick, onNodeClick, pannable = false, zoomable = false, ariaLabel, inversePan, zoomStep = 1, offsetScale = 5, }) {\n const store = useStoreApi();\n const svg = useRef(null);\n const { boundingRect, viewBB, rfId, panZoom, translateExtent, flowWidth, flowHeight, ariaLabelConfig } = useStore(selector$1, shallow);\n const elementWidth = style?.width ?? defaultWidth;\n const elementHeight = style?.height ?? defaultHeight;\n const scaledWidth = boundingRect.width / elementWidth;\n const scaledHeight = boundingRect.height / elementHeight;\n const viewScale = Math.max(scaledWidth, scaledHeight);\n const viewWidth = viewScale * elementWidth;\n const viewHeight = viewScale * elementHeight;\n const offset = offsetScale * viewScale;\n const x = boundingRect.x - (viewWidth - boundingRect.width) / 2 - offset;\n const y = boundingRect.y - (viewHeight - boundingRect.height) / 2 - offset;\n const width = viewWidth + offset * 2;\n const height = viewHeight + offset * 2;\n const labelledBy = `${ARIA_LABEL_KEY}-${rfId}`;\n const viewScaleRef = useRef(0);\n const minimapInstance = useRef();\n viewScaleRef.current = viewScale;\n useEffect(() => {\n if (svg.current && panZoom) {\n minimapInstance.current = XYMinimap({\n domNode: svg.current,\n panZoom,\n getTransform: () => store.getState().transform,\n getViewScale: () => viewScaleRef.current,\n });\n return () => {\n minimapInstance.current?.destroy();\n };\n }\n }, [panZoom]);\n useEffect(() => {\n minimapInstance.current?.update({\n translateExtent,\n width: flowWidth,\n height: flowHeight,\n inversePan,\n pannable,\n zoomStep,\n zoomable,\n });\n }, [pannable, zoomable, inversePan, zoomStep, translateExtent, flowWidth, flowHeight]);\n const onSvgClick = onClick\n ? (event) => {\n const [x, y] = minimapInstance.current?.pointer(event) || [0, 0];\n onClick(event, { x, y });\n }\n : undefined;\n const onSvgNodeClick = onNodeClick\n ? useCallback((event, nodeId) => {\n const node = store.getState().nodeLookup.get(nodeId).internals.userNode;\n onNodeClick(event, node);\n }, [])\n : undefined;\n const _ariaLabel = ariaLabel ?? ariaLabelConfig['minimap.ariaLabel'];\n return (jsx(Panel, { position: position, style: {\n ...style,\n '--xy-minimap-background-color-props': typeof bgColor === 'string' ? bgColor : undefined,\n '--xy-minimap-mask-background-color-props': typeof maskColor === 'string' ? maskColor : undefined,\n '--xy-minimap-mask-stroke-color-props': typeof maskStrokeColor === 'string' ? maskStrokeColor : undefined,\n '--xy-minimap-mask-stroke-width-props': typeof maskStrokeWidth === 'number' ? maskStrokeWidth * viewScale : undefined,\n '--xy-minimap-node-background-color-props': typeof nodeColor === 'string' ? nodeColor : undefined,\n '--xy-minimap-node-stroke-color-props': typeof nodeStrokeColor === 'string' ? nodeStrokeColor : undefined,\n '--xy-minimap-node-stroke-width-props': typeof nodeStrokeWidth === 'number' ? nodeStrokeWidth : undefined,\n }, className: cc(['react-flow__minimap', className]), \"data-testid\": \"rf__minimap\", children: jsxs(\"svg\", { width: elementWidth, height: elementHeight, viewBox: `${x} ${y} ${width} ${height}`, className: \"react-flow__minimap-svg\", role: \"img\", \"aria-labelledby\": labelledBy, ref: svg, onClick: onSvgClick, children: [_ariaLabel && jsx(\"title\", { id: labelledBy, children: _ariaLabel }), jsx(MiniMapNodes$1, { onClick: onSvgNodeClick, nodeColor: nodeColor, nodeStrokeColor: nodeStrokeColor, nodeBorderRadius: nodeBorderRadius, nodeClassName: nodeClassName, nodeStrokeWidth: nodeStrokeWidth, nodeComponent: nodeComponent }), jsx(\"path\", { className: \"react-flow__minimap-mask\", d: `M${x - offset},${y - offset}h${width + offset * 2}v${height + offset * 2}h${-width - offset * 2}z\n M${viewBB.x},${viewBB.y}h${viewBB.width}v${viewBB.height}h${-viewBB.width}z`, fillRule: \"evenodd\", pointerEvents: \"none\" })] }) }));\n}\nMiniMapComponent.displayName = 'MiniMap';\n/**\n * The `` component can be used to render an overview of your flow. It\n * renders each node as an SVG element and visualizes where the current viewport is\n * in relation to the rest of the flow.\n *\n * @public\n * @example\n *\n * ```jsx\n *import { ReactFlow, MiniMap } from '@xyflow/react';\n *\n *export default function Flow() {\n * return (\n * \n * \n * \n * );\n *}\n *```\n */\nconst MiniMap = memo(MiniMapComponent);\n\nconst scaleSelector = (calculateScale) => (store) => calculateScale ? `${Math.max(1 / store.transform[2], 1)}` : undefined;\nconst defaultPositions = {\n [ResizeControlVariant.Line]: 'right',\n [ResizeControlVariant.Handle]: 'bottom-right',\n};\nfunction ResizeControl({ nodeId, position, variant = ResizeControlVariant.Handle, className, style = undefined, children, color, minWidth = 10, minHeight = 10, maxWidth = Number.MAX_VALUE, maxHeight = Number.MAX_VALUE, keepAspectRatio = false, resizeDirection, autoScale = true, shouldResize, onResizeStart, onResize, onResizeEnd, }) {\n const contextNodeId = useNodeId();\n const id = typeof nodeId === 'string' ? nodeId : contextNodeId;\n const store = useStoreApi();\n const resizeControlRef = useRef(null);\n const isHandleControl = variant === ResizeControlVariant.Handle;\n const scale = useStore(useCallback(scaleSelector(isHandleControl && autoScale), [isHandleControl, autoScale]), shallow);\n const resizer = useRef(null);\n const controlPosition = position ?? defaultPositions[variant];\n useEffect(() => {\n if (!resizeControlRef.current || !id) {\n return;\n }\n if (!resizer.current) {\n resizer.current = XYResizer({\n domNode: resizeControlRef.current,\n nodeId: id,\n getStoreItems: () => {\n const { nodeLookup, transform, snapGrid, snapToGrid, nodeOrigin, domNode } = store.getState();\n return {\n nodeLookup,\n transform,\n snapGrid,\n snapToGrid,\n nodeOrigin,\n paneDomNode: domNode,\n };\n },\n onChange: (change, childChanges) => {\n const { triggerNodeChanges, nodeLookup, parentLookup, nodeOrigin } = store.getState();\n const changes = [];\n const nextPosition = { x: change.x, y: change.y };\n const node = nodeLookup.get(id);\n if (node && node.expandParent && node.parentId) {\n const origin = node.origin ?? nodeOrigin;\n const width = change.width ?? node.measured.width ?? 0;\n const height = change.height ?? node.measured.height ?? 0;\n const child = {\n id: node.id,\n parentId: node.parentId,\n rect: {\n width,\n height,\n ...evaluateAbsolutePosition({\n x: change.x ?? node.position.x,\n y: change.y ?? node.position.y,\n }, { width, height }, node.parentId, nodeLookup, origin),\n },\n };\n const parentExpandChanges = handleExpandParent([child], nodeLookup, parentLookup, nodeOrigin);\n changes.push(...parentExpandChanges);\n /*\n * when the parent was expanded by the child node, its position will be clamped at\n * 0,0 when node origin is 0,0 and to width, height if it's 1,1\n */\n nextPosition.x = change.x ? Math.max(origin[0] * width, change.x) : undefined;\n nextPosition.y = change.y ? Math.max(origin[1] * height, change.y) : undefined;\n }\n if (nextPosition.x !== undefined && nextPosition.y !== undefined) {\n const positionChange = {\n id,\n type: 'position',\n position: { ...nextPosition },\n };\n changes.push(positionChange);\n }\n if (change.width !== undefined && change.height !== undefined) {\n const setAttributes = !resizeDirection ? true : resizeDirection === 'horizontal' ? 'width' : 'height';\n const dimensionChange = {\n id,\n type: 'dimensions',\n resizing: true,\n setAttributes,\n dimensions: {\n width: change.width,\n height: change.height,\n },\n };\n changes.push(dimensionChange);\n }\n for (const childChange of childChanges) {\n const positionChange = {\n ...childChange,\n type: 'position',\n };\n changes.push(positionChange);\n }\n triggerNodeChanges(changes);\n },\n onEnd: ({ width, height }) => {\n const dimensionChange = {\n id: id,\n type: 'dimensions',\n resizing: false,\n dimensions: {\n width,\n height,\n },\n };\n store.getState().triggerNodeChanges([dimensionChange]);\n },\n });\n }\n resizer.current.update({\n controlPosition,\n boundaries: {\n minWidth,\n minHeight,\n maxWidth,\n maxHeight,\n },\n keepAspectRatio,\n resizeDirection,\n onResizeStart,\n onResize,\n onResizeEnd,\n shouldResize,\n });\n return () => {\n resizer.current?.destroy();\n };\n }, [\n controlPosition,\n minWidth,\n minHeight,\n maxWidth,\n maxHeight,\n keepAspectRatio,\n onResizeStart,\n onResize,\n onResizeEnd,\n shouldResize,\n ]);\n const positionClassNames = controlPosition.split('-');\n return (jsx(\"div\", { className: cc(['react-flow__resize-control', 'nodrag', ...positionClassNames, variant, className]), ref: resizeControlRef, style: {\n ...style,\n scale,\n ...(color && { [isHandleControl ? 'backgroundColor' : 'borderColor']: color }),\n }, children: children }));\n}\n/**\n * To create your own resizing UI, you can use the `NodeResizeControl` component where you can pass children (such as icons).\n * @public\n *\n */\nconst NodeResizeControl = memo(ResizeControl);\n\n/**\n * The `` component can be used to add a resize functionality to your\n * nodes. It renders draggable controls around the node to resize in all directions.\n * @public\n *\n * @example\n *```jsx\n *import { memo } from 'react';\n *import { Handle, Position, NodeResizer } from '@xyflow/react';\n *\n *function ResizableNode({ data }) {\n * return (\n * <>\n * \n * \n *
{data.label}
\n * \n * \n * );\n *};\n *\n *export default memo(ResizableNode);\n *```\n */\nfunction NodeResizer({ nodeId, isVisible = true, handleClassName, handleStyle, lineClassName, lineStyle, color, minWidth = 10, minHeight = 10, maxWidth = Number.MAX_VALUE, maxHeight = Number.MAX_VALUE, keepAspectRatio = false, autoScale = true, shouldResize, onResizeStart, onResize, onResizeEnd, }) {\n if (!isVisible) {\n return null;\n }\n return (jsxs(Fragment, { children: [XY_RESIZER_LINE_POSITIONS.map((position) => (jsx(NodeResizeControl, { className: lineClassName, style: lineStyle, nodeId: nodeId, position: position, variant: ResizeControlVariant.Line, color: color, minWidth: minWidth, minHeight: minHeight, maxWidth: maxWidth, maxHeight: maxHeight, onResizeStart: onResizeStart, keepAspectRatio: keepAspectRatio, autoScale: autoScale, shouldResize: shouldResize, onResize: onResize, onResizeEnd: onResizeEnd }, position))), XY_RESIZER_HANDLE_POSITIONS.map((position) => (jsx(NodeResizeControl, { className: handleClassName, style: handleStyle, nodeId: nodeId, position: position, color: color, minWidth: minWidth, minHeight: minHeight, maxWidth: maxWidth, maxHeight: maxHeight, onResizeStart: onResizeStart, keepAspectRatio: keepAspectRatio, autoScale: autoScale, shouldResize: shouldResize, onResize: onResize, onResizeEnd: onResizeEnd }, position)))] }));\n}\n\nconst selector = (state) => state.domNode?.querySelector('.react-flow__renderer');\nfunction NodeToolbarPortal({ children }) {\n const wrapperRef = useStore(selector);\n if (!wrapperRef) {\n return null;\n }\n return createPortal(children, wrapperRef);\n}\n\nconst nodeEqualityFn = (a, b) => a?.internals.positionAbsolute.x !== b?.internals.positionAbsolute.x ||\n a?.internals.positionAbsolute.y !== b?.internals.positionAbsolute.y ||\n a?.measured.width !== b?.measured.width ||\n a?.measured.height !== b?.measured.height ||\n a?.selected !== b?.selected ||\n a?.internals.z !== b?.internals.z;\nconst nodesEqualityFn = (a, b) => {\n if (a.size !== b.size) {\n return false;\n }\n for (const [key, node] of a) {\n if (nodeEqualityFn(node, b.get(key))) {\n return false;\n }\n }\n return true;\n};\nconst storeSelector = (state) => ({\n x: state.transform[0],\n y: state.transform[1],\n zoom: state.transform[2],\n selectedNodesCount: state.nodes.filter((node) => node.selected).length,\n});\n/**\n * This component can render a toolbar or tooltip to one side of a custom node. This\n * toolbar doesn't scale with the viewport so that the content is always visible.\n *\n * @public\n * @example\n * ```jsx\n *import { memo } from 'react';\n *import { Handle, Position, NodeToolbar } from '@xyflow/react';\n *\n *function CustomNode({ data }) {\n * return (\n * <>\n * \n * \n * \n * \n * \n *\n *
\n * {data.label}\n *
\n *\n * \n * \n * \n * );\n *};\n *\n *export default memo(CustomNode);\n *```\n * @remarks By default, the toolbar is only visible when a node is selected. If multiple\n * nodes are selected it will not be visible to prevent overlapping toolbars or\n * clutter. You can override this behavior by setting the `isVisible` prop to `true`.\n */\nfunction NodeToolbar({ nodeId, children, className, style, isVisible, position = Position.Top, offset = 10, align = 'center', ...rest }) {\n const contextNodeId = useNodeId();\n const nodesSelector = useCallback((state) => {\n const nodeIds = Array.isArray(nodeId) ? nodeId : [nodeId || contextNodeId || ''];\n const internalNodes = nodeIds.reduce((res, id) => {\n const node = state.nodeLookup.get(id);\n if (node) {\n res.set(node.id, node);\n }\n return res;\n }, new Map());\n return internalNodes;\n }, [nodeId, contextNodeId]);\n const nodes = useStore(nodesSelector, nodesEqualityFn);\n const { x, y, zoom, selectedNodesCount } = useStore(storeSelector, shallow);\n // if isVisible is not set, we show the toolbar only if its node is selected and no other node is selected\n const isActive = typeof isVisible === 'boolean'\n ? isVisible\n : nodes.size === 1 && nodes.values().next().value?.selected && selectedNodesCount === 1;\n if (!isActive || !nodes.size) {\n return null;\n }\n const nodeRect = getInternalNodesBounds(nodes);\n const nodesArray = Array.from(nodes.values());\n const zIndex = Math.max(...nodesArray.map((node) => node.internals.z + 1));\n const wrapperStyle = {\n position: 'absolute',\n transform: getNodeToolbarTransform(nodeRect, { x, y, zoom }, position, offset, align),\n zIndex,\n ...style,\n };\n return (jsx(NodeToolbarPortal, { children: jsx(\"div\", { style: wrapperStyle, className: cc(['react-flow__node-toolbar', className]), ...rest, \"data-id\": nodesArray.reduce((acc, node) => `${acc}${node.id} `, '').trim(), children: children }) }));\n}\n\nconst zoomSelector = (state) => state.transform[2];\n/**\n * This component can render a toolbar or tooltip to one side of a custom edge. This\n * toolbar doesn't scale with the viewport so that the content stays the same size.\n *\n * @public\n * @example\n * ```jsx\n * import { EdgeToolbar, BaseEdge, getBezierPath, type EdgeProps } from \"@xyflow/react\";\n *\n * export function CustomEdge({ id, data, ...props }: EdgeProps) {\n * const [edgePath, centerX, centerY] = getBezierPath(props);\n *\n * return (\n * <>\n * \n * \n * \n * \n * \n * );\n * }\n * ```\n */\nfunction EdgeToolbar({ edgeId, x, y, children, className, style, isVisible, alignX = 'center', alignY = 'center', ...rest }) {\n const edgeSelector = useCallback((state) => state.edgeLookup.get(edgeId), [edgeId]);\n const edge = useStore(edgeSelector, shallow);\n const isActive = typeof isVisible === 'boolean' ? isVisible : edge?.selected;\n const zoom = useStore(zoomSelector);\n if (!isActive) {\n return null;\n }\n const zIndex = (edge?.zIndex ?? 0) + 1;\n const transform = getEdgeToolbarTransform(x, y, zoom, alignX, alignY);\n return (jsx(EdgeLabelRenderer, { children: jsx(\"div\", { style: {\n position: 'absolute',\n transform,\n zIndex,\n pointerEvents: 'all',\n transformOrigin: '0 0',\n ...style,\n }, className: cc(['react-flow__edge-toolbar', className]), \"data-id\": edge?.id ?? '', ...rest, children: children }) }));\n}\n\nexport { Background, BackgroundVariant, BaseEdge, BezierEdge, ControlButton, Controls, EdgeLabelRenderer, EdgeText, EdgeToolbar, Handle, MiniMap, MiniMapNode, NodeResizeControl, NodeResizer, NodeToolbar, Panel, index as ReactFlow, ReactFlowProvider, SimpleBezierEdge, SmoothStepEdge, StepEdge, StraightEdge, ViewportPortal, applyEdgeChanges, applyNodeChanges, experimental_useOnEdgesChangeMiddleware, experimental_useOnNodesChangeMiddleware, getSimpleBezierPath, isEdge, isNode, useConnection, useEdges, useEdgesState, useHandleConnections, useInternalNode, useKeyPress, useNodeConnections, useNodeId, useNodes, useNodesData, useNodesInitialized, useNodesState, useOnSelectionChange, useOnViewportChange, useReactFlow, useStore, useStoreApi, useUpdateNodeInternals, useViewport };\n", "export default function cc(names) {\n if (typeof names === \"string\" || typeof names === \"number\") return \"\" + names\n\n let out = \"\"\n\n if (Array.isArray(names)) {\n for (let i = 0, tmp; i < names.length; i++) {\n if ((tmp = cc(names[i])) !== \"\") {\n out += (out && \" \") + tmp\n }\n }\n } else {\n for (let k in names) {\n if (names[k]) out += (out && \" \") + k\n }\n }\n\n return out\n}\n", "var noop = {value: () => {}};\n\nfunction dispatch() {\n for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) {\n if (!(t = arguments[i] + \"\") || (t in _) || /[\\s.]/.test(t)) throw new Error(\"illegal type: \" + t);\n _[t] = [];\n }\n return new Dispatch(_);\n}\n\nfunction Dispatch(_) {\n this._ = _;\n}\n\nfunction parseTypenames(typenames, types) {\n return typenames.trim().split(/^|\\s+/).map(function(t) {\n var name = \"\", i = t.indexOf(\".\");\n if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);\n if (t && !types.hasOwnProperty(t)) throw new Error(\"unknown type: \" + t);\n return {type: t, name: name};\n });\n}\n\nDispatch.prototype = dispatch.prototype = {\n constructor: Dispatch,\n on: function(typename, callback) {\n var _ = this._,\n T = parseTypenames(typename + \"\", _),\n t,\n i = -1,\n n = T.length;\n\n // If no callback was specified, return the callback of the given type and name.\n if (arguments.length < 2) {\n while (++i < n) if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t;\n return;\n }\n\n // If a type was specified, set the callback for the given type and name.\n // Otherwise, if a null callback was specified, remove callbacks of the given name.\n if (callback != null && typeof callback !== \"function\") throw new Error(\"invalid callback: \" + callback);\n while (++i < n) {\n if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback);\n else if (callback == null) for (t in _) _[t] = set(_[t], typename.name, null);\n }\n\n return this;\n },\n copy: function() {\n var copy = {}, _ = this._;\n for (var t in _) copy[t] = _[t].slice();\n return new Dispatch(copy);\n },\n call: function(type, that) {\n if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2];\n if (!this._.hasOwnProperty(type)) throw new Error(\"unknown type: \" + type);\n for (t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\n },\n apply: function(type, that, args) {\n if (!this._.hasOwnProperty(type)) throw new Error(\"unknown type: \" + type);\n for (var t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\n }\n};\n\nfunction get(type, name) {\n for (var i = 0, n = type.length, c; i < n; ++i) {\n if ((c = type[i]).name === name) {\n return c.value;\n }\n }\n}\n\nfunction set(type, name, callback) {\n for (var i = 0, n = type.length; i < n; ++i) {\n if (type[i].name === name) {\n type[i] = noop, type = type.slice(0, i).concat(type.slice(i + 1));\n break;\n }\n }\n if (callback != null) type.push({name: name, value: callback});\n return type;\n}\n\nexport default dispatch;\n", "export var xhtml = \"http://www.w3.org/1999/xhtml\";\n\nexport default {\n svg: \"http://www.w3.org/2000/svg\",\n xhtml: xhtml,\n xlink: \"http://www.w3.org/1999/xlink\",\n xml: \"http://www.w3.org/XML/1998/namespace\",\n xmlns: \"http://www.w3.org/2000/xmlns/\"\n};\n", "import namespaces from \"./namespaces.js\";\n\nexport default function(name) {\n var prefix = name += \"\", i = prefix.indexOf(\":\");\n if (i >= 0 && (prefix = name.slice(0, i)) !== \"xmlns\") name = name.slice(i + 1);\n return namespaces.hasOwnProperty(prefix) ? {space: namespaces[prefix], local: name} : name; // eslint-disable-line no-prototype-builtins\n}\n", "import namespace from \"./namespace.js\";\nimport {xhtml} from \"./namespaces.js\";\n\nfunction creatorInherit(name) {\n return function() {\n var document = this.ownerDocument,\n uri = this.namespaceURI;\n return uri === xhtml && document.documentElement.namespaceURI === xhtml\n ? document.createElement(name)\n : document.createElementNS(uri, name);\n };\n}\n\nfunction creatorFixed(fullname) {\n return function() {\n return this.ownerDocument.createElementNS(fullname.space, fullname.local);\n };\n}\n\nexport default function(name) {\n var fullname = namespace(name);\n return (fullname.local\n ? creatorFixed\n : creatorInherit)(fullname);\n}\n", "function none() {}\n\nexport default function(selector) {\n return selector == null ? none : function() {\n return this.querySelector(selector);\n };\n}\n", "import {Selection} from \"./index.js\";\nimport selector from \"../selector.js\";\n\nexport default function(select) {\n if (typeof select !== \"function\") select = selector(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {\n if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {\n if (\"__data__\" in node) subnode.__data__ = node.__data__;\n subgroup[i] = subnode;\n }\n }\n }\n\n return new Selection(subgroups, this._parents);\n}\n", "// Given something array like (or null), returns something that is strictly an\n// array. This is used to ensure that array-like objects passed to d3.selectAll\n// or selection.selectAll are converted into proper arrays when creating a\n// selection; we don’t ever want to create a selection backed by a live\n// HTMLCollection or NodeList. However, note that selection.selectAll will use a\n// static NodeList as a group, since it safely derived from querySelectorAll.\nexport default function array(x) {\n return x == null ? [] : Array.isArray(x) ? x : Array.from(x);\n}\n", "function empty() {\n return [];\n}\n\nexport default function(selector) {\n return selector == null ? empty : function() {\n return this.querySelectorAll(selector);\n };\n}\n", "import {Selection} from \"./index.js\";\nimport array from \"../array.js\";\nimport selectorAll from \"../selectorAll.js\";\n\nfunction arrayAll(select) {\n return function() {\n return array(select.apply(this, arguments));\n };\n}\n\nexport default function(select) {\n if (typeof select === \"function\") select = arrayAll(select);\n else select = selectorAll(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n subgroups.push(select.call(node, node.__data__, i, group));\n parents.push(node);\n }\n }\n }\n\n return new Selection(subgroups, parents);\n}\n", "export default function(selector) {\n return function() {\n return this.matches(selector);\n };\n}\n\nexport function childMatcher(selector) {\n return function(node) {\n return node.matches(selector);\n };\n}\n\n", "import {childMatcher} from \"../matcher.js\";\n\nvar find = Array.prototype.find;\n\nfunction childFind(match) {\n return function() {\n return find.call(this.children, match);\n };\n}\n\nfunction childFirst() {\n return this.firstElementChild;\n}\n\nexport default function(match) {\n return this.select(match == null ? childFirst\n : childFind(typeof match === \"function\" ? match : childMatcher(match)));\n}\n", "import {childMatcher} from \"../matcher.js\";\n\nvar filter = Array.prototype.filter;\n\nfunction children() {\n return Array.from(this.children);\n}\n\nfunction childrenFilter(match) {\n return function() {\n return filter.call(this.children, match);\n };\n}\n\nexport default function(match) {\n return this.selectAll(match == null ? children\n : childrenFilter(typeof match === \"function\" ? match : childMatcher(match)));\n}\n", "import {Selection} from \"./index.js\";\nimport matcher from \"../matcher.js\";\n\nexport default function(match) {\n if (typeof match !== \"function\") match = matcher(match);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {\n if ((node = group[i]) && match.call(node, node.__data__, i, group)) {\n subgroup.push(node);\n }\n }\n }\n\n return new Selection(subgroups, this._parents);\n}\n", "export default function(update) {\n return new Array(update.length);\n}\n", "import sparse from \"./sparse.js\";\nimport {Selection} from \"./index.js\";\n\nexport default function() {\n return new Selection(this._enter || this._groups.map(sparse), this._parents);\n}\n\nexport function EnterNode(parent, datum) {\n this.ownerDocument = parent.ownerDocument;\n this.namespaceURI = parent.namespaceURI;\n this._next = null;\n this._parent = parent;\n this.__data__ = datum;\n}\n\nEnterNode.prototype = {\n constructor: EnterNode,\n appendChild: function(child) { return this._parent.insertBefore(child, this._next); },\n insertBefore: function(child, next) { return this._parent.insertBefore(child, next); },\n querySelector: function(selector) { return this._parent.querySelector(selector); },\n querySelectorAll: function(selector) { return this._parent.querySelectorAll(selector); }\n};\n", "export default function(x) {\n return function() {\n return x;\n };\n}\n", "import {Selection} from \"./index.js\";\nimport {EnterNode} from \"./enter.js\";\nimport constant from \"../constant.js\";\n\nfunction bindIndex(parent, group, enter, update, exit, data) {\n var i = 0,\n node,\n groupLength = group.length,\n dataLength = data.length;\n\n // Put any non-null nodes that fit into update.\n // Put any null nodes into enter.\n // Put any remaining data into enter.\n for (; i < dataLength; ++i) {\n if (node = group[i]) {\n node.__data__ = data[i];\n update[i] = node;\n } else {\n enter[i] = new EnterNode(parent, data[i]);\n }\n }\n\n // Put any non-null nodes that don’t fit into exit.\n for (; i < groupLength; ++i) {\n if (node = group[i]) {\n exit[i] = node;\n }\n }\n}\n\nfunction bindKey(parent, group, enter, update, exit, data, key) {\n var i,\n node,\n nodeByKeyValue = new Map,\n groupLength = group.length,\n dataLength = data.length,\n keyValues = new Array(groupLength),\n keyValue;\n\n // Compute the key for each node.\n // If multiple nodes have the same key, the duplicates are added to exit.\n for (i = 0; i < groupLength; ++i) {\n if (node = group[i]) {\n keyValues[i] = keyValue = key.call(node, node.__data__, i, group) + \"\";\n if (nodeByKeyValue.has(keyValue)) {\n exit[i] = node;\n } else {\n nodeByKeyValue.set(keyValue, node);\n }\n }\n }\n\n // Compute the key for each datum.\n // If there a node associated with this key, join and add it to update.\n // If there is not (or the key is a duplicate), add it to enter.\n for (i = 0; i < dataLength; ++i) {\n keyValue = key.call(parent, data[i], i, data) + \"\";\n if (node = nodeByKeyValue.get(keyValue)) {\n update[i] = node;\n node.__data__ = data[i];\n nodeByKeyValue.delete(keyValue);\n } else {\n enter[i] = new EnterNode(parent, data[i]);\n }\n }\n\n // Add any remaining nodes that were not bound to data to exit.\n for (i = 0; i < groupLength; ++i) {\n if ((node = group[i]) && (nodeByKeyValue.get(keyValues[i]) === node)) {\n exit[i] = node;\n }\n }\n}\n\nfunction datum(node) {\n return node.__data__;\n}\n\nexport default function(value, key) {\n if (!arguments.length) return Array.from(this, datum);\n\n var bind = key ? bindKey : bindIndex,\n parents = this._parents,\n groups = this._groups;\n\n if (typeof value !== \"function\") value = constant(value);\n\n for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) {\n var parent = parents[j],\n group = groups[j],\n groupLength = group.length,\n data = arraylike(value.call(parent, parent && parent.__data__, j, parents)),\n dataLength = data.length,\n enterGroup = enter[j] = new Array(dataLength),\n updateGroup = update[j] = new Array(dataLength),\n exitGroup = exit[j] = new Array(groupLength);\n\n bind(parent, group, enterGroup, updateGroup, exitGroup, data, key);\n\n // Now connect the enter nodes to their following update node, such that\n // appendChild can insert the materialized enter node before this node,\n // rather than at the end of the parent node.\n for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) {\n if (previous = enterGroup[i0]) {\n if (i0 >= i1) i1 = i0 + 1;\n while (!(next = updateGroup[i1]) && ++i1 < dataLength);\n previous._next = next || null;\n }\n }\n }\n\n update = new Selection(update, parents);\n update._enter = enter;\n update._exit = exit;\n return update;\n}\n\n// Given some data, this returns an array-like view of it: an object that\n// exposes a length property and allows numeric indexing. Note that unlike\n// selectAll, this isn’t worried about “live” collections because the resulting\n// array will only be used briefly while data is being bound. (It is possible to\n// cause the data to change while iterating by using a key function, but please\n// don’t; we’d rather avoid a gratuitous copy.)\nfunction arraylike(data) {\n return typeof data === \"object\" && \"length\" in data\n ? data // Array, TypedArray, NodeList, array-like\n : Array.from(data); // Map, Set, iterable, string, or anything else\n}\n", "import sparse from \"./sparse.js\";\nimport {Selection} from \"./index.js\";\n\nexport default function() {\n return new Selection(this._exit || this._groups.map(sparse), this._parents);\n}\n", "export default function(onenter, onupdate, onexit) {\n var enter = this.enter(), update = this, exit = this.exit();\n if (typeof onenter === \"function\") {\n enter = onenter(enter);\n if (enter) enter = enter.selection();\n } else {\n enter = enter.append(onenter + \"\");\n }\n if (onupdate != null) {\n update = onupdate(update);\n if (update) update = update.selection();\n }\n if (onexit == null) exit.remove(); else onexit(exit);\n return enter && update ? enter.merge(update).order() : update;\n}\n", "import {Selection} from \"./index.js\";\n\nexport default function(context) {\n var selection = context.selection ? context.selection() : context;\n\n for (var groups0 = this._groups, groups1 = selection._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {\n for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {\n if (node = group0[i] || group1[i]) {\n merge[i] = node;\n }\n }\n }\n\n for (; j < m0; ++j) {\n merges[j] = groups0[j];\n }\n\n return new Selection(merges, this._parents);\n}\n", "export default function() {\n\n for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) {\n for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) {\n if (node = group[i]) {\n if (next && node.compareDocumentPosition(next) ^ 4) next.parentNode.insertBefore(node, next);\n next = node;\n }\n }\n }\n\n return this;\n}\n", "import {Selection} from \"./index.js\";\n\nexport default function(compare) {\n if (!compare) compare = ascending;\n\n function compareNode(a, b) {\n return a && b ? compare(a.__data__, b.__data__) : !a - !b;\n }\n\n for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n sortgroup[i] = node;\n }\n }\n sortgroup.sort(compareNode);\n }\n\n return new Selection(sortgroups, this._parents).order();\n}\n\nfunction ascending(a, b) {\n return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n}\n", "export default function() {\n var callback = arguments[0];\n arguments[0] = this;\n callback.apply(null, arguments);\n return this;\n}\n", "export default function() {\n return Array.from(this);\n}\n", "export default function() {\n\n for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n for (var group = groups[j], i = 0, n = group.length; i < n; ++i) {\n var node = group[i];\n if (node) return node;\n }\n }\n\n return null;\n}\n", "export default function() {\n let size = 0;\n for (const node of this) ++size; // eslint-disable-line no-unused-vars\n return size;\n}\n", "export default function() {\n return !this.node();\n}\n", "export default function(callback) {\n\n for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {\n if (node = group[i]) callback.call(node, node.__data__, i, group);\n }\n }\n\n return this;\n}\n", "import namespace from \"../namespace.js\";\n\nfunction attrRemove(name) {\n return function() {\n this.removeAttribute(name);\n };\n}\n\nfunction attrRemoveNS(fullname) {\n return function() {\n this.removeAttributeNS(fullname.space, fullname.local);\n };\n}\n\nfunction attrConstant(name, value) {\n return function() {\n this.setAttribute(name, value);\n };\n}\n\nfunction attrConstantNS(fullname, value) {\n return function() {\n this.setAttributeNS(fullname.space, fullname.local, value);\n };\n}\n\nfunction attrFunction(name, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.removeAttribute(name);\n else this.setAttribute(name, v);\n };\n}\n\nfunction attrFunctionNS(fullname, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.removeAttributeNS(fullname.space, fullname.local);\n else this.setAttributeNS(fullname.space, fullname.local, v);\n };\n}\n\nexport default function(name, value) {\n var fullname = namespace(name);\n\n if (arguments.length < 2) {\n var node = this.node();\n return fullname.local\n ? node.getAttributeNS(fullname.space, fullname.local)\n : node.getAttribute(fullname);\n }\n\n return this.each((value == null\n ? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === \"function\"\n ? (fullname.local ? attrFunctionNS : attrFunction)\n : (fullname.local ? attrConstantNS : attrConstant)))(fullname, value));\n}\n", "export default function(node) {\n return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node\n || (node.document && node) // node is a Window\n || node.defaultView; // node is a Document\n}\n", "import defaultView from \"../window.js\";\n\nfunction styleRemove(name) {\n return function() {\n this.style.removeProperty(name);\n };\n}\n\nfunction styleConstant(name, value, priority) {\n return function() {\n this.style.setProperty(name, value, priority);\n };\n}\n\nfunction styleFunction(name, value, priority) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.style.removeProperty(name);\n else this.style.setProperty(name, v, priority);\n };\n}\n\nexport default function(name, value, priority) {\n return arguments.length > 1\n ? this.each((value == null\n ? styleRemove : typeof value === \"function\"\n ? styleFunction\n : styleConstant)(name, value, priority == null ? \"\" : priority))\n : styleValue(this.node(), name);\n}\n\nexport function styleValue(node, name) {\n return node.style.getPropertyValue(name)\n || defaultView(node).getComputedStyle(node, null).getPropertyValue(name);\n}\n", "function propertyRemove(name) {\n return function() {\n delete this[name];\n };\n}\n\nfunction propertyConstant(name, value) {\n return function() {\n this[name] = value;\n };\n}\n\nfunction propertyFunction(name, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) delete this[name];\n else this[name] = v;\n };\n}\n\nexport default function(name, value) {\n return arguments.length > 1\n ? this.each((value == null\n ? propertyRemove : typeof value === \"function\"\n ? propertyFunction\n : propertyConstant)(name, value))\n : this.node()[name];\n}\n", "function classArray(string) {\n return string.trim().split(/^|\\s+/);\n}\n\nfunction classList(node) {\n return node.classList || new ClassList(node);\n}\n\nfunction ClassList(node) {\n this._node = node;\n this._names = classArray(node.getAttribute(\"class\") || \"\");\n}\n\nClassList.prototype = {\n add: function(name) {\n var i = this._names.indexOf(name);\n if (i < 0) {\n this._names.push(name);\n this._node.setAttribute(\"class\", this._names.join(\" \"));\n }\n },\n remove: function(name) {\n var i = this._names.indexOf(name);\n if (i >= 0) {\n this._names.splice(i, 1);\n this._node.setAttribute(\"class\", this._names.join(\" \"));\n }\n },\n contains: function(name) {\n return this._names.indexOf(name) >= 0;\n }\n};\n\nfunction classedAdd(node, names) {\n var list = classList(node), i = -1, n = names.length;\n while (++i < n) list.add(names[i]);\n}\n\nfunction classedRemove(node, names) {\n var list = classList(node), i = -1, n = names.length;\n while (++i < n) list.remove(names[i]);\n}\n\nfunction classedTrue(names) {\n return function() {\n classedAdd(this, names);\n };\n}\n\nfunction classedFalse(names) {\n return function() {\n classedRemove(this, names);\n };\n}\n\nfunction classedFunction(names, value) {\n return function() {\n (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names);\n };\n}\n\nexport default function(name, value) {\n var names = classArray(name + \"\");\n\n if (arguments.length < 2) {\n var list = classList(this.node()), i = -1, n = names.length;\n while (++i < n) if (!list.contains(names[i])) return false;\n return true;\n }\n\n return this.each((typeof value === \"function\"\n ? classedFunction : value\n ? classedTrue\n : classedFalse)(names, value));\n}\n", "function textRemove() {\n this.textContent = \"\";\n}\n\nfunction textConstant(value) {\n return function() {\n this.textContent = value;\n };\n}\n\nfunction textFunction(value) {\n return function() {\n var v = value.apply(this, arguments);\n this.textContent = v == null ? \"\" : v;\n };\n}\n\nexport default function(value) {\n return arguments.length\n ? this.each(value == null\n ? textRemove : (typeof value === \"function\"\n ? textFunction\n : textConstant)(value))\n : this.node().textContent;\n}\n", "function htmlRemove() {\n this.innerHTML = \"\";\n}\n\nfunction htmlConstant(value) {\n return function() {\n this.innerHTML = value;\n };\n}\n\nfunction htmlFunction(value) {\n return function() {\n var v = value.apply(this, arguments);\n this.innerHTML = v == null ? \"\" : v;\n };\n}\n\nexport default function(value) {\n return arguments.length\n ? this.each(value == null\n ? htmlRemove : (typeof value === \"function\"\n ? htmlFunction\n : htmlConstant)(value))\n : this.node().innerHTML;\n}\n", "function raise() {\n if (this.nextSibling) this.parentNode.appendChild(this);\n}\n\nexport default function() {\n return this.each(raise);\n}\n", "function lower() {\n if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild);\n}\n\nexport default function() {\n return this.each(lower);\n}\n", "import creator from \"../creator.js\";\n\nexport default function(name) {\n var create = typeof name === \"function\" ? name : creator(name);\n return this.select(function() {\n return this.appendChild(create.apply(this, arguments));\n });\n}\n", "import creator from \"../creator.js\";\nimport selector from \"../selector.js\";\n\nfunction constantNull() {\n return null;\n}\n\nexport default function(name, before) {\n var create = typeof name === \"function\" ? name : creator(name),\n select = before == null ? constantNull : typeof before === \"function\" ? before : selector(before);\n return this.select(function() {\n return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null);\n });\n}\n", "function remove() {\n var parent = this.parentNode;\n if (parent) parent.removeChild(this);\n}\n\nexport default function() {\n return this.each(remove);\n}\n", "function selection_cloneShallow() {\n var clone = this.cloneNode(false), parent = this.parentNode;\n return parent ? parent.insertBefore(clone, this.nextSibling) : clone;\n}\n\nfunction selection_cloneDeep() {\n var clone = this.cloneNode(true), parent = this.parentNode;\n return parent ? parent.insertBefore(clone, this.nextSibling) : clone;\n}\n\nexport default function(deep) {\n return this.select(deep ? selection_cloneDeep : selection_cloneShallow);\n}\n", "export default function(value) {\n return arguments.length\n ? this.property(\"__data__\", value)\n : this.node().__data__;\n}\n", "function contextListener(listener) {\n return function(event) {\n listener.call(this, event, this.__data__);\n };\n}\n\nfunction parseTypenames(typenames) {\n return typenames.trim().split(/^|\\s+/).map(function(t) {\n var name = \"\", i = t.indexOf(\".\");\n if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);\n return {type: t, name: name};\n });\n}\n\nfunction onRemove(typename) {\n return function() {\n var on = this.__on;\n if (!on) return;\n for (var j = 0, i = -1, m = on.length, o; j < m; ++j) {\n if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) {\n this.removeEventListener(o.type, o.listener, o.options);\n } else {\n on[++i] = o;\n }\n }\n if (++i) on.length = i;\n else delete this.__on;\n };\n}\n\nfunction onAdd(typename, value, options) {\n return function() {\n var on = this.__on, o, listener = contextListener(value);\n if (on) for (var j = 0, m = on.length; j < m; ++j) {\n if ((o = on[j]).type === typename.type && o.name === typename.name) {\n this.removeEventListener(o.type, o.listener, o.options);\n this.addEventListener(o.type, o.listener = listener, o.options = options);\n o.value = value;\n return;\n }\n }\n this.addEventListener(typename.type, listener, options);\n o = {type: typename.type, name: typename.name, value: value, listener: listener, options: options};\n if (!on) this.__on = [o];\n else on.push(o);\n };\n}\n\nexport default function(typename, value, options) {\n var typenames = parseTypenames(typename + \"\"), i, n = typenames.length, t;\n\n if (arguments.length < 2) {\n var on = this.node().__on;\n if (on) for (var j = 0, m = on.length, o; j < m; ++j) {\n for (i = 0, o = on[j]; i < n; ++i) {\n if ((t = typenames[i]).type === o.type && t.name === o.name) {\n return o.value;\n }\n }\n }\n return;\n }\n\n on = value ? onAdd : onRemove;\n for (i = 0; i < n; ++i) this.each(on(typenames[i], value, options));\n return this;\n}\n", "import defaultView from \"../window.js\";\n\nfunction dispatchEvent(node, type, params) {\n var window = defaultView(node),\n event = window.CustomEvent;\n\n if (typeof event === \"function\") {\n event = new event(type, params);\n } else {\n event = window.document.createEvent(\"Event\");\n if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail;\n else event.initEvent(type, false, false);\n }\n\n node.dispatchEvent(event);\n}\n\nfunction dispatchConstant(type, params) {\n return function() {\n return dispatchEvent(this, type, params);\n };\n}\n\nfunction dispatchFunction(type, params) {\n return function() {\n return dispatchEvent(this, type, params.apply(this, arguments));\n };\n}\n\nexport default function(type, params) {\n return this.each((typeof params === \"function\"\n ? dispatchFunction\n : dispatchConstant)(type, params));\n}\n", "export default function*() {\n for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {\n if (node = group[i]) yield node;\n }\n }\n}\n", "import selection_select from \"./select.js\";\nimport selection_selectAll from \"./selectAll.js\";\nimport selection_selectChild from \"./selectChild.js\";\nimport selection_selectChildren from \"./selectChildren.js\";\nimport selection_filter from \"./filter.js\";\nimport selection_data from \"./data.js\";\nimport selection_enter from \"./enter.js\";\nimport selection_exit from \"./exit.js\";\nimport selection_join from \"./join.js\";\nimport selection_merge from \"./merge.js\";\nimport selection_order from \"./order.js\";\nimport selection_sort from \"./sort.js\";\nimport selection_call from \"./call.js\";\nimport selection_nodes from \"./nodes.js\";\nimport selection_node from \"./node.js\";\nimport selection_size from \"./size.js\";\nimport selection_empty from \"./empty.js\";\nimport selection_each from \"./each.js\";\nimport selection_attr from \"./attr.js\";\nimport selection_style from \"./style.js\";\nimport selection_property from \"./property.js\";\nimport selection_classed from \"./classed.js\";\nimport selection_text from \"./text.js\";\nimport selection_html from \"./html.js\";\nimport selection_raise from \"./raise.js\";\nimport selection_lower from \"./lower.js\";\nimport selection_append from \"./append.js\";\nimport selection_insert from \"./insert.js\";\nimport selection_remove from \"./remove.js\";\nimport selection_clone from \"./clone.js\";\nimport selection_datum from \"./datum.js\";\nimport selection_on from \"./on.js\";\nimport selection_dispatch from \"./dispatch.js\";\nimport selection_iterator from \"./iterator.js\";\n\nexport var root = [null];\n\nexport function Selection(groups, parents) {\n this._groups = groups;\n this._parents = parents;\n}\n\nfunction selection() {\n return new Selection([[document.documentElement]], root);\n}\n\nfunction selection_selection() {\n return this;\n}\n\nSelection.prototype = selection.prototype = {\n constructor: Selection,\n select: selection_select,\n selectAll: selection_selectAll,\n selectChild: selection_selectChild,\n selectChildren: selection_selectChildren,\n filter: selection_filter,\n data: selection_data,\n enter: selection_enter,\n exit: selection_exit,\n join: selection_join,\n merge: selection_merge,\n selection: selection_selection,\n order: selection_order,\n sort: selection_sort,\n call: selection_call,\n nodes: selection_nodes,\n node: selection_node,\n size: selection_size,\n empty: selection_empty,\n each: selection_each,\n attr: selection_attr,\n style: selection_style,\n property: selection_property,\n classed: selection_classed,\n text: selection_text,\n html: selection_html,\n raise: selection_raise,\n lower: selection_lower,\n append: selection_append,\n insert: selection_insert,\n remove: selection_remove,\n clone: selection_clone,\n datum: selection_datum,\n on: selection_on,\n dispatch: selection_dispatch,\n [Symbol.iterator]: selection_iterator\n};\n\nexport default selection;\n", "import {Selection, root} from \"./selection/index.js\";\n\nexport default function(selector) {\n return typeof selector === \"string\"\n ? new Selection([[document.querySelector(selector)]], [document.documentElement])\n : new Selection([[selector]], root);\n}\n", "var nextId = 0;\n\nexport default function local() {\n return new Local;\n}\n\nfunction Local() {\n this._ = \"@\" + (++nextId).toString(36);\n}\n\nLocal.prototype = local.prototype = {\n constructor: Local,\n get: function(node) {\n var id = this._;\n while (!(id in node)) if (!(node = node.parentNode)) return;\n return node[id];\n },\n set: function(node, value) {\n return node[this._] = value;\n },\n remove: function(node) {\n return this._ in node && delete node[this._];\n },\n toString: function() {\n return this._;\n }\n};\n", "export default function(event) {\n let sourceEvent;\n while (sourceEvent = event.sourceEvent) event = sourceEvent;\n return event;\n}\n", "import sourceEvent from \"./sourceEvent.js\";\n\nexport default function(event, node) {\n event = sourceEvent(event);\n if (node === undefined) node = event.currentTarget;\n if (node) {\n var svg = node.ownerSVGElement || node;\n if (svg.createSVGPoint) {\n var point = svg.createSVGPoint();\n point.x = event.clientX, point.y = event.clientY;\n point = point.matrixTransform(node.getScreenCTM().inverse());\n return [point.x, point.y];\n }\n if (node.getBoundingClientRect) {\n var rect = node.getBoundingClientRect();\n return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop];\n }\n }\n return [event.pageX, event.pageY];\n}\n", "// These are typically used in conjunction with noevent to ensure that we can\n// preventDefault on the event.\nexport const nonpassive = {passive: false};\nexport const nonpassivecapture = {capture: true, passive: false};\n\nexport function nopropagation(event) {\n event.stopImmediatePropagation();\n}\n\nexport default function(event) {\n event.preventDefault();\n event.stopImmediatePropagation();\n}\n", "import {select} from \"d3-selection\";\nimport noevent, {nonpassivecapture} from \"./noevent.js\";\n\nexport default function(view) {\n var root = view.document.documentElement,\n selection = select(view).on(\"dragstart.drag\", noevent, nonpassivecapture);\n if (\"onselectstart\" in root) {\n selection.on(\"selectstart.drag\", noevent, nonpassivecapture);\n } else {\n root.__noselect = root.style.MozUserSelect;\n root.style.MozUserSelect = \"none\";\n }\n}\n\nexport function yesdrag(view, noclick) {\n var root = view.document.documentElement,\n selection = select(view).on(\"dragstart.drag\", null);\n if (noclick) {\n selection.on(\"click.drag\", noevent, nonpassivecapture);\n setTimeout(function() { selection.on(\"click.drag\", null); }, 0);\n }\n if (\"onselectstart\" in root) {\n selection.on(\"selectstart.drag\", null);\n } else {\n root.style.MozUserSelect = root.__noselect;\n delete root.__noselect;\n }\n}\n", "export default x => () => x;\n", "export default function DragEvent(type, {\n sourceEvent,\n subject,\n target,\n identifier,\n active,\n x, y, dx, dy,\n dispatch\n}) {\n Object.defineProperties(this, {\n type: {value: type, enumerable: true, configurable: true},\n sourceEvent: {value: sourceEvent, enumerable: true, configurable: true},\n subject: {value: subject, enumerable: true, configurable: true},\n target: {value: target, enumerable: true, configurable: true},\n identifier: {value: identifier, enumerable: true, configurable: true},\n active: {value: active, enumerable: true, configurable: true},\n x: {value: x, enumerable: true, configurable: true},\n y: {value: y, enumerable: true, configurable: true},\n dx: {value: dx, enumerable: true, configurable: true},\n dy: {value: dy, enumerable: true, configurable: true},\n _: {value: dispatch}\n });\n}\n\nDragEvent.prototype.on = function() {\n var value = this._.on.apply(this._, arguments);\n return value === this._ ? this : value;\n};\n", "import {dispatch} from \"d3-dispatch\";\nimport {select, pointer} from \"d3-selection\";\nimport nodrag, {yesdrag} from \"./nodrag.js\";\nimport noevent, {nonpassive, nonpassivecapture, nopropagation} from \"./noevent.js\";\nimport constant from \"./constant.js\";\nimport DragEvent from \"./event.js\";\n\n// Ignore right-click, since that should open the context menu.\nfunction defaultFilter(event) {\n return !event.ctrlKey && !event.button;\n}\n\nfunction defaultContainer() {\n return this.parentNode;\n}\n\nfunction defaultSubject(event, d) {\n return d == null ? {x: event.x, y: event.y} : d;\n}\n\nfunction defaultTouchable() {\n return navigator.maxTouchPoints || (\"ontouchstart\" in this);\n}\n\nexport default function() {\n var filter = defaultFilter,\n container = defaultContainer,\n subject = defaultSubject,\n touchable = defaultTouchable,\n gestures = {},\n listeners = dispatch(\"start\", \"drag\", \"end\"),\n active = 0,\n mousedownx,\n mousedowny,\n mousemoving,\n touchending,\n clickDistance2 = 0;\n\n function drag(selection) {\n selection\n .on(\"mousedown.drag\", mousedowned)\n .filter(touchable)\n .on(\"touchstart.drag\", touchstarted)\n .on(\"touchmove.drag\", touchmoved, nonpassive)\n .on(\"touchend.drag touchcancel.drag\", touchended)\n .style(\"touch-action\", \"none\")\n .style(\"-webkit-tap-highlight-color\", \"rgba(0,0,0,0)\");\n }\n\n function mousedowned(event, d) {\n if (touchending || !filter.call(this, event, d)) return;\n var gesture = beforestart(this, container.call(this, event, d), event, d, \"mouse\");\n if (!gesture) return;\n select(event.view)\n .on(\"mousemove.drag\", mousemoved, nonpassivecapture)\n .on(\"mouseup.drag\", mouseupped, nonpassivecapture);\n nodrag(event.view);\n nopropagation(event);\n mousemoving = false;\n mousedownx = event.clientX;\n mousedowny = event.clientY;\n gesture(\"start\", event);\n }\n\n function mousemoved(event) {\n noevent(event);\n if (!mousemoving) {\n var dx = event.clientX - mousedownx, dy = event.clientY - mousedowny;\n mousemoving = dx * dx + dy * dy > clickDistance2;\n }\n gestures.mouse(\"drag\", event);\n }\n\n function mouseupped(event) {\n select(event.view).on(\"mousemove.drag mouseup.drag\", null);\n yesdrag(event.view, mousemoving);\n noevent(event);\n gestures.mouse(\"end\", event);\n }\n\n function touchstarted(event, d) {\n if (!filter.call(this, event, d)) return;\n var touches = event.changedTouches,\n c = container.call(this, event, d),\n n = touches.length, i, gesture;\n\n for (i = 0; i < n; ++i) {\n if (gesture = beforestart(this, c, event, d, touches[i].identifier, touches[i])) {\n nopropagation(event);\n gesture(\"start\", event, touches[i]);\n }\n }\n }\n\n function touchmoved(event) {\n var touches = event.changedTouches,\n n = touches.length, i, gesture;\n\n for (i = 0; i < n; ++i) {\n if (gesture = gestures[touches[i].identifier]) {\n noevent(event);\n gesture(\"drag\", event, touches[i]);\n }\n }\n }\n\n function touchended(event) {\n var touches = event.changedTouches,\n n = touches.length, i, gesture;\n\n if (touchending) clearTimeout(touchending);\n touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed!\n for (i = 0; i < n; ++i) {\n if (gesture = gestures[touches[i].identifier]) {\n nopropagation(event);\n gesture(\"end\", event, touches[i]);\n }\n }\n }\n\n function beforestart(that, container, event, d, identifier, touch) {\n var dispatch = listeners.copy(),\n p = pointer(touch || event, container), dx, dy,\n s;\n\n if ((s = subject.call(that, new DragEvent(\"beforestart\", {\n sourceEvent: event,\n target: drag,\n identifier,\n active,\n x: p[0],\n y: p[1],\n dx: 0,\n dy: 0,\n dispatch\n }), d)) == null) return;\n\n dx = s.x - p[0] || 0;\n dy = s.y - p[1] || 0;\n\n return function gesture(type, event, touch) {\n var p0 = p, n;\n switch (type) {\n case \"start\": gestures[identifier] = gesture, n = active++; break;\n case \"end\": delete gestures[identifier], --active; // falls through\n case \"drag\": p = pointer(touch || event, container), n = active; break;\n }\n dispatch.call(\n type,\n that,\n new DragEvent(type, {\n sourceEvent: event,\n subject: s,\n target: drag,\n identifier,\n active: n,\n x: p[0] + dx,\n y: p[1] + dy,\n dx: p[0] - p0[0],\n dy: p[1] - p0[1],\n dispatch\n }),\n d\n );\n };\n }\n\n drag.filter = function(_) {\n return arguments.length ? (filter = typeof _ === \"function\" ? _ : constant(!!_), drag) : filter;\n };\n\n drag.container = function(_) {\n return arguments.length ? (container = typeof _ === \"function\" ? _ : constant(_), drag) : container;\n };\n\n drag.subject = function(_) {\n return arguments.length ? (subject = typeof _ === \"function\" ? _ : constant(_), drag) : subject;\n };\n\n drag.touchable = function(_) {\n return arguments.length ? (touchable = typeof _ === \"function\" ? _ : constant(!!_), drag) : touchable;\n };\n\n drag.on = function() {\n var value = listeners.on.apply(listeners, arguments);\n return value === listeners ? drag : value;\n };\n\n drag.clickDistance = function(_) {\n return arguments.length ? (clickDistance2 = (_ = +_) * _, drag) : Math.sqrt(clickDistance2);\n };\n\n return drag;\n}\n", "export default function(constructor, factory, prototype) {\n constructor.prototype = factory.prototype = prototype;\n prototype.constructor = constructor;\n}\n\nexport function extend(parent, definition) {\n var prototype = Object.create(parent.prototype);\n for (var key in definition) prototype[key] = definition[key];\n return prototype;\n}\n", "import define, {extend} from \"./define.js\";\n\nexport function Color() {}\n\nexport var darker = 0.7;\nexport var brighter = 1 / darker;\n\nvar reI = \"\\\\s*([+-]?\\\\d+)\\\\s*\",\n reN = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\",\n reP = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\",\n reHex = /^#([0-9a-f]{3,8})$/,\n reRgbInteger = new RegExp(`^rgb\\\\(${reI},${reI},${reI}\\\\)$`),\n reRgbPercent = new RegExp(`^rgb\\\\(${reP},${reP},${reP}\\\\)$`),\n reRgbaInteger = new RegExp(`^rgba\\\\(${reI},${reI},${reI},${reN}\\\\)$`),\n reRgbaPercent = new RegExp(`^rgba\\\\(${reP},${reP},${reP},${reN}\\\\)$`),\n reHslPercent = new RegExp(`^hsl\\\\(${reN},${reP},${reP}\\\\)$`),\n reHslaPercent = new RegExp(`^hsla\\\\(${reN},${reP},${reP},${reN}\\\\)$`);\n\nvar named = {\n aliceblue: 0xf0f8ff,\n antiquewhite: 0xfaebd7,\n aqua: 0x00ffff,\n aquamarine: 0x7fffd4,\n azure: 0xf0ffff,\n beige: 0xf5f5dc,\n bisque: 0xffe4c4,\n black: 0x000000,\n blanchedalmond: 0xffebcd,\n blue: 0x0000ff,\n blueviolet: 0x8a2be2,\n brown: 0xa52a2a,\n burlywood: 0xdeb887,\n cadetblue: 0x5f9ea0,\n chartreuse: 0x7fff00,\n chocolate: 0xd2691e,\n coral: 0xff7f50,\n cornflowerblue: 0x6495ed,\n cornsilk: 0xfff8dc,\n crimson: 0xdc143c,\n cyan: 0x00ffff,\n darkblue: 0x00008b,\n darkcyan: 0x008b8b,\n darkgoldenrod: 0xb8860b,\n darkgray: 0xa9a9a9,\n darkgreen: 0x006400,\n darkgrey: 0xa9a9a9,\n darkkhaki: 0xbdb76b,\n darkmagenta: 0x8b008b,\n darkolivegreen: 0x556b2f,\n darkorange: 0xff8c00,\n darkorchid: 0x9932cc,\n darkred: 0x8b0000,\n darksalmon: 0xe9967a,\n darkseagreen: 0x8fbc8f,\n darkslateblue: 0x483d8b,\n darkslategray: 0x2f4f4f,\n darkslategrey: 0x2f4f4f,\n darkturquoise: 0x00ced1,\n darkviolet: 0x9400d3,\n deeppink: 0xff1493,\n deepskyblue: 0x00bfff,\n dimgray: 0x696969,\n dimgrey: 0x696969,\n dodgerblue: 0x1e90ff,\n firebrick: 0xb22222,\n floralwhite: 0xfffaf0,\n forestgreen: 0x228b22,\n fuchsia: 0xff00ff,\n gainsboro: 0xdcdcdc,\n ghostwhite: 0xf8f8ff,\n gold: 0xffd700,\n goldenrod: 0xdaa520,\n gray: 0x808080,\n green: 0x008000,\n greenyellow: 0xadff2f,\n grey: 0x808080,\n honeydew: 0xf0fff0,\n hotpink: 0xff69b4,\n indianred: 0xcd5c5c,\n indigo: 0x4b0082,\n ivory: 0xfffff0,\n khaki: 0xf0e68c,\n lavender: 0xe6e6fa,\n lavenderblush: 0xfff0f5,\n lawngreen: 0x7cfc00,\n lemonchiffon: 0xfffacd,\n lightblue: 0xadd8e6,\n lightcoral: 0xf08080,\n lightcyan: 0xe0ffff,\n lightgoldenrodyellow: 0xfafad2,\n lightgray: 0xd3d3d3,\n lightgreen: 0x90ee90,\n lightgrey: 0xd3d3d3,\n lightpink: 0xffb6c1,\n lightsalmon: 0xffa07a,\n lightseagreen: 0x20b2aa,\n lightskyblue: 0x87cefa,\n lightslategray: 0x778899,\n lightslategrey: 0x778899,\n lightsteelblue: 0xb0c4de,\n lightyellow: 0xffffe0,\n lime: 0x00ff00,\n limegreen: 0x32cd32,\n linen: 0xfaf0e6,\n magenta: 0xff00ff,\n maroon: 0x800000,\n mediumaquamarine: 0x66cdaa,\n mediumblue: 0x0000cd,\n mediumorchid: 0xba55d3,\n mediumpurple: 0x9370db,\n mediumseagreen: 0x3cb371,\n mediumslateblue: 0x7b68ee,\n mediumspringgreen: 0x00fa9a,\n mediumturquoise: 0x48d1cc,\n mediumvioletred: 0xc71585,\n midnightblue: 0x191970,\n mintcream: 0xf5fffa,\n mistyrose: 0xffe4e1,\n moccasin: 0xffe4b5,\n navajowhite: 0xffdead,\n navy: 0x000080,\n oldlace: 0xfdf5e6,\n olive: 0x808000,\n olivedrab: 0x6b8e23,\n orange: 0xffa500,\n orangered: 0xff4500,\n orchid: 0xda70d6,\n palegoldenrod: 0xeee8aa,\n palegreen: 0x98fb98,\n paleturquoise: 0xafeeee,\n palevioletred: 0xdb7093,\n papayawhip: 0xffefd5,\n peachpuff: 0xffdab9,\n peru: 0xcd853f,\n pink: 0xffc0cb,\n plum: 0xdda0dd,\n powderblue: 0xb0e0e6,\n purple: 0x800080,\n rebeccapurple: 0x663399,\n red: 0xff0000,\n rosybrown: 0xbc8f8f,\n royalblue: 0x4169e1,\n saddlebrown: 0x8b4513,\n salmon: 0xfa8072,\n sandybrown: 0xf4a460,\n seagreen: 0x2e8b57,\n seashell: 0xfff5ee,\n sienna: 0xa0522d,\n silver: 0xc0c0c0,\n skyblue: 0x87ceeb,\n slateblue: 0x6a5acd,\n slategray: 0x708090,\n slategrey: 0x708090,\n snow: 0xfffafa,\n springgreen: 0x00ff7f,\n steelblue: 0x4682b4,\n tan: 0xd2b48c,\n teal: 0x008080,\n thistle: 0xd8bfd8,\n tomato: 0xff6347,\n turquoise: 0x40e0d0,\n violet: 0xee82ee,\n wheat: 0xf5deb3,\n white: 0xffffff,\n whitesmoke: 0xf5f5f5,\n yellow: 0xffff00,\n yellowgreen: 0x9acd32\n};\n\ndefine(Color, color, {\n copy(channels) {\n return Object.assign(new this.constructor, this, channels);\n },\n displayable() {\n return this.rgb().displayable();\n },\n hex: color_formatHex, // Deprecated! Use color.formatHex.\n formatHex: color_formatHex,\n formatHex8: color_formatHex8,\n formatHsl: color_formatHsl,\n formatRgb: color_formatRgb,\n toString: color_formatRgb\n});\n\nfunction color_formatHex() {\n return this.rgb().formatHex();\n}\n\nfunction color_formatHex8() {\n return this.rgb().formatHex8();\n}\n\nfunction color_formatHsl() {\n return hslConvert(this).formatHsl();\n}\n\nfunction color_formatRgb() {\n return this.rgb().formatRgb();\n}\n\nexport default function color(format) {\n var m, l;\n format = (format + \"\").trim().toLowerCase();\n return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000\n : l === 3 ? new Rgb((m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1) // #f00\n : l === 8 ? rgba(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000\n : l === 4 ? rgba((m >> 12 & 0xf) | (m >> 8 & 0xf0), (m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), (((m & 0xf) << 4) | (m & 0xf)) / 0xff) // #f000\n : null) // invalid hex\n : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)\n : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)\n : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)\n : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)\n : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)\n : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)\n : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins\n : format === \"transparent\" ? new Rgb(NaN, NaN, NaN, 0)\n : null;\n}\n\nfunction rgbn(n) {\n return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);\n}\n\nfunction rgba(r, g, b, a) {\n if (a <= 0) r = g = b = NaN;\n return new Rgb(r, g, b, a);\n}\n\nexport function rgbConvert(o) {\n if (!(o instanceof Color)) o = color(o);\n if (!o) return new Rgb;\n o = o.rgb();\n return new Rgb(o.r, o.g, o.b, o.opacity);\n}\n\nexport function rgb(r, g, b, opacity) {\n return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);\n}\n\nexport function Rgb(r, g, b, opacity) {\n this.r = +r;\n this.g = +g;\n this.b = +b;\n this.opacity = +opacity;\n}\n\ndefine(Rgb, rgb, extend(Color, {\n brighter(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n },\n darker(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n },\n rgb() {\n return this;\n },\n clamp() {\n return new Rgb(clampi(this.r), clampi(this.g), clampi(this.b), clampa(this.opacity));\n },\n displayable() {\n return (-0.5 <= this.r && this.r < 255.5)\n && (-0.5 <= this.g && this.g < 255.5)\n && (-0.5 <= this.b && this.b < 255.5)\n && (0 <= this.opacity && this.opacity <= 1);\n },\n hex: rgb_formatHex, // Deprecated! Use color.formatHex.\n formatHex: rgb_formatHex,\n formatHex8: rgb_formatHex8,\n formatRgb: rgb_formatRgb,\n toString: rgb_formatRgb\n}));\n\nfunction rgb_formatHex() {\n return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}`;\n}\n\nfunction rgb_formatHex8() {\n return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}${hex((isNaN(this.opacity) ? 1 : this.opacity) * 255)}`;\n}\n\nfunction rgb_formatRgb() {\n const a = clampa(this.opacity);\n return `${a === 1 ? \"rgb(\" : \"rgba(\"}${clampi(this.r)}, ${clampi(this.g)}, ${clampi(this.b)}${a === 1 ? \")\" : `, ${a})`}`;\n}\n\nfunction clampa(opacity) {\n return isNaN(opacity) ? 1 : Math.max(0, Math.min(1, opacity));\n}\n\nfunction clampi(value) {\n return Math.max(0, Math.min(255, Math.round(value) || 0));\n}\n\nfunction hex(value) {\n value = clampi(value);\n return (value < 16 ? \"0\" : \"\") + value.toString(16);\n}\n\nfunction hsla(h, s, l, a) {\n if (a <= 0) h = s = l = NaN;\n else if (l <= 0 || l >= 1) h = s = NaN;\n else if (s <= 0) h = NaN;\n return new Hsl(h, s, l, a);\n}\n\nexport function hslConvert(o) {\n if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);\n if (!(o instanceof Color)) o = color(o);\n if (!o) return new Hsl;\n if (o instanceof Hsl) return o;\n o = o.rgb();\n var r = o.r / 255,\n g = o.g / 255,\n b = o.b / 255,\n min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n h = NaN,\n s = max - min,\n l = (max + min) / 2;\n if (s) {\n if (r === max) h = (g - b) / s + (g < b) * 6;\n else if (g === max) h = (b - r) / s + 2;\n else h = (r - g) / s + 4;\n s /= l < 0.5 ? max + min : 2 - max - min;\n h *= 60;\n } else {\n s = l > 0 && l < 1 ? 0 : h;\n }\n return new Hsl(h, s, l, o.opacity);\n}\n\nexport function hsl(h, s, l, opacity) {\n return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);\n}\n\nfunction Hsl(h, s, l, opacity) {\n this.h = +h;\n this.s = +s;\n this.l = +l;\n this.opacity = +opacity;\n}\n\ndefine(Hsl, hsl, extend(Color, {\n brighter(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\n },\n darker(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\n },\n rgb() {\n var h = this.h % 360 + (this.h < 0) * 360,\n s = isNaN(h) || isNaN(this.s) ? 0 : this.s,\n l = this.l,\n m2 = l + (l < 0.5 ? l : 1 - l) * s,\n m1 = 2 * l - m2;\n return new Rgb(\n hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),\n hsl2rgb(h, m1, m2),\n hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),\n this.opacity\n );\n },\n clamp() {\n return new Hsl(clamph(this.h), clampt(this.s), clampt(this.l), clampa(this.opacity));\n },\n displayable() {\n return (0 <= this.s && this.s <= 1 || isNaN(this.s))\n && (0 <= this.l && this.l <= 1)\n && (0 <= this.opacity && this.opacity <= 1);\n },\n formatHsl() {\n const a = clampa(this.opacity);\n return `${a === 1 ? \"hsl(\" : \"hsla(\"}${clamph(this.h)}, ${clampt(this.s) * 100}%, ${clampt(this.l) * 100}%${a === 1 ? \")\" : `, ${a})`}`;\n }\n}));\n\nfunction clamph(value) {\n value = (value || 0) % 360;\n return value < 0 ? value + 360 : value;\n}\n\nfunction clampt(value) {\n return Math.max(0, Math.min(1, value || 0));\n}\n\n/* From FvD 13.37, CSS Color Module Level 3 */\nfunction hsl2rgb(h, m1, m2) {\n return (h < 60 ? m1 + (m2 - m1) * h / 60\n : h < 180 ? m2\n : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60\n : m1) * 255;\n}\n", "export const radians = Math.PI / 180;\nexport const degrees = 180 / Math.PI;\n", "import define, {extend} from \"./define.js\";\nimport {Color, rgbConvert, Rgb} from \"./color.js\";\nimport {degrees, radians} from \"./math.js\";\n\n// https://observablehq.com/@mbostock/lab-and-rgb\nconst K = 18,\n Xn = 0.96422,\n Yn = 1,\n Zn = 0.82521,\n t0 = 4 / 29,\n t1 = 6 / 29,\n t2 = 3 * t1 * t1,\n t3 = t1 * t1 * t1;\n\nfunction labConvert(o) {\n if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity);\n if (o instanceof Hcl) return hcl2lab(o);\n if (!(o instanceof Rgb)) o = rgbConvert(o);\n var r = rgb2lrgb(o.r),\n g = rgb2lrgb(o.g),\n b = rgb2lrgb(o.b),\n y = xyz2lab((0.2225045 * r + 0.7168786 * g + 0.0606169 * b) / Yn), x, z;\n if (r === g && g === b) x = z = y; else {\n x = xyz2lab((0.4360747 * r + 0.3850649 * g + 0.1430804 * b) / Xn);\n z = xyz2lab((0.0139322 * r + 0.0971045 * g + 0.7141733 * b) / Zn);\n }\n return new Lab(116 * y - 16, 500 * (x - y), 200 * (y - z), o.opacity);\n}\n\nexport function gray(l, opacity) {\n return new Lab(l, 0, 0, opacity == null ? 1 : opacity);\n}\n\nexport default function lab(l, a, b, opacity) {\n return arguments.length === 1 ? labConvert(l) : new Lab(l, a, b, opacity == null ? 1 : opacity);\n}\n\nexport function Lab(l, a, b, opacity) {\n this.l = +l;\n this.a = +a;\n this.b = +b;\n this.opacity = +opacity;\n}\n\ndefine(Lab, lab, extend(Color, {\n brighter(k) {\n return new Lab(this.l + K * (k == null ? 1 : k), this.a, this.b, this.opacity);\n },\n darker(k) {\n return new Lab(this.l - K * (k == null ? 1 : k), this.a, this.b, this.opacity);\n },\n rgb() {\n var y = (this.l + 16) / 116,\n x = isNaN(this.a) ? y : y + this.a / 500,\n z = isNaN(this.b) ? y : y - this.b / 200;\n x = Xn * lab2xyz(x);\n y = Yn * lab2xyz(y);\n z = Zn * lab2xyz(z);\n return new Rgb(\n lrgb2rgb( 3.1338561 * x - 1.6168667 * y - 0.4906146 * z),\n lrgb2rgb(-0.9787684 * x + 1.9161415 * y + 0.0334540 * z),\n lrgb2rgb( 0.0719453 * x - 0.2289914 * y + 1.4052427 * z),\n this.opacity\n );\n }\n}));\n\nfunction xyz2lab(t) {\n return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0;\n}\n\nfunction lab2xyz(t) {\n return t > t1 ? t * t * t : t2 * (t - t0);\n}\n\nfunction lrgb2rgb(x) {\n return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055);\n}\n\nfunction rgb2lrgb(x) {\n return (x /= 255) <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4);\n}\n\nfunction hclConvert(o) {\n if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity);\n if (!(o instanceof Lab)) o = labConvert(o);\n if (o.a === 0 && o.b === 0) return new Hcl(NaN, 0 < o.l && o.l < 100 ? 0 : NaN, o.l, o.opacity);\n var h = Math.atan2(o.b, o.a) * degrees;\n return new Hcl(h < 0 ? h + 360 : h, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity);\n}\n\nexport function lch(l, c, h, opacity) {\n return arguments.length === 1 ? hclConvert(l) : new Hcl(h, c, l, opacity == null ? 1 : opacity);\n}\n\nexport function hcl(h, c, l, opacity) {\n return arguments.length === 1 ? hclConvert(h) : new Hcl(h, c, l, opacity == null ? 1 : opacity);\n}\n\nexport function Hcl(h, c, l, opacity) {\n this.h = +h;\n this.c = +c;\n this.l = +l;\n this.opacity = +opacity;\n}\n\nfunction hcl2lab(o) {\n if (isNaN(o.h)) return new Lab(o.l, 0, 0, o.opacity);\n var h = o.h * radians;\n return new Lab(o.l, Math.cos(h) * o.c, Math.sin(h) * o.c, o.opacity);\n}\n\ndefine(Hcl, hcl, extend(Color, {\n brighter(k) {\n return new Hcl(this.h, this.c, this.l + K * (k == null ? 1 : k), this.opacity);\n },\n darker(k) {\n return new Hcl(this.h, this.c, this.l - K * (k == null ? 1 : k), this.opacity);\n },\n rgb() {\n return hcl2lab(this).rgb();\n }\n}));\n", "import define, {extend} from \"./define.js\";\nimport {Color, rgbConvert, Rgb, darker, brighter} from \"./color.js\";\nimport {degrees, radians} from \"./math.js\";\n\nvar A = -0.14861,\n B = +1.78277,\n C = -0.29227,\n D = -0.90649,\n E = +1.97294,\n ED = E * D,\n EB = E * B,\n BC_DA = B * C - D * A;\n\nfunction cubehelixConvert(o) {\n if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity);\n if (!(o instanceof Rgb)) o = rgbConvert(o);\n var r = o.r / 255,\n g = o.g / 255,\n b = o.b / 255,\n l = (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB),\n bl = b - l,\n k = (E * (g - l) - C * bl) / D,\n s = Math.sqrt(k * k + bl * bl) / (E * l * (1 - l)), // NaN if l=0 or l=1\n h = s ? Math.atan2(k, bl) * degrees - 120 : NaN;\n return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity);\n}\n\nexport default function cubehelix(h, s, l, opacity) {\n return arguments.length === 1 ? cubehelixConvert(h) : new Cubehelix(h, s, l, opacity == null ? 1 : opacity);\n}\n\nexport function Cubehelix(h, s, l, opacity) {\n this.h = +h;\n this.s = +s;\n this.l = +l;\n this.opacity = +opacity;\n}\n\ndefine(Cubehelix, cubehelix, extend(Color, {\n brighter(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Cubehelix(this.h, this.s, this.l * k, this.opacity);\n },\n darker(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Cubehelix(this.h, this.s, this.l * k, this.opacity);\n },\n rgb() {\n var h = isNaN(this.h) ? 0 : (this.h + 120) * radians,\n l = +this.l,\n a = isNaN(this.s) ? 0 : this.s * l * (1 - l),\n cosh = Math.cos(h),\n sinh = Math.sin(h);\n return new Rgb(\n 255 * (l + a * (A * cosh + B * sinh)),\n 255 * (l + a * (C * cosh + D * sinh)),\n 255 * (l + a * (E * cosh)),\n this.opacity\n );\n }\n}));\n", "export function basis(t1, v0, v1, v2, v3) {\n var t2 = t1 * t1, t3 = t2 * t1;\n return ((1 - 3 * t1 + 3 * t2 - t3) * v0\n + (4 - 6 * t2 + 3 * t3) * v1\n + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2\n + t3 * v3) / 6;\n}\n\nexport default function(values) {\n var n = values.length - 1;\n return function(t) {\n var i = t <= 0 ? (t = 0) : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n),\n v1 = values[i],\n v2 = values[i + 1],\n v0 = i > 0 ? values[i - 1] : 2 * v1 - v2,\n v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1;\n return basis((t - i / n) * n, v0, v1, v2, v3);\n };\n}\n", "import {basis} from \"./basis.js\";\n\nexport default function(values) {\n var n = values.length;\n return function(t) {\n var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n),\n v0 = values[(i + n - 1) % n],\n v1 = values[i % n],\n v2 = values[(i + 1) % n],\n v3 = values[(i + 2) % n];\n return basis((t - i / n) * n, v0, v1, v2, v3);\n };\n}\n", "export default x => () => x;\n", "import constant from \"./constant.js\";\n\nfunction linear(a, d) {\n return function(t) {\n return a + t * d;\n };\n}\n\nfunction exponential(a, b, y) {\n return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) {\n return Math.pow(a + t * b, y);\n };\n}\n\nexport function hue(a, b) {\n var d = b - a;\n return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant(isNaN(a) ? b : a);\n}\n\nexport function gamma(y) {\n return (y = +y) === 1 ? nogamma : function(a, b) {\n return b - a ? exponential(a, b, y) : constant(isNaN(a) ? b : a);\n };\n}\n\nexport default function nogamma(a, b) {\n var d = b - a;\n return d ? linear(a, d) : constant(isNaN(a) ? b : a);\n}\n", "import {rgb as colorRgb} from \"d3-color\";\nimport basis from \"./basis.js\";\nimport basisClosed from \"./basisClosed.js\";\nimport nogamma, {gamma} from \"./color.js\";\n\nexport default (function rgbGamma(y) {\n var color = gamma(y);\n\n function rgb(start, end) {\n var r = color((start = colorRgb(start)).r, (end = colorRgb(end)).r),\n g = color(start.g, end.g),\n b = color(start.b, end.b),\n opacity = nogamma(start.opacity, end.opacity);\n return function(t) {\n start.r = r(t);\n start.g = g(t);\n start.b = b(t);\n start.opacity = opacity(t);\n return start + \"\";\n };\n }\n\n rgb.gamma = rgbGamma;\n\n return rgb;\n})(1);\n\nfunction rgbSpline(spline) {\n return function(colors) {\n var n = colors.length,\n r = new Array(n),\n g = new Array(n),\n b = new Array(n),\n i, color;\n for (i = 0; i < n; ++i) {\n color = colorRgb(colors[i]);\n r[i] = color.r || 0;\n g[i] = color.g || 0;\n b[i] = color.b || 0;\n }\n r = spline(r);\n g = spline(g);\n b = spline(b);\n color.opacity = 1;\n return function(t) {\n color.r = r(t);\n color.g = g(t);\n color.b = b(t);\n return color + \"\";\n };\n };\n}\n\nexport var rgbBasis = rgbSpline(basis);\nexport var rgbBasisClosed = rgbSpline(basisClosed);\n", "export default function(a, b) {\n if (!b) b = [];\n var n = a ? Math.min(b.length, a.length) : 0,\n c = b.slice(),\n i;\n return function(t) {\n for (i = 0; i < n; ++i) c[i] = a[i] * (1 - t) + b[i] * t;\n return c;\n };\n}\n\nexport function isNumberArray(x) {\n return ArrayBuffer.isView(x) && !(x instanceof DataView);\n}\n", "import value from \"./value.js\";\nimport numberArray, {isNumberArray} from \"./numberArray.js\";\n\nexport default function(a, b) {\n return (isNumberArray(b) ? numberArray : genericArray)(a, b);\n}\n\nexport function genericArray(a, b) {\n var nb = b ? b.length : 0,\n na = a ? Math.min(nb, a.length) : 0,\n x = new Array(na),\n c = new Array(nb),\n i;\n\n for (i = 0; i < na; ++i) x[i] = value(a[i], b[i]);\n for (; i < nb; ++i) c[i] = b[i];\n\n return function(t) {\n for (i = 0; i < na; ++i) c[i] = x[i](t);\n return c;\n };\n}\n", "export default function(a, b) {\n var d = new Date;\n return a = +a, b = +b, function(t) {\n return d.setTime(a * (1 - t) + b * t), d;\n };\n}\n", "export default function(a, b) {\n return a = +a, b = +b, function(t) {\n return a * (1 - t) + b * t;\n };\n}\n", "import value from \"./value.js\";\n\nexport default function(a, b) {\n var i = {},\n c = {},\n k;\n\n if (a === null || typeof a !== \"object\") a = {};\n if (b === null || typeof b !== \"object\") b = {};\n\n for (k in b) {\n if (k in a) {\n i[k] = value(a[k], b[k]);\n } else {\n c[k] = b[k];\n }\n }\n\n return function(t) {\n for (k in i) c[k] = i[k](t);\n return c;\n };\n}\n", "import number from \"./number.js\";\n\nvar reA = /[-+]?(?:\\d+\\.?\\d*|\\.?\\d+)(?:[eE][-+]?\\d+)?/g,\n reB = new RegExp(reA.source, \"g\");\n\nfunction zero(b) {\n return function() {\n return b;\n };\n}\n\nfunction one(b) {\n return function(t) {\n return b(t) + \"\";\n };\n}\n\nexport default function(a, b) {\n var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b\n am, // current match in a\n bm, // current match in b\n bs, // string preceding current number in b, if any\n i = -1, // index in s\n s = [], // string constants and placeholders\n q = []; // number interpolators\n\n // Coerce inputs to strings.\n a = a + \"\", b = b + \"\";\n\n // Interpolate pairs of numbers in a & b.\n while ((am = reA.exec(a))\n && (bm = reB.exec(b))) {\n if ((bs = bm.index) > bi) { // a string precedes the next number in b\n bs = b.slice(bi, bs);\n if (s[i]) s[i] += bs; // coalesce with previous string\n else s[++i] = bs;\n }\n if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match\n if (s[i]) s[i] += bm; // coalesce with previous string\n else s[++i] = bm;\n } else { // interpolate non-matching numbers\n s[++i] = null;\n q.push({i: i, x: number(am, bm)});\n }\n bi = reB.lastIndex;\n }\n\n // Add remains of b.\n if (bi < b.length) {\n bs = b.slice(bi);\n if (s[i]) s[i] += bs; // coalesce with previous string\n else s[++i] = bs;\n }\n\n // Special optimization for only a single match.\n // Otherwise, interpolate each of the numbers and rejoin the string.\n return s.length < 2 ? (q[0]\n ? one(q[0].x)\n : zero(b))\n : (b = q.length, function(t) {\n for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);\n return s.join(\"\");\n });\n}\n", "import {color} from \"d3-color\";\nimport rgb from \"./rgb.js\";\nimport {genericArray} from \"./array.js\";\nimport date from \"./date.js\";\nimport number from \"./number.js\";\nimport object from \"./object.js\";\nimport string from \"./string.js\";\nimport constant from \"./constant.js\";\nimport numberArray, {isNumberArray} from \"./numberArray.js\";\n\nexport default function(a, b) {\n var t = typeof b, c;\n return b == null || t === \"boolean\" ? constant(b)\n : (t === \"number\" ? number\n : t === \"string\" ? ((c = color(b)) ? (b = c, rgb) : string)\n : b instanceof color ? rgb\n : b instanceof Date ? date\n : isNumberArray(b) ? numberArray\n : Array.isArray(b) ? genericArray\n : typeof b.valueOf !== \"function\" && typeof b.toString !== \"function\" || isNaN(b) ? object\n : number)(a, b);\n}\n", "var degrees = 180 / Math.PI;\n\nexport var identity = {\n translateX: 0,\n translateY: 0,\n rotate: 0,\n skewX: 0,\n scaleX: 1,\n scaleY: 1\n};\n\nexport default function(a, b, c, d, e, f) {\n var scaleX, scaleY, skewX;\n if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX;\n if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX;\n if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY;\n if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX;\n return {\n translateX: e,\n translateY: f,\n rotate: Math.atan2(b, a) * degrees,\n skewX: Math.atan(skewX) * degrees,\n scaleX: scaleX,\n scaleY: scaleY\n };\n}\n", "import decompose, {identity} from \"./decompose.js\";\n\nvar svgNode;\n\n/* eslint-disable no-undef */\nexport function parseCss(value) {\n const m = new (typeof DOMMatrix === \"function\" ? DOMMatrix : WebKitCSSMatrix)(value + \"\");\n return m.isIdentity ? identity : decompose(m.a, m.b, m.c, m.d, m.e, m.f);\n}\n\nexport function parseSvg(value) {\n if (value == null) return identity;\n if (!svgNode) svgNode = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n svgNode.setAttribute(\"transform\", value);\n if (!(value = svgNode.transform.baseVal.consolidate())) return identity;\n value = value.matrix;\n return decompose(value.a, value.b, value.c, value.d, value.e, value.f);\n}\n", "import number from \"../number.js\";\nimport {parseCss, parseSvg} from \"./parse.js\";\n\nfunction interpolateTransform(parse, pxComma, pxParen, degParen) {\n\n function pop(s) {\n return s.length ? s.pop() + \" \" : \"\";\n }\n\n function translate(xa, ya, xb, yb, s, q) {\n if (xa !== xb || ya !== yb) {\n var i = s.push(\"translate(\", null, pxComma, null, pxParen);\n q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)});\n } else if (xb || yb) {\n s.push(\"translate(\" + xb + pxComma + yb + pxParen);\n }\n }\n\n function rotate(a, b, s, q) {\n if (a !== b) {\n if (a - b > 180) b += 360; else if (b - a > 180) a += 360; // shortest path\n q.push({i: s.push(pop(s) + \"rotate(\", null, degParen) - 2, x: number(a, b)});\n } else if (b) {\n s.push(pop(s) + \"rotate(\" + b + degParen);\n }\n }\n\n function skewX(a, b, s, q) {\n if (a !== b) {\n q.push({i: s.push(pop(s) + \"skewX(\", null, degParen) - 2, x: number(a, b)});\n } else if (b) {\n s.push(pop(s) + \"skewX(\" + b + degParen);\n }\n }\n\n function scale(xa, ya, xb, yb, s, q) {\n if (xa !== xb || ya !== yb) {\n var i = s.push(pop(s) + \"scale(\", null, \",\", null, \")\");\n q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)});\n } else if (xb !== 1 || yb !== 1) {\n s.push(pop(s) + \"scale(\" + xb + \",\" + yb + \")\");\n }\n }\n\n return function(a, b) {\n var s = [], // string constants and placeholders\n q = []; // number interpolators\n a = parse(a), b = parse(b);\n translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q);\n rotate(a.rotate, b.rotate, s, q);\n skewX(a.skewX, b.skewX, s, q);\n scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q);\n a = b = null; // gc\n return function(t) {\n var i = -1, n = q.length, o;\n while (++i < n) s[(o = q[i]).i] = o.x(t);\n return s.join(\"\");\n };\n };\n}\n\nexport var interpolateTransformCss = interpolateTransform(parseCss, \"px, \", \"px)\", \"deg)\");\nexport var interpolateTransformSvg = interpolateTransform(parseSvg, \", \", \")\", \")\");\n", "var epsilon2 = 1e-12;\n\nfunction cosh(x) {\n return ((x = Math.exp(x)) + 1 / x) / 2;\n}\n\nfunction sinh(x) {\n return ((x = Math.exp(x)) - 1 / x) / 2;\n}\n\nfunction tanh(x) {\n return ((x = Math.exp(2 * x)) - 1) / (x + 1);\n}\n\nexport default (function zoomRho(rho, rho2, rho4) {\n\n // p0 = [ux0, uy0, w0]\n // p1 = [ux1, uy1, w1]\n function zoom(p0, p1) {\n var ux0 = p0[0], uy0 = p0[1], w0 = p0[2],\n ux1 = p1[0], uy1 = p1[1], w1 = p1[2],\n dx = ux1 - ux0,\n dy = uy1 - uy0,\n d2 = dx * dx + dy * dy,\n i,\n S;\n\n // Special case for u0 ≅ u1.\n if (d2 < epsilon2) {\n S = Math.log(w1 / w0) / rho;\n i = function(t) {\n return [\n ux0 + t * dx,\n uy0 + t * dy,\n w0 * Math.exp(rho * t * S)\n ];\n }\n }\n\n // General case.\n else {\n var d1 = Math.sqrt(d2),\n b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1),\n b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1),\n r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0),\n r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1);\n S = (r1 - r0) / rho;\n i = function(t) {\n var s = t * S,\n coshr0 = cosh(r0),\n u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0));\n return [\n ux0 + u * dx,\n uy0 + u * dy,\n w0 * coshr0 / cosh(rho * s + r0)\n ];\n }\n }\n\n i.duration = S * 1000 * rho / Math.SQRT2;\n\n return i;\n }\n\n zoom.rho = function(_) {\n var _1 = Math.max(1e-3, +_), _2 = _1 * _1, _4 = _2 * _2;\n return zoomRho(_1, _2, _4);\n };\n\n return zoom;\n})(Math.SQRT2, 2, 4);\n", "import {hsl as colorHsl} from \"d3-color\";\nimport color, {hue} from \"./color.js\";\n\nfunction hsl(hue) {\n return function(start, end) {\n var h = hue((start = colorHsl(start)).h, (end = colorHsl(end)).h),\n s = color(start.s, end.s),\n l = color(start.l, end.l),\n opacity = color(start.opacity, end.opacity);\n return function(t) {\n start.h = h(t);\n start.s = s(t);\n start.l = l(t);\n start.opacity = opacity(t);\n return start + \"\";\n };\n }\n}\n\nexport default hsl(hue);\nexport var hslLong = hsl(color);\n", "import {hcl as colorHcl} from \"d3-color\";\nimport color, {hue} from \"./color.js\";\n\nfunction hcl(hue) {\n return function(start, end) {\n var h = hue((start = colorHcl(start)).h, (end = colorHcl(end)).h),\n c = color(start.c, end.c),\n l = color(start.l, end.l),\n opacity = color(start.opacity, end.opacity);\n return function(t) {\n start.h = h(t);\n start.c = c(t);\n start.l = l(t);\n start.opacity = opacity(t);\n return start + \"\";\n };\n }\n}\n\nexport default hcl(hue);\nexport var hclLong = hcl(color);\n", "import {cubehelix as colorCubehelix} from \"d3-color\";\nimport color, {hue} from \"./color.js\";\n\nfunction cubehelix(hue) {\n return (function cubehelixGamma(y) {\n y = +y;\n\n function cubehelix(start, end) {\n var h = hue((start = colorCubehelix(start)).h, (end = colorCubehelix(end)).h),\n s = color(start.s, end.s),\n l = color(start.l, end.l),\n opacity = color(start.opacity, end.opacity);\n return function(t) {\n start.h = h(t);\n start.s = s(t);\n start.l = l(Math.pow(t, y));\n start.opacity = opacity(t);\n return start + \"\";\n };\n }\n\n cubehelix.gamma = cubehelixGamma;\n\n return cubehelix;\n })(1);\n}\n\nexport default cubehelix(hue);\nexport var cubehelixLong = cubehelix(color);\n", "var frame = 0, // is an animation frame pending?\n timeout = 0, // is a timeout pending?\n interval = 0, // are any timers active?\n pokeDelay = 1000, // how frequently we check for clock skew\n taskHead,\n taskTail,\n clockLast = 0,\n clockNow = 0,\n clockSkew = 0,\n clock = typeof performance === \"object\" && performance.now ? performance : Date,\n setFrame = typeof window === \"object\" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) { setTimeout(f, 17); };\n\nexport function now() {\n return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);\n}\n\nfunction clearNow() {\n clockNow = 0;\n}\n\nexport function Timer() {\n this._call =\n this._time =\n this._next = null;\n}\n\nTimer.prototype = timer.prototype = {\n constructor: Timer,\n restart: function(callback, delay, time) {\n if (typeof callback !== \"function\") throw new TypeError(\"callback is not a function\");\n time = (time == null ? now() : +time) + (delay == null ? 0 : +delay);\n if (!this._next && taskTail !== this) {\n if (taskTail) taskTail._next = this;\n else taskHead = this;\n taskTail = this;\n }\n this._call = callback;\n this._time = time;\n sleep();\n },\n stop: function() {\n if (this._call) {\n this._call = null;\n this._time = Infinity;\n sleep();\n }\n }\n};\n\nexport function timer(callback, delay, time) {\n var t = new Timer;\n t.restart(callback, delay, time);\n return t;\n}\n\nexport function timerFlush() {\n now(); // Get the current time, if not already set.\n ++frame; // Pretend we’ve set an alarm, if we haven’t already.\n var t = taskHead, e;\n while (t) {\n if ((e = clockNow - t._time) >= 0) t._call.call(undefined, e);\n t = t._next;\n }\n --frame;\n}\n\nfunction wake() {\n clockNow = (clockLast = clock.now()) + clockSkew;\n frame = timeout = 0;\n try {\n timerFlush();\n } finally {\n frame = 0;\n nap();\n clockNow = 0;\n }\n}\n\nfunction poke() {\n var now = clock.now(), delay = now - clockLast;\n if (delay > pokeDelay) clockSkew -= delay, clockLast = now;\n}\n\nfunction nap() {\n var t0, t1 = taskHead, t2, time = Infinity;\n while (t1) {\n if (t1._call) {\n if (time > t1._time) time = t1._time;\n t0 = t1, t1 = t1._next;\n } else {\n t2 = t1._next, t1._next = null;\n t1 = t0 ? t0._next = t2 : taskHead = t2;\n }\n }\n taskTail = t0;\n sleep(time);\n}\n\nfunction sleep(time) {\n if (frame) return; // Soonest alarm already set, or will be.\n if (timeout) timeout = clearTimeout(timeout);\n var delay = time - clockNow; // Strictly less than if we recomputed clockNow.\n if (delay > 24) {\n if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew);\n if (interval) interval = clearInterval(interval);\n } else {\n if (!interval) clockLast = clock.now(), interval = setInterval(poke, pokeDelay);\n frame = 1, setFrame(wake);\n }\n}\n", "import {Timer} from \"./timer.js\";\n\nexport default function(callback, delay, time) {\n var t = new Timer;\n delay = delay == null ? 0 : +delay;\n t.restart(elapsed => {\n t.stop();\n callback(elapsed + delay);\n }, delay, time);\n return t;\n}\n", "import {dispatch} from \"d3-dispatch\";\nimport {timer, timeout} from \"d3-timer\";\n\nvar emptyOn = dispatch(\"start\", \"end\", \"cancel\", \"interrupt\");\nvar emptyTween = [];\n\nexport var CREATED = 0;\nexport var SCHEDULED = 1;\nexport var STARTING = 2;\nexport var STARTED = 3;\nexport var RUNNING = 4;\nexport var ENDING = 5;\nexport var ENDED = 6;\n\nexport default function(node, name, id, index, group, timing) {\n var schedules = node.__transition;\n if (!schedules) node.__transition = {};\n else if (id in schedules) return;\n create(node, id, {\n name: name,\n index: index, // For context during callback.\n group: group, // For context during callback.\n on: emptyOn,\n tween: emptyTween,\n time: timing.time,\n delay: timing.delay,\n duration: timing.duration,\n ease: timing.ease,\n timer: null,\n state: CREATED\n });\n}\n\nexport function init(node, id) {\n var schedule = get(node, id);\n if (schedule.state > CREATED) throw new Error(\"too late; already scheduled\");\n return schedule;\n}\n\nexport function set(node, id) {\n var schedule = get(node, id);\n if (schedule.state > STARTED) throw new Error(\"too late; already running\");\n return schedule;\n}\n\nexport function get(node, id) {\n var schedule = node.__transition;\n if (!schedule || !(schedule = schedule[id])) throw new Error(\"transition not found\");\n return schedule;\n}\n\nfunction create(node, id, self) {\n var schedules = node.__transition,\n tween;\n\n // Initialize the self timer when the transition is created.\n // Note the actual delay is not known until the first callback!\n schedules[id] = self;\n self.timer = timer(schedule, 0, self.time);\n\n function schedule(elapsed) {\n self.state = SCHEDULED;\n self.timer.restart(start, self.delay, self.time);\n\n // If the elapsed delay is less than our first sleep, start immediately.\n if (self.delay <= elapsed) start(elapsed - self.delay);\n }\n\n function start(elapsed) {\n var i, j, n, o;\n\n // If the state is not SCHEDULED, then we previously errored on start.\n if (self.state !== SCHEDULED) return stop();\n\n for (i in schedules) {\n o = schedules[i];\n if (o.name !== self.name) continue;\n\n // While this element already has a starting transition during this frame,\n // defer starting an interrupting transition until that transition has a\n // chance to tick (and possibly end); see d3/d3-transition#54!\n if (o.state === STARTED) return timeout(start);\n\n // Interrupt the active transition, if any.\n if (o.state === RUNNING) {\n o.state = ENDED;\n o.timer.stop();\n o.on.call(\"interrupt\", node, node.__data__, o.index, o.group);\n delete schedules[i];\n }\n\n // Cancel any pre-empted transitions.\n else if (+i < id) {\n o.state = ENDED;\n o.timer.stop();\n o.on.call(\"cancel\", node, node.__data__, o.index, o.group);\n delete schedules[i];\n }\n }\n\n // Defer the first tick to end of the current frame; see d3/d3#1576.\n // Note the transition may be canceled after start and before the first tick!\n // Note this must be scheduled before the start event; see d3/d3-transition#16!\n // Assuming this is successful, subsequent callbacks go straight to tick.\n timeout(function() {\n if (self.state === STARTED) {\n self.state = RUNNING;\n self.timer.restart(tick, self.delay, self.time);\n tick(elapsed);\n }\n });\n\n // Dispatch the start event.\n // Note this must be done before the tween are initialized.\n self.state = STARTING;\n self.on.call(\"start\", node, node.__data__, self.index, self.group);\n if (self.state !== STARTING) return; // interrupted\n self.state = STARTED;\n\n // Initialize the tween, deleting null tween.\n tween = new Array(n = self.tween.length);\n for (i = 0, j = -1; i < n; ++i) {\n if (o = self.tween[i].value.call(node, node.__data__, self.index, self.group)) {\n tween[++j] = o;\n }\n }\n tween.length = j + 1;\n }\n\n function tick(elapsed) {\n var t = elapsed < self.duration ? self.ease.call(null, elapsed / self.duration) : (self.timer.restart(stop), self.state = ENDING, 1),\n i = -1,\n n = tween.length;\n\n while (++i < n) {\n tween[i].call(node, t);\n }\n\n // Dispatch the end event.\n if (self.state === ENDING) {\n self.on.call(\"end\", node, node.__data__, self.index, self.group);\n stop();\n }\n }\n\n function stop() {\n self.state = ENDED;\n self.timer.stop();\n delete schedules[id];\n for (var i in schedules) return; // eslint-disable-line no-unused-vars\n delete node.__transition;\n }\n}\n", "import {STARTING, ENDING, ENDED} from \"./transition/schedule.js\";\n\nexport default function(node, name) {\n var schedules = node.__transition,\n schedule,\n active,\n empty = true,\n i;\n\n if (!schedules) return;\n\n name = name == null ? null : name + \"\";\n\n for (i in schedules) {\n if ((schedule = schedules[i]).name !== name) { empty = false; continue; }\n active = schedule.state > STARTING && schedule.state < ENDING;\n schedule.state = ENDED;\n schedule.timer.stop();\n schedule.on.call(active ? \"interrupt\" : \"cancel\", node, node.__data__, schedule.index, schedule.group);\n delete schedules[i];\n }\n\n if (empty) delete node.__transition;\n}\n", "import interrupt from \"../interrupt.js\";\n\nexport default function(name) {\n return this.each(function() {\n interrupt(this, name);\n });\n}\n", "import {get, set} from \"./schedule.js\";\n\nfunction tweenRemove(id, name) {\n var tween0, tween1;\n return function() {\n var schedule = set(this, id),\n tween = schedule.tween;\n\n // If this node shared tween with the previous node,\n // just assign the updated shared tween and we’re done!\n // Otherwise, copy-on-write.\n if (tween !== tween0) {\n tween1 = tween0 = tween;\n for (var i = 0, n = tween1.length; i < n; ++i) {\n if (tween1[i].name === name) {\n tween1 = tween1.slice();\n tween1.splice(i, 1);\n break;\n }\n }\n }\n\n schedule.tween = tween1;\n };\n}\n\nfunction tweenFunction(id, name, value) {\n var tween0, tween1;\n if (typeof value !== \"function\") throw new Error;\n return function() {\n var schedule = set(this, id),\n tween = schedule.tween;\n\n // If this node shared tween with the previous node,\n // just assign the updated shared tween and we’re done!\n // Otherwise, copy-on-write.\n if (tween !== tween0) {\n tween1 = (tween0 = tween).slice();\n for (var t = {name: name, value: value}, i = 0, n = tween1.length; i < n; ++i) {\n if (tween1[i].name === name) {\n tween1[i] = t;\n break;\n }\n }\n if (i === n) tween1.push(t);\n }\n\n schedule.tween = tween1;\n };\n}\n\nexport default function(name, value) {\n var id = this._id;\n\n name += \"\";\n\n if (arguments.length < 2) {\n var tween = get(this.node(), id).tween;\n for (var i = 0, n = tween.length, t; i < n; ++i) {\n if ((t = tween[i]).name === name) {\n return t.value;\n }\n }\n return null;\n }\n\n return this.each((value == null ? tweenRemove : tweenFunction)(id, name, value));\n}\n\nexport function tweenValue(transition, name, value) {\n var id = transition._id;\n\n transition.each(function() {\n var schedule = set(this, id);\n (schedule.value || (schedule.value = {}))[name] = value.apply(this, arguments);\n });\n\n return function(node) {\n return get(node, id).value[name];\n };\n}\n", "import {color} from \"d3-color\";\nimport {interpolateNumber, interpolateRgb, interpolateString} from \"d3-interpolate\";\n\nexport default function(a, b) {\n var c;\n return (typeof b === \"number\" ? interpolateNumber\n : b instanceof color ? interpolateRgb\n : (c = color(b)) ? (b = c, interpolateRgb)\n : interpolateString)(a, b);\n}\n", "import {interpolateTransformSvg as interpolateTransform} from \"d3-interpolate\";\nimport {namespace} from \"d3-selection\";\nimport {tweenValue} from \"./tween.js\";\nimport interpolate from \"./interpolate.js\";\n\nfunction attrRemove(name) {\n return function() {\n this.removeAttribute(name);\n };\n}\n\nfunction attrRemoveNS(fullname) {\n return function() {\n this.removeAttributeNS(fullname.space, fullname.local);\n };\n}\n\nfunction attrConstant(name, interpolate, value1) {\n var string00,\n string1 = value1 + \"\",\n interpolate0;\n return function() {\n var string0 = this.getAttribute(name);\n return string0 === string1 ? null\n : string0 === string00 ? interpolate0\n : interpolate0 = interpolate(string00 = string0, value1);\n };\n}\n\nfunction attrConstantNS(fullname, interpolate, value1) {\n var string00,\n string1 = value1 + \"\",\n interpolate0;\n return function() {\n var string0 = this.getAttributeNS(fullname.space, fullname.local);\n return string0 === string1 ? null\n : string0 === string00 ? interpolate0\n : interpolate0 = interpolate(string00 = string0, value1);\n };\n}\n\nfunction attrFunction(name, interpolate, value) {\n var string00,\n string10,\n interpolate0;\n return function() {\n var string0, value1 = value(this), string1;\n if (value1 == null) return void this.removeAttribute(name);\n string0 = this.getAttribute(name);\n string1 = value1 + \"\";\n return string0 === string1 ? null\n : string0 === string00 && string1 === string10 ? interpolate0\n : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));\n };\n}\n\nfunction attrFunctionNS(fullname, interpolate, value) {\n var string00,\n string10,\n interpolate0;\n return function() {\n var string0, value1 = value(this), string1;\n if (value1 == null) return void this.removeAttributeNS(fullname.space, fullname.local);\n string0 = this.getAttributeNS(fullname.space, fullname.local);\n string1 = value1 + \"\";\n return string0 === string1 ? null\n : string0 === string00 && string1 === string10 ? interpolate0\n : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));\n };\n}\n\nexport default function(name, value) {\n var fullname = namespace(name), i = fullname === \"transform\" ? interpolateTransform : interpolate;\n return this.attrTween(name, typeof value === \"function\"\n ? (fullname.local ? attrFunctionNS : attrFunction)(fullname, i, tweenValue(this, \"attr.\" + name, value))\n : value == null ? (fullname.local ? attrRemoveNS : attrRemove)(fullname)\n : (fullname.local ? attrConstantNS : attrConstant)(fullname, i, value));\n}\n", "import {namespace} from \"d3-selection\";\n\nfunction attrInterpolate(name, i) {\n return function(t) {\n this.setAttribute(name, i.call(this, t));\n };\n}\n\nfunction attrInterpolateNS(fullname, i) {\n return function(t) {\n this.setAttributeNS(fullname.space, fullname.local, i.call(this, t));\n };\n}\n\nfunction attrTweenNS(fullname, value) {\n var t0, i0;\n function tween() {\n var i = value.apply(this, arguments);\n if (i !== i0) t0 = (i0 = i) && attrInterpolateNS(fullname, i);\n return t0;\n }\n tween._value = value;\n return tween;\n}\n\nfunction attrTween(name, value) {\n var t0, i0;\n function tween() {\n var i = value.apply(this, arguments);\n if (i !== i0) t0 = (i0 = i) && attrInterpolate(name, i);\n return t0;\n }\n tween._value = value;\n return tween;\n}\n\nexport default function(name, value) {\n var key = \"attr.\" + name;\n if (arguments.length < 2) return (key = this.tween(key)) && key._value;\n if (value == null) return this.tween(key, null);\n if (typeof value !== \"function\") throw new Error;\n var fullname = namespace(name);\n return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value));\n}\n", "import {get, init} from \"./schedule.js\";\n\nfunction delayFunction(id, value) {\n return function() {\n init(this, id).delay = +value.apply(this, arguments);\n };\n}\n\nfunction delayConstant(id, value) {\n return value = +value, function() {\n init(this, id).delay = value;\n };\n}\n\nexport default function(value) {\n var id = this._id;\n\n return arguments.length\n ? this.each((typeof value === \"function\"\n ? delayFunction\n : delayConstant)(id, value))\n : get(this.node(), id).delay;\n}\n", "import {get, set} from \"./schedule.js\";\n\nfunction durationFunction(id, value) {\n return function() {\n set(this, id).duration = +value.apply(this, arguments);\n };\n}\n\nfunction durationConstant(id, value) {\n return value = +value, function() {\n set(this, id).duration = value;\n };\n}\n\nexport default function(value) {\n var id = this._id;\n\n return arguments.length\n ? this.each((typeof value === \"function\"\n ? durationFunction\n : durationConstant)(id, value))\n : get(this.node(), id).duration;\n}\n", "import {get, set} from \"./schedule.js\";\n\nfunction easeConstant(id, value) {\n if (typeof value !== \"function\") throw new Error;\n return function() {\n set(this, id).ease = value;\n };\n}\n\nexport default function(value) {\n var id = this._id;\n\n return arguments.length\n ? this.each(easeConstant(id, value))\n : get(this.node(), id).ease;\n}\n", "import {set} from \"./schedule.js\";\n\nfunction easeVarying(id, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (typeof v !== \"function\") throw new Error;\n set(this, id).ease = v;\n };\n}\n\nexport default function(value) {\n if (typeof value !== \"function\") throw new Error;\n return this.each(easeVarying(this._id, value));\n}\n", "import {matcher} from \"d3-selection\";\nimport {Transition} from \"./index.js\";\n\nexport default function(match) {\n if (typeof match !== \"function\") match = matcher(match);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {\n if ((node = group[i]) && match.call(node, node.__data__, i, group)) {\n subgroup.push(node);\n }\n }\n }\n\n return new Transition(subgroups, this._parents, this._name, this._id);\n}\n", "import {Transition} from \"./index.js\";\n\nexport default function(transition) {\n if (transition._id !== this._id) throw new Error;\n\n for (var groups0 = this._groups, groups1 = transition._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {\n for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {\n if (node = group0[i] || group1[i]) {\n merge[i] = node;\n }\n }\n }\n\n for (; j < m0; ++j) {\n merges[j] = groups0[j];\n }\n\n return new Transition(merges, this._parents, this._name, this._id);\n}\n", "import {get, set, init} from \"./schedule.js\";\n\nfunction start(name) {\n return (name + \"\").trim().split(/^|\\s+/).every(function(t) {\n var i = t.indexOf(\".\");\n if (i >= 0) t = t.slice(0, i);\n return !t || t === \"start\";\n });\n}\n\nfunction onFunction(id, name, listener) {\n var on0, on1, sit = start(name) ? init : set;\n return function() {\n var schedule = sit(this, id),\n on = schedule.on;\n\n // If this node shared a dispatch with the previous node,\n // just assign the updated shared dispatch and we’re done!\n // Otherwise, copy-on-write.\n if (on !== on0) (on1 = (on0 = on).copy()).on(name, listener);\n\n schedule.on = on1;\n };\n}\n\nexport default function(name, listener) {\n var id = this._id;\n\n return arguments.length < 2\n ? get(this.node(), id).on.on(name)\n : this.each(onFunction(id, name, listener));\n}\n", "function removeFunction(id) {\n return function() {\n var parent = this.parentNode;\n for (var i in this.__transition) if (+i !== id) return;\n if (parent) parent.removeChild(this);\n };\n}\n\nexport default function() {\n return this.on(\"end.remove\", removeFunction(this._id));\n}\n", "import {selector} from \"d3-selection\";\nimport {Transition} from \"./index.js\";\nimport schedule, {get} from \"./schedule.js\";\n\nexport default function(select) {\n var name = this._name,\n id = this._id;\n\n if (typeof select !== \"function\") select = selector(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {\n if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {\n if (\"__data__\" in node) subnode.__data__ = node.__data__;\n subgroup[i] = subnode;\n schedule(subgroup[i], name, id, i, subgroup, get(node, id));\n }\n }\n }\n\n return new Transition(subgroups, this._parents, name, id);\n}\n", "import {selectorAll} from \"d3-selection\";\nimport {Transition} from \"./index.js\";\nimport schedule, {get} from \"./schedule.js\";\n\nexport default function(select) {\n var name = this._name,\n id = this._id;\n\n if (typeof select !== \"function\") select = selectorAll(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n for (var children = select.call(node, node.__data__, i, group), child, inherit = get(node, id), k = 0, l = children.length; k < l; ++k) {\n if (child = children[k]) {\n schedule(child, name, id, k, children, inherit);\n }\n }\n subgroups.push(children);\n parents.push(node);\n }\n }\n }\n\n return new Transition(subgroups, parents, name, id);\n}\n", "import {selection} from \"d3-selection\";\n\nvar Selection = selection.prototype.constructor;\n\nexport default function() {\n return new Selection(this._groups, this._parents);\n}\n", "import {interpolateTransformCss as interpolateTransform} from \"d3-interpolate\";\nimport {style} from \"d3-selection\";\nimport {set} from \"./schedule.js\";\nimport {tweenValue} from \"./tween.js\";\nimport interpolate from \"./interpolate.js\";\n\nfunction styleNull(name, interpolate) {\n var string00,\n string10,\n interpolate0;\n return function() {\n var string0 = style(this, name),\n string1 = (this.style.removeProperty(name), style(this, name));\n return string0 === string1 ? null\n : string0 === string00 && string1 === string10 ? interpolate0\n : interpolate0 = interpolate(string00 = string0, string10 = string1);\n };\n}\n\nfunction styleRemove(name) {\n return function() {\n this.style.removeProperty(name);\n };\n}\n\nfunction styleConstant(name, interpolate, value1) {\n var string00,\n string1 = value1 + \"\",\n interpolate0;\n return function() {\n var string0 = style(this, name);\n return string0 === string1 ? null\n : string0 === string00 ? interpolate0\n : interpolate0 = interpolate(string00 = string0, value1);\n };\n}\n\nfunction styleFunction(name, interpolate, value) {\n var string00,\n string10,\n interpolate0;\n return function() {\n var string0 = style(this, name),\n value1 = value(this),\n string1 = value1 + \"\";\n if (value1 == null) string1 = value1 = (this.style.removeProperty(name), style(this, name));\n return string0 === string1 ? null\n : string0 === string00 && string1 === string10 ? interpolate0\n : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));\n };\n}\n\nfunction styleMaybeRemove(id, name) {\n var on0, on1, listener0, key = \"style.\" + name, event = \"end.\" + key, remove;\n return function() {\n var schedule = set(this, id),\n on = schedule.on,\n listener = schedule.value[key] == null ? remove || (remove = styleRemove(name)) : undefined;\n\n // If this node shared a dispatch with the previous node,\n // just assign the updated shared dispatch and we’re done!\n // Otherwise, copy-on-write.\n if (on !== on0 || listener0 !== listener) (on1 = (on0 = on).copy()).on(event, listener0 = listener);\n\n schedule.on = on1;\n };\n}\n\nexport default function(name, value, priority) {\n var i = (name += \"\") === \"transform\" ? interpolateTransform : interpolate;\n return value == null ? this\n .styleTween(name, styleNull(name, i))\n .on(\"end.style.\" + name, styleRemove(name))\n : typeof value === \"function\" ? this\n .styleTween(name, styleFunction(name, i, tweenValue(this, \"style.\" + name, value)))\n .each(styleMaybeRemove(this._id, name))\n : this\n .styleTween(name, styleConstant(name, i, value), priority)\n .on(\"end.style.\" + name, null);\n}\n", "function styleInterpolate(name, i, priority) {\n return function(t) {\n this.style.setProperty(name, i.call(this, t), priority);\n };\n}\n\nfunction styleTween(name, value, priority) {\n var t, i0;\n function tween() {\n var i = value.apply(this, arguments);\n if (i !== i0) t = (i0 = i) && styleInterpolate(name, i, priority);\n return t;\n }\n tween._value = value;\n return tween;\n}\n\nexport default function(name, value, priority) {\n var key = \"style.\" + (name += \"\");\n if (arguments.length < 2) return (key = this.tween(key)) && key._value;\n if (value == null) return this.tween(key, null);\n if (typeof value !== \"function\") throw new Error;\n return this.tween(key, styleTween(name, value, priority == null ? \"\" : priority));\n}\n", "import {tweenValue} from \"./tween.js\";\n\nfunction textConstant(value) {\n return function() {\n this.textContent = value;\n };\n}\n\nfunction textFunction(value) {\n return function() {\n var value1 = value(this);\n this.textContent = value1 == null ? \"\" : value1;\n };\n}\n\nexport default function(value) {\n return this.tween(\"text\", typeof value === \"function\"\n ? textFunction(tweenValue(this, \"text\", value))\n : textConstant(value == null ? \"\" : value + \"\"));\n}\n", "function textInterpolate(i) {\n return function(t) {\n this.textContent = i.call(this, t);\n };\n}\n\nfunction textTween(value) {\n var t0, i0;\n function tween() {\n var i = value.apply(this, arguments);\n if (i !== i0) t0 = (i0 = i) && textInterpolate(i);\n return t0;\n }\n tween._value = value;\n return tween;\n}\n\nexport default function(value) {\n var key = \"text\";\n if (arguments.length < 1) return (key = this.tween(key)) && key._value;\n if (value == null) return this.tween(key, null);\n if (typeof value !== \"function\") throw new Error;\n return this.tween(key, textTween(value));\n}\n", "import {Transition, newId} from \"./index.js\";\nimport schedule, {get} from \"./schedule.js\";\n\nexport default function() {\n var name = this._name,\n id0 = this._id,\n id1 = newId();\n\n for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n var inherit = get(node, id0);\n schedule(node, name, id1, i, group, {\n time: inherit.time + inherit.delay + inherit.duration,\n delay: 0,\n duration: inherit.duration,\n ease: inherit.ease\n });\n }\n }\n }\n\n return new Transition(groups, this._parents, name, id1);\n}\n", "import {set} from \"./schedule.js\";\n\nexport default function() {\n var on0, on1, that = this, id = that._id, size = that.size();\n return new Promise(function(resolve, reject) {\n var cancel = {value: reject},\n end = {value: function() { if (--size === 0) resolve(); }};\n\n that.each(function() {\n var schedule = set(this, id),\n on = schedule.on;\n\n // If this node shared a dispatch with the previous node,\n // just assign the updated shared dispatch and we’re done!\n // Otherwise, copy-on-write.\n if (on !== on0) {\n on1 = (on0 = on).copy();\n on1._.cancel.push(cancel);\n on1._.interrupt.push(cancel);\n on1._.end.push(end);\n }\n\n schedule.on = on1;\n });\n\n // The selection was empty, resolve end immediately\n if (size === 0) resolve();\n });\n}\n", "import {selection} from \"d3-selection\";\nimport transition_attr from \"./attr.js\";\nimport transition_attrTween from \"./attrTween.js\";\nimport transition_delay from \"./delay.js\";\nimport transition_duration from \"./duration.js\";\nimport transition_ease from \"./ease.js\";\nimport transition_easeVarying from \"./easeVarying.js\";\nimport transition_filter from \"./filter.js\";\nimport transition_merge from \"./merge.js\";\nimport transition_on from \"./on.js\";\nimport transition_remove from \"./remove.js\";\nimport transition_select from \"./select.js\";\nimport transition_selectAll from \"./selectAll.js\";\nimport transition_selection from \"./selection.js\";\nimport transition_style from \"./style.js\";\nimport transition_styleTween from \"./styleTween.js\";\nimport transition_text from \"./text.js\";\nimport transition_textTween from \"./textTween.js\";\nimport transition_transition from \"./transition.js\";\nimport transition_tween from \"./tween.js\";\nimport transition_end from \"./end.js\";\n\nvar id = 0;\n\nexport function Transition(groups, parents, name, id) {\n this._groups = groups;\n this._parents = parents;\n this._name = name;\n this._id = id;\n}\n\nexport default function transition(name) {\n return selection().transition(name);\n}\n\nexport function newId() {\n return ++id;\n}\n\nvar selection_prototype = selection.prototype;\n\nTransition.prototype = transition.prototype = {\n constructor: Transition,\n select: transition_select,\n selectAll: transition_selectAll,\n selectChild: selection_prototype.selectChild,\n selectChildren: selection_prototype.selectChildren,\n filter: transition_filter,\n merge: transition_merge,\n selection: transition_selection,\n transition: transition_transition,\n call: selection_prototype.call,\n nodes: selection_prototype.nodes,\n node: selection_prototype.node,\n size: selection_prototype.size,\n empty: selection_prototype.empty,\n each: selection_prototype.each,\n on: transition_on,\n attr: transition_attr,\n attrTween: transition_attrTween,\n style: transition_style,\n styleTween: transition_styleTween,\n text: transition_text,\n textTween: transition_textTween,\n remove: transition_remove,\n tween: transition_tween,\n delay: transition_delay,\n duration: transition_duration,\n ease: transition_ease,\n easeVarying: transition_easeVarying,\n end: transition_end,\n [Symbol.iterator]: selection_prototype[Symbol.iterator]\n};\n", "export function cubicIn(t) {\n return t * t * t;\n}\n\nexport function cubicOut(t) {\n return --t * t * t + 1;\n}\n\nexport function cubicInOut(t) {\n return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;\n}\n", "var exponent = 3;\n\nexport var polyIn = (function custom(e) {\n e = +e;\n\n function polyIn(t) {\n return Math.pow(t, e);\n }\n\n polyIn.exponent = custom;\n\n return polyIn;\n})(exponent);\n\nexport var polyOut = (function custom(e) {\n e = +e;\n\n function polyOut(t) {\n return 1 - Math.pow(1 - t, e);\n }\n\n polyOut.exponent = custom;\n\n return polyOut;\n})(exponent);\n\nexport var polyInOut = (function custom(e) {\n e = +e;\n\n function polyInOut(t) {\n return ((t *= 2) <= 1 ? Math.pow(t, e) : 2 - Math.pow(2 - t, e)) / 2;\n }\n\n polyInOut.exponent = custom;\n\n return polyInOut;\n})(exponent);\n", "var pi = Math.PI,\n halfPi = pi / 2;\n\nexport function sinIn(t) {\n return (+t === 1) ? 1 : 1 - Math.cos(t * halfPi);\n}\n\nexport function sinOut(t) {\n return Math.sin(t * halfPi);\n}\n\nexport function sinInOut(t) {\n return (1 - Math.cos(pi * t)) / 2;\n}\n", "// tpmt is two power minus ten times t scaled to [0,1]\nexport function tpmt(x) {\n return (Math.pow(2, -10 * x) - 0.0009765625) * 1.0009775171065494;\n}\n", "var b1 = 4 / 11,\n b2 = 6 / 11,\n b3 = 8 / 11,\n b4 = 3 / 4,\n b5 = 9 / 11,\n b6 = 10 / 11,\n b7 = 15 / 16,\n b8 = 21 / 22,\n b9 = 63 / 64,\n b0 = 1 / b1 / b1;\n\nexport function bounceIn(t) {\n return 1 - bounceOut(1 - t);\n}\n\nexport function bounceOut(t) {\n return (t = +t) < b1 ? b0 * t * t : t < b3 ? b0 * (t -= b2) * t + b4 : t < b6 ? b0 * (t -= b5) * t + b7 : b0 * (t -= b8) * t + b9;\n}\n\nexport function bounceInOut(t) {\n return ((t *= 2) <= 1 ? 1 - bounceOut(1 - t) : bounceOut(t - 1) + 1) / 2;\n}\n", "var overshoot = 1.70158;\n\nexport var backIn = (function custom(s) {\n s = +s;\n\n function backIn(t) {\n return (t = +t) * t * (s * (t - 1) + t);\n }\n\n backIn.overshoot = custom;\n\n return backIn;\n})(overshoot);\n\nexport var backOut = (function custom(s) {\n s = +s;\n\n function backOut(t) {\n return --t * t * ((t + 1) * s + t) + 1;\n }\n\n backOut.overshoot = custom;\n\n return backOut;\n})(overshoot);\n\nexport var backInOut = (function custom(s) {\n s = +s;\n\n function backInOut(t) {\n return ((t *= 2) < 1 ? t * t * ((s + 1) * t - s) : (t -= 2) * t * ((s + 1) * t + s) + 2) / 2;\n }\n\n backInOut.overshoot = custom;\n\n return backInOut;\n})(overshoot);\n", "import {tpmt} from \"./math.js\";\n\nvar tau = 2 * Math.PI,\n amplitude = 1,\n period = 0.3;\n\nexport var elasticIn = (function custom(a, p) {\n var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);\n\n function elasticIn(t) {\n return a * tpmt(-(--t)) * Math.sin((s - t) / p);\n }\n\n elasticIn.amplitude = function(a) { return custom(a, p * tau); };\n elasticIn.period = function(p) { return custom(a, p); };\n\n return elasticIn;\n})(amplitude, period);\n\nexport var elasticOut = (function custom(a, p) {\n var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);\n\n function elasticOut(t) {\n return 1 - a * tpmt(t = +t) * Math.sin((t + s) / p);\n }\n\n elasticOut.amplitude = function(a) { return custom(a, p * tau); };\n elasticOut.period = function(p) { return custom(a, p); };\n\n return elasticOut;\n})(amplitude, period);\n\nexport var elasticInOut = (function custom(a, p) {\n var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);\n\n function elasticInOut(t) {\n return ((t = t * 2 - 1) < 0\n ? a * tpmt(-t) * Math.sin((s - t) / p)\n : 2 - a * tpmt(t) * Math.sin((s + t) / p)) / 2;\n }\n\n elasticInOut.amplitude = function(a) { return custom(a, p * tau); };\n elasticInOut.period = function(p) { return custom(a, p); };\n\n return elasticInOut;\n})(amplitude, period);\n", "import {Transition, newId} from \"../transition/index.js\";\nimport schedule from \"../transition/schedule.js\";\nimport {easeCubicInOut} from \"d3-ease\";\nimport {now} from \"d3-timer\";\n\nvar defaultTiming = {\n time: null, // Set on use.\n delay: 0,\n duration: 250,\n ease: easeCubicInOut\n};\n\nfunction inherit(node, id) {\n var timing;\n while (!(timing = node.__transition) || !(timing = timing[id])) {\n if (!(node = node.parentNode)) {\n throw new Error(`transition ${id} not found`);\n }\n }\n return timing;\n}\n\nexport default function(name) {\n var id,\n timing;\n\n if (name instanceof Transition) {\n id = name._id, name = name._name;\n } else {\n id = newId(), (timing = defaultTiming).time = now(), name = name == null ? null : name + \"\";\n }\n\n for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n schedule(node, name, id, i, group, timing || inherit(node, id));\n }\n }\n }\n\n return new Transition(groups, this._parents, name, id);\n}\n", "import {selection} from \"d3-selection\";\nimport selection_interrupt from \"./interrupt.js\";\nimport selection_transition from \"./transition.js\";\n\nselection.prototype.interrupt = selection_interrupt;\nselection.prototype.transition = selection_transition;\n", "export default x => () => x;\n", "export default function ZoomEvent(type, {\n sourceEvent,\n target,\n transform,\n dispatch\n}) {\n Object.defineProperties(this, {\n type: {value: type, enumerable: true, configurable: true},\n sourceEvent: {value: sourceEvent, enumerable: true, configurable: true},\n target: {value: target, enumerable: true, configurable: true},\n transform: {value: transform, enumerable: true, configurable: true},\n _: {value: dispatch}\n });\n}\n", "export function Transform(k, x, y) {\n this.k = k;\n this.x = x;\n this.y = y;\n}\n\nTransform.prototype = {\n constructor: Transform,\n scale: function(k) {\n return k === 1 ? this : new Transform(this.k * k, this.x, this.y);\n },\n translate: function(x, y) {\n return x === 0 & y === 0 ? this : new Transform(this.k, this.x + this.k * x, this.y + this.k * y);\n },\n apply: function(point) {\n return [point[0] * this.k + this.x, point[1] * this.k + this.y];\n },\n applyX: function(x) {\n return x * this.k + this.x;\n },\n applyY: function(y) {\n return y * this.k + this.y;\n },\n invert: function(location) {\n return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k];\n },\n invertX: function(x) {\n return (x - this.x) / this.k;\n },\n invertY: function(y) {\n return (y - this.y) / this.k;\n },\n rescaleX: function(x) {\n return x.copy().domain(x.range().map(this.invertX, this).map(x.invert, x));\n },\n rescaleY: function(y) {\n return y.copy().domain(y.range().map(this.invertY, this).map(y.invert, y));\n },\n toString: function() {\n return \"translate(\" + this.x + \",\" + this.y + \") scale(\" + this.k + \")\";\n }\n};\n\nexport var identity = new Transform(1, 0, 0);\n\ntransform.prototype = Transform.prototype;\n\nexport default function transform(node) {\n while (!node.__zoom) if (!(node = node.parentNode)) return identity;\n return node.__zoom;\n}\n", "export function nopropagation(event) {\n event.stopImmediatePropagation();\n}\n\nexport default function(event) {\n event.preventDefault();\n event.stopImmediatePropagation();\n}\n", "import {dispatch} from \"d3-dispatch\";\nimport {dragDisable, dragEnable} from \"d3-drag\";\nimport {interpolateZoom} from \"d3-interpolate\";\nimport {select, pointer} from \"d3-selection\";\nimport {interrupt} from \"d3-transition\";\nimport constant from \"./constant.js\";\nimport ZoomEvent from \"./event.js\";\nimport {Transform, identity} from \"./transform.js\";\nimport noevent, {nopropagation} from \"./noevent.js\";\n\n// Ignore right-click, since that should open the context menu.\n// except for pinch-to-zoom, which is sent as a wheel+ctrlKey event\nfunction defaultFilter(event) {\n return (!event.ctrlKey || event.type === 'wheel') && !event.button;\n}\n\nfunction defaultExtent() {\n var e = this;\n if (e instanceof SVGElement) {\n e = e.ownerSVGElement || e;\n if (e.hasAttribute(\"viewBox\")) {\n e = e.viewBox.baseVal;\n return [[e.x, e.y], [e.x + e.width, e.y + e.height]];\n }\n return [[0, 0], [e.width.baseVal.value, e.height.baseVal.value]];\n }\n return [[0, 0], [e.clientWidth, e.clientHeight]];\n}\n\nfunction defaultTransform() {\n return this.__zoom || identity;\n}\n\nfunction defaultWheelDelta(event) {\n return -event.deltaY * (event.deltaMode === 1 ? 0.05 : event.deltaMode ? 1 : 0.002) * (event.ctrlKey ? 10 : 1);\n}\n\nfunction defaultTouchable() {\n return navigator.maxTouchPoints || (\"ontouchstart\" in this);\n}\n\nfunction defaultConstrain(transform, extent, translateExtent) {\n var dx0 = transform.invertX(extent[0][0]) - translateExtent[0][0],\n dx1 = transform.invertX(extent[1][0]) - translateExtent[1][0],\n dy0 = transform.invertY(extent[0][1]) - translateExtent[0][1],\n dy1 = transform.invertY(extent[1][1]) - translateExtent[1][1];\n return transform.translate(\n dx1 > dx0 ? (dx0 + dx1) / 2 : Math.min(0, dx0) || Math.max(0, dx1),\n dy1 > dy0 ? (dy0 + dy1) / 2 : Math.min(0, dy0) || Math.max(0, dy1)\n );\n}\n\nexport default function() {\n var filter = defaultFilter,\n extent = defaultExtent,\n constrain = defaultConstrain,\n wheelDelta = defaultWheelDelta,\n touchable = defaultTouchable,\n scaleExtent = [0, Infinity],\n translateExtent = [[-Infinity, -Infinity], [Infinity, Infinity]],\n duration = 250,\n interpolate = interpolateZoom,\n listeners = dispatch(\"start\", \"zoom\", \"end\"),\n touchstarting,\n touchfirst,\n touchending,\n touchDelay = 500,\n wheelDelay = 150,\n clickDistance2 = 0,\n tapDistance = 10;\n\n function zoom(selection) {\n selection\n .property(\"__zoom\", defaultTransform)\n .on(\"wheel.zoom\", wheeled, {passive: false})\n .on(\"mousedown.zoom\", mousedowned)\n .on(\"dblclick.zoom\", dblclicked)\n .filter(touchable)\n .on(\"touchstart.zoom\", touchstarted)\n .on(\"touchmove.zoom\", touchmoved)\n .on(\"touchend.zoom touchcancel.zoom\", touchended)\n .style(\"-webkit-tap-highlight-color\", \"rgba(0,0,0,0)\");\n }\n\n zoom.transform = function(collection, transform, point, event) {\n var selection = collection.selection ? collection.selection() : collection;\n selection.property(\"__zoom\", defaultTransform);\n if (collection !== selection) {\n schedule(collection, transform, point, event);\n } else {\n selection.interrupt().each(function() {\n gesture(this, arguments)\n .event(event)\n .start()\n .zoom(null, typeof transform === \"function\" ? transform.apply(this, arguments) : transform)\n .end();\n });\n }\n };\n\n zoom.scaleBy = function(selection, k, p, event) {\n zoom.scaleTo(selection, function() {\n var k0 = this.__zoom.k,\n k1 = typeof k === \"function\" ? k.apply(this, arguments) : k;\n return k0 * k1;\n }, p, event);\n };\n\n zoom.scaleTo = function(selection, k, p, event) {\n zoom.transform(selection, function() {\n var e = extent.apply(this, arguments),\n t0 = this.__zoom,\n p0 = p == null ? centroid(e) : typeof p === \"function\" ? p.apply(this, arguments) : p,\n p1 = t0.invert(p0),\n k1 = typeof k === \"function\" ? k.apply(this, arguments) : k;\n return constrain(translate(scale(t0, k1), p0, p1), e, translateExtent);\n }, p, event);\n };\n\n zoom.translateBy = function(selection, x, y, event) {\n zoom.transform(selection, function() {\n return constrain(this.__zoom.translate(\n typeof x === \"function\" ? x.apply(this, arguments) : x,\n typeof y === \"function\" ? y.apply(this, arguments) : y\n ), extent.apply(this, arguments), translateExtent);\n }, null, event);\n };\n\n zoom.translateTo = function(selection, x, y, p, event) {\n zoom.transform(selection, function() {\n var e = extent.apply(this, arguments),\n t = this.__zoom,\n p0 = p == null ? centroid(e) : typeof p === \"function\" ? p.apply(this, arguments) : p;\n return constrain(identity.translate(p0[0], p0[1]).scale(t.k).translate(\n typeof x === \"function\" ? -x.apply(this, arguments) : -x,\n typeof y === \"function\" ? -y.apply(this, arguments) : -y\n ), e, translateExtent);\n }, p, event);\n };\n\n function scale(transform, k) {\n k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], k));\n return k === transform.k ? transform : new Transform(k, transform.x, transform.y);\n }\n\n function translate(transform, p0, p1) {\n var x = p0[0] - p1[0] * transform.k, y = p0[1] - p1[1] * transform.k;\n return x === transform.x && y === transform.y ? transform : new Transform(transform.k, x, y);\n }\n\n function centroid(extent) {\n return [(+extent[0][0] + +extent[1][0]) / 2, (+extent[0][1] + +extent[1][1]) / 2];\n }\n\n function schedule(transition, transform, point, event) {\n transition\n .on(\"start.zoom\", function() { gesture(this, arguments).event(event).start(); })\n .on(\"interrupt.zoom end.zoom\", function() { gesture(this, arguments).event(event).end(); })\n .tween(\"zoom\", function() {\n var that = this,\n args = arguments,\n g = gesture(that, args).event(event),\n e = extent.apply(that, args),\n p = point == null ? centroid(e) : typeof point === \"function\" ? point.apply(that, args) : point,\n w = Math.max(e[1][0] - e[0][0], e[1][1] - e[0][1]),\n a = that.__zoom,\n b = typeof transform === \"function\" ? transform.apply(that, args) : transform,\n i = interpolate(a.invert(p).concat(w / a.k), b.invert(p).concat(w / b.k));\n return function(t) {\n if (t === 1) t = b; // Avoid rounding error on end.\n else { var l = i(t), k = w / l[2]; t = new Transform(k, p[0] - l[0] * k, p[1] - l[1] * k); }\n g.zoom(null, t);\n };\n });\n }\n\n function gesture(that, args, clean) {\n return (!clean && that.__zooming) || new Gesture(that, args);\n }\n\n function Gesture(that, args) {\n this.that = that;\n this.args = args;\n this.active = 0;\n this.sourceEvent = null;\n this.extent = extent.apply(that, args);\n this.taps = 0;\n }\n\n Gesture.prototype = {\n event: function(event) {\n if (event) this.sourceEvent = event;\n return this;\n },\n start: function() {\n if (++this.active === 1) {\n this.that.__zooming = this;\n this.emit(\"start\");\n }\n return this;\n },\n zoom: function(key, transform) {\n if (this.mouse && key !== \"mouse\") this.mouse[1] = transform.invert(this.mouse[0]);\n if (this.touch0 && key !== \"touch\") this.touch0[1] = transform.invert(this.touch0[0]);\n if (this.touch1 && key !== \"touch\") this.touch1[1] = transform.invert(this.touch1[0]);\n this.that.__zoom = transform;\n this.emit(\"zoom\");\n return this;\n },\n end: function() {\n if (--this.active === 0) {\n delete this.that.__zooming;\n this.emit(\"end\");\n }\n return this;\n },\n emit: function(type) {\n var d = select(this.that).datum();\n listeners.call(\n type,\n this.that,\n new ZoomEvent(type, {\n sourceEvent: this.sourceEvent,\n target: zoom,\n type,\n transform: this.that.__zoom,\n dispatch: listeners\n }),\n d\n );\n }\n };\n\n function wheeled(event, ...args) {\n if (!filter.apply(this, arguments)) return;\n var g = gesture(this, args).event(event),\n t = this.__zoom,\n k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], t.k * Math.pow(2, wheelDelta.apply(this, arguments)))),\n p = pointer(event);\n\n // If the mouse is in the same location as before, reuse it.\n // If there were recent wheel events, reset the wheel idle timeout.\n if (g.wheel) {\n if (g.mouse[0][0] !== p[0] || g.mouse[0][1] !== p[1]) {\n g.mouse[1] = t.invert(g.mouse[0] = p);\n }\n clearTimeout(g.wheel);\n }\n\n // If this wheel event won’t trigger a transform change, ignore it.\n else if (t.k === k) return;\n\n // Otherwise, capture the mouse point and location at the start.\n else {\n g.mouse = [p, t.invert(p)];\n interrupt(this);\n g.start();\n }\n\n noevent(event);\n g.wheel = setTimeout(wheelidled, wheelDelay);\n g.zoom(\"mouse\", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent, translateExtent));\n\n function wheelidled() {\n g.wheel = null;\n g.end();\n }\n }\n\n function mousedowned(event, ...args) {\n if (touchending || !filter.apply(this, arguments)) return;\n var currentTarget = event.currentTarget,\n g = gesture(this, args, true).event(event),\n v = select(event.view).on(\"mousemove.zoom\", mousemoved, true).on(\"mouseup.zoom\", mouseupped, true),\n p = pointer(event, currentTarget),\n x0 = event.clientX,\n y0 = event.clientY;\n\n dragDisable(event.view);\n nopropagation(event);\n g.mouse = [p, this.__zoom.invert(p)];\n interrupt(this);\n g.start();\n\n function mousemoved(event) {\n noevent(event);\n if (!g.moved) {\n var dx = event.clientX - x0, dy = event.clientY - y0;\n g.moved = dx * dx + dy * dy > clickDistance2;\n }\n g.event(event)\n .zoom(\"mouse\", constrain(translate(g.that.__zoom, g.mouse[0] = pointer(event, currentTarget), g.mouse[1]), g.extent, translateExtent));\n }\n\n function mouseupped(event) {\n v.on(\"mousemove.zoom mouseup.zoom\", null);\n dragEnable(event.view, g.moved);\n noevent(event);\n g.event(event).end();\n }\n }\n\n function dblclicked(event, ...args) {\n if (!filter.apply(this, arguments)) return;\n var t0 = this.__zoom,\n p0 = pointer(event.changedTouches ? event.changedTouches[0] : event, this),\n p1 = t0.invert(p0),\n k1 = t0.k * (event.shiftKey ? 0.5 : 2),\n t1 = constrain(translate(scale(t0, k1), p0, p1), extent.apply(this, args), translateExtent);\n\n noevent(event);\n if (duration > 0) select(this).transition().duration(duration).call(schedule, t1, p0, event);\n else select(this).call(zoom.transform, t1, p0, event);\n }\n\n function touchstarted(event, ...args) {\n if (!filter.apply(this, arguments)) return;\n var touches = event.touches,\n n = touches.length,\n g = gesture(this, args, event.changedTouches.length === n).event(event),\n started, i, t, p;\n\n nopropagation(event);\n for (i = 0; i < n; ++i) {\n t = touches[i], p = pointer(t, this);\n p = [p, this.__zoom.invert(p), t.identifier];\n if (!g.touch0) g.touch0 = p, started = true, g.taps = 1 + !!touchstarting;\n else if (!g.touch1 && g.touch0[2] !== p[2]) g.touch1 = p, g.taps = 0;\n }\n\n if (touchstarting) touchstarting = clearTimeout(touchstarting);\n\n if (started) {\n if (g.taps < 2) touchfirst = p[0], touchstarting = setTimeout(function() { touchstarting = null; }, touchDelay);\n interrupt(this);\n g.start();\n }\n }\n\n function touchmoved(event, ...args) {\n if (!this.__zooming) return;\n var g = gesture(this, args).event(event),\n touches = event.changedTouches,\n n = touches.length, i, t, p, l;\n\n noevent(event);\n for (i = 0; i < n; ++i) {\n t = touches[i], p = pointer(t, this);\n if (g.touch0 && g.touch0[2] === t.identifier) g.touch0[0] = p;\n else if (g.touch1 && g.touch1[2] === t.identifier) g.touch1[0] = p;\n }\n t = g.that.__zoom;\n if (g.touch1) {\n var p0 = g.touch0[0], l0 = g.touch0[1],\n p1 = g.touch1[0], l1 = g.touch1[1],\n dp = (dp = p1[0] - p0[0]) * dp + (dp = p1[1] - p0[1]) * dp,\n dl = (dl = l1[0] - l0[0]) * dl + (dl = l1[1] - l0[1]) * dl;\n t = scale(t, Math.sqrt(dp / dl));\n p = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2];\n l = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2];\n }\n else if (g.touch0) p = g.touch0[0], l = g.touch0[1];\n else return;\n\n g.zoom(\"touch\", constrain(translate(t, p, l), g.extent, translateExtent));\n }\n\n function touchended(event, ...args) {\n if (!this.__zooming) return;\n var g = gesture(this, args).event(event),\n touches = event.changedTouches,\n n = touches.length, i, t;\n\n nopropagation(event);\n if (touchending) clearTimeout(touchending);\n touchending = setTimeout(function() { touchending = null; }, touchDelay);\n for (i = 0; i < n; ++i) {\n t = touches[i];\n if (g.touch0 && g.touch0[2] === t.identifier) delete g.touch0;\n else if (g.touch1 && g.touch1[2] === t.identifier) delete g.touch1;\n }\n if (g.touch1 && !g.touch0) g.touch0 = g.touch1, delete g.touch1;\n if (g.touch0) g.touch0[1] = this.__zoom.invert(g.touch0[0]);\n else {\n g.end();\n // If this was a dbltap, reroute to the (optional) dblclick.zoom handler.\n if (g.taps === 2) {\n t = pointer(t, this);\n if (Math.hypot(touchfirst[0] - t[0], touchfirst[1] - t[1]) < tapDistance) {\n var p = select(this).on(\"dblclick.zoom\");\n if (p) p.apply(this, arguments);\n }\n }\n }\n }\n\n zoom.wheelDelta = function(_) {\n return arguments.length ? (wheelDelta = typeof _ === \"function\" ? _ : constant(+_), zoom) : wheelDelta;\n };\n\n zoom.filter = function(_) {\n return arguments.length ? (filter = typeof _ === \"function\" ? _ : constant(!!_), zoom) : filter;\n };\n\n zoom.touchable = function(_) {\n return arguments.length ? (touchable = typeof _ === \"function\" ? _ : constant(!!_), zoom) : touchable;\n };\n\n zoom.extent = function(_) {\n return arguments.length ? (extent = typeof _ === \"function\" ? _ : constant([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent;\n };\n\n zoom.scaleExtent = function(_) {\n return arguments.length ? (scaleExtent[0] = +_[0], scaleExtent[1] = +_[1], zoom) : [scaleExtent[0], scaleExtent[1]];\n };\n\n zoom.translateExtent = function(_) {\n return arguments.length ? (translateExtent[0][0] = +_[0][0], translateExtent[1][0] = +_[1][0], translateExtent[0][1] = +_[0][1], translateExtent[1][1] = +_[1][1], zoom) : [[translateExtent[0][0], translateExtent[0][1]], [translateExtent[1][0], translateExtent[1][1]]];\n };\n\n zoom.constrain = function(_) {\n return arguments.length ? (constrain = _, zoom) : constrain;\n };\n\n zoom.duration = function(_) {\n return arguments.length ? (duration = +_, zoom) : duration;\n };\n\n zoom.interpolate = function(_) {\n return arguments.length ? (interpolate = _, zoom) : interpolate;\n };\n\n zoom.on = function() {\n var value = listeners.on.apply(listeners, arguments);\n return value === listeners ? zoom : value;\n };\n\n zoom.clickDistance = function(_) {\n return arguments.length ? (clickDistance2 = (_ = +_) * _, zoom) : Math.sqrt(clickDistance2);\n };\n\n zoom.tapDistance = function(_) {\n return arguments.length ? (tapDistance = +_, zoom) : tapDistance;\n };\n\n return zoom;\n}\n", "import { drag } from 'd3-drag';\nimport { select, pointer } from 'd3-selection';\nimport { zoom, zoomIdentity, zoomTransform } from 'd3-zoom';\nimport { interpolateZoom, interpolate } from 'd3-interpolate';\n\nconst errorMessages = {\n error001: () => '[React Flow]: Seems like you have not used zustand provider as an ancestor. Help: https://reactflow.dev/error#001',\n error002: () => \"It looks like you've created a new nodeTypes or edgeTypes object. If this wasn't on purpose please define the nodeTypes/edgeTypes outside of the component or memoize them.\",\n error003: (nodeType) => `Node type \"${nodeType}\" not found. Using fallback type \"default\".`,\n error004: () => 'The React Flow parent container needs a width and a height to render the graph.',\n error005: () => 'Only child nodes can use a parent extent.',\n error006: () => \"Can't create edge. An edge needs a source and a target.\",\n error007: (id) => `The old edge with id=${id} does not exist.`,\n error009: (type) => `Marker type \"${type}\" doesn't exist.`,\n error008: (handleType, { id, sourceHandle, targetHandle }) => `Couldn't create edge for ${handleType} handle id: \"${handleType === 'source' ? sourceHandle : targetHandle}\", edge id: ${id}.`,\n error010: () => 'Handle: No node id found. Make sure to only use a Handle inside a custom Node.',\n error011: (edgeType) => `Edge type \"${edgeType}\" not found. Using fallback type \"default\".`,\n error012: (id) => `Node with id \"${id}\" does not exist, it may have been removed. This can happen when a node is deleted before the \"onNodeClick\" handler is called.`,\n error013: (lib = 'react') => `It seems that you haven't loaded the styles. Please import '@xyflow/${lib}/dist/style.css' or base.css to make sure everything is working properly.`,\n error014: () => 'useNodeConnections: No node ID found. Call useNodeConnections inside a custom Node or provide a node ID.',\n error015: () => 'It seems that you are trying to drag a node that is not initialized. Please use onNodesChange as explained in the docs.',\n};\nconst infiniteExtent = [\n [Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY],\n [Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY],\n];\nconst elementSelectionKeys = ['Enter', ' ', 'Escape'];\nconst defaultAriaLabelConfig = {\n 'node.a11yDescription.default': 'Press enter or space to select a node. Press delete to remove it and escape to cancel.',\n 'node.a11yDescription.keyboardDisabled': 'Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.',\n 'node.a11yDescription.ariaLiveMessage': ({ direction, x, y }) => `Moved selected node ${direction}. New position, x: ${x}, y: ${y}`,\n 'edge.a11yDescription.default': 'Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.',\n // Control elements\n 'controls.ariaLabel': 'Control Panel',\n 'controls.zoomIn.ariaLabel': 'Zoom In',\n 'controls.zoomOut.ariaLabel': 'Zoom Out',\n 'controls.fitView.ariaLabel': 'Fit View',\n 'controls.interactive.ariaLabel': 'Toggle Interactivity',\n // Mini map\n 'minimap.ariaLabel': 'Mini Map',\n // Handle\n 'handle.ariaLabel': 'Handle',\n};\n\n/**\n * The `ConnectionMode` is used to set the mode of connection between nodes.\n * The `Strict` mode is the default one and only allows source to target edges.\n * `Loose` mode allows source to source and target to target edges as well.\n *\n * @public\n */\nvar ConnectionMode;\n(function (ConnectionMode) {\n ConnectionMode[\"Strict\"] = \"strict\";\n ConnectionMode[\"Loose\"] = \"loose\";\n})(ConnectionMode || (ConnectionMode = {}));\n/**\n * This enum is used to set the different modes of panning the viewport when the\n * user scrolls. The `Free` mode allows the user to pan in any direction by scrolling\n * with a device like a trackpad. The `Vertical` and `Horizontal` modes restrict\n * scroll panning to only the vertical or horizontal axis, respectively.\n *\n * @public\n */\nvar PanOnScrollMode;\n(function (PanOnScrollMode) {\n PanOnScrollMode[\"Free\"] = \"free\";\n PanOnScrollMode[\"Vertical\"] = \"vertical\";\n PanOnScrollMode[\"Horizontal\"] = \"horizontal\";\n})(PanOnScrollMode || (PanOnScrollMode = {}));\nvar SelectionMode;\n(function (SelectionMode) {\n SelectionMode[\"Partial\"] = \"partial\";\n SelectionMode[\"Full\"] = \"full\";\n})(SelectionMode || (SelectionMode = {}));\nconst initialConnection = {\n inProgress: false,\n isValid: null,\n from: null,\n fromHandle: null,\n fromPosition: null,\n fromNode: null,\n to: null,\n toHandle: null,\n toPosition: null,\n toNode: null,\n pointer: null,\n};\n\n/**\n * If you set the `connectionLineType` prop on your [``](/api-reference/react-flow#connection-connectionLineType)\n *component, it will dictate the style of connection line rendered when creating\n *new edges.\n *\n * @public\n *\n * @remarks If you choose to render a custom connection line component, this value will be\n *passed to your component as part of its [`ConnectionLineComponentProps`](/api-reference/types/connection-line-component-props).\n */\nvar ConnectionLineType;\n(function (ConnectionLineType) {\n ConnectionLineType[\"Bezier\"] = \"default\";\n ConnectionLineType[\"Straight\"] = \"straight\";\n ConnectionLineType[\"Step\"] = \"step\";\n ConnectionLineType[\"SmoothStep\"] = \"smoothstep\";\n ConnectionLineType[\"SimpleBezier\"] = \"simplebezier\";\n})(ConnectionLineType || (ConnectionLineType = {}));\n/**\n * Edges may optionally have a marker on either end. The MarkerType type enumerates\n * the options available to you when configuring a given marker.\n *\n * @public\n */\nvar MarkerType;\n(function (MarkerType) {\n MarkerType[\"Arrow\"] = \"arrow\";\n MarkerType[\"ArrowClosed\"] = \"arrowclosed\";\n})(MarkerType || (MarkerType = {}));\n\n/**\n * While [`PanelPosition`](/api-reference/types/panel-position) can be used to place a\n * component in the corners of a container, the `Position` enum is less precise and used\n * primarily in relation to edges and handles.\n *\n * @public\n */\nvar Position;\n(function (Position) {\n Position[\"Left\"] = \"left\";\n Position[\"Top\"] = \"top\";\n Position[\"Right\"] = \"right\";\n Position[\"Bottom\"] = \"bottom\";\n})(Position || (Position = {}));\nconst oppositePosition = {\n [Position.Left]: Position.Right,\n [Position.Right]: Position.Left,\n [Position.Top]: Position.Bottom,\n [Position.Bottom]: Position.Top,\n};\n\n/**\n * @internal\n */\nfunction areConnectionMapsEqual(a, b) {\n if (!a && !b) {\n return true;\n }\n if (!a || !b || a.size !== b.size) {\n return false;\n }\n if (!a.size && !b.size) {\n return true;\n }\n for (const key of a.keys()) {\n if (!b.has(key)) {\n return false;\n }\n }\n return true;\n}\n/**\n * We call the callback for all connections in a that are not in b\n *\n * @internal\n */\nfunction handleConnectionChange(a, b, cb) {\n if (!cb) {\n return;\n }\n const diff = [];\n a.forEach((connection, key) => {\n if (!b?.has(key)) {\n diff.push(connection);\n }\n });\n if (diff.length) {\n cb(diff);\n }\n}\nfunction getConnectionStatus(isValid) {\n return isValid === null ? null : isValid ? 'valid' : 'invalid';\n}\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/**\n * Test whether an object is usable as an Edge\n * @public\n * @remarks In TypeScript this is a type guard that will narrow the type of whatever you pass in to Edge if it returns true\n * @param element - The element to test\n * @returns A boolean indicating whether the element is an Edge\n */\nconst isEdgeBase = (element) => 'id' in element && 'source' in element && 'target' in element;\n/**\n * Test whether an object is usable as a Node\n * @public\n * @remarks In TypeScript this is a type guard that will narrow the type of whatever you pass in to Node if it returns true\n * @param element - The element to test\n * @returns A boolean indicating whether the element is an Node\n */\nconst isNodeBase = (element) => 'id' in element && 'position' in element && !('source' in element) && !('target' in element);\nconst isInternalNodeBase = (element) => 'id' in element && 'internals' in element && !('source' in element) && !('target' in element);\n/**\n * This util is used to tell you what nodes, if any, are connected to the given node\n * as the _target_ of an edge.\n * @public\n * @param node - The node to get the connected nodes from.\n * @param nodes - The array of all nodes.\n * @param edges - The array of all edges.\n * @returns An array of nodes that are connected over edges where the source is the given node.\n *\n * @example\n * ```ts\n *import { getOutgoers } from '@xyflow/react';\n *\n *const nodes = [];\n *const edges = [];\n *\n *const outgoers = getOutgoers(\n * { id: '1', position: { x: 0, y: 0 }, data: { label: 'node' } },\n * nodes,\n * edges,\n *);\n *```\n */\nconst getOutgoers = (node, nodes, edges) => {\n if (!node.id) {\n return [];\n }\n const outgoerIds = new Set();\n edges.forEach((edge) => {\n if (edge.source === node.id) {\n outgoerIds.add(edge.target);\n }\n });\n return nodes.filter((n) => outgoerIds.has(n.id));\n};\n/**\n * This util is used to tell you what nodes, if any, are connected to the given node\n * as the _source_ of an edge.\n * @public\n * @param node - The node to get the connected nodes from.\n * @param nodes - The array of all nodes.\n * @param edges - The array of all edges.\n * @returns An array of nodes that are connected over edges where the target is the given node.\n *\n * @example\n * ```ts\n *import { getIncomers } from '@xyflow/react';\n *\n *const nodes = [];\n *const edges = [];\n *\n *const incomers = getIncomers(\n * { id: '1', position: { x: 0, y: 0 }, data: { label: 'node' } },\n * nodes,\n * edges,\n *);\n *```\n */\nconst getIncomers = (node, nodes, edges) => {\n if (!node.id) {\n return [];\n }\n const incomersIds = new Set();\n edges.forEach((edge) => {\n if (edge.target === node.id) {\n incomersIds.add(edge.source);\n }\n });\n return nodes.filter((n) => incomersIds.has(n.id));\n};\nconst getNodePositionWithOrigin = (node, nodeOrigin = [0, 0]) => {\n const { width, height } = getNodeDimensions(node);\n const origin = node.origin ?? nodeOrigin;\n const offsetX = width * origin[0];\n const offsetY = height * origin[1];\n return {\n x: node.position.x - offsetX,\n y: node.position.y - offsetY,\n };\n};\n/**\n * Returns the bounding box that contains all the given nodes in an array. This can\n * be useful when combined with [`getViewportForBounds`](/api-reference/utils/get-viewport-for-bounds)\n * to calculate the correct transform to fit the given nodes in a viewport.\n * @public\n * @remarks Useful when combined with {@link getViewportForBounds} to calculate the correct transform to fit the given nodes in a viewport.\n * @param nodes - Nodes to calculate the bounds for.\n * @returns Bounding box enclosing all nodes.\n *\n * @remarks This function was previously called `getRectOfNodes`\n *\n * @example\n * ```js\n *import { getNodesBounds } from '@xyflow/react';\n *\n *const nodes = [\n * {\n * id: 'a',\n * position: { x: 0, y: 0 },\n * data: { label: 'a' },\n * width: 50,\n * height: 25,\n * },\n * {\n * id: 'b',\n * position: { x: 100, y: 100 },\n * data: { label: 'b' },\n * width: 50,\n * height: 25,\n * },\n *];\n *\n *const bounds = getNodesBounds(nodes);\n *```\n */\nconst getNodesBounds = (nodes, params = { nodeOrigin: [0, 0] }) => {\n if (process.env.NODE_ENV === 'development' && !params.nodeLookup) {\n console.warn('Please use `getNodesBounds` from `useReactFlow`/`useSvelteFlow` hook to ensure correct values for sub flows. If not possible, you have to provide a nodeLookup to support sub flows.');\n }\n if (nodes.length === 0) {\n return { x: 0, y: 0, width: 0, height: 0 };\n }\n const box = nodes.reduce((currBox, nodeOrId) => {\n const isId = typeof nodeOrId === 'string';\n let currentNode = !params.nodeLookup && !isId ? nodeOrId : undefined;\n if (params.nodeLookup) {\n currentNode = isId\n ? params.nodeLookup.get(nodeOrId)\n : !isInternalNodeBase(nodeOrId)\n ? params.nodeLookup.get(nodeOrId.id)\n : nodeOrId;\n }\n const nodeBox = currentNode ? nodeToBox(currentNode, params.nodeOrigin) : { x: 0, y: 0, x2: 0, y2: 0 };\n return getBoundsOfBoxes(currBox, nodeBox);\n }, { x: Infinity, y: Infinity, x2: -Infinity, y2: -Infinity });\n return boxToRect(box);\n};\n/**\n * Determines a bounding box that contains all given nodes in an array\n * @internal\n */\nconst getInternalNodesBounds = (nodeLookup, params = {}) => {\n let box = { x: Infinity, y: Infinity, x2: -Infinity, y2: -Infinity };\n let hasVisibleNodes = false;\n nodeLookup.forEach((node) => {\n if (params.filter === undefined || params.filter(node)) {\n box = getBoundsOfBoxes(box, nodeToBox(node));\n hasVisibleNodes = true;\n }\n });\n return hasVisibleNodes ? boxToRect(box) : { x: 0, y: 0, width: 0, height: 0 };\n};\nconst getNodesInside = (nodes, rect, [tx, ty, tScale] = [0, 0, 1], partially = false, \n// set excludeNonSelectableNodes if you want to pay attention to the nodes \"selectable\" attribute\nexcludeNonSelectableNodes = false) => {\n const paneRect = {\n ...pointToRendererPoint(rect, [tx, ty, tScale]),\n width: rect.width / tScale,\n height: rect.height / tScale,\n };\n const visibleNodes = [];\n for (const node of nodes.values()) {\n const { measured, selectable = true, hidden = false } = node;\n if ((excludeNonSelectableNodes && !selectable) || hidden) {\n continue;\n }\n const width = measured.width ?? node.width ?? node.initialWidth ?? null;\n const height = measured.height ?? node.height ?? node.initialHeight ?? null;\n const overlappingArea = getOverlappingArea(paneRect, nodeToRect(node));\n const area = (width ?? 0) * (height ?? 0);\n const partiallyVisible = partially && overlappingArea > 0;\n const forceInitialRender = !node.internals.handleBounds;\n const isVisible = forceInitialRender || partiallyVisible || overlappingArea >= area;\n if (isVisible || node.dragging) {\n visibleNodes.push(node);\n }\n }\n return visibleNodes;\n};\n/**\n * This utility filters an array of edges, keeping only those where either the source or target\n * node is present in the given array of nodes.\n * @public\n * @param nodes - Nodes you want to get the connected edges for.\n * @param edges - All edges.\n * @returns Array of edges that connect any of the given nodes with each other.\n *\n * @example\n * ```js\n *import { getConnectedEdges } from '@xyflow/react';\n *\n *const nodes = [\n * { id: 'a', position: { x: 0, y: 0 } },\n * { id: 'b', position: { x: 100, y: 0 } },\n *];\n *\n *const edges = [\n * { id: 'a->c', source: 'a', target: 'c' },\n * { id: 'c->d', source: 'c', target: 'd' },\n *];\n *\n *const connectedEdges = getConnectedEdges(nodes, edges);\n * // => [{ id: 'a->c', source: 'a', target: 'c' }]\n *```\n */\nconst getConnectedEdges = (nodes, edges) => {\n const nodeIds = new Set();\n nodes.forEach((node) => {\n nodeIds.add(node.id);\n });\n return edges.filter((edge) => nodeIds.has(edge.source) || nodeIds.has(edge.target));\n};\nfunction getFitViewNodes(nodeLookup, options) {\n const fitViewNodes = new Map();\n const optionNodeIds = options?.nodes ? new Set(options.nodes.map((node) => node.id)) : null;\n nodeLookup.forEach((n) => {\n const isVisible = n.measured.width && n.measured.height && (options?.includeHiddenNodes || !n.hidden);\n if (isVisible && (!optionNodeIds || optionNodeIds.has(n.id))) {\n fitViewNodes.set(n.id, n);\n }\n });\n return fitViewNodes;\n}\nasync function fitViewport({ nodes, width, height, panZoom, minZoom, maxZoom }, options) {\n if (nodes.size === 0) {\n return Promise.resolve(true);\n }\n const nodesToFit = getFitViewNodes(nodes, options);\n const bounds = getInternalNodesBounds(nodesToFit);\n const viewport = getViewportForBounds(bounds, width, height, options?.minZoom ?? minZoom, options?.maxZoom ?? maxZoom, options?.padding ?? 0.1);\n await panZoom.setViewport(viewport, {\n duration: options?.duration,\n ease: options?.ease,\n interpolate: options?.interpolate,\n });\n return Promise.resolve(true);\n}\n/**\n * This function calculates the next position of a node, taking into account the node's extent, parent node, and origin.\n *\n * @internal\n * @returns position, positionAbsolute\n */\nfunction calculateNodePosition({ nodeId, nextPosition, nodeLookup, nodeOrigin = [0, 0], nodeExtent, onError, }) {\n const node = nodeLookup.get(nodeId);\n const parentNode = node.parentId ? nodeLookup.get(node.parentId) : undefined;\n const { x: parentX, y: parentY } = parentNode ? parentNode.internals.positionAbsolute : { x: 0, y: 0 };\n const origin = node.origin ?? nodeOrigin;\n let extent = node.extent || nodeExtent;\n if (node.extent === 'parent' && !node.expandParent) {\n if (!parentNode) {\n onError?.('005', errorMessages['error005']());\n }\n else {\n const parentWidth = parentNode.measured.width;\n const parentHeight = parentNode.measured.height;\n if (parentWidth && parentHeight) {\n extent = [\n [parentX, parentY],\n [parentX + parentWidth, parentY + parentHeight],\n ];\n }\n }\n }\n else if (parentNode && isCoordinateExtent(node.extent)) {\n extent = [\n [node.extent[0][0] + parentX, node.extent[0][1] + parentY],\n [node.extent[1][0] + parentX, node.extent[1][1] + parentY],\n ];\n }\n const positionAbsolute = isCoordinateExtent(extent)\n ? clampPosition(nextPosition, extent, node.measured)\n : nextPosition;\n if (node.measured.width === undefined || node.measured.height === undefined) {\n onError?.('015', errorMessages['error015']());\n }\n return {\n position: {\n x: positionAbsolute.x - parentX + (node.measured.width ?? 0) * origin[0],\n y: positionAbsolute.y - parentY + (node.measured.height ?? 0) * origin[1],\n },\n positionAbsolute,\n };\n}\n/**\n * Pass in nodes & edges to delete, get arrays of nodes and edges that actually can be deleted\n * @internal\n * @param param.nodesToRemove - The nodes to remove\n * @param param.edgesToRemove - The edges to remove\n * @param param.nodes - All nodes\n * @param param.edges - All edges\n * @param param.onBeforeDelete - Callback to check which nodes and edges can be deleted\n * @returns nodes: nodes that can be deleted, edges: edges that can be deleted\n */\nasync function getElementsToRemove({ nodesToRemove = [], edgesToRemove = [], nodes, edges, onBeforeDelete, }) {\n const nodeIds = new Set(nodesToRemove.map((node) => node.id));\n const matchingNodes = [];\n for (const node of nodes) {\n if (node.deletable === false) {\n continue;\n }\n const isIncluded = nodeIds.has(node.id);\n const parentHit = !isIncluded && node.parentId && matchingNodes.find((n) => n.id === node.parentId);\n if (isIncluded || parentHit) {\n matchingNodes.push(node);\n }\n }\n const edgeIds = new Set(edgesToRemove.map((edge) => edge.id));\n const deletableEdges = edges.filter((edge) => edge.deletable !== false);\n const connectedEdges = getConnectedEdges(matchingNodes, deletableEdges);\n const matchingEdges = connectedEdges;\n for (const edge of deletableEdges) {\n const isIncluded = edgeIds.has(edge.id);\n if (isIncluded && !matchingEdges.find((e) => e.id === edge.id)) {\n matchingEdges.push(edge);\n }\n }\n if (!onBeforeDelete) {\n return {\n edges: matchingEdges,\n nodes: matchingNodes,\n };\n }\n const onBeforeDeleteResult = await onBeforeDelete({\n nodes: matchingNodes,\n edges: matchingEdges,\n });\n if (typeof onBeforeDeleteResult === 'boolean') {\n return onBeforeDeleteResult ? { edges: matchingEdges, nodes: matchingNodes } : { edges: [], nodes: [] };\n }\n return onBeforeDeleteResult;\n}\n\nconst clamp = (val, min = 0, max = 1) => Math.min(Math.max(val, min), max);\nconst clampPosition = (position = { x: 0, y: 0 }, extent, dimensions) => ({\n x: clamp(position.x, extent[0][0], extent[1][0] - (dimensions?.width ?? 0)),\n y: clamp(position.y, extent[0][1], extent[1][1] - (dimensions?.height ?? 0)),\n});\nfunction clampPositionToParent(childPosition, childDimensions, parent) {\n const { width: parentWidth, height: parentHeight } = getNodeDimensions(parent);\n const { x: parentX, y: parentY } = parent.internals.positionAbsolute;\n return clampPosition(childPosition, [\n [parentX, parentY],\n [parentX + parentWidth, parentY + parentHeight],\n ], childDimensions);\n}\n/**\n * Calculates the velocity of panning when the mouse is close to the edge of the canvas\n * @internal\n * @param value - One dimensional poition of the mouse (x or y)\n * @param min - Minimal position on canvas before panning starts\n * @param max - Maximal position on canvas before panning starts\n * @returns - A number between 0 and 1 that represents the velocity of panning\n */\nconst calcAutoPanVelocity = (value, min, max) => {\n if (value < min) {\n return clamp(Math.abs(value - min), 1, min) / min;\n }\n else if (value > max) {\n return -clamp(Math.abs(value - max), 1, min) / min;\n }\n return 0;\n};\nconst calcAutoPan = (pos, bounds, speed = 15, distance = 40) => {\n const xMovement = calcAutoPanVelocity(pos.x, distance, bounds.width - distance) * speed;\n const yMovement = calcAutoPanVelocity(pos.y, distance, bounds.height - distance) * speed;\n return [xMovement, yMovement];\n};\nconst getBoundsOfBoxes = (box1, box2) => ({\n x: Math.min(box1.x, box2.x),\n y: Math.min(box1.y, box2.y),\n x2: Math.max(box1.x2, box2.x2),\n y2: Math.max(box1.y2, box2.y2),\n});\nconst rectToBox = ({ x, y, width, height }) => ({\n x,\n y,\n x2: x + width,\n y2: y + height,\n});\nconst boxToRect = ({ x, y, x2, y2 }) => ({\n x,\n y,\n width: x2 - x,\n height: y2 - y,\n});\nconst nodeToRect = (node, nodeOrigin = [0, 0]) => {\n const { x, y } = isInternalNodeBase(node)\n ? node.internals.positionAbsolute\n : getNodePositionWithOrigin(node, nodeOrigin);\n return {\n x,\n y,\n width: node.measured?.width ?? node.width ?? node.initialWidth ?? 0,\n height: node.measured?.height ?? node.height ?? node.initialHeight ?? 0,\n };\n};\nconst nodeToBox = (node, nodeOrigin = [0, 0]) => {\n const { x, y } = isInternalNodeBase(node)\n ? node.internals.positionAbsolute\n : getNodePositionWithOrigin(node, nodeOrigin);\n return {\n x,\n y,\n x2: x + (node.measured?.width ?? node.width ?? node.initialWidth ?? 0),\n y2: y + (node.measured?.height ?? node.height ?? node.initialHeight ?? 0),\n };\n};\nconst getBoundsOfRects = (rect1, rect2) => boxToRect(getBoundsOfBoxes(rectToBox(rect1), rectToBox(rect2)));\nconst getOverlappingArea = (rectA, rectB) => {\n const xOverlap = Math.max(0, Math.min(rectA.x + rectA.width, rectB.x + rectB.width) - Math.max(rectA.x, rectB.x));\n const yOverlap = Math.max(0, Math.min(rectA.y + rectA.height, rectB.y + rectB.height) - Math.max(rectA.y, rectB.y));\n return Math.ceil(xOverlap * yOverlap);\n};\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst isRectObject = (obj) => isNumeric(obj.width) && isNumeric(obj.height) && isNumeric(obj.x) && isNumeric(obj.y);\n/* eslint-disable-next-line @typescript-eslint/no-explicit-any */\nconst isNumeric = (n) => !isNaN(n) && isFinite(n);\n// used for a11y key board controls for nodes and edges\nconst devWarn = (id, message) => {\n if (process.env.NODE_ENV === 'development') {\n console.warn(`[React Flow]: ${message} Help: https://reactflow.dev/error#${id}`);\n }\n};\nconst snapPosition = (position, snapGrid = [1, 1]) => {\n return {\n x: snapGrid[0] * Math.round(position.x / snapGrid[0]),\n y: snapGrid[1] * Math.round(position.y / snapGrid[1]),\n };\n};\nconst pointToRendererPoint = ({ x, y }, [tx, ty, tScale], snapToGrid = false, snapGrid = [1, 1]) => {\n const position = {\n x: (x - tx) / tScale,\n y: (y - ty) / tScale,\n };\n return snapToGrid ? snapPosition(position, snapGrid) : position;\n};\nconst rendererPointToPoint = ({ x, y }, [tx, ty, tScale]) => {\n return {\n x: x * tScale + tx,\n y: y * tScale + ty,\n };\n};\n/**\n * Parses a single padding value to a number\n * @internal\n * @param padding - Padding to parse\n * @param viewport - Width or height of the viewport\n * @returns The padding in pixels\n */\nfunction parsePadding(padding, viewport) {\n if (typeof padding === 'number') {\n return Math.floor((viewport - viewport / (1 + padding)) * 0.5);\n }\n if (typeof padding === 'string' && padding.endsWith('px')) {\n const paddingValue = parseFloat(padding);\n if (!Number.isNaN(paddingValue)) {\n return Math.floor(paddingValue);\n }\n }\n if (typeof padding === 'string' && padding.endsWith('%')) {\n const paddingValue = parseFloat(padding);\n if (!Number.isNaN(paddingValue)) {\n return Math.floor(viewport * paddingValue * 0.01);\n }\n }\n console.error(`[React Flow] The padding value \"${padding}\" is invalid. Please provide a number or a string with a valid unit (px or %).`);\n return 0;\n}\n/**\n * Parses the paddings to an object with top, right, bottom, left, x and y paddings\n * @internal\n * @param padding - Padding to parse\n * @param width - Width of the viewport\n * @param height - Height of the viewport\n * @returns An object with the paddings in pixels\n */\nfunction parsePaddings(padding, width, height) {\n if (typeof padding === 'string' || typeof padding === 'number') {\n const paddingY = parsePadding(padding, height);\n const paddingX = parsePadding(padding, width);\n return {\n top: paddingY,\n right: paddingX,\n bottom: paddingY,\n left: paddingX,\n x: paddingX * 2,\n y: paddingY * 2,\n };\n }\n if (typeof padding === 'object') {\n const top = parsePadding(padding.top ?? padding.y ?? 0, height);\n const bottom = parsePadding(padding.bottom ?? padding.y ?? 0, height);\n const left = parsePadding(padding.left ?? padding.x ?? 0, width);\n const right = parsePadding(padding.right ?? padding.x ?? 0, width);\n return { top, right, bottom, left, x: left + right, y: top + bottom };\n }\n return { top: 0, right: 0, bottom: 0, left: 0, x: 0, y: 0 };\n}\n/**\n * Calculates the resulting paddings if the new viewport is applied\n * @internal\n * @param bounds - Bounds to fit inside viewport\n * @param x - X position of the viewport\n * @param y - Y position of the viewport\n * @param zoom - Zoom level of the viewport\n * @param width - Width of the viewport\n * @param height - Height of the viewport\n * @returns An object with the minimum padding required to fit the bounds inside the viewport\n */\nfunction calculateAppliedPaddings(bounds, x, y, zoom, width, height) {\n const { x: left, y: top } = rendererPointToPoint(bounds, [x, y, zoom]);\n const { x: boundRight, y: boundBottom } = rendererPointToPoint({ x: bounds.x + bounds.width, y: bounds.y + bounds.height }, [x, y, zoom]);\n const right = width - boundRight;\n const bottom = height - boundBottom;\n return {\n left: Math.floor(left),\n top: Math.floor(top),\n right: Math.floor(right),\n bottom: Math.floor(bottom),\n };\n}\n/**\n * Returns a viewport that encloses the given bounds with padding.\n * @public\n * @remarks You can determine bounds of nodes with {@link getNodesBounds} and {@link getBoundsOfRects}\n * @param bounds - Bounds to fit inside viewport.\n * @param width - Width of the viewport.\n * @param height - Height of the viewport.\n * @param minZoom - Minimum zoom level of the resulting viewport.\n * @param maxZoom - Maximum zoom level of the resulting viewport.\n * @param padding - Padding around the bounds.\n * @returns A transformed {@link Viewport} that encloses the given bounds which you can pass to e.g. {@link setViewport}.\n * @example\n * const { x, y, zoom } = getViewportForBounds(\n * { x: 0, y: 0, width: 100, height: 100},\n * 1200, 800, 0.5, 2);\n */\nconst getViewportForBounds = (bounds, width, height, minZoom, maxZoom, padding) => {\n // First we resolve all the paddings to actual pixel values\n const p = parsePaddings(padding, width, height);\n const xZoom = (width - p.x) / bounds.width;\n const yZoom = (height - p.y) / bounds.height;\n // We calculate the new x, y, zoom for a centered view\n const zoom = Math.min(xZoom, yZoom);\n const clampedZoom = clamp(zoom, minZoom, maxZoom);\n const boundsCenterX = bounds.x + bounds.width / 2;\n const boundsCenterY = bounds.y + bounds.height / 2;\n const x = width / 2 - boundsCenterX * clampedZoom;\n const y = height / 2 - boundsCenterY * clampedZoom;\n // Then we calculate the minimum padding, to respect asymmetric paddings\n const newPadding = calculateAppliedPaddings(bounds, x, y, clampedZoom, width, height);\n // We only want to have an offset if the newPadding is smaller than the required padding\n const offset = {\n left: Math.min(newPadding.left - p.left, 0),\n top: Math.min(newPadding.top - p.top, 0),\n right: Math.min(newPadding.right - p.right, 0),\n bottom: Math.min(newPadding.bottom - p.bottom, 0),\n };\n return {\n x: x - offset.left + offset.right,\n y: y - offset.top + offset.bottom,\n zoom: clampedZoom,\n };\n};\nconst isMacOs = () => typeof navigator !== 'undefined' && navigator?.userAgent?.indexOf('Mac') >= 0;\nfunction isCoordinateExtent(extent) {\n return extent !== undefined && extent !== null && extent !== 'parent';\n}\nfunction getNodeDimensions(node) {\n return {\n width: node.measured?.width ?? node.width ?? node.initialWidth ?? 0,\n height: node.measured?.height ?? node.height ?? node.initialHeight ?? 0,\n };\n}\nfunction nodeHasDimensions(node) {\n return ((node.measured?.width ?? node.width ?? node.initialWidth) !== undefined &&\n (node.measured?.height ?? node.height ?? node.initialHeight) !== undefined);\n}\n/**\n * Convert child position to aboslute position\n *\n * @internal\n * @param position\n * @param parentId\n * @param nodeLookup\n * @param nodeOrigin\n * @returns an internal node with an absolute position\n */\nfunction evaluateAbsolutePosition(position, dimensions = { width: 0, height: 0 }, parentId, nodeLookup, nodeOrigin) {\n const positionAbsolute = { ...position };\n const parent = nodeLookup.get(parentId);\n if (parent) {\n const origin = parent.origin || nodeOrigin;\n positionAbsolute.x += parent.internals.positionAbsolute.x - (dimensions.width ?? 0) * origin[0];\n positionAbsolute.y += parent.internals.positionAbsolute.y - (dimensions.height ?? 0) * origin[1];\n }\n return positionAbsolute;\n}\nfunction areSetsEqual(a, b) {\n if (a.size !== b.size) {\n return false;\n }\n for (const item of a) {\n if (!b.has(item)) {\n return false;\n }\n }\n return true;\n}\n/**\n * Polyfill for Promise.withResolvers until we can use it in all browsers\n * @internal\n */\nfunction withResolvers() {\n let resolve;\n let reject;\n const promise = new Promise((res, rej) => {\n resolve = res;\n reject = rej;\n });\n return { promise, resolve, reject };\n}\nfunction mergeAriaLabelConfig(partial) {\n return { ...defaultAriaLabelConfig, ...(partial || {}) };\n}\n\nfunction getPointerPosition(event, { snapGrid = [0, 0], snapToGrid = false, transform, containerBounds }) {\n const { x, y } = getEventPosition(event);\n const pointerPos = pointToRendererPoint({ x: x - (containerBounds?.left ?? 0), y: y - (containerBounds?.top ?? 0) }, transform);\n const { x: xSnapped, y: ySnapped } = snapToGrid ? snapPosition(pointerPos, snapGrid) : pointerPos;\n // we need the snapped position in order to be able to skip unnecessary drag events\n return {\n xSnapped,\n ySnapped,\n ...pointerPos,\n };\n}\nconst getDimensions = (node) => ({\n width: node.offsetWidth,\n height: node.offsetHeight,\n});\nconst getHostForElement = (element) => element?.getRootNode?.() || window?.document;\nconst inputTags = ['INPUT', 'SELECT', 'TEXTAREA'];\nfunction isInputDOMNode(event) {\n // using composed path for handling shadow dom\n const target = (event.composedPath?.()?.[0] || event.target);\n if (target?.nodeType !== 1 /* Node.ELEMENT_NODE */)\n return false;\n const isInput = inputTags.includes(target.nodeName) || target.hasAttribute('contenteditable');\n // when an input field is focused we don't want to trigger deletion or movement of nodes\n return isInput || !!target.closest('.nokey');\n}\nconst isMouseEvent = (event) => 'clientX' in event;\nconst getEventPosition = (event, bounds) => {\n const isMouse = isMouseEvent(event);\n const evtX = isMouse ? event.clientX : event.touches?.[0].clientX;\n const evtY = isMouse ? event.clientY : event.touches?.[0].clientY;\n return {\n x: evtX - (bounds?.left ?? 0),\n y: evtY - (bounds?.top ?? 0),\n };\n};\n/*\n * The handle bounds are calculated relative to the node element.\n * We store them in the internals object of the node in order to avoid\n * unnecessary recalculations.\n */\nconst getHandleBounds = (type, nodeElement, nodeBounds, zoom, nodeId) => {\n const handles = nodeElement.querySelectorAll(`.${type}`);\n if (!handles || !handles.length) {\n return null;\n }\n return Array.from(handles).map((handle) => {\n const handleBounds = handle.getBoundingClientRect();\n return {\n id: handle.getAttribute('data-handleid'),\n type,\n nodeId,\n position: handle.getAttribute('data-handlepos'),\n x: (handleBounds.left - nodeBounds.left) / zoom,\n y: (handleBounds.top - nodeBounds.top) / zoom,\n ...getDimensions(handle),\n };\n });\n};\n\nfunction getBezierEdgeCenter({ sourceX, sourceY, targetX, targetY, sourceControlX, sourceControlY, targetControlX, targetControlY, }) {\n /*\n * cubic bezier t=0.5 mid point, not the actual mid point, but easy to calculate\n * https://stackoverflow.com/questions/67516101/how-to-find-distance-mid-point-of-bezier-curve\n */\n const centerX = sourceX * 0.125 + sourceControlX * 0.375 + targetControlX * 0.375 + targetX * 0.125;\n const centerY = sourceY * 0.125 + sourceControlY * 0.375 + targetControlY * 0.375 + targetY * 0.125;\n const offsetX = Math.abs(centerX - sourceX);\n const offsetY = Math.abs(centerY - sourceY);\n return [centerX, centerY, offsetX, offsetY];\n}\nfunction calculateControlOffset(distance, curvature) {\n if (distance >= 0) {\n return 0.5 * distance;\n }\n return curvature * 25 * Math.sqrt(-distance);\n}\nfunction getControlWithCurvature({ pos, x1, y1, x2, y2, c }) {\n switch (pos) {\n case Position.Left:\n return [x1 - calculateControlOffset(x1 - x2, c), y1];\n case Position.Right:\n return [x1 + calculateControlOffset(x2 - x1, c), y1];\n case Position.Top:\n return [x1, y1 - calculateControlOffset(y1 - y2, c)];\n case Position.Bottom:\n return [x1, y1 + calculateControlOffset(y2 - y1, c)];\n }\n}\n/**\n * The `getBezierPath` util returns everything you need to render a bezier edge\n *between two nodes.\n * @public\n * @returns A path string you can use in an SVG, the `labelX` and `labelY` position (center of path)\n * and `offsetX`, `offsetY` between source handle and label.\n * - `path`: the path to use in an SVG `` element.\n * - `labelX`: the `x` position you can use to render a label for this edge.\n * - `labelY`: the `y` position you can use to render a label for this edge.\n * - `offsetX`: the absolute difference between the source `x` position and the `x` position of the\n * middle of this path.\n * - `offsetY`: the absolute difference between the source `y` position and the `y` position of the\n * middle of this path.\n * @example\n * ```js\n * const source = { x: 0, y: 20 };\n * const target = { x: 150, y: 100 };\n *\n * const [path, labelX, labelY, offsetX, offsetY] = getBezierPath({\n * sourceX: source.x,\n * sourceY: source.y,\n * sourcePosition: Position.Right,\n * targetX: target.x,\n * targetY: target.y,\n * targetPosition: Position.Left,\n *});\n *```\n *\n * @remarks This function returns a tuple (aka a fixed-size array) to make it easier to\n *work with multiple edge paths at once.\n */\nfunction getBezierPath({ sourceX, sourceY, sourcePosition = Position.Bottom, targetX, targetY, targetPosition = Position.Top, curvature = 0.25, }) {\n const [sourceControlX, sourceControlY] = getControlWithCurvature({\n pos: sourcePosition,\n x1: sourceX,\n y1: sourceY,\n x2: targetX,\n y2: targetY,\n c: curvature,\n });\n const [targetControlX, targetControlY] = getControlWithCurvature({\n pos: targetPosition,\n x1: targetX,\n y1: targetY,\n x2: sourceX,\n y2: sourceY,\n c: curvature,\n });\n const [labelX, labelY, offsetX, offsetY] = getBezierEdgeCenter({\n sourceX,\n sourceY,\n targetX,\n targetY,\n sourceControlX,\n sourceControlY,\n targetControlX,\n targetControlY,\n });\n return [\n `M${sourceX},${sourceY} C${sourceControlX},${sourceControlY} ${targetControlX},${targetControlY} ${targetX},${targetY}`,\n labelX,\n labelY,\n offsetX,\n offsetY,\n ];\n}\n\n// this is used for straight edges and simple smoothstep edges (LTR, RTL, BTT, TTB)\nfunction getEdgeCenter({ sourceX, sourceY, targetX, targetY, }) {\n const xOffset = Math.abs(targetX - sourceX) / 2;\n const centerX = targetX < sourceX ? targetX + xOffset : targetX - xOffset;\n const yOffset = Math.abs(targetY - sourceY) / 2;\n const centerY = targetY < sourceY ? targetY + yOffset : targetY - yOffset;\n return [centerX, centerY, xOffset, yOffset];\n}\n/**\n * Returns the z-index for an edge based on the node it connects and whether it is selected.\n * By default, edges are rendered below nodes. This behaviour is different for edges that are\n * connected to nodes with a parent, as they are rendered above the parent node.\n */\nfunction getElevatedEdgeZIndex({ sourceNode, targetNode, selected = false, zIndex = 0, elevateOnSelect = false, zIndexMode = 'basic', }) {\n if (zIndexMode === 'manual') {\n return zIndex;\n }\n const edgeZ = elevateOnSelect && selected ? zIndex + 1000 : zIndex;\n const nodeZ = Math.max(sourceNode.parentId || (elevateOnSelect && sourceNode.selected) ? sourceNode.internals.z : 0, targetNode.parentId || (elevateOnSelect && targetNode.selected) ? targetNode.internals.z : 0);\n return edgeZ + nodeZ;\n}\nfunction isEdgeVisible({ sourceNode, targetNode, width, height, transform }) {\n const edgeBox = getBoundsOfBoxes(nodeToBox(sourceNode), nodeToBox(targetNode));\n if (edgeBox.x === edgeBox.x2) {\n edgeBox.x2 += 1;\n }\n if (edgeBox.y === edgeBox.y2) {\n edgeBox.y2 += 1;\n }\n const viewRect = {\n x: -transform[0] / transform[2],\n y: -transform[1] / transform[2],\n width: width / transform[2],\n height: height / transform[2],\n };\n return getOverlappingArea(viewRect, boxToRect(edgeBox)) > 0;\n}\n/**\n * The default edge ID generator function. Generates an ID based on the source, target, and handles.\n * @public\n * @param params - The connection or edge to generate an ID for.\n * @returns The generated edge ID.\n */\nconst getEdgeId = ({ source, sourceHandle, target, targetHandle }) => `xy-edge__${source}${sourceHandle || ''}-${target}${targetHandle || ''}`;\nconst connectionExists = (edge, edges) => {\n return edges.some((el) => el.source === edge.source &&\n el.target === edge.target &&\n (el.sourceHandle === edge.sourceHandle || (!el.sourceHandle && !edge.sourceHandle)) &&\n (el.targetHandle === edge.targetHandle || (!el.targetHandle && !edge.targetHandle)));\n};\n/**\n * This util is a convenience function to add a new Edge to an array of edges. It also performs some validation to make sure you don't add an invalid edge or duplicate an existing one.\n * @public\n * @param edgeParams - Either an `Edge` or a `Connection` you want to add.\n * @param edges - The array of all current edges.\n * @param options - Optional configuration object.\n * @returns A new array of edges with the new edge added.\n *\n * @remarks If an edge with the same `target` and `source` already exists (and the same\n *`targetHandle` and `sourceHandle` if those are set), then this util won't add\n *a new edge even if the `id` property is different.\n *\n */\nconst addEdge = (edgeParams, edges, options = {}) => {\n if (!edgeParams.source || !edgeParams.target) {\n devWarn('006', errorMessages['error006']());\n return edges;\n }\n const edgeIdGenerator = options.getEdgeId || getEdgeId;\n let edge;\n if (isEdgeBase(edgeParams)) {\n edge = { ...edgeParams };\n }\n else {\n edge = {\n ...edgeParams,\n id: edgeIdGenerator(edgeParams),\n };\n }\n if (connectionExists(edge, edges)) {\n return edges;\n }\n if (edge.sourceHandle === null) {\n delete edge.sourceHandle;\n }\n if (edge.targetHandle === null) {\n delete edge.targetHandle;\n }\n return edges.concat(edge);\n};\n/**\n * A handy utility to update an existing [`Edge`](/api-reference/types/edge) with new properties.\n *This searches your edge array for an edge with a matching `id` and updates its\n *properties with the connection you provide.\n * @public\n * @param oldEdge - The edge you want to update.\n * @param newConnection - The new connection you want to update the edge with.\n * @param edges - The array of all current edges.\n * @returns The updated edges array.\n *\n * @example\n * ```js\n *const onReconnect = useCallback(\n * (oldEdge: Edge, newConnection: Connection) => setEdges((els) => reconnectEdge(oldEdge, newConnection, els)),[]);\n *```\n */\nconst reconnectEdge = (oldEdge, newConnection, edges, options = { shouldReplaceId: true }) => {\n const { id: oldEdgeId, ...rest } = oldEdge;\n if (!newConnection.source || !newConnection.target) {\n devWarn('006', errorMessages['error006']());\n return edges;\n }\n const foundEdge = edges.find((e) => e.id === oldEdge.id);\n if (!foundEdge) {\n devWarn('007', errorMessages['error007'](oldEdgeId));\n return edges;\n }\n const edgeIdGenerator = options.getEdgeId || getEdgeId;\n // Remove old edge and create the new edge with parameters of old edge.\n const edge = {\n ...rest,\n id: options.shouldReplaceId ? edgeIdGenerator(newConnection) : oldEdgeId,\n source: newConnection.source,\n target: newConnection.target,\n sourceHandle: newConnection.sourceHandle,\n targetHandle: newConnection.targetHandle,\n };\n return edges.filter((e) => e.id !== oldEdgeId).concat(edge);\n};\n\n/**\n * Calculates the straight line path between two points.\n * @public\n * @returns A path string you can use in an SVG, the `labelX` and `labelY` position (center of path)\n * and `offsetX`, `offsetY` between source handle and label.\n *\n * - `path`: the path to use in an SVG `` element.\n * - `labelX`: the `x` position you can use to render a label for this edge.\n * - `labelY`: the `y` position you can use to render a label for this edge.\n * - `offsetX`: the absolute difference between the source `x` position and the `x` position of the\n * middle of this path.\n * - `offsetY`: the absolute difference between the source `y` position and the `y` position of the\n * middle of this path.\n * @example\n * ```js\n * const source = { x: 0, y: 20 };\n * const target = { x: 150, y: 100 };\n *\n * const [path, labelX, labelY, offsetX, offsetY] = getStraightPath({\n * sourceX: source.x,\n * sourceY: source.y,\n * sourcePosition: Position.Right,\n * targetX: target.x,\n * targetY: target.y,\n * targetPosition: Position.Left,\n * });\n * ```\n * @remarks This function returns a tuple (aka a fixed-size array) to make it easier to work with multiple edge paths at once.\n */\nfunction getStraightPath({ sourceX, sourceY, targetX, targetY, }) {\n const [labelX, labelY, offsetX, offsetY] = getEdgeCenter({\n sourceX,\n sourceY,\n targetX,\n targetY,\n });\n return [`M ${sourceX},${sourceY}L ${targetX},${targetY}`, labelX, labelY, offsetX, offsetY];\n}\n\nconst handleDirections = {\n [Position.Left]: { x: -1, y: 0 },\n [Position.Right]: { x: 1, y: 0 },\n [Position.Top]: { x: 0, y: -1 },\n [Position.Bottom]: { x: 0, y: 1 },\n};\nconst getDirection = ({ source, sourcePosition = Position.Bottom, target, }) => {\n if (sourcePosition === Position.Left || sourcePosition === Position.Right) {\n return source.x < target.x ? { x: 1, y: 0 } : { x: -1, y: 0 };\n }\n return source.y < target.y ? { x: 0, y: 1 } : { x: 0, y: -1 };\n};\nconst distance = (a, b) => Math.sqrt(Math.pow(b.x - a.x, 2) + Math.pow(b.y - a.y, 2));\n/*\n * With this function we try to mimic an orthogonal edge routing behaviour\n * It's not as good as a real orthogonal edge routing, but it's faster and good enough as a default for step and smooth step edges\n */\nfunction getPoints({ source, sourcePosition = Position.Bottom, target, targetPosition = Position.Top, center, offset, stepPosition, }) {\n const sourceDir = handleDirections[sourcePosition];\n const targetDir = handleDirections[targetPosition];\n const sourceGapped = { x: source.x + sourceDir.x * offset, y: source.y + sourceDir.y * offset };\n const targetGapped = { x: target.x + targetDir.x * offset, y: target.y + targetDir.y * offset };\n const dir = getDirection({\n source: sourceGapped,\n sourcePosition,\n target: targetGapped,\n });\n const dirAccessor = dir.x !== 0 ? 'x' : 'y';\n const currDir = dir[dirAccessor];\n let points = [];\n let centerX, centerY;\n const sourceGapOffset = { x: 0, y: 0 };\n const targetGapOffset = { x: 0, y: 0 };\n const [, , defaultOffsetX, defaultOffsetY] = getEdgeCenter({\n sourceX: source.x,\n sourceY: source.y,\n targetX: target.x,\n targetY: target.y,\n });\n // opposite handle positions, default case\n if (sourceDir[dirAccessor] * targetDir[dirAccessor] === -1) {\n if (dirAccessor === 'x') {\n // Primary direction is horizontal, so stepPosition affects X coordinate\n centerX = center.x ?? (sourceGapped.x + (targetGapped.x - sourceGapped.x) * stepPosition);\n centerY = center.y ?? (sourceGapped.y + targetGapped.y) / 2;\n }\n else {\n // Primary direction is vertical, so stepPosition affects Y coordinate \n centerX = center.x ?? (sourceGapped.x + targetGapped.x) / 2;\n centerY = center.y ?? (sourceGapped.y + (targetGapped.y - sourceGapped.y) * stepPosition);\n }\n /*\n * --->\n * |\n * >---\n */\n const verticalSplit = [\n { x: centerX, y: sourceGapped.y },\n { x: centerX, y: targetGapped.y },\n ];\n /*\n * |\n * ---\n * |\n */\n const horizontalSplit = [\n { x: sourceGapped.x, y: centerY },\n { x: targetGapped.x, y: centerY },\n ];\n if (sourceDir[dirAccessor] === currDir) {\n points = dirAccessor === 'x' ? verticalSplit : horizontalSplit;\n }\n else {\n points = dirAccessor === 'x' ? horizontalSplit : verticalSplit;\n }\n }\n else {\n // sourceTarget means we take x from source and y from target, targetSource is the opposite\n const sourceTarget = [{ x: sourceGapped.x, y: targetGapped.y }];\n const targetSource = [{ x: targetGapped.x, y: sourceGapped.y }];\n // this handles edges with same handle positions\n if (dirAccessor === 'x') {\n points = sourceDir.x === currDir ? targetSource : sourceTarget;\n }\n else {\n points = sourceDir.y === currDir ? sourceTarget : targetSource;\n }\n if (sourcePosition === targetPosition) {\n const diff = Math.abs(source[dirAccessor] - target[dirAccessor]);\n // if an edge goes from right to right for example (sourcePosition === targetPosition) and the distance between source.x and target.x is less than the offset, the added point and the gapped source/target will overlap. This leads to a weird edge path. To avoid this we add a gapOffset to the source/target\n if (diff <= offset) {\n const gapOffset = Math.min(offset - 1, offset - diff);\n if (sourceDir[dirAccessor] === currDir) {\n sourceGapOffset[dirAccessor] = (sourceGapped[dirAccessor] > source[dirAccessor] ? -1 : 1) * gapOffset;\n }\n else {\n targetGapOffset[dirAccessor] = (targetGapped[dirAccessor] > target[dirAccessor] ? -1 : 1) * gapOffset;\n }\n }\n }\n // these are conditions for handling mixed handle positions like Right -> Bottom for example\n if (sourcePosition !== targetPosition) {\n const dirAccessorOpposite = dirAccessor === 'x' ? 'y' : 'x';\n const isSameDir = sourceDir[dirAccessor] === targetDir[dirAccessorOpposite];\n const sourceGtTargetOppo = sourceGapped[dirAccessorOpposite] > targetGapped[dirAccessorOpposite];\n const sourceLtTargetOppo = sourceGapped[dirAccessorOpposite] < targetGapped[dirAccessorOpposite];\n const flipSourceTarget = (sourceDir[dirAccessor] === 1 && ((!isSameDir && sourceGtTargetOppo) || (isSameDir && sourceLtTargetOppo))) ||\n (sourceDir[dirAccessor] !== 1 && ((!isSameDir && sourceLtTargetOppo) || (isSameDir && sourceGtTargetOppo)));\n if (flipSourceTarget) {\n points = dirAccessor === 'x' ? sourceTarget : targetSource;\n }\n }\n const sourceGapPoint = { x: sourceGapped.x + sourceGapOffset.x, y: sourceGapped.y + sourceGapOffset.y };\n const targetGapPoint = { x: targetGapped.x + targetGapOffset.x, y: targetGapped.y + targetGapOffset.y };\n const maxXDistance = Math.max(Math.abs(sourceGapPoint.x - points[0].x), Math.abs(targetGapPoint.x - points[0].x));\n const maxYDistance = Math.max(Math.abs(sourceGapPoint.y - points[0].y), Math.abs(targetGapPoint.y - points[0].y));\n // we want to place the label on the longest segment of the edge\n if (maxXDistance >= maxYDistance) {\n centerX = (sourceGapPoint.x + targetGapPoint.x) / 2;\n centerY = points[0].y;\n }\n else {\n centerX = points[0].x;\n centerY = (sourceGapPoint.y + targetGapPoint.y) / 2;\n }\n }\n const pathPoints = [\n source,\n { x: sourceGapped.x + sourceGapOffset.x, y: sourceGapped.y + sourceGapOffset.y },\n ...points,\n { x: targetGapped.x + targetGapOffset.x, y: targetGapped.y + targetGapOffset.y },\n target,\n ];\n return [pathPoints, centerX, centerY, defaultOffsetX, defaultOffsetY];\n}\nfunction getBend(a, b, c, size) {\n const bendSize = Math.min(distance(a, b) / 2, distance(b, c) / 2, size);\n const { x, y } = b;\n // no bend\n if ((a.x === x && x === c.x) || (a.y === y && y === c.y)) {\n return `L${x} ${y}`;\n }\n // first segment is horizontal\n if (a.y === y) {\n const xDir = a.x < c.x ? -1 : 1;\n const yDir = a.y < c.y ? 1 : -1;\n return `L ${x + bendSize * xDir},${y}Q ${x},${y} ${x},${y + bendSize * yDir}`;\n }\n const xDir = a.x < c.x ? 1 : -1;\n const yDir = a.y < c.y ? -1 : 1;\n return `L ${x},${y + bendSize * yDir}Q ${x},${y} ${x + bendSize * xDir},${y}`;\n}\n/**\n * The `getSmoothStepPath` util returns everything you need to render a stepped path\n * between two nodes. The `borderRadius` property can be used to choose how rounded\n * the corners of those steps are.\n * @public\n * @returns A path string you can use in an SVG, the `labelX` and `labelY` position (center of path)\n * and `offsetX`, `offsetY` between source handle and label.\n *\n * - `path`: the path to use in an SVG `` element.\n * - `labelX`: the `x` position you can use to render a label for this edge.\n * - `labelY`: the `y` position you can use to render a label for this edge.\n * - `offsetX`: the absolute difference between the source `x` position and the `x` position of the\n * middle of this path.\n * - `offsetY`: the absolute difference between the source `y` position and the `y` position of the\n * middle of this path.\n * @example\n * ```js\n * const source = { x: 0, y: 20 };\n * const target = { x: 150, y: 100 };\n *\n * const [path, labelX, labelY, offsetX, offsetY] = getSmoothStepPath({\n * sourceX: source.x,\n * sourceY: source.y,\n * sourcePosition: Position.Right,\n * targetX: target.x,\n * targetY: target.y,\n * targetPosition: Position.Left,\n * });\n * ```\n * @remarks This function returns a tuple (aka a fixed-size array) to make it easier to work with multiple edge paths at once.\n */\nfunction getSmoothStepPath({ sourceX, sourceY, sourcePosition = Position.Bottom, targetX, targetY, targetPosition = Position.Top, borderRadius = 5, centerX, centerY, offset = 20, stepPosition = 0.5, }) {\n const [points, labelX, labelY, offsetX, offsetY] = getPoints({\n source: { x: sourceX, y: sourceY },\n sourcePosition,\n target: { x: targetX, y: targetY },\n targetPosition,\n center: { x: centerX, y: centerY },\n offset,\n stepPosition,\n });\n const path = points.reduce((res, p, i) => {\n let segment = '';\n if (i > 0 && i < points.length - 1) {\n segment = getBend(points[i - 1], p, points[i + 1], borderRadius);\n }\n else {\n segment = `${i === 0 ? 'M' : 'L'}${p.x} ${p.y}`;\n }\n res += segment;\n return res;\n }, '');\n return [path, labelX, labelY, offsetX, offsetY];\n}\n\nfunction isNodeInitialized(node) {\n return (node &&\n !!(node.internals.handleBounds || node.handles?.length) &&\n !!(node.measured.width || node.width || node.initialWidth));\n}\nfunction getEdgePosition(params) {\n const { sourceNode, targetNode } = params;\n if (!isNodeInitialized(sourceNode) || !isNodeInitialized(targetNode)) {\n return null;\n }\n const sourceHandleBounds = sourceNode.internals.handleBounds || toHandleBounds(sourceNode.handles);\n const targetHandleBounds = targetNode.internals.handleBounds || toHandleBounds(targetNode.handles);\n const sourceHandle = getHandle$1(sourceHandleBounds?.source ?? [], params.sourceHandle);\n const targetHandle = getHandle$1(\n // when connection type is loose we can define all handles as sources and connect source -> source\n params.connectionMode === ConnectionMode.Strict\n ? targetHandleBounds?.target ?? []\n : (targetHandleBounds?.target ?? []).concat(targetHandleBounds?.source ?? []), params.targetHandle);\n if (!sourceHandle || !targetHandle) {\n params.onError?.('008', errorMessages['error008'](!sourceHandle ? 'source' : 'target', {\n id: params.id,\n sourceHandle: params.sourceHandle,\n targetHandle: params.targetHandle,\n }));\n return null;\n }\n const sourcePosition = sourceHandle?.position || Position.Bottom;\n const targetPosition = targetHandle?.position || Position.Top;\n const source = getHandlePosition(sourceNode, sourceHandle, sourcePosition);\n const target = getHandlePosition(targetNode, targetHandle, targetPosition);\n return {\n sourceX: source.x,\n sourceY: source.y,\n targetX: target.x,\n targetY: target.y,\n sourcePosition,\n targetPosition,\n };\n}\nfunction toHandleBounds(handles) {\n if (!handles) {\n return null;\n }\n const source = [];\n const target = [];\n for (const handle of handles) {\n handle.width = handle.width ?? 1;\n handle.height = handle.height ?? 1;\n if (handle.type === 'source') {\n source.push(handle);\n }\n else if (handle.type === 'target') {\n target.push(handle);\n }\n }\n return {\n source,\n target,\n };\n}\nfunction getHandlePosition(node, handle, fallbackPosition = Position.Left, center = false) {\n const x = (handle?.x ?? 0) + node.internals.positionAbsolute.x;\n const y = (handle?.y ?? 0) + node.internals.positionAbsolute.y;\n const { width, height } = handle ?? getNodeDimensions(node);\n if (center) {\n return { x: x + width / 2, y: y + height / 2 };\n }\n const position = handle?.position ?? fallbackPosition;\n switch (position) {\n case Position.Top:\n return { x: x + width / 2, y };\n case Position.Right:\n return { x: x + width, y: y + height / 2 };\n case Position.Bottom:\n return { x: x + width / 2, y: y + height };\n case Position.Left:\n return { x, y: y + height / 2 };\n }\n}\nfunction getHandle$1(bounds, handleId) {\n if (!bounds) {\n return null;\n }\n // if no handleId is given, we use the first handle, otherwise we check for the id\n return (!handleId ? bounds[0] : bounds.find((d) => d.id === handleId)) || null;\n}\n\nfunction getMarkerId(marker, id) {\n if (!marker) {\n return '';\n }\n if (typeof marker === 'string') {\n return marker;\n }\n const idPrefix = id ? `${id}__` : '';\n return `${idPrefix}${Object.keys(marker)\n .sort()\n .map((key) => `${key}=${marker[key]}`)\n .join('&')}`;\n}\nfunction createMarkerIds(edges, { id, defaultColor, defaultMarkerStart, defaultMarkerEnd, }) {\n const ids = new Set();\n return edges\n .reduce((markers, edge) => {\n [edge.markerStart || defaultMarkerStart, edge.markerEnd || defaultMarkerEnd].forEach((marker) => {\n if (marker && typeof marker === 'object') {\n const markerId = getMarkerId(marker, id);\n if (!ids.has(markerId)) {\n markers.push({ id: markerId, color: marker.color || defaultColor, ...marker });\n ids.add(markerId);\n }\n }\n });\n return markers;\n }, [])\n .sort((a, b) => a.id.localeCompare(b.id));\n}\n\nfunction getNodeToolbarTransform(nodeRect, viewport, position, offset, align) {\n let alignmentOffset = 0.5;\n if (align === 'start') {\n alignmentOffset = 0;\n }\n else if (align === 'end') {\n alignmentOffset = 1;\n }\n /*\n * position === Position.Top\n * we set the x any y position of the toolbar based on the nodes position\n */\n let pos = [\n (nodeRect.x + nodeRect.width * alignmentOffset) * viewport.zoom + viewport.x,\n nodeRect.y * viewport.zoom + viewport.y - offset,\n ];\n // and than shift it based on the alignment. The shift values are in %.\n let shift = [-100 * alignmentOffset, -100];\n switch (position) {\n case Position.Right:\n pos = [\n (nodeRect.x + nodeRect.width) * viewport.zoom + viewport.x + offset,\n (nodeRect.y + nodeRect.height * alignmentOffset) * viewport.zoom + viewport.y,\n ];\n shift = [0, -100 * alignmentOffset];\n break;\n case Position.Bottom:\n pos[1] = (nodeRect.y + nodeRect.height) * viewport.zoom + viewport.y + offset;\n shift[1] = 0;\n break;\n case Position.Left:\n pos = [\n nodeRect.x * viewport.zoom + viewport.x - offset,\n (nodeRect.y + nodeRect.height * alignmentOffset) * viewport.zoom + viewport.y,\n ];\n shift = [-100, -100 * alignmentOffset];\n break;\n }\n return `translate(${pos[0]}px, ${pos[1]}px) translate(${shift[0]}%, ${shift[1]}%)`;\n}\n\nconst alignXToPercent = {\n left: 0,\n center: 50,\n right: 100,\n};\nconst alignYToPercent = {\n top: 0,\n center: 50,\n bottom: 100,\n};\nfunction getEdgeToolbarTransform(x, y, zoom, alignX = 'center', alignY = 'center') {\n return `translate(${x}px, ${y}px) scale(${1 / zoom}) translate(${-(alignXToPercent[alignX] ?? 50)}%, ${-(alignYToPercent[alignY] ?? 50)}%)`;\n}\n\nconst SELECTED_NODE_Z = 1000;\nconst ROOT_PARENT_Z_INCREMENT = 10;\nconst defaultOptions = {\n nodeOrigin: [0, 0],\n nodeExtent: infiniteExtent,\n elevateNodesOnSelect: true,\n zIndexMode: 'basic',\n defaults: {},\n};\nconst adoptUserNodesDefaultOptions = {\n ...defaultOptions,\n checkEquality: true,\n};\nfunction mergeObjects(base, incoming) {\n const result = { ...base };\n for (const key in incoming) {\n if (incoming[key] !== undefined) {\n // typecast is safe here, because we check for undefined\n result[key] = incoming[key];\n }\n }\n return result;\n}\nfunction updateAbsolutePositions(nodeLookup, parentLookup, options) {\n const _options = mergeObjects(defaultOptions, options);\n for (const node of nodeLookup.values()) {\n if (node.parentId) {\n updateChildNode(node, nodeLookup, parentLookup, _options);\n }\n else {\n const positionWithOrigin = getNodePositionWithOrigin(node, _options.nodeOrigin);\n const extent = isCoordinateExtent(node.extent) ? node.extent : _options.nodeExtent;\n const clampedPosition = clampPosition(positionWithOrigin, extent, getNodeDimensions(node));\n node.internals.positionAbsolute = clampedPosition;\n }\n }\n}\nfunction parseHandles(userNode, internalNode) {\n if (!userNode.handles) {\n return !userNode.measured ? undefined : internalNode?.internals.handleBounds;\n }\n const source = [];\n const target = [];\n for (const handle of userNode.handles) {\n const handleBounds = {\n id: handle.id,\n width: handle.width ?? 1,\n height: handle.height ?? 1,\n nodeId: userNode.id,\n x: handle.x,\n y: handle.y,\n position: handle.position,\n type: handle.type,\n };\n if (handle.type === 'source') {\n source.push(handleBounds);\n }\n else if (handle.type === 'target') {\n target.push(handleBounds);\n }\n }\n return {\n source,\n target,\n };\n}\nfunction isManualZIndexMode(zIndexMode) {\n return zIndexMode === 'manual';\n}\nfunction adoptUserNodes(nodes, nodeLookup, parentLookup, options = {}) {\n const _options = mergeObjects(adoptUserNodesDefaultOptions, options);\n const rootParentIndex = { i: 0 };\n const tmpLookup = new Map(nodeLookup);\n const selectedNodeZ = _options?.elevateNodesOnSelect && !isManualZIndexMode(_options.zIndexMode) ? SELECTED_NODE_Z : 0;\n let nodesInitialized = nodes.length > 0;\n nodeLookup.clear();\n parentLookup.clear();\n for (const userNode of nodes) {\n let internalNode = tmpLookup.get(userNode.id);\n if (_options.checkEquality && userNode === internalNode?.internals.userNode) {\n nodeLookup.set(userNode.id, internalNode);\n }\n else {\n const positionWithOrigin = getNodePositionWithOrigin(userNode, _options.nodeOrigin);\n const extent = isCoordinateExtent(userNode.extent) ? userNode.extent : _options.nodeExtent;\n const clampedPosition = clampPosition(positionWithOrigin, extent, getNodeDimensions(userNode));\n internalNode = {\n ..._options.defaults,\n ...userNode,\n measured: {\n width: userNode.measured?.width,\n height: userNode.measured?.height,\n },\n internals: {\n positionAbsolute: clampedPosition,\n // if user re-initializes the node or removes `measured` for whatever reason, we reset the handleBounds so that the node gets re-measured\n handleBounds: parseHandles(userNode, internalNode),\n z: calculateZ(userNode, selectedNodeZ, _options.zIndexMode),\n userNode,\n },\n };\n nodeLookup.set(userNode.id, internalNode);\n }\n if ((internalNode.measured === undefined ||\n internalNode.measured.width === undefined ||\n internalNode.measured.height === undefined) &&\n !internalNode.hidden) {\n nodesInitialized = false;\n }\n if (userNode.parentId) {\n updateChildNode(internalNode, nodeLookup, parentLookup, options, rootParentIndex);\n }\n }\n return nodesInitialized;\n}\nfunction updateParentLookup(node, parentLookup) {\n if (!node.parentId) {\n return;\n }\n const childNodes = parentLookup.get(node.parentId);\n if (childNodes) {\n childNodes.set(node.id, node);\n }\n else {\n parentLookup.set(node.parentId, new Map([[node.id, node]]));\n }\n}\n/**\n * Updates positionAbsolute and zIndex of a child node and the parentLookup.\n */\nfunction updateChildNode(node, nodeLookup, parentLookup, options, rootParentIndex) {\n const { elevateNodesOnSelect, nodeOrigin, nodeExtent, zIndexMode } = mergeObjects(defaultOptions, options);\n const parentId = node.parentId;\n const parentNode = nodeLookup.get(parentId);\n if (!parentNode) {\n console.warn(`Parent node ${parentId} not found. Please make sure that parent nodes are in front of their child nodes in the nodes array.`);\n return;\n }\n updateParentLookup(node, parentLookup);\n // We just want to set the rootParentIndex for the first child\n if (rootParentIndex &&\n !parentNode.parentId &&\n parentNode.internals.rootParentIndex === undefined &&\n zIndexMode === 'auto') {\n parentNode.internals.rootParentIndex = ++rootParentIndex.i;\n parentNode.internals.z = parentNode.internals.z + rootParentIndex.i * ROOT_PARENT_Z_INCREMENT;\n }\n // But we need to update rootParentIndex.i also when parent has not been updated\n if (rootParentIndex && parentNode.internals.rootParentIndex !== undefined) {\n rootParentIndex.i = parentNode.internals.rootParentIndex;\n }\n const selectedNodeZ = elevateNodesOnSelect && !isManualZIndexMode(zIndexMode) ? SELECTED_NODE_Z : 0;\n const { x, y, z } = calculateChildXYZ(node, parentNode, nodeOrigin, nodeExtent, selectedNodeZ, zIndexMode);\n const { positionAbsolute } = node.internals;\n const positionChanged = x !== positionAbsolute.x || y !== positionAbsolute.y;\n if (positionChanged || z !== node.internals.z) {\n // we create a new object to mark the node as updated\n nodeLookup.set(node.id, {\n ...node,\n internals: {\n ...node.internals,\n positionAbsolute: positionChanged ? { x, y } : positionAbsolute,\n z,\n },\n });\n }\n}\nfunction calculateZ(node, selectedNodeZ, zIndexMode) {\n const zIndex = isNumeric(node.zIndex) ? node.zIndex : 0;\n if (isManualZIndexMode(zIndexMode)) {\n return zIndex;\n }\n return zIndex + (node.selected ? selectedNodeZ : 0);\n}\nfunction calculateChildXYZ(childNode, parentNode, nodeOrigin, nodeExtent, selectedNodeZ, zIndexMode) {\n const { x: parentX, y: parentY } = parentNode.internals.positionAbsolute;\n const childDimensions = getNodeDimensions(childNode);\n const positionWithOrigin = getNodePositionWithOrigin(childNode, nodeOrigin);\n const clampedPosition = isCoordinateExtent(childNode.extent)\n ? clampPosition(positionWithOrigin, childNode.extent, childDimensions)\n : positionWithOrigin;\n let absolutePosition = clampPosition({ x: parentX + clampedPosition.x, y: parentY + clampedPosition.y }, nodeExtent, childDimensions);\n if (childNode.extent === 'parent') {\n absolutePosition = clampPositionToParent(absolutePosition, childDimensions, parentNode);\n }\n const childZ = calculateZ(childNode, selectedNodeZ, zIndexMode);\n const parentZ = parentNode.internals.z ?? 0;\n return {\n x: absolutePosition.x,\n y: absolutePosition.y,\n z: parentZ >= childZ ? parentZ + 1 : childZ,\n };\n}\nfunction handleExpandParent(children, nodeLookup, parentLookup, nodeOrigin = [0, 0]) {\n const changes = [];\n const parentExpansions = new Map();\n // determine the expanded rectangle the child nodes would take for each parent\n for (const child of children) {\n const parent = nodeLookup.get(child.parentId);\n if (!parent) {\n continue;\n }\n const parentRect = parentExpansions.get(child.parentId)?.expandedRect ?? nodeToRect(parent);\n const expandedRect = getBoundsOfRects(parentRect, child.rect);\n parentExpansions.set(child.parentId, { expandedRect, parent });\n }\n if (parentExpansions.size > 0) {\n parentExpansions.forEach(({ expandedRect, parent }, parentId) => {\n // determine the position & dimensions of the parent\n const positionAbsolute = parent.internals.positionAbsolute;\n const dimensions = getNodeDimensions(parent);\n const origin = parent.origin ?? nodeOrigin;\n // determine how much the parent expands in width and position\n const xChange = expandedRect.x < positionAbsolute.x ? Math.round(Math.abs(positionAbsolute.x - expandedRect.x)) : 0;\n const yChange = expandedRect.y < positionAbsolute.y ? Math.round(Math.abs(positionAbsolute.y - expandedRect.y)) : 0;\n const newWidth = Math.max(dimensions.width, Math.round(expandedRect.width));\n const newHeight = Math.max(dimensions.height, Math.round(expandedRect.height));\n const widthChange = (newWidth - dimensions.width) * origin[0];\n const heightChange = (newHeight - dimensions.height) * origin[1];\n // We need to correct the position of the parent node if the origin is not [0,0]\n if (xChange > 0 || yChange > 0 || widthChange || heightChange) {\n changes.push({\n id: parentId,\n type: 'position',\n position: {\n x: parent.position.x - xChange + widthChange,\n y: parent.position.y - yChange + heightChange,\n },\n });\n /*\n * We move all child nodes in the oppsite direction\n * so the x,y changes of the parent do not move the children\n */\n parentLookup.get(parentId)?.forEach((childNode) => {\n if (!children.some((child) => child.id === childNode.id)) {\n changes.push({\n id: childNode.id,\n type: 'position',\n position: {\n x: childNode.position.x + xChange,\n y: childNode.position.y + yChange,\n },\n });\n }\n });\n }\n // We need to correct the dimensions of the parent node if the origin is not [0,0]\n if (dimensions.width < expandedRect.width || dimensions.height < expandedRect.height || xChange || yChange) {\n changes.push({\n id: parentId,\n type: 'dimensions',\n setAttributes: true,\n dimensions: {\n width: newWidth + (xChange ? origin[0] * xChange - widthChange : 0),\n height: newHeight + (yChange ? origin[1] * yChange - heightChange : 0),\n },\n });\n }\n });\n }\n return changes;\n}\nfunction updateNodeInternals(updates, nodeLookup, parentLookup, domNode, nodeOrigin, nodeExtent, zIndexMode) {\n const viewportNode = domNode?.querySelector('.xyflow__viewport');\n let updatedInternals = false;\n if (!viewportNode) {\n return { changes: [], updatedInternals };\n }\n const changes = [];\n const style = window.getComputedStyle(viewportNode);\n const { m22: zoom } = new window.DOMMatrixReadOnly(style.transform);\n // in this array we collect nodes, that might trigger changes (like expanding parent)\n const parentExpandChildren = [];\n for (const update of updates.values()) {\n const node = nodeLookup.get(update.id);\n if (!node) {\n continue;\n }\n if (node.hidden) {\n nodeLookup.set(node.id, {\n ...node,\n internals: {\n ...node.internals,\n handleBounds: undefined,\n },\n });\n updatedInternals = true;\n continue;\n }\n const dimensions = getDimensions(update.nodeElement);\n const dimensionChanged = node.measured.width !== dimensions.width || node.measured.height !== dimensions.height;\n const doUpdate = !!(dimensions.width &&\n dimensions.height &&\n (dimensionChanged || !node.internals.handleBounds || update.force));\n if (doUpdate) {\n const nodeBounds = update.nodeElement.getBoundingClientRect();\n const extent = isCoordinateExtent(node.extent) ? node.extent : nodeExtent;\n let { positionAbsolute } = node.internals;\n if (node.parentId && node.extent === 'parent') {\n positionAbsolute = clampPositionToParent(positionAbsolute, dimensions, nodeLookup.get(node.parentId));\n }\n else if (extent) {\n positionAbsolute = clampPosition(positionAbsolute, extent, dimensions);\n }\n const newNode = {\n ...node,\n measured: dimensions,\n internals: {\n ...node.internals,\n positionAbsolute,\n handleBounds: {\n source: getHandleBounds('source', update.nodeElement, nodeBounds, zoom, node.id),\n target: getHandleBounds('target', update.nodeElement, nodeBounds, zoom, node.id),\n },\n },\n };\n nodeLookup.set(node.id, newNode);\n if (node.parentId) {\n updateChildNode(newNode, nodeLookup, parentLookup, { nodeOrigin, zIndexMode });\n }\n updatedInternals = true;\n if (dimensionChanged) {\n changes.push({\n id: node.id,\n type: 'dimensions',\n dimensions,\n });\n if (node.expandParent && node.parentId) {\n parentExpandChildren.push({\n id: node.id,\n parentId: node.parentId,\n rect: nodeToRect(newNode, nodeOrigin),\n });\n }\n }\n }\n }\n if (parentExpandChildren.length > 0) {\n const parentExpandChanges = handleExpandParent(parentExpandChildren, nodeLookup, parentLookup, nodeOrigin);\n changes.push(...parentExpandChanges);\n }\n return { changes, updatedInternals };\n}\nasync function panBy({ delta, panZoom, transform, translateExtent, width, height, }) {\n if (!panZoom || (!delta.x && !delta.y)) {\n return Promise.resolve(false);\n }\n const nextViewport = await panZoom.setViewportConstrained({\n x: transform[0] + delta.x,\n y: transform[1] + delta.y,\n zoom: transform[2],\n }, [\n [0, 0],\n [width, height],\n ], translateExtent);\n const transformChanged = !!nextViewport &&\n (nextViewport.x !== transform[0] || nextViewport.y !== transform[1] || nextViewport.k !== transform[2]);\n return Promise.resolve(transformChanged);\n}\n/**\n * this function adds the connection to the connectionLookup\n * at the following keys: nodeId-type-handleId, nodeId-type and nodeId\n * @param type type of the connection\n * @param connection connection that should be added to the lookup\n * @param connectionKey at which key the connection should be added\n * @param connectionLookup reference to the connection lookup\n * @param nodeId nodeId of the connection\n * @param handleId handleId of the conneciton\n */\nfunction addConnectionToLookup(type, connection, connectionKey, connectionLookup, nodeId, handleId) {\n /*\n * We add the connection to the connectionLookup at the following keys\n * 1. nodeId, 2. nodeId-type, 3. nodeId-type-handleId\n * If the key already exists, we add the connection to the existing map\n */\n let key = nodeId;\n const nodeMap = connectionLookup.get(key) || new Map();\n connectionLookup.set(key, nodeMap.set(connectionKey, connection));\n key = `${nodeId}-${type}`;\n const typeMap = connectionLookup.get(key) || new Map();\n connectionLookup.set(key, typeMap.set(connectionKey, connection));\n if (handleId) {\n key = `${nodeId}-${type}-${handleId}`;\n const handleMap = connectionLookup.get(key) || new Map();\n connectionLookup.set(key, handleMap.set(connectionKey, connection));\n }\n}\nfunction updateConnectionLookup(connectionLookup, edgeLookup, edges) {\n connectionLookup.clear();\n edgeLookup.clear();\n for (const edge of edges) {\n const { source: sourceNode, target: targetNode, sourceHandle = null, targetHandle = null } = edge;\n const connection = { edgeId: edge.id, source: sourceNode, target: targetNode, sourceHandle, targetHandle };\n const sourceKey = `${sourceNode}-${sourceHandle}--${targetNode}-${targetHandle}`;\n const targetKey = `${targetNode}-${targetHandle}--${sourceNode}-${sourceHandle}`;\n addConnectionToLookup('source', connection, targetKey, connectionLookup, sourceNode, sourceHandle);\n addConnectionToLookup('target', connection, sourceKey, connectionLookup, targetNode, targetHandle);\n edgeLookup.set(edge.id, edge);\n }\n}\n\nfunction shallowNodeData(a, b) {\n if (a === null || b === null) {\n return false;\n }\n const _a = Array.isArray(a) ? a : [a];\n const _b = Array.isArray(b) ? b : [b];\n if (_a.length !== _b.length) {\n return false;\n }\n for (let i = 0; i < _a.length; i++) {\n if (_a[i].id !== _b[i].id || _a[i].type !== _b[i].type || !Object.is(_a[i].data, _b[i].data)) {\n return false;\n }\n }\n return true;\n}\n\nfunction isParentSelected(node, nodeLookup) {\n if (!node.parentId) {\n return false;\n }\n const parentNode = nodeLookup.get(node.parentId);\n if (!parentNode) {\n return false;\n }\n if (parentNode.selected) {\n return true;\n }\n return isParentSelected(parentNode, nodeLookup);\n}\nfunction hasSelector(target, selector, domNode) {\n let current = target;\n do {\n if (current?.matches?.(selector))\n return true;\n if (current === domNode)\n return false;\n current = current?.parentElement;\n } while (current);\n return false;\n}\n// looks for all selected nodes and created a NodeDragItem for each of them\nfunction getDragItems(nodeLookup, nodesDraggable, mousePos, nodeId) {\n const dragItems = new Map();\n for (const [id, node] of nodeLookup) {\n if ((node.selected || node.id === nodeId) &&\n (!node.parentId || !isParentSelected(node, nodeLookup)) &&\n (node.draggable || (nodesDraggable && typeof node.draggable === 'undefined'))) {\n const internalNode = nodeLookup.get(id);\n if (internalNode) {\n dragItems.set(id, {\n id,\n position: internalNode.position || { x: 0, y: 0 },\n distance: {\n x: mousePos.x - internalNode.internals.positionAbsolute.x,\n y: mousePos.y - internalNode.internals.positionAbsolute.y,\n },\n extent: internalNode.extent,\n parentId: internalNode.parentId,\n origin: internalNode.origin,\n expandParent: internalNode.expandParent,\n internals: {\n positionAbsolute: internalNode.internals.positionAbsolute || { x: 0, y: 0 },\n },\n measured: {\n width: internalNode.measured.width ?? 0,\n height: internalNode.measured.height ?? 0,\n },\n });\n }\n }\n }\n return dragItems;\n}\n/*\n * returns two params:\n * 1. the dragged node (or the first of the list, if we are dragging a node selection)\n * 2. array of selected nodes (for multi selections)\n */\nfunction getEventHandlerParams({ nodeId, dragItems, nodeLookup, dragging = true, }) {\n const nodesFromDragItems = [];\n for (const [id, dragItem] of dragItems) {\n const node = nodeLookup.get(id)?.internals.userNode;\n if (node) {\n nodesFromDragItems.push({\n ...node,\n position: dragItem.position,\n dragging,\n });\n }\n }\n if (!nodeId) {\n return [nodesFromDragItems[0], nodesFromDragItems];\n }\n const node = nodeLookup.get(nodeId)?.internals.userNode;\n return [\n !node\n ? nodesFromDragItems[0]\n : {\n ...node,\n position: dragItems.get(nodeId)?.position || node.position,\n dragging,\n },\n nodesFromDragItems,\n ];\n}\n/**\n * If a selection is being dragged we want to apply the same snap offset to all nodes in the selection.\n * This function calculates the snap offset based on the first node in the selection.\n */\nfunction calculateSnapOffset({ dragItems, snapGrid, x, y, }) {\n const refDragItem = dragItems.values().next().value;\n if (!refDragItem) {\n return null;\n }\n const refPos = {\n x: x - refDragItem.distance.x,\n y: y - refDragItem.distance.y,\n };\n const refPosSnapped = snapPosition(refPos, snapGrid);\n return {\n x: refPosSnapped.x - refPos.x,\n y: refPosSnapped.y - refPos.y,\n };\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction XYDrag({ onNodeMouseDown, getStoreItems, onDragStart, onDrag, onDragStop, }) {\n let lastPos = { x: null, y: null };\n let autoPanId = 0;\n let dragItems = new Map();\n let autoPanStarted = false;\n let mousePosition = { x: 0, y: 0 };\n let containerBounds = null;\n let dragStarted = false;\n let d3Selection = null;\n let abortDrag = false; // prevents unintentional dragging on multitouch\n let nodePositionsChanged = false;\n // we store the last drag event to be able to use it in the update function\n let dragEvent = null;\n // public functions\n function update({ noDragClassName, handleSelector, domNode, isSelectable, nodeId, nodeClickDistance = 0, }) {\n d3Selection = select(domNode);\n function updateNodes({ x, y }) {\n const { nodeLookup, nodeExtent, snapGrid, snapToGrid, nodeOrigin, onNodeDrag, onSelectionDrag, onError, updateNodePositions, } = getStoreItems();\n lastPos = { x, y };\n let hasChange = false;\n const isMultiDrag = dragItems.size > 1;\n const nodesBox = isMultiDrag && nodeExtent ? rectToBox(getInternalNodesBounds(dragItems)) : null;\n const multiDragSnapOffset = isMultiDrag && snapToGrid\n ? calculateSnapOffset({\n dragItems,\n snapGrid,\n x,\n y,\n })\n : null;\n for (const [id, dragItem] of dragItems) {\n /*\n * if the node is not in the nodeLookup anymore, it was probably deleted while dragging\n */\n if (!nodeLookup.has(id)) {\n continue;\n }\n let nextPosition = { x: x - dragItem.distance.x, y: y - dragItem.distance.y };\n if (snapToGrid) {\n nextPosition = multiDragSnapOffset\n ? {\n x: Math.round(nextPosition.x + multiDragSnapOffset.x),\n y: Math.round(nextPosition.y + multiDragSnapOffset.y),\n }\n : snapPosition(nextPosition, snapGrid);\n }\n let adjustedNodeExtent = null;\n if (isMultiDrag && nodeExtent && !dragItem.extent && nodesBox) {\n const { positionAbsolute } = dragItem.internals;\n const x1 = positionAbsolute.x - nodesBox.x + nodeExtent[0][0];\n const x2 = positionAbsolute.x + dragItem.measured.width - nodesBox.x2 + nodeExtent[1][0];\n const y1 = positionAbsolute.y - nodesBox.y + nodeExtent[0][1];\n const y2 = positionAbsolute.y + dragItem.measured.height - nodesBox.y2 + nodeExtent[1][1];\n adjustedNodeExtent = [\n [x1, y1],\n [x2, y2],\n ];\n }\n const { position, positionAbsolute } = calculateNodePosition({\n nodeId: id,\n nextPosition,\n nodeLookup,\n nodeExtent: adjustedNodeExtent ? adjustedNodeExtent : nodeExtent,\n nodeOrigin,\n onError,\n });\n // we want to make sure that we only fire a change event when there is a change\n hasChange = hasChange || dragItem.position.x !== position.x || dragItem.position.y !== position.y;\n dragItem.position = position;\n dragItem.internals.positionAbsolute = positionAbsolute;\n }\n nodePositionsChanged = nodePositionsChanged || hasChange;\n if (!hasChange) {\n return;\n }\n updateNodePositions(dragItems, true);\n if (dragEvent && (onDrag || onNodeDrag || (!nodeId && onSelectionDrag))) {\n const [currentNode, currentNodes] = getEventHandlerParams({\n nodeId,\n dragItems,\n nodeLookup,\n });\n onDrag?.(dragEvent, dragItems, currentNode, currentNodes);\n onNodeDrag?.(dragEvent, currentNode, currentNodes);\n if (!nodeId) {\n onSelectionDrag?.(dragEvent, currentNodes);\n }\n }\n }\n async function autoPan() {\n if (!containerBounds) {\n return;\n }\n const { transform, panBy, autoPanSpeed, autoPanOnNodeDrag } = getStoreItems();\n if (!autoPanOnNodeDrag) {\n autoPanStarted = false;\n cancelAnimationFrame(autoPanId);\n return;\n }\n const [xMovement, yMovement] = calcAutoPan(mousePosition, containerBounds, autoPanSpeed);\n if (xMovement !== 0 || yMovement !== 0) {\n lastPos.x = (lastPos.x ?? 0) - xMovement / transform[2];\n lastPos.y = (lastPos.y ?? 0) - yMovement / transform[2];\n if (await panBy({ x: xMovement, y: yMovement })) {\n updateNodes(lastPos);\n }\n }\n autoPanId = requestAnimationFrame(autoPan);\n }\n function startDrag(event) {\n const { nodeLookup, multiSelectionActive, nodesDraggable, transform, snapGrid, snapToGrid, selectNodesOnDrag, onNodeDragStart, onSelectionDragStart, unselectNodesAndEdges, } = getStoreItems();\n dragStarted = true;\n if ((!selectNodesOnDrag || !isSelectable) && !multiSelectionActive && nodeId) {\n if (!nodeLookup.get(nodeId)?.selected) {\n // we need to reset selected nodes when selectNodesOnDrag=false\n unselectNodesAndEdges();\n }\n }\n if (isSelectable && selectNodesOnDrag && nodeId) {\n onNodeMouseDown?.(nodeId);\n }\n const pointerPos = getPointerPosition(event.sourceEvent, { transform, snapGrid, snapToGrid, containerBounds });\n lastPos = pointerPos;\n dragItems = getDragItems(nodeLookup, nodesDraggable, pointerPos, nodeId);\n if (dragItems.size > 0 && (onDragStart || onNodeDragStart || (!nodeId && onSelectionDragStart))) {\n const [currentNode, currentNodes] = getEventHandlerParams({\n nodeId,\n dragItems,\n nodeLookup,\n });\n onDragStart?.(event.sourceEvent, dragItems, currentNode, currentNodes);\n onNodeDragStart?.(event.sourceEvent, currentNode, currentNodes);\n if (!nodeId) {\n onSelectionDragStart?.(event.sourceEvent, currentNodes);\n }\n }\n }\n const d3DragInstance = drag()\n .clickDistance(nodeClickDistance)\n .on('start', (event) => {\n const { domNode, nodeDragThreshold, transform, snapGrid, snapToGrid } = getStoreItems();\n containerBounds = domNode?.getBoundingClientRect() || null;\n abortDrag = false;\n nodePositionsChanged = false;\n dragEvent = event.sourceEvent;\n if (nodeDragThreshold === 0) {\n startDrag(event);\n }\n const pointerPos = getPointerPosition(event.sourceEvent, { transform, snapGrid, snapToGrid, containerBounds });\n lastPos = pointerPos;\n mousePosition = getEventPosition(event.sourceEvent, containerBounds);\n })\n .on('drag', (event) => {\n const { autoPanOnNodeDrag, transform, snapGrid, snapToGrid, nodeDragThreshold, nodeLookup } = getStoreItems();\n const pointerPos = getPointerPosition(event.sourceEvent, { transform, snapGrid, snapToGrid, containerBounds });\n dragEvent = event.sourceEvent;\n if ((event.sourceEvent.type === 'touchmove' && event.sourceEvent.touches.length > 1) ||\n // if user deletes a node while dragging, we need to abort the drag to prevent errors\n (nodeId && !nodeLookup.has(nodeId))) {\n abortDrag = true;\n }\n if (abortDrag) {\n return;\n }\n if (!autoPanStarted && autoPanOnNodeDrag && dragStarted) {\n autoPanStarted = true;\n autoPan();\n }\n if (!dragStarted) {\n // Calculate distance in client coordinates for consistent drag threshold behavior across zoom levels\n const currentMousePosition = getEventPosition(event.sourceEvent, containerBounds);\n const x = currentMousePosition.x - mousePosition.x;\n const y = currentMousePosition.y - mousePosition.y;\n const distance = Math.sqrt(x * x + y * y);\n if (distance > nodeDragThreshold) {\n startDrag(event);\n }\n }\n // skip events without movement\n if ((lastPos.x !== pointerPos.xSnapped || lastPos.y !== pointerPos.ySnapped) && dragItems && dragStarted) {\n mousePosition = getEventPosition(event.sourceEvent, containerBounds);\n updateNodes(pointerPos);\n }\n })\n .on('end', (event) => {\n if (!dragStarted || abortDrag) {\n return;\n }\n autoPanStarted = false;\n dragStarted = false;\n cancelAnimationFrame(autoPanId);\n if (dragItems.size > 0) {\n const { nodeLookup, updateNodePositions, onNodeDragStop, onSelectionDragStop } = getStoreItems();\n if (nodePositionsChanged) {\n updateNodePositions(dragItems, false);\n nodePositionsChanged = false;\n }\n if (onDragStop || onNodeDragStop || (!nodeId && onSelectionDragStop)) {\n const [currentNode, currentNodes] = getEventHandlerParams({\n nodeId,\n dragItems,\n nodeLookup,\n dragging: false,\n });\n onDragStop?.(event.sourceEvent, dragItems, currentNode, currentNodes);\n onNodeDragStop?.(event.sourceEvent, currentNode, currentNodes);\n if (!nodeId) {\n onSelectionDragStop?.(event.sourceEvent, currentNodes);\n }\n }\n }\n })\n .filter((event) => {\n const target = event.target;\n const isDraggable = !event.button &&\n (!noDragClassName || !hasSelector(target, `.${noDragClassName}`, domNode)) &&\n (!handleSelector || hasSelector(target, handleSelector, domNode));\n return isDraggable;\n });\n d3Selection.call(d3DragInstance);\n }\n function destroy() {\n d3Selection?.on('.drag', null);\n }\n return {\n update,\n destroy,\n };\n}\n\nfunction getNodesWithinDistance(position, nodeLookup, distance) {\n const nodes = [];\n const rect = {\n x: position.x - distance,\n y: position.y - distance,\n width: distance * 2,\n height: distance * 2,\n };\n for (const node of nodeLookup.values()) {\n if (getOverlappingArea(rect, nodeToRect(node)) > 0) {\n nodes.push(node);\n }\n }\n return nodes;\n}\n/*\n * this distance is used for the area around the user pointer\n * while doing a connection for finding the closest nodes\n */\nconst ADDITIONAL_DISTANCE = 250;\nfunction getClosestHandle(position, connectionRadius, nodeLookup, fromHandle) {\n let closestHandles = [];\n let minDistance = Infinity;\n const closeNodes = getNodesWithinDistance(position, nodeLookup, connectionRadius + ADDITIONAL_DISTANCE);\n for (const node of closeNodes) {\n const allHandles = [...(node.internals.handleBounds?.source ?? []), ...(node.internals.handleBounds?.target ?? [])];\n for (const handle of allHandles) {\n // if the handle is the same as the fromHandle we skip it\n if (fromHandle.nodeId === handle.nodeId && fromHandle.type === handle.type && fromHandle.id === handle.id) {\n continue;\n }\n // determine absolute position of the handle\n const { x, y } = getHandlePosition(node, handle, handle.position, true);\n const distance = Math.sqrt(Math.pow(x - position.x, 2) + Math.pow(y - position.y, 2));\n if (distance > connectionRadius) {\n continue;\n }\n if (distance < minDistance) {\n closestHandles = [{ ...handle, x, y }];\n minDistance = distance;\n }\n else if (distance === minDistance) {\n // when multiple handles are on the same distance we collect all of them\n closestHandles.push({ ...handle, x, y });\n }\n }\n }\n if (!closestHandles.length) {\n return null;\n }\n // when multiple handles overlay each other we prefer the opposite handle\n if (closestHandles.length > 1) {\n const oppositeHandleType = fromHandle.type === 'source' ? 'target' : 'source';\n return closestHandles.find((handle) => handle.type === oppositeHandleType) ?? closestHandles[0];\n }\n return closestHandles[0];\n}\nfunction getHandle(nodeId, handleType, handleId, nodeLookup, connectionMode, withAbsolutePosition = false) {\n const node = nodeLookup.get(nodeId);\n if (!node) {\n return null;\n }\n const handles = connectionMode === 'strict'\n ? node.internals.handleBounds?.[handleType]\n : [...(node.internals.handleBounds?.source ?? []), ...(node.internals.handleBounds?.target ?? [])];\n const handle = (handleId ? handles?.find((h) => h.id === handleId) : handles?.[0]) ?? null;\n return handle && withAbsolutePosition\n ? { ...handle, ...getHandlePosition(node, handle, handle.position, true) }\n : handle;\n}\nfunction getHandleType(edgeUpdaterType, handleDomNode) {\n if (edgeUpdaterType) {\n return edgeUpdaterType;\n }\n else if (handleDomNode?.classList.contains('target')) {\n return 'target';\n }\n else if (handleDomNode?.classList.contains('source')) {\n return 'source';\n }\n return null;\n}\nfunction isConnectionValid(isInsideConnectionRadius, isHandleValid) {\n let isValid = null;\n if (isHandleValid) {\n isValid = true;\n }\n else if (isInsideConnectionRadius && !isHandleValid) {\n isValid = false;\n }\n return isValid;\n}\n\nconst alwaysValid = () => true;\nfunction onPointerDown(event, { connectionMode, connectionRadius, handleId, nodeId, edgeUpdaterType, isTarget, domNode, nodeLookup, lib, autoPanOnConnect, flowId, panBy, cancelConnection, onConnectStart, onConnect, onConnectEnd, isValidConnection = alwaysValid, onReconnectEnd, updateConnection, getTransform, getFromHandle, autoPanSpeed, dragThreshold = 1, handleDomNode, }) {\n // when xyflow is used inside a shadow root we can't use document\n const doc = getHostForElement(event.target);\n let autoPanId = 0;\n let closestHandle;\n const { x, y } = getEventPosition(event);\n const handleType = getHandleType(edgeUpdaterType, handleDomNode);\n const containerBounds = domNode?.getBoundingClientRect();\n let connectionStarted = false;\n if (!containerBounds || !handleType) {\n return;\n }\n const fromHandleInternal = getHandle(nodeId, handleType, handleId, nodeLookup, connectionMode);\n if (!fromHandleInternal) {\n return;\n }\n let position = getEventPosition(event, containerBounds);\n let autoPanStarted = false;\n let connection = null;\n let isValid = false;\n let resultHandleDomNode = null;\n // when the user is moving the mouse close to the edge of the canvas while connecting we move the canvas\n function autoPan() {\n if (!autoPanOnConnect || !containerBounds) {\n return;\n }\n const [x, y] = calcAutoPan(position, containerBounds, autoPanSpeed);\n panBy({ x, y });\n autoPanId = requestAnimationFrame(autoPan);\n }\n // Stays the same for all consecutive pointermove events\n const fromHandle = {\n ...fromHandleInternal,\n nodeId,\n type: handleType,\n position: fromHandleInternal.position,\n };\n const fromInternalNode = nodeLookup.get(nodeId);\n const from = getHandlePosition(fromInternalNode, fromHandle, Position.Left, true);\n let previousConnection = {\n inProgress: true,\n isValid: null,\n from,\n fromHandle,\n fromPosition: fromHandle.position,\n fromNode: fromInternalNode,\n to: position,\n toHandle: null,\n toPosition: oppositePosition[fromHandle.position],\n toNode: null,\n pointer: position,\n };\n function startConnection() {\n connectionStarted = true;\n updateConnection(previousConnection);\n onConnectStart?.(event, { nodeId, handleId, handleType });\n }\n if (dragThreshold === 0) {\n startConnection();\n }\n function onPointerMove(event) {\n if (!connectionStarted) {\n const { x: evtX, y: evtY } = getEventPosition(event);\n const dx = evtX - x;\n const dy = evtY - y;\n const nextConnectionStarted = dx * dx + dy * dy > dragThreshold * dragThreshold;\n if (!nextConnectionStarted) {\n return;\n }\n startConnection();\n }\n if (!getFromHandle() || !fromHandle) {\n onPointerUp(event);\n return;\n }\n const transform = getTransform();\n position = getEventPosition(event, containerBounds);\n closestHandle = getClosestHandle(pointToRendererPoint(position, transform, false, [1, 1]), connectionRadius, nodeLookup, fromHandle);\n if (!autoPanStarted) {\n autoPan();\n autoPanStarted = true;\n }\n const result = isValidHandle(event, {\n handle: closestHandle,\n connectionMode,\n fromNodeId: nodeId,\n fromHandleId: handleId,\n fromType: isTarget ? 'target' : 'source',\n isValidConnection,\n doc,\n lib,\n flowId,\n nodeLookup,\n });\n resultHandleDomNode = result.handleDomNode;\n connection = result.connection;\n isValid = isConnectionValid(!!closestHandle, result.isValid);\n const fromInternalNode = nodeLookup.get(nodeId);\n const from = fromInternalNode\n ? getHandlePosition(fromInternalNode, fromHandle, Position.Left, true)\n : previousConnection.from;\n const newConnection = {\n ...previousConnection,\n from,\n isValid,\n to: result.toHandle && isValid\n ? rendererPointToPoint({ x: result.toHandle.x, y: result.toHandle.y }, transform)\n : position,\n toHandle: result.toHandle,\n toPosition: isValid && result.toHandle ? result.toHandle.position : oppositePosition[fromHandle.position],\n toNode: result.toHandle ? nodeLookup.get(result.toHandle.nodeId) : null,\n pointer: position,\n };\n updateConnection(newConnection);\n previousConnection = newConnection;\n }\n function onPointerUp(event) {\n // Prevent multi-touch aborting connection\n if ('touches' in event && event.touches.length > 0) {\n return;\n }\n if (connectionStarted) {\n if ((closestHandle || resultHandleDomNode) && connection && isValid) {\n onConnect?.(connection);\n }\n /*\n * it's important to get a fresh reference from the store here\n * in order to get the latest state of onConnectEnd\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { inProgress, ...connectionState } = previousConnection;\n const finalConnectionState = {\n ...connectionState,\n toPosition: previousConnection.toHandle ? previousConnection.toPosition : null,\n };\n onConnectEnd?.(event, finalConnectionState);\n if (edgeUpdaterType) {\n onReconnectEnd?.(event, finalConnectionState);\n }\n }\n cancelConnection();\n cancelAnimationFrame(autoPanId);\n autoPanStarted = false;\n isValid = false;\n connection = null;\n resultHandleDomNode = null;\n doc.removeEventListener('mousemove', onPointerMove);\n doc.removeEventListener('mouseup', onPointerUp);\n doc.removeEventListener('touchmove', onPointerMove);\n doc.removeEventListener('touchend', onPointerUp);\n }\n doc.addEventListener('mousemove', onPointerMove);\n doc.addEventListener('mouseup', onPointerUp);\n doc.addEventListener('touchmove', onPointerMove);\n doc.addEventListener('touchend', onPointerUp);\n}\n// checks if and returns connection in fom of an object { source: 123, target: 312 }\nfunction isValidHandle(event, { handle, connectionMode, fromNodeId, fromHandleId, fromType, doc, lib, flowId, isValidConnection = alwaysValid, nodeLookup, }) {\n const isTarget = fromType === 'target';\n const handleDomNode = handle\n ? doc.querySelector(`.${lib}-flow__handle[data-id=\"${flowId}-${handle?.nodeId}-${handle?.id}-${handle?.type}\"]`)\n : null;\n const { x, y } = getEventPosition(event);\n const handleBelow = doc.elementFromPoint(x, y);\n /*\n * we always want to prioritize the handle below the mouse cursor over the closest distance handle,\n * because it could be that the center of another handle is closer to the mouse pointer than the handle below the cursor\n */\n const handleToCheck = handleBelow?.classList.contains(`${lib}-flow__handle`) ? handleBelow : handleDomNode;\n const result = {\n handleDomNode: handleToCheck,\n isValid: false,\n connection: null,\n toHandle: null,\n };\n if (handleToCheck) {\n const handleType = getHandleType(undefined, handleToCheck);\n const handleNodeId = handleToCheck.getAttribute('data-nodeid');\n const handleId = handleToCheck.getAttribute('data-handleid');\n const connectable = handleToCheck.classList.contains('connectable');\n const connectableEnd = handleToCheck.classList.contains('connectableend');\n if (!handleNodeId || !handleType) {\n return result;\n }\n const connection = {\n source: isTarget ? handleNodeId : fromNodeId,\n sourceHandle: isTarget ? handleId : fromHandleId,\n target: isTarget ? fromNodeId : handleNodeId,\n targetHandle: isTarget ? fromHandleId : handleId,\n };\n result.connection = connection;\n const isConnectable = connectable && connectableEnd;\n // in strict mode we don't allow target to target or source to source connections\n const isValid = isConnectable &&\n (connectionMode === ConnectionMode.Strict\n ? (isTarget && handleType === 'source') || (!isTarget && handleType === 'target')\n : handleNodeId !== fromNodeId || handleId !== fromHandleId);\n result.isValid = isValid && isValidConnection(connection);\n result.toHandle = getHandle(handleNodeId, handleType, handleId, nodeLookup, connectionMode, true);\n }\n return result;\n}\nconst XYHandle = {\n onPointerDown,\n isValid: isValidHandle,\n};\n\nfunction XYMinimap({ domNode, panZoom, getTransform, getViewScale }) {\n const selection = select(domNode);\n function update({ translateExtent, width, height, zoomStep = 1, pannable = true, zoomable = true, inversePan = false, }) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const zoomHandler = (event) => {\n if (event.sourceEvent.type !== 'wheel' || !panZoom) {\n return;\n }\n const transform = getTransform();\n const factor = event.sourceEvent.ctrlKey && isMacOs() ? 10 : 1;\n const pinchDelta = -event.sourceEvent.deltaY *\n (event.sourceEvent.deltaMode === 1 ? 0.05 : event.sourceEvent.deltaMode ? 1 : 0.002) *\n zoomStep;\n const nextZoom = transform[2] * Math.pow(2, pinchDelta * factor);\n panZoom.scaleTo(nextZoom);\n };\n let panStart = [0, 0];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const panStartHandler = (event) => {\n if (event.sourceEvent.type === 'mousedown' || event.sourceEvent.type === 'touchstart') {\n panStart = [\n event.sourceEvent.clientX ?? event.sourceEvent.touches[0].clientX,\n event.sourceEvent.clientY ?? event.sourceEvent.touches[0].clientY,\n ];\n }\n };\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const panHandler = (event) => {\n const transform = getTransform();\n if ((event.sourceEvent.type !== 'mousemove' && event.sourceEvent.type !== 'touchmove') || !panZoom) {\n return;\n }\n const panCurrent = [\n event.sourceEvent.clientX ?? event.sourceEvent.touches[0].clientX,\n event.sourceEvent.clientY ?? event.sourceEvent.touches[0].clientY,\n ];\n const panDelta = [panCurrent[0] - panStart[0], panCurrent[1] - panStart[1]];\n panStart = panCurrent;\n const moveScale = getViewScale() * Math.max(transform[2], Math.log(transform[2])) * (inversePan ? -1 : 1);\n const position = {\n x: transform[0] - panDelta[0] * moveScale,\n y: transform[1] - panDelta[1] * moveScale,\n };\n const extent = [\n [0, 0],\n [width, height],\n ];\n panZoom.setViewportConstrained({\n x: position.x,\n y: position.y,\n zoom: transform[2],\n }, extent, translateExtent);\n };\n const zoomAndPanHandler = zoom()\n .on('start', panStartHandler)\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n .on('zoom', pannable ? panHandler : null)\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n .on('zoom.wheel', zoomable ? zoomHandler : null);\n selection.call(zoomAndPanHandler, {});\n }\n function destroy() {\n selection.on('zoom', null);\n }\n return {\n update,\n destroy,\n pointer,\n };\n}\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nconst transformToViewport = (transform) => ({\n x: transform.x,\n y: transform.y,\n zoom: transform.k,\n});\nconst viewportToTransform = ({ x, y, zoom }) => zoomIdentity.translate(x, y).scale(zoom);\nconst isWrappedWithClass = (event, className) => event.target.closest(`.${className}`);\nconst isRightClickPan = (panOnDrag, usedButton) => usedButton === 2 && Array.isArray(panOnDrag) && panOnDrag.includes(2);\n// taken from d3-ease: https://github.com/d3/d3-ease/blob/main/src/cubic.js\nconst defaultEase = (t) => ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;\nconst getD3Transition = (selection, duration = 0, ease = defaultEase, onEnd = () => { }) => {\n const hasDuration = typeof duration === 'number' && duration > 0;\n if (!hasDuration) {\n onEnd();\n }\n return hasDuration ? selection.transition().duration(duration).ease(ease).on('end', onEnd) : selection;\n};\nconst wheelDelta = (event) => {\n const factor = event.ctrlKey && isMacOs() ? 10 : 1;\n return -event.deltaY * (event.deltaMode === 1 ? 0.05 : event.deltaMode ? 1 : 0.002) * factor;\n};\n\nfunction createPanOnScrollHandler({ zoomPanValues, noWheelClassName, d3Selection, d3Zoom, panOnScrollMode, panOnScrollSpeed, zoomOnPinch, onPanZoomStart, onPanZoom, onPanZoomEnd, }) {\n return (event) => {\n if (isWrappedWithClass(event, noWheelClassName)) {\n if (event.ctrlKey) {\n event.preventDefault(); // stop native page zoom for pinch zooming\n }\n return false;\n }\n event.preventDefault();\n event.stopImmediatePropagation();\n const currentZoom = d3Selection.property('__zoom').k || 1;\n // macos sets ctrlKey=true for pinch gesture on a trackpad\n if (event.ctrlKey && zoomOnPinch) {\n const point = pointer(event);\n const pinchDelta = wheelDelta(event);\n const zoom = currentZoom * Math.pow(2, pinchDelta);\n // @ts-ignore\n d3Zoom.scaleTo(d3Selection, zoom, point, event);\n return;\n }\n /*\n * increase scroll speed in firefox\n * firefox: deltaMode === 1; chrome: deltaMode === 0\n */\n const deltaNormalize = event.deltaMode === 1 ? 20 : 1;\n let deltaX = panOnScrollMode === PanOnScrollMode.Vertical ? 0 : event.deltaX * deltaNormalize;\n let deltaY = panOnScrollMode === PanOnScrollMode.Horizontal ? 0 : event.deltaY * deltaNormalize;\n // this enables vertical scrolling with shift + scroll on windows\n if (!isMacOs() && event.shiftKey && panOnScrollMode !== PanOnScrollMode.Vertical) {\n deltaX = event.deltaY * deltaNormalize;\n deltaY = 0;\n }\n d3Zoom.translateBy(d3Selection, -(deltaX / currentZoom) * panOnScrollSpeed, -(deltaY / currentZoom) * panOnScrollSpeed, \n // @ts-ignore\n { internal: true });\n const nextViewport = transformToViewport(d3Selection.property('__zoom'));\n clearTimeout(zoomPanValues.panScrollTimeout);\n /*\n * for pan on scroll we need to handle the event calls on our own\n * we can't use the start, zoom and end events from d3-zoom\n * because start and move gets called on every scroll event and not once at the beginning\n */\n if (!zoomPanValues.isPanScrolling) {\n zoomPanValues.isPanScrolling = true;\n onPanZoomStart?.(event, nextViewport);\n }\n else {\n onPanZoom?.(event, nextViewport);\n zoomPanValues.panScrollTimeout = setTimeout(() => {\n onPanZoomEnd?.(event, nextViewport);\n zoomPanValues.isPanScrolling = false;\n }, 150);\n }\n };\n}\nfunction createZoomOnScrollHandler({ noWheelClassName, preventScrolling, d3ZoomHandler }) {\n return function (event, d) {\n const isWheel = event.type === 'wheel';\n // we still want to enable pinch zooming even if preventScrolling is set to false\n const preventZoom = !preventScrolling && isWheel && !event.ctrlKey;\n const hasNoWheelClass = isWrappedWithClass(event, noWheelClassName);\n // if user is pinch zooming above a nowheel element, we don't want the browser to zoom\n if (event.ctrlKey && isWheel && hasNoWheelClass) {\n event.preventDefault();\n }\n if (preventZoom || hasNoWheelClass) {\n return null;\n }\n event.preventDefault();\n d3ZoomHandler.call(this, event, d);\n };\n}\nfunction createPanZoomStartHandler({ zoomPanValues, onDraggingChange, onPanZoomStart }) {\n return (event) => {\n if (event.sourceEvent?.internal) {\n return;\n }\n const viewport = transformToViewport(event.transform);\n // we need to remember it here, because it's always 0 in the \"zoom\" event\n zoomPanValues.mouseButton = event.sourceEvent?.button || 0;\n zoomPanValues.isZoomingOrPanning = true;\n zoomPanValues.prevViewport = viewport;\n if (event.sourceEvent?.type === 'mousedown') {\n onDraggingChange(true);\n }\n if (onPanZoomStart) {\n onPanZoomStart?.(event.sourceEvent, viewport);\n }\n };\n}\nfunction createPanZoomHandler({ zoomPanValues, panOnDrag, onPaneContextMenu, onTransformChange, onPanZoom, }) {\n return (event) => {\n zoomPanValues.usedRightMouseButton = !!(onPaneContextMenu && isRightClickPan(panOnDrag, zoomPanValues.mouseButton ?? 0));\n if (!event.sourceEvent?.sync) {\n onTransformChange([event.transform.x, event.transform.y, event.transform.k]);\n }\n if (onPanZoom && !event.sourceEvent?.internal) {\n onPanZoom?.(event.sourceEvent, transformToViewport(event.transform));\n }\n };\n}\nfunction createPanZoomEndHandler({ zoomPanValues, panOnDrag, panOnScroll, onDraggingChange, onPanZoomEnd, onPaneContextMenu, }) {\n return (event) => {\n if (event.sourceEvent?.internal) {\n return;\n }\n zoomPanValues.isZoomingOrPanning = false;\n if (onPaneContextMenu &&\n isRightClickPan(panOnDrag, zoomPanValues.mouseButton ?? 0) &&\n !zoomPanValues.usedRightMouseButton &&\n event.sourceEvent) {\n onPaneContextMenu(event.sourceEvent);\n }\n zoomPanValues.usedRightMouseButton = false;\n onDraggingChange(false);\n if (onPanZoomEnd) {\n const viewport = transformToViewport(event.transform);\n zoomPanValues.prevViewport = viewport;\n clearTimeout(zoomPanValues.timerId);\n zoomPanValues.timerId = setTimeout(() => {\n onPanZoomEnd?.(event.sourceEvent, viewport);\n }, \n // we need a setTimeout for panOnScroll to supress multiple end events fired during scroll\n panOnScroll ? 150 : 0);\n }\n };\n}\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nfunction createFilter({ zoomActivationKeyPressed, zoomOnScroll, zoomOnPinch, panOnDrag, panOnScroll, zoomOnDoubleClick, userSelectionActive, noWheelClassName, noPanClassName, lib, connectionInProgress, }) {\n return (event) => {\n const zoomScroll = zoomActivationKeyPressed || zoomOnScroll;\n const pinchZoom = zoomOnPinch && event.ctrlKey;\n const isWheelEvent = event.type === 'wheel';\n if (event.button === 1 &&\n event.type === 'mousedown' &&\n (isWrappedWithClass(event, `${lib}-flow__node`) || isWrappedWithClass(event, `${lib}-flow__edge`))) {\n return true;\n }\n // if all interactions are disabled, we prevent all zoom events\n if (!panOnDrag && !zoomScroll && !panOnScroll && !zoomOnDoubleClick && !zoomOnPinch) {\n return false;\n }\n // during a selection we prevent all other interactions\n if (userSelectionActive) {\n return false;\n }\n // we want to disable pinch-zooming while making a connection\n if (connectionInProgress && !isWheelEvent) {\n return false;\n }\n // if the target element is inside an element with the nowheel class, we prevent zooming\n if (isWrappedWithClass(event, noWheelClassName) && isWheelEvent) {\n return false;\n }\n // if the target element is inside an element with the nopan class, we prevent panning\n if (isWrappedWithClass(event, noPanClassName) &&\n (!isWheelEvent || (panOnScroll && isWheelEvent && !zoomActivationKeyPressed))) {\n return false;\n }\n if (!zoomOnPinch && event.ctrlKey && isWheelEvent) {\n return false;\n }\n if (!zoomOnPinch && event.type === 'touchstart' && event.touches?.length > 1) {\n event.preventDefault(); // if you manage to start with 2 touches, we prevent native zoom\n return false;\n }\n // when there is no scroll handling enabled, we prevent all wheel events\n if (!zoomScroll && !panOnScroll && !pinchZoom && isWheelEvent) {\n return false;\n }\n // if the pane is not movable, we prevent dragging it with mousestart or touchstart\n if (!panOnDrag && (event.type === 'mousedown' || event.type === 'touchstart')) {\n return false;\n }\n // if the pane is only movable using allowed clicks\n if (Array.isArray(panOnDrag) && !panOnDrag.includes(event.button) && event.type === 'mousedown') {\n return false;\n }\n // We only allow right clicks if pan on drag is set to right click\n const buttonAllowed = (Array.isArray(panOnDrag) && panOnDrag.includes(event.button)) || !event.button || event.button <= 1;\n // default filter for d3-zoom\n return (!event.ctrlKey || isWheelEvent) && buttonAllowed;\n };\n}\n\nfunction XYPanZoom({ domNode, minZoom, maxZoom, translateExtent, viewport, onPanZoom, onPanZoomStart, onPanZoomEnd, onDraggingChange, }) {\n const zoomPanValues = {\n isZoomingOrPanning: false,\n usedRightMouseButton: false,\n prevViewport: { x: 0, y: 0, zoom: 0 },\n mouseButton: 0,\n timerId: undefined,\n panScrollTimeout: undefined,\n isPanScrolling: false,\n };\n const bbox = domNode.getBoundingClientRect();\n const d3ZoomInstance = zoom().scaleExtent([minZoom, maxZoom]).translateExtent(translateExtent);\n const d3Selection = select(domNode).call(d3ZoomInstance);\n setViewportConstrained({\n x: viewport.x,\n y: viewport.y,\n zoom: clamp(viewport.zoom, minZoom, maxZoom),\n }, [\n [0, 0],\n [bbox.width, bbox.height],\n ], translateExtent);\n const d3ZoomHandler = d3Selection.on('wheel.zoom');\n const d3DblClickZoomHandler = d3Selection.on('dblclick.zoom');\n d3ZoomInstance.wheelDelta(wheelDelta);\n function setTransform(transform, options) {\n if (d3Selection) {\n return new Promise((resolve) => {\n d3ZoomInstance?.interpolate(options?.interpolate === 'linear' ? interpolate : interpolateZoom).transform(getD3Transition(d3Selection, options?.duration, options?.ease, () => resolve(true)), transform);\n });\n }\n return Promise.resolve(false);\n }\n // public functions\n function update({ noWheelClassName, noPanClassName, onPaneContextMenu, userSelectionActive, panOnScroll, panOnDrag, panOnScrollMode, panOnScrollSpeed, preventScrolling, zoomOnPinch, zoomOnScroll, zoomOnDoubleClick, zoomActivationKeyPressed, lib, onTransformChange, connectionInProgress, paneClickDistance, selectionOnDrag, }) {\n if (userSelectionActive && !zoomPanValues.isZoomingOrPanning) {\n destroy();\n }\n const isPanOnScroll = panOnScroll && !zoomActivationKeyPressed && !userSelectionActive;\n d3ZoomInstance.clickDistance(selectionOnDrag ? Infinity : !isNumeric(paneClickDistance) || paneClickDistance < 0 ? 0 : paneClickDistance);\n const wheelHandler = isPanOnScroll\n ? createPanOnScrollHandler({\n zoomPanValues,\n noWheelClassName,\n d3Selection,\n d3Zoom: d3ZoomInstance,\n panOnScrollMode,\n panOnScrollSpeed,\n zoomOnPinch,\n onPanZoomStart,\n onPanZoom,\n onPanZoomEnd,\n })\n : createZoomOnScrollHandler({\n noWheelClassName,\n preventScrolling,\n d3ZoomHandler,\n });\n d3Selection.on('wheel.zoom', wheelHandler, { passive: false });\n if (!userSelectionActive) {\n // pan zoom start\n const startHandler = createPanZoomStartHandler({\n zoomPanValues,\n onDraggingChange,\n onPanZoomStart,\n });\n d3ZoomInstance.on('start', startHandler);\n // pan zoom\n const panZoomHandler = createPanZoomHandler({\n zoomPanValues,\n panOnDrag,\n onPaneContextMenu: !!onPaneContextMenu,\n onPanZoom,\n onTransformChange,\n });\n d3ZoomInstance.on('zoom', panZoomHandler);\n // pan zoom end\n const panZoomEndHandler = createPanZoomEndHandler({\n zoomPanValues,\n panOnDrag,\n panOnScroll,\n onPaneContextMenu,\n onPanZoomEnd,\n onDraggingChange,\n });\n d3ZoomInstance.on('end', panZoomEndHandler);\n }\n const filter = createFilter({\n zoomActivationKeyPressed,\n panOnDrag,\n zoomOnScroll,\n panOnScroll,\n zoomOnDoubleClick,\n zoomOnPinch,\n userSelectionActive,\n noPanClassName,\n noWheelClassName,\n lib,\n connectionInProgress,\n });\n d3ZoomInstance.filter(filter);\n /*\n * We cannot add zoomOnDoubleClick to the filter above because\n * double tapping on touch screens circumvents the filter and\n * dblclick.zoom is fired on the selection directly\n */\n if (zoomOnDoubleClick) {\n d3Selection.on('dblclick.zoom', d3DblClickZoomHandler);\n }\n else {\n d3Selection.on('dblclick.zoom', null);\n }\n }\n function destroy() {\n d3ZoomInstance.on('zoom', null);\n }\n async function setViewportConstrained(viewport, extent, translateExtent) {\n const nextTransform = viewportToTransform(viewport);\n const contrainedTransform = d3ZoomInstance?.constrain()(nextTransform, extent, translateExtent);\n if (contrainedTransform) {\n await setTransform(contrainedTransform);\n }\n return new Promise((resolve) => resolve(contrainedTransform));\n }\n async function setViewport(viewport, options) {\n const nextTransform = viewportToTransform(viewport);\n await setTransform(nextTransform, options);\n return new Promise((resolve) => resolve(nextTransform));\n }\n function syncViewport(viewport) {\n if (d3Selection) {\n const nextTransform = viewportToTransform(viewport);\n const currentTransform = d3Selection.property('__zoom');\n if (currentTransform.k !== viewport.zoom ||\n currentTransform.x !== viewport.x ||\n currentTransform.y !== viewport.y) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n d3ZoomInstance?.transform(d3Selection, nextTransform, null, { sync: true });\n }\n }\n }\n function getViewport() {\n const transform = d3Selection ? zoomTransform(d3Selection.node()) : { x: 0, y: 0, k: 1 };\n return { x: transform.x, y: transform.y, zoom: transform.k };\n }\n function scaleTo(zoom, options) {\n if (d3Selection) {\n return new Promise((resolve) => {\n d3ZoomInstance?.interpolate(options?.interpolate === 'linear' ? interpolate : interpolateZoom).scaleTo(getD3Transition(d3Selection, options?.duration, options?.ease, () => resolve(true)), zoom);\n });\n }\n return Promise.resolve(false);\n }\n function scaleBy(factor, options) {\n if (d3Selection) {\n return new Promise((resolve) => {\n d3ZoomInstance?.interpolate(options?.interpolate === 'linear' ? interpolate : interpolateZoom).scaleBy(getD3Transition(d3Selection, options?.duration, options?.ease, () => resolve(true)), factor);\n });\n }\n return Promise.resolve(false);\n }\n function setScaleExtent(scaleExtent) {\n d3ZoomInstance?.scaleExtent(scaleExtent);\n }\n function setTranslateExtent(translateExtent) {\n d3ZoomInstance?.translateExtent(translateExtent);\n }\n function setClickDistance(distance) {\n const validDistance = !isNumeric(distance) || distance < 0 ? 0 : distance;\n d3ZoomInstance?.clickDistance(validDistance);\n }\n return {\n update,\n destroy,\n setViewport,\n setViewportConstrained,\n getViewport,\n scaleTo,\n scaleBy,\n setScaleExtent,\n setTranslateExtent,\n syncViewport,\n setClickDistance,\n };\n}\n\n/**\n * Used to determine the variant of the resize control\n *\n * @public\n */\nvar ResizeControlVariant;\n(function (ResizeControlVariant) {\n ResizeControlVariant[\"Line\"] = \"line\";\n ResizeControlVariant[\"Handle\"] = \"handle\";\n})(ResizeControlVariant || (ResizeControlVariant = {}));\nconst XY_RESIZER_HANDLE_POSITIONS = ['top-left', 'top-right', 'bottom-left', 'bottom-right'];\nconst XY_RESIZER_LINE_POSITIONS = ['top', 'right', 'bottom', 'left'];\n\n/**\n * Get all connecting edges for a given set of nodes\n * @param width - new width of the node\n * @param prevWidth - previous width of the node\n * @param height - new height of the node\n * @param prevHeight - previous height of the node\n * @param affectsX - whether to invert the resize direction for the x axis\n * @param affectsY - whether to invert the resize direction for the y axis\n * @returns array of two numbers representing the direction of the resize for each axis, 0 = no change, 1 = increase, -1 = decrease\n */\nfunction getResizeDirection({ width, prevWidth, height, prevHeight, affectsX, affectsY, }) {\n const deltaWidth = width - prevWidth;\n const deltaHeight = height - prevHeight;\n const direction = [deltaWidth > 0 ? 1 : deltaWidth < 0 ? -1 : 0, deltaHeight > 0 ? 1 : deltaHeight < 0 ? -1 : 0];\n if (deltaWidth && affectsX) {\n direction[0] = direction[0] * -1;\n }\n if (deltaHeight && affectsY) {\n direction[1] = direction[1] * -1;\n }\n return direction;\n}\n/**\n * Parses the control position that is being dragged to dimensions that are being resized\n * @param controlPosition - position of the control that is being dragged\n * @returns isHorizontal, isVertical, affectsX, affectsY,\n */\nfunction getControlDirection(controlPosition) {\n const isHorizontal = controlPosition.includes('right') || controlPosition.includes('left');\n const isVertical = controlPosition.includes('bottom') || controlPosition.includes('top');\n const affectsX = controlPosition.includes('left');\n const affectsY = controlPosition.includes('top');\n return {\n isHorizontal,\n isVertical,\n affectsX,\n affectsY,\n };\n}\nfunction getLowerExtentClamp(lowerExtent, lowerBound) {\n return Math.max(0, lowerBound - lowerExtent);\n}\nfunction getUpperExtentClamp(upperExtent, upperBound) {\n return Math.max(0, upperExtent - upperBound);\n}\nfunction getSizeClamp(size, minSize, maxSize) {\n return Math.max(0, minSize - size, size - maxSize);\n}\nfunction xor(a, b) {\n return a ? !b : b;\n}\n/**\n * Calculates new width & height and x & y of node after resize based on pointer position\n * @description - Buckle up, this is a chunky one... If you want to determine the new dimensions of a node after a resize,\n * you have to account for all possible restrictions: min/max width/height of the node, the maximum extent the node is allowed\n * to move in (in this case: resize into) determined by the parent node, the minimal extent determined by child nodes\n * with expandParent or extent: 'parent' set and oh yeah, these things also have to work with keepAspectRatio!\n * The way this is done is by determining how much each of these restricting actually restricts the resize and then applying the\n * strongest restriction. Because the resize affects x, y and width, height and width, height of a opposing side with keepAspectRatio,\n * the resize amount is always kept in distX & distY amount (the distance in mouse movement)\n * Instead of clamping each value, we first calculate the biggest 'clamp' (for the lack of a better name) and then apply it to all values.\n * To complicate things nodeOrigin has to be taken into account as well. This is done by offsetting the nodes as if their origin is [0, 0],\n * then calculating the restrictions as usual\n * @param startValues - starting values of resize\n * @param controlDirection - dimensions affected by the resize\n * @param pointerPosition - the current pointer position corrected for snapping\n * @param boundaries - minimum and maximum dimensions of the node\n * @param keepAspectRatio - prevent changes of asprect ratio\n * @returns x, y, width and height of the node after resize\n */\nfunction getDimensionsAfterResize(startValues, controlDirection, pointerPosition, boundaries, keepAspectRatio, nodeOrigin, extent, childExtent) {\n let { affectsX, affectsY } = controlDirection;\n const { isHorizontal, isVertical } = controlDirection;\n const isDiagonal = isHorizontal && isVertical;\n const { xSnapped, ySnapped } = pointerPosition;\n const { minWidth, maxWidth, minHeight, maxHeight } = boundaries;\n const { x: startX, y: startY, width: startWidth, height: startHeight, aspectRatio } = startValues;\n let distX = Math.floor(isHorizontal ? xSnapped - startValues.pointerX : 0);\n let distY = Math.floor(isVertical ? ySnapped - startValues.pointerY : 0);\n const newWidth = startWidth + (affectsX ? -distX : distX);\n const newHeight = startHeight + (affectsY ? -distY : distY);\n const originOffsetX = -nodeOrigin[0] * startWidth;\n const originOffsetY = -nodeOrigin[1] * startHeight;\n // Check if maxWidth, minWWidth, maxHeight, minHeight are restricting the resize\n let clampX = getSizeClamp(newWidth, minWidth, maxWidth);\n let clampY = getSizeClamp(newHeight, minHeight, maxHeight);\n // Check if extent is restricting the resize\n if (extent) {\n let xExtentClamp = 0;\n let yExtentClamp = 0;\n if (affectsX && distX < 0) {\n xExtentClamp = getLowerExtentClamp(startX + distX + originOffsetX, extent[0][0]);\n }\n else if (!affectsX && distX > 0) {\n xExtentClamp = getUpperExtentClamp(startX + newWidth + originOffsetX, extent[1][0]);\n }\n if (affectsY && distY < 0) {\n yExtentClamp = getLowerExtentClamp(startY + distY + originOffsetY, extent[0][1]);\n }\n else if (!affectsY && distY > 0) {\n yExtentClamp = getUpperExtentClamp(startY + newHeight + originOffsetY, extent[1][1]);\n }\n clampX = Math.max(clampX, xExtentClamp);\n clampY = Math.max(clampY, yExtentClamp);\n }\n // Check if the child extent is restricting the resize\n if (childExtent) {\n let xExtentClamp = 0;\n let yExtentClamp = 0;\n if (affectsX && distX > 0) {\n xExtentClamp = getUpperExtentClamp(startX + distX, childExtent[0][0]);\n }\n else if (!affectsX && distX < 0) {\n xExtentClamp = getLowerExtentClamp(startX + newWidth, childExtent[1][0]);\n }\n if (affectsY && distY > 0) {\n yExtentClamp = getUpperExtentClamp(startY + distY, childExtent[0][1]);\n }\n else if (!affectsY && distY < 0) {\n yExtentClamp = getLowerExtentClamp(startY + newHeight, childExtent[1][1]);\n }\n clampX = Math.max(clampX, xExtentClamp);\n clampY = Math.max(clampY, yExtentClamp);\n }\n // Check if the aspect ratio resizing of the other side is restricting the resize\n if (keepAspectRatio) {\n if (isHorizontal) {\n // Check if the max dimensions might be restricting the resize\n const aspectHeightClamp = getSizeClamp(newWidth / aspectRatio, minHeight, maxHeight) * aspectRatio;\n clampX = Math.max(clampX, aspectHeightClamp);\n // Check if the extent is restricting the resize\n if (extent) {\n let aspectExtentClamp = 0;\n if ((!affectsX && !affectsY) || (affectsX && !affectsY && isDiagonal)) {\n aspectExtentClamp =\n getUpperExtentClamp(startY + originOffsetY + newWidth / aspectRatio, extent[1][1]) * aspectRatio;\n }\n else {\n aspectExtentClamp =\n getLowerExtentClamp(startY + originOffsetY + (affectsX ? distX : -distX) / aspectRatio, extent[0][1]) *\n aspectRatio;\n }\n clampX = Math.max(clampX, aspectExtentClamp);\n }\n // Check if the child extent is restricting the resize\n if (childExtent) {\n let aspectExtentClamp = 0;\n if ((!affectsX && !affectsY) || (affectsX && !affectsY && isDiagonal)) {\n aspectExtentClamp = getLowerExtentClamp(startY + newWidth / aspectRatio, childExtent[1][1]) * aspectRatio;\n }\n else {\n aspectExtentClamp =\n getUpperExtentClamp(startY + (affectsX ? distX : -distX) / aspectRatio, childExtent[0][1]) * aspectRatio;\n }\n clampX = Math.max(clampX, aspectExtentClamp);\n }\n }\n // Do the same thing for vertical resizing\n if (isVertical) {\n const aspectWidthClamp = getSizeClamp(newHeight * aspectRatio, minWidth, maxWidth) / aspectRatio;\n clampY = Math.max(clampY, aspectWidthClamp);\n if (extent) {\n let aspectExtentClamp = 0;\n if ((!affectsX && !affectsY) || (affectsY && !affectsX && isDiagonal)) {\n aspectExtentClamp =\n getUpperExtentClamp(startX + newHeight * aspectRatio + originOffsetX, extent[1][0]) / aspectRatio;\n }\n else {\n aspectExtentClamp =\n getLowerExtentClamp(startX + (affectsY ? distY : -distY) * aspectRatio + originOffsetX, extent[0][0]) /\n aspectRatio;\n }\n clampY = Math.max(clampY, aspectExtentClamp);\n }\n if (childExtent) {\n let aspectExtentClamp = 0;\n if ((!affectsX && !affectsY) || (affectsY && !affectsX && isDiagonal)) {\n aspectExtentClamp = getLowerExtentClamp(startX + newHeight * aspectRatio, childExtent[1][0]) / aspectRatio;\n }\n else {\n aspectExtentClamp =\n getUpperExtentClamp(startX + (affectsY ? distY : -distY) * aspectRatio, childExtent[0][0]) / aspectRatio;\n }\n clampY = Math.max(clampY, aspectExtentClamp);\n }\n }\n }\n distY = distY + (distY < 0 ? clampY : -clampY);\n distX = distX + (distX < 0 ? clampX : -clampX);\n if (keepAspectRatio) {\n if (isDiagonal) {\n if (newWidth > newHeight * aspectRatio) {\n distY = (xor(affectsX, affectsY) ? -distX : distX) / aspectRatio;\n }\n else {\n distX = (xor(affectsX, affectsY) ? -distY : distY) * aspectRatio;\n }\n }\n else {\n if (isHorizontal) {\n distY = distX / aspectRatio;\n affectsY = affectsX;\n }\n else {\n distX = distY * aspectRatio;\n affectsX = affectsY;\n }\n }\n }\n const x = affectsX ? startX + distX : startX;\n const y = affectsY ? startY + distY : startY;\n return {\n width: startWidth + (affectsX ? -distX : distX),\n height: startHeight + (affectsY ? -distY : distY),\n x: nodeOrigin[0] * distX * (!affectsX ? 1 : -1) + x,\n y: nodeOrigin[1] * distY * (!affectsY ? 1 : -1) + y,\n };\n}\n\nconst initPrevValues = { width: 0, height: 0, x: 0, y: 0 };\nconst initStartValues = {\n ...initPrevValues,\n pointerX: 0,\n pointerY: 0,\n aspectRatio: 1,\n};\nfunction nodeToParentExtent(node) {\n return [\n [0, 0],\n [node.measured.width, node.measured.height],\n ];\n}\nfunction nodeToChildExtent(child, parent, nodeOrigin) {\n const x = parent.position.x + child.position.x;\n const y = parent.position.y + child.position.y;\n const width = child.measured.width ?? 0;\n const height = child.measured.height ?? 0;\n const originOffsetX = nodeOrigin[0] * width;\n const originOffsetY = nodeOrigin[1] * height;\n return [\n [x - originOffsetX, y - originOffsetY],\n [x + width - originOffsetX, y + height - originOffsetY],\n ];\n}\nfunction XYResizer({ domNode, nodeId, getStoreItems, onChange, onEnd }) {\n const selection = select(domNode);\n let params = {\n controlDirection: getControlDirection('bottom-right'),\n boundaries: {\n minWidth: 0,\n minHeight: 0,\n maxWidth: Number.MAX_VALUE,\n maxHeight: Number.MAX_VALUE,\n },\n resizeDirection: undefined,\n keepAspectRatio: false,\n };\n function update({ controlPosition, boundaries, keepAspectRatio, resizeDirection, onResizeStart, onResize, onResizeEnd, shouldResize, }) {\n let prevValues = { ...initPrevValues };\n let startValues = { ...initStartValues };\n params = {\n boundaries,\n resizeDirection,\n keepAspectRatio,\n controlDirection: getControlDirection(controlPosition),\n };\n let node = undefined;\n let containerBounds = null;\n let childNodes = [];\n let parentNode = undefined; // Needed to fix expandParent\n let parentExtent = undefined;\n let childExtent = undefined;\n // we only want to trigger onResizeEnd if onResize was actually called\n let resizeDetected = false;\n const dragHandler = drag()\n .on('start', (event) => {\n const { nodeLookup, transform, snapGrid, snapToGrid, nodeOrigin, paneDomNode } = getStoreItems();\n node = nodeLookup.get(nodeId);\n if (!node) {\n return;\n }\n containerBounds = paneDomNode?.getBoundingClientRect() ?? null;\n const { xSnapped, ySnapped } = getPointerPosition(event.sourceEvent, {\n transform,\n snapGrid,\n snapToGrid,\n containerBounds,\n });\n prevValues = {\n width: node.measured.width ?? 0,\n height: node.measured.height ?? 0,\n x: node.position.x ?? 0,\n y: node.position.y ?? 0,\n };\n startValues = {\n ...prevValues,\n pointerX: xSnapped,\n pointerY: ySnapped,\n aspectRatio: prevValues.width / prevValues.height,\n };\n parentNode = undefined;\n if (node.parentId && (node.extent === 'parent' || node.expandParent)) {\n parentNode = nodeLookup.get(node.parentId);\n parentExtent = parentNode && node.extent === 'parent' ? nodeToParentExtent(parentNode) : undefined;\n }\n /*\n * Collect all child nodes to correct their relative positions when top/left changes\n * Determine largest minimal extent the parent node is allowed to resize to\n */\n childNodes = [];\n childExtent = undefined;\n for (const [childId, child] of nodeLookup) {\n if (child.parentId === nodeId) {\n childNodes.push({\n id: childId,\n position: { ...child.position },\n extent: child.extent,\n });\n if (child.extent === 'parent' || child.expandParent) {\n const extent = nodeToChildExtent(child, node, child.origin ?? nodeOrigin);\n if (childExtent) {\n childExtent = [\n [Math.min(extent[0][0], childExtent[0][0]), Math.min(extent[0][1], childExtent[0][1])],\n [Math.max(extent[1][0], childExtent[1][0]), Math.max(extent[1][1], childExtent[1][1])],\n ];\n }\n else {\n childExtent = extent;\n }\n }\n }\n }\n onResizeStart?.(event, { ...prevValues });\n })\n .on('drag', (event) => {\n const { transform, snapGrid, snapToGrid, nodeOrigin: storeNodeOrigin } = getStoreItems();\n const pointerPosition = getPointerPosition(event.sourceEvent, {\n transform,\n snapGrid,\n snapToGrid,\n containerBounds,\n });\n const childChanges = [];\n if (!node) {\n return;\n }\n const { x: prevX, y: prevY, width: prevWidth, height: prevHeight } = prevValues;\n const change = {};\n const nodeOrigin = node.origin ?? storeNodeOrigin;\n const { width, height, x, y } = getDimensionsAfterResize(startValues, params.controlDirection, pointerPosition, params.boundaries, params.keepAspectRatio, nodeOrigin, parentExtent, childExtent);\n const isWidthChange = width !== prevWidth;\n const isHeightChange = height !== prevHeight;\n const isXPosChange = x !== prevX && isWidthChange;\n const isYPosChange = y !== prevY && isHeightChange;\n if (!isXPosChange && !isYPosChange && !isWidthChange && !isHeightChange) {\n return;\n }\n if (isXPosChange || isYPosChange || nodeOrigin[0] === 1 || nodeOrigin[1] === 1) {\n change.x = isXPosChange ? x : prevValues.x;\n change.y = isYPosChange ? y : prevValues.y;\n prevValues.x = change.x;\n prevValues.y = change.y;\n /*\n * when top/left changes, correct the relative positions of child nodes\n * so that they stay in the same position\n */\n if (childNodes.length > 0) {\n const xChange = x - prevX;\n const yChange = y - prevY;\n for (const childNode of childNodes) {\n childNode.position = {\n x: childNode.position.x - xChange + nodeOrigin[0] * (width - prevWidth),\n y: childNode.position.y - yChange + nodeOrigin[1] * (height - prevHeight),\n };\n childChanges.push(childNode);\n }\n }\n }\n if (isWidthChange || isHeightChange) {\n change.width =\n isWidthChange && (!params.resizeDirection || params.resizeDirection === 'horizontal')\n ? width\n : prevValues.width;\n change.height =\n isHeightChange && (!params.resizeDirection || params.resizeDirection === 'vertical')\n ? height\n : prevValues.height;\n prevValues.width = change.width;\n prevValues.height = change.height;\n }\n // Fix expandParent when resizing from top/left\n if (parentNode && node.expandParent) {\n const xLimit = nodeOrigin[0] * (change.width ?? 0);\n if (change.x && change.x < xLimit) {\n prevValues.x = xLimit;\n startValues.x = startValues.x - (change.x - xLimit);\n }\n const yLimit = nodeOrigin[1] * (change.height ?? 0);\n if (change.y && change.y < yLimit) {\n prevValues.y = yLimit;\n startValues.y = startValues.y - (change.y - yLimit);\n }\n }\n const direction = getResizeDirection({\n width: prevValues.width,\n prevWidth,\n height: prevValues.height,\n prevHeight,\n affectsX: params.controlDirection.affectsX,\n affectsY: params.controlDirection.affectsY,\n });\n const nextValues = { ...prevValues, direction };\n const callResize = shouldResize?.(event, nextValues);\n if (callResize === false) {\n return;\n }\n resizeDetected = true;\n onResize?.(event, nextValues);\n onChange(change, childChanges);\n })\n .on('end', (event) => {\n if (!resizeDetected) {\n return;\n }\n onResizeEnd?.(event, { ...prevValues });\n onEnd?.({ ...prevValues });\n resizeDetected = false;\n });\n selection.call(dragHandler);\n }\n function destroy() {\n selection.on('.drag', null);\n }\n return {\n update,\n destroy,\n };\n}\n\nexport { ConnectionLineType, ConnectionMode, MarkerType, PanOnScrollMode, Position, ResizeControlVariant, SelectionMode, XYDrag, XYHandle, XYMinimap, XYPanZoom, XYResizer, XY_RESIZER_HANDLE_POSITIONS, XY_RESIZER_LINE_POSITIONS, addEdge, adoptUserNodes, areConnectionMapsEqual, areSetsEqual, boxToRect, calcAutoPan, calculateNodePosition, clamp, clampPosition, clampPositionToParent, createMarkerIds, defaultAriaLabelConfig, devWarn, elementSelectionKeys, errorMessages, evaluateAbsolutePosition, fitViewport, getBezierEdgeCenter, getBezierPath, getBoundsOfBoxes, getBoundsOfRects, getConnectedEdges, getConnectionStatus, getDimensions, getEdgeCenter, getEdgeId, getEdgePosition, getEdgeToolbarTransform, getElementsToRemove, getElevatedEdgeZIndex, getEventPosition, getHandleBounds, getHandlePosition, getHostForElement, getIncomers, getInternalNodesBounds, getMarkerId, getNodeDimensions, getNodePositionWithOrigin, getNodeToolbarTransform, getNodesBounds, getNodesInside, getOutgoers, getOverlappingArea, getPointerPosition, getSmoothStepPath, getStraightPath, getViewportForBounds, handleConnectionChange, handleExpandParent, infiniteExtent, initialConnection, isCoordinateExtent, isEdgeBase, isEdgeVisible, isInputDOMNode, isInternalNodeBase, isMacOs, isManualZIndexMode, isMouseEvent, isNodeBase, isNumeric, isRectObject, mergeAriaLabelConfig, nodeHasDimensions, nodeToBox, nodeToRect, oppositePosition, panBy, pointToRendererPoint, reconnectEdge, rectToBox, rendererPointToPoint, shallowNodeData, snapPosition, updateAbsolutePositions, updateConnectionLookup, updateNodeInternals, withResolvers };\n", "import ReactExports from 'react';\nimport useSyncExternalStoreExports from 'use-sync-external-store/shim/with-selector.js';\nimport { createStore } from 'zustand/vanilla';\n\nconst { useDebugValue } = ReactExports;\nconst { useSyncExternalStoreWithSelector } = useSyncExternalStoreExports;\nconst identity = (arg) => arg;\nfunction useStoreWithEqualityFn(api, selector = identity, equalityFn) {\n const slice = useSyncExternalStoreWithSelector(\n api.subscribe,\n api.getState,\n api.getServerState || api.getInitialState,\n selector,\n equalityFn\n );\n useDebugValue(slice);\n return slice;\n}\nconst createWithEqualityFnImpl = (createState, defaultEqualityFn) => {\n const api = createStore(createState);\n const useBoundStoreWithEqualityFn = (selector, equalityFn = defaultEqualityFn) => useStoreWithEqualityFn(api, selector, equalityFn);\n Object.assign(useBoundStoreWithEqualityFn, api);\n return useBoundStoreWithEqualityFn;\n};\nconst createWithEqualityFn = (createState, defaultEqualityFn) => createState ? createWithEqualityFnImpl(createState, defaultEqualityFn) : createWithEqualityFnImpl;\n\nexport { createWithEqualityFn, useStoreWithEqualityFn };\n", "const createStoreImpl = (createState) => {\n let state;\n const listeners = /* @__PURE__ */ new Set();\n const setState = (partial, replace) => {\n const nextState = typeof partial === \"function\" ? partial(state) : partial;\n if (!Object.is(nextState, state)) {\n const previousState = state;\n state = (replace != null ? replace : typeof nextState !== \"object\" || nextState === null) ? nextState : Object.assign({}, state, nextState);\n listeners.forEach((listener) => listener(state, previousState));\n }\n };\n const getState = () => state;\n const getInitialState = () => initialState;\n const subscribe = (listener) => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n };\n const destroy = () => {\n if ((import.meta.env ? import.meta.env.MODE : void 0) !== \"production\") {\n console.warn(\n \"[DEPRECATED] The `destroy` method will be unsupported in a future version. Instead use unsubscribe function returned by subscribe. Everything will be garbage-collected if store is garbage-collected.\"\n );\n }\n listeners.clear();\n };\n const api = { setState, getState, getInitialState, subscribe, destroy };\n const initialState = state = createState(setState, getState, api);\n return api;\n};\nconst createStore = (createState) => createState ? createStoreImpl(createState) : createStoreImpl;\nvar vanilla = (createState) => {\n if ((import.meta.env ? import.meta.env.MODE : void 0) !== \"production\") {\n console.warn(\n \"[DEPRECATED] Default export is deprecated. Instead use import { createStore } from 'zustand/vanilla'.\"\n );\n }\n return createStore(createState);\n};\n\nexport { createStore, vanilla as default };\n", "function shallow$1(objA, objB) {\n if (Object.is(objA, objB)) {\n return true;\n }\n if (typeof objA !== \"object\" || objA === null || typeof objB !== \"object\" || objB === null) {\n return false;\n }\n if (objA instanceof Map && objB instanceof Map) {\n if (objA.size !== objB.size) return false;\n for (const [key, value] of objA) {\n if (!Object.is(value, objB.get(key))) {\n return false;\n }\n }\n return true;\n }\n if (objA instanceof Set && objB instanceof Set) {\n if (objA.size !== objB.size) return false;\n for (const value of objA) {\n if (!objB.has(value)) {\n return false;\n }\n }\n return true;\n }\n const keysA = Object.keys(objA);\n if (keysA.length !== Object.keys(objB).length) {\n return false;\n }\n for (const keyA of keysA) {\n if (!Object.prototype.hasOwnProperty.call(objB, keyA) || !Object.is(objA[keyA], objB[keyA])) {\n return false;\n }\n }\n return true;\n}\n\nvar shallow = (objA, objB) => {\n if ((import.meta.env ? import.meta.env.MODE : void 0) !== \"production\") {\n console.warn(\n \"[DEPRECATED] Default export is deprecated. Instead use `import { shallow } from 'zustand/shallow'`.\"\n );\n }\n return shallow$1(objA, objB);\n};\n\nexport { shallow as default, shallow$1 as shallow };\n"], + "mappings": "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", + "names": ["useState", "useLayoutEffect", "useEffect", "useDebugValue", "useRef", "useEffect", "useMemo", "useDebugValue", "selector", "import_react", "document", "selector", "selector", "selector", "datum", "selector", "selection", "create", "create", "parseTypenames", "window", "dispatch_default", "dispatch_default", "select_default", "selector", "id", "root", "selection", "select_default", "constant_default", "dispatch", "filter", "selection", "select_default", "container", "dispatch", "event", "touch", "constant_default", "cosh", "sinh", "t1", "t2", "t3", "constant_default", "constant_default", "color", "rgb", "start", "i", "constant_default", "degrees", "b0", "b1", "hsl", "hue", "start", "hcl", "hue", "start", "cubehelix", "hue", "start", "now", "t0", "t1", "t2", "id", "index", "get", "set", "start", "empty", "interrupt_default", "id", "set", "get", "transition", "attrRemove", "attrRemoveNS", "attrConstant", "attrConstantNS", "attrFunction", "attrFunctionNS", "attr_default", "t0", "id", "get", "id", "set", "get", "id", "set", "get", "id", "set", "filter_default", "merge_default", "transition", "id", "set", "on_default", "get", "id", "remove_default", "select_default", "id", "get", "selectAll_default", "id", "children", "inherit", "get", "Selection", "selection_default", "styleRemove", "styleConstant", "styleFunction", "id", "remove", "set", "style_default", "textConstant", "textFunction", "text_default", "t0", "inherit", "get", "id", "set", "id", "select_default", "selectAll_default", "filter_default", "merge_default", "selection_default", "on_default", "attr_default", "style_default", "text_default", "remove_default", "polyIn", "custom", "polyOut", "polyInOut", "custom", "backIn", "backOut", "backInOut", "custom", "elasticIn", "a", "p", "elasticOut", "elasticInOut", "id", "transition_default", "interrupt_default", "transition_default", "constant_default", "transform", "dispatch", "identity", "nopropagation", "noevent_default", "defaultFilter", "identity", "defaultTouchable", "transform", "zoom_default", "filter", "wheelDelta", "selection", "t0", "extent", "transition", "select_default", "noevent_default", "nopropagation", "event", "t1", "constant_default", "id", "ConnectionMode", "PanOnScrollMode", "SelectionMode", "ConnectionLineType", "MarkerType", "Position", "distance", "transform", "selected", "xDir", "yDir", "children", "_a", "style", "selector", "node", "select_default", "positionAbsolute", "panBy", "domNode", "x", "y", "event", "fromInternalNode", "from", "selection", "zoom_default", "identity", "filter", "viewport", "translateExtent", "ResizeControlVariant", "getInitialState", "ReactExports", "useSyncExternalStoreExports", "identity", "selector", "selector", "children", "style", "initPrevValues", "target", "transform", "changes", "id", "selected", "index", "fitViewQueued", "nodes", "setNodes", "defaultViewport", "onViewportChange", "distance", "_a", "onPointerDown", "updateNodeInternals", "node", "isParent", "color", "Symbol", "markers", "panBy", "store", "zIndex", "containerStyle", "createStore", "set", "get", "fitViewOptions", "width", "height", "minZoom", "maxZoom", "nodeOrigin", "zIndexMode", "edges", "nodeExtent", "BackgroundVariant", "x", "y", "nodesSelector", "wrapperStyle"] +} diff --git a/visual_workflow_builder/frontend_v4/node_modules/.vite/deps/_metadata.json b/visual_workflow_builder/frontend_v4/node_modules/.vite/deps/_metadata.json new file mode 100644 index 000000000..aa62c21af --- /dev/null +++ b/visual_workflow_builder/frontend_v4/node_modules/.vite/deps/_metadata.json @@ -0,0 +1,55 @@ +{ + "hash": "d5b0eaa8", + "configHash": "16da7aac", + "lockfileHash": "450919b0", + "browserHash": "5c72f267", + "optimized": { + "react": { + "src": "../../react/index.js", + "file": "react.js", + "fileHash": "91cd16f1", + "needsInterop": true + }, + "react-dom": { + "src": "../../react-dom/index.js", + "file": "react-dom.js", + "fileHash": "d50df9b9", + "needsInterop": true + }, + "react/jsx-dev-runtime": { + "src": "../../react/jsx-dev-runtime.js", + "file": "react_jsx-dev-runtime.js", + "fileHash": "5a514a24", + "needsInterop": true + }, + "react/jsx-runtime": { + "src": "../../react/jsx-runtime.js", + "file": "react_jsx-runtime.js", + "fileHash": "248142fb", + "needsInterop": true + }, + "@xyflow/react": { + "src": "../../@xyflow/react/dist/esm/index.js", + "file": "@xyflow_react.js", + "fileHash": "8e9fa38b", + "needsInterop": false + }, + "react-dom/client": { + "src": "../../react-dom/client.js", + "file": "react-dom_client.js", + "fileHash": "475353d2", + "needsInterop": true + } + }, + "chunks": { + "chunk-GRWX7YRK": { + "file": "chunk-GRWX7YRK.js" + }, + "chunk-XPR23Y44": { + "file": "chunk-XPR23Y44.js" + }, + "chunk-I4MZPW7S": { + "file": "chunk-I4MZPW7S.js" + } + } +} \ No newline at end of file diff --git a/visual_workflow_builder/frontend_v4/node_modules/.vite/deps/chunk-GRWX7YRK.js b/visual_workflow_builder/frontend_v4/node_modules/.vite/deps/chunk-GRWX7YRK.js new file mode 100644 index 000000000..c8d9789a1 --- /dev/null +++ b/visual_workflow_builder/frontend_v4/node_modules/.vite/deps/chunk-GRWX7YRK.js @@ -0,0 +1,926 @@ +import { + __commonJS, + require_react +} from "./chunk-I4MZPW7S.js"; + +// node_modules/react/cjs/react-jsx-runtime.development.js +var require_react_jsx_runtime_development = __commonJS({ + "node_modules/react/cjs/react-jsx-runtime.development.js"(exports) { + "use strict"; + if (true) { + (function() { + "use strict"; + var React = require_react(); + var REACT_ELEMENT_TYPE = Symbol.for("react.element"); + var REACT_PORTAL_TYPE = Symbol.for("react.portal"); + var REACT_FRAGMENT_TYPE = Symbol.for("react.fragment"); + var REACT_STRICT_MODE_TYPE = Symbol.for("react.strict_mode"); + var REACT_PROFILER_TYPE = Symbol.for("react.profiler"); + var REACT_PROVIDER_TYPE = Symbol.for("react.provider"); + var REACT_CONTEXT_TYPE = Symbol.for("react.context"); + var REACT_FORWARD_REF_TYPE = Symbol.for("react.forward_ref"); + var REACT_SUSPENSE_TYPE = Symbol.for("react.suspense"); + var REACT_SUSPENSE_LIST_TYPE = Symbol.for("react.suspense_list"); + var REACT_MEMO_TYPE = Symbol.for("react.memo"); + var REACT_LAZY_TYPE = Symbol.for("react.lazy"); + var REACT_OFFSCREEN_TYPE = Symbol.for("react.offscreen"); + var MAYBE_ITERATOR_SYMBOL = Symbol.iterator; + var FAUX_ITERATOR_SYMBOL = "@@iterator"; + function getIteratorFn(maybeIterable) { + if (maybeIterable === null || typeof maybeIterable !== "object") { + return null; + } + var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]; + if (typeof maybeIterator === "function") { + return maybeIterator; + } + return null; + } + var ReactSharedInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED; + function error(format) { + { + { + for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { + args[_key2 - 1] = arguments[_key2]; + } + printWarning("error", format, args); + } + } + } + function printWarning(level, format, args) { + { + var ReactDebugCurrentFrame2 = ReactSharedInternals.ReactDebugCurrentFrame; + var stack = ReactDebugCurrentFrame2.getStackAddendum(); + if (stack !== "") { + format += "%s"; + args = args.concat([stack]); + } + var argsWithFormat = args.map(function(item) { + return String(item); + }); + argsWithFormat.unshift("Warning: " + format); + Function.prototype.apply.call(console[level], console, argsWithFormat); + } + } + var enableScopeAPI = false; + var enableCacheElement = false; + var enableTransitionTracing = false; + var enableLegacyHidden = false; + var enableDebugTracing = false; + var REACT_MODULE_REFERENCE; + { + REACT_MODULE_REFERENCE = Symbol.for("react.module.reference"); + } + function isValidElementType(type) { + if (typeof type === "string" || typeof type === "function") { + return true; + } + if (type === REACT_FRAGMENT_TYPE || type === REACT_PROFILER_TYPE || enableDebugTracing || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || enableLegacyHidden || type === REACT_OFFSCREEN_TYPE || enableScopeAPI || enableCacheElement || enableTransitionTracing) { + return true; + } + if (typeof type === "object" && type !== null) { + if (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || // This needs to include all possible module reference object + // types supported by any Flight configuration anywhere since + // we don't know which Flight build this will end up being used + // with. + type.$$typeof === REACT_MODULE_REFERENCE || type.getModuleId !== void 0) { + return true; + } + } + return false; + } + function getWrappedName(outerType, innerType, wrapperName) { + var displayName = outerType.displayName; + if (displayName) { + return displayName; + } + var functionName = innerType.displayName || innerType.name || ""; + return functionName !== "" ? wrapperName + "(" + functionName + ")" : wrapperName; + } + function getContextName(type) { + return type.displayName || "Context"; + } + function getComponentNameFromType(type) { + if (type == null) { + return null; + } + { + if (typeof type.tag === "number") { + error("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."); + } + } + if (typeof type === "function") { + return type.displayName || type.name || null; + } + if (typeof type === "string") { + return type; + } + switch (type) { + case REACT_FRAGMENT_TYPE: + return "Fragment"; + case REACT_PORTAL_TYPE: + return "Portal"; + case REACT_PROFILER_TYPE: + return "Profiler"; + case REACT_STRICT_MODE_TYPE: + return "StrictMode"; + case REACT_SUSPENSE_TYPE: + return "Suspense"; + case REACT_SUSPENSE_LIST_TYPE: + return "SuspenseList"; + } + if (typeof type === "object") { + switch (type.$$typeof) { + case REACT_CONTEXT_TYPE: + var context = type; + return getContextName(context) + ".Consumer"; + case REACT_PROVIDER_TYPE: + var provider = type; + return getContextName(provider._context) + ".Provider"; + case REACT_FORWARD_REF_TYPE: + return getWrappedName(type, type.render, "ForwardRef"); + case REACT_MEMO_TYPE: + var outerName = type.displayName || null; + if (outerName !== null) { + return outerName; + } + return getComponentNameFromType(type.type) || "Memo"; + case REACT_LAZY_TYPE: { + var lazyComponent = type; + var payload = lazyComponent._payload; + var init = lazyComponent._init; + try { + return getComponentNameFromType(init(payload)); + } catch (x) { + return null; + } + } + } + } + return null; + } + var assign = Object.assign; + var disabledDepth = 0; + var prevLog; + var prevInfo; + var prevWarn; + var prevError; + var prevGroup; + var prevGroupCollapsed; + var prevGroupEnd; + function disabledLog() { + } + disabledLog.__reactDisabledLog = true; + function disableLogs() { + { + if (disabledDepth === 0) { + prevLog = console.log; + prevInfo = console.info; + prevWarn = console.warn; + prevError = console.error; + prevGroup = console.group; + prevGroupCollapsed = console.groupCollapsed; + prevGroupEnd = console.groupEnd; + var props = { + configurable: true, + enumerable: true, + value: disabledLog, + writable: true + }; + Object.defineProperties(console, { + info: props, + log: props, + warn: props, + error: props, + group: props, + groupCollapsed: props, + groupEnd: props + }); + } + disabledDepth++; + } + } + function reenableLogs() { + { + disabledDepth--; + if (disabledDepth === 0) { + var props = { + configurable: true, + enumerable: true, + writable: true + }; + Object.defineProperties(console, { + log: assign({}, props, { + value: prevLog + }), + info: assign({}, props, { + value: prevInfo + }), + warn: assign({}, props, { + value: prevWarn + }), + error: assign({}, props, { + value: prevError + }), + group: assign({}, props, { + value: prevGroup + }), + groupCollapsed: assign({}, props, { + value: prevGroupCollapsed + }), + groupEnd: assign({}, props, { + value: prevGroupEnd + }) + }); + } + if (disabledDepth < 0) { + error("disabledDepth fell below zero. This is a bug in React. Please file an issue."); + } + } + } + var ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher; + var prefix; + function describeBuiltInComponentFrame(name, source, ownerFn) { + { + if (prefix === void 0) { + try { + throw Error(); + } catch (x) { + var match = x.stack.trim().match(/\n( *(at )?)/); + prefix = match && match[1] || ""; + } + } + return "\n" + prefix + name; + } + } + var reentry = false; + var componentFrameCache; + { + var PossiblyWeakMap = typeof WeakMap === "function" ? WeakMap : Map; + componentFrameCache = new PossiblyWeakMap(); + } + function describeNativeComponentFrame(fn, construct) { + if (!fn || reentry) { + return ""; + } + { + var frame = componentFrameCache.get(fn); + if (frame !== void 0) { + return frame; + } + } + var control; + reentry = true; + var previousPrepareStackTrace = Error.prepareStackTrace; + Error.prepareStackTrace = void 0; + var previousDispatcher; + { + previousDispatcher = ReactCurrentDispatcher.current; + ReactCurrentDispatcher.current = null; + disableLogs(); + } + try { + if (construct) { + var Fake = function() { + throw Error(); + }; + Object.defineProperty(Fake.prototype, "props", { + set: function() { + throw Error(); + } + }); + if (typeof Reflect === "object" && Reflect.construct) { + try { + Reflect.construct(Fake, []); + } catch (x) { + control = x; + } + Reflect.construct(fn, [], Fake); + } else { + try { + Fake.call(); + } catch (x) { + control = x; + } + fn.call(Fake.prototype); + } + } else { + try { + throw Error(); + } catch (x) { + control = x; + } + fn(); + } + } catch (sample) { + if (sample && control && typeof sample.stack === "string") { + var sampleLines = sample.stack.split("\n"); + var controlLines = control.stack.split("\n"); + var s = sampleLines.length - 1; + var c = controlLines.length - 1; + while (s >= 1 && c >= 0 && sampleLines[s] !== controlLines[c]) { + c--; + } + for (; s >= 1 && c >= 0; s--, c--) { + if (sampleLines[s] !== controlLines[c]) { + if (s !== 1 || c !== 1) { + do { + s--; + c--; + if (c < 0 || sampleLines[s] !== controlLines[c]) { + var _frame = "\n" + sampleLines[s].replace(" at new ", " at "); + if (fn.displayName && _frame.includes("")) { + _frame = _frame.replace("", fn.displayName); + } + { + if (typeof fn === "function") { + componentFrameCache.set(fn, _frame); + } + } + return _frame; + } + } while (s >= 1 && c >= 0); + } + break; + } + } + } + } finally { + reentry = false; + { + ReactCurrentDispatcher.current = previousDispatcher; + reenableLogs(); + } + Error.prepareStackTrace = previousPrepareStackTrace; + } + var name = fn ? fn.displayName || fn.name : ""; + var syntheticFrame = name ? describeBuiltInComponentFrame(name) : ""; + { + if (typeof fn === "function") { + componentFrameCache.set(fn, syntheticFrame); + } + } + return syntheticFrame; + } + function describeFunctionComponentFrame(fn, source, ownerFn) { + { + return describeNativeComponentFrame(fn, false); + } + } + function shouldConstruct(Component) { + var prototype = Component.prototype; + return !!(prototype && prototype.isReactComponent); + } + function describeUnknownElementTypeFrameInDEV(type, source, ownerFn) { + if (type == null) { + return ""; + } + if (typeof type === "function") { + { + return describeNativeComponentFrame(type, shouldConstruct(type)); + } + } + if (typeof type === "string") { + return describeBuiltInComponentFrame(type); + } + switch (type) { + case REACT_SUSPENSE_TYPE: + return describeBuiltInComponentFrame("Suspense"); + case REACT_SUSPENSE_LIST_TYPE: + return describeBuiltInComponentFrame("SuspenseList"); + } + if (typeof type === "object") { + switch (type.$$typeof) { + case REACT_FORWARD_REF_TYPE: + return describeFunctionComponentFrame(type.render); + case REACT_MEMO_TYPE: + return describeUnknownElementTypeFrameInDEV(type.type, source, ownerFn); + case REACT_LAZY_TYPE: { + var lazyComponent = type; + var payload = lazyComponent._payload; + var init = lazyComponent._init; + try { + return describeUnknownElementTypeFrameInDEV(init(payload), source, ownerFn); + } catch (x) { + } + } + } + } + return ""; + } + var hasOwnProperty = Object.prototype.hasOwnProperty; + var loggedTypeFailures = {}; + var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame; + function setCurrentlyValidatingElement(element) { + { + if (element) { + var owner = element._owner; + var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null); + ReactDebugCurrentFrame.setExtraStackFrame(stack); + } else { + ReactDebugCurrentFrame.setExtraStackFrame(null); + } + } + } + function checkPropTypes(typeSpecs, values, location, componentName, element) { + { + var has = Function.call.bind(hasOwnProperty); + for (var typeSpecName in typeSpecs) { + if (has(typeSpecs, typeSpecName)) { + var error$1 = void 0; + try { + if (typeof typeSpecs[typeSpecName] !== "function") { + var err = Error((componentName || "React class") + ": " + location + " type `" + typeSpecName + "` is invalid; it must be a function, usually from the `prop-types` package, but received `" + typeof typeSpecs[typeSpecName] + "`.This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`."); + err.name = "Invariant Violation"; + throw err; + } + error$1 = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, "SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"); + } catch (ex) { + error$1 = ex; + } + if (error$1 && !(error$1 instanceof Error)) { + setCurrentlyValidatingElement(element); + error("%s: type specification of %s `%s` is invalid; the type checker function must return `null` or an `Error` but returned a %s. You may have forgotten to pass an argument to the type checker creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and shape all require an argument).", componentName || "React class", location, typeSpecName, typeof error$1); + setCurrentlyValidatingElement(null); + } + if (error$1 instanceof Error && !(error$1.message in loggedTypeFailures)) { + loggedTypeFailures[error$1.message] = true; + setCurrentlyValidatingElement(element); + error("Failed %s type: %s", location, error$1.message); + setCurrentlyValidatingElement(null); + } + } + } + } + } + var isArrayImpl = Array.isArray; + function isArray(a) { + return isArrayImpl(a); + } + function typeName(value) { + { + var hasToStringTag = typeof Symbol === "function" && Symbol.toStringTag; + var type = hasToStringTag && value[Symbol.toStringTag] || value.constructor.name || "Object"; + return type; + } + } + function willCoercionThrow(value) { + { + try { + testStringCoercion(value); + return false; + } catch (e) { + return true; + } + } + } + function testStringCoercion(value) { + return "" + value; + } + function checkKeyStringCoercion(value) { + { + if (willCoercionThrow(value)) { + error("The provided key is an unsupported type %s. This value must be coerced to a string before before using it here.", typeName(value)); + return testStringCoercion(value); + } + } + } + var ReactCurrentOwner = ReactSharedInternals.ReactCurrentOwner; + var RESERVED_PROPS = { + key: true, + ref: true, + __self: true, + __source: true + }; + var specialPropKeyWarningShown; + var specialPropRefWarningShown; + var didWarnAboutStringRefs; + { + didWarnAboutStringRefs = {}; + } + function hasValidRef(config) { + { + if (hasOwnProperty.call(config, "ref")) { + var getter = Object.getOwnPropertyDescriptor(config, "ref").get; + if (getter && getter.isReactWarning) { + return false; + } + } + } + return config.ref !== void 0; + } + function hasValidKey(config) { + { + if (hasOwnProperty.call(config, "key")) { + var getter = Object.getOwnPropertyDescriptor(config, "key").get; + if (getter && getter.isReactWarning) { + return false; + } + } + } + return config.key !== void 0; + } + function warnIfStringRefCannotBeAutoConverted(config, self) { + { + if (typeof config.ref === "string" && ReactCurrentOwner.current && self && ReactCurrentOwner.current.stateNode !== self) { + var componentName = getComponentNameFromType(ReactCurrentOwner.current.type); + if (!didWarnAboutStringRefs[componentName]) { + error('Component "%s" contains the string ref "%s". Support for string refs will be removed in a future major release. This case cannot be automatically converted to an arrow function. We ask you to manually fix this case by using useRef() or createRef() instead. Learn more about using refs safely here: https://reactjs.org/link/strict-mode-string-ref', getComponentNameFromType(ReactCurrentOwner.current.type), config.ref); + didWarnAboutStringRefs[componentName] = true; + } + } + } + } + function defineKeyPropWarningGetter(props, displayName) { + { + var warnAboutAccessingKey = function() { + if (!specialPropKeyWarningShown) { + specialPropKeyWarningShown = true; + error("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://reactjs.org/link/special-props)", displayName); + } + }; + warnAboutAccessingKey.isReactWarning = true; + Object.defineProperty(props, "key", { + get: warnAboutAccessingKey, + configurable: true + }); + } + } + function defineRefPropWarningGetter(props, displayName) { + { + var warnAboutAccessingRef = function() { + if (!specialPropRefWarningShown) { + specialPropRefWarningShown = true; + error("%s: `ref` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://reactjs.org/link/special-props)", displayName); + } + }; + warnAboutAccessingRef.isReactWarning = true; + Object.defineProperty(props, "ref", { + get: warnAboutAccessingRef, + configurable: true + }); + } + } + var ReactElement = function(type, key, ref, self, source, owner, props) { + var element = { + // This tag allows us to uniquely identify this as a React Element + $$typeof: REACT_ELEMENT_TYPE, + // Built-in properties that belong on the element + type, + key, + ref, + props, + // Record the component responsible for creating this element. + _owner: owner + }; + { + element._store = {}; + Object.defineProperty(element._store, "validated", { + configurable: false, + enumerable: false, + writable: true, + value: false + }); + Object.defineProperty(element, "_self", { + configurable: false, + enumerable: false, + writable: false, + value: self + }); + Object.defineProperty(element, "_source", { + configurable: false, + enumerable: false, + writable: false, + value: source + }); + if (Object.freeze) { + Object.freeze(element.props); + Object.freeze(element); + } + } + return element; + }; + function jsxDEV(type, config, maybeKey, source, self) { + { + var propName; + var props = {}; + var key = null; + var ref = null; + if (maybeKey !== void 0) { + { + checkKeyStringCoercion(maybeKey); + } + key = "" + maybeKey; + } + if (hasValidKey(config)) { + { + checkKeyStringCoercion(config.key); + } + key = "" + config.key; + } + if (hasValidRef(config)) { + ref = config.ref; + warnIfStringRefCannotBeAutoConverted(config, self); + } + for (propName in config) { + if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) { + props[propName] = config[propName]; + } + } + if (type && type.defaultProps) { + var defaultProps = type.defaultProps; + for (propName in defaultProps) { + if (props[propName] === void 0) { + props[propName] = defaultProps[propName]; + } + } + } + if (key || ref) { + var displayName = typeof type === "function" ? type.displayName || type.name || "Unknown" : type; + if (key) { + defineKeyPropWarningGetter(props, displayName); + } + if (ref) { + defineRefPropWarningGetter(props, displayName); + } + } + return ReactElement(type, key, ref, self, source, ReactCurrentOwner.current, props); + } + } + var ReactCurrentOwner$1 = ReactSharedInternals.ReactCurrentOwner; + var ReactDebugCurrentFrame$1 = ReactSharedInternals.ReactDebugCurrentFrame; + function setCurrentlyValidatingElement$1(element) { + { + if (element) { + var owner = element._owner; + var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null); + ReactDebugCurrentFrame$1.setExtraStackFrame(stack); + } else { + ReactDebugCurrentFrame$1.setExtraStackFrame(null); + } + } + } + var propTypesMisspellWarningShown; + { + propTypesMisspellWarningShown = false; + } + function isValidElement(object) { + { + return typeof object === "object" && object !== null && object.$$typeof === REACT_ELEMENT_TYPE; + } + } + function getDeclarationErrorAddendum() { + { + if (ReactCurrentOwner$1.current) { + var name = getComponentNameFromType(ReactCurrentOwner$1.current.type); + if (name) { + return "\n\nCheck the render method of `" + name + "`."; + } + } + return ""; + } + } + function getSourceInfoErrorAddendum(source) { + { + if (source !== void 0) { + var fileName = source.fileName.replace(/^.*[\\\/]/, ""); + var lineNumber = source.lineNumber; + return "\n\nCheck your code at " + fileName + ":" + lineNumber + "."; + } + return ""; + } + } + var ownerHasKeyUseWarning = {}; + function getCurrentComponentErrorInfo(parentType) { + { + var info = getDeclarationErrorAddendum(); + if (!info) { + var parentName = typeof parentType === "string" ? parentType : parentType.displayName || parentType.name; + if (parentName) { + info = "\n\nCheck the top-level render call using <" + parentName + ">."; + } + } + return info; + } + } + function validateExplicitKey(element, parentType) { + { + if (!element._store || element._store.validated || element.key != null) { + return; + } + element._store.validated = true; + var currentComponentErrorInfo = getCurrentComponentErrorInfo(parentType); + if (ownerHasKeyUseWarning[currentComponentErrorInfo]) { + return; + } + ownerHasKeyUseWarning[currentComponentErrorInfo] = true; + var childOwner = ""; + if (element && element._owner && element._owner !== ReactCurrentOwner$1.current) { + childOwner = " It was passed a child from " + getComponentNameFromType(element._owner.type) + "."; + } + setCurrentlyValidatingElement$1(element); + error('Each child in a list should have a unique "key" prop.%s%s See https://reactjs.org/link/warning-keys for more information.', currentComponentErrorInfo, childOwner); + setCurrentlyValidatingElement$1(null); + } + } + function validateChildKeys(node, parentType) { + { + if (typeof node !== "object") { + return; + } + if (isArray(node)) { + for (var i = 0; i < node.length; i++) { + var child = node[i]; + if (isValidElement(child)) { + validateExplicitKey(child, parentType); + } + } + } else if (isValidElement(node)) { + if (node._store) { + node._store.validated = true; + } + } else if (node) { + var iteratorFn = getIteratorFn(node); + if (typeof iteratorFn === "function") { + if (iteratorFn !== node.entries) { + var iterator = iteratorFn.call(node); + var step; + while (!(step = iterator.next()).done) { + if (isValidElement(step.value)) { + validateExplicitKey(step.value, parentType); + } + } + } + } + } + } + } + function validatePropTypes(element) { + { + var type = element.type; + if (type === null || type === void 0 || typeof type === "string") { + return; + } + var propTypes; + if (typeof type === "function") { + propTypes = type.propTypes; + } else if (typeof type === "object" && (type.$$typeof === REACT_FORWARD_REF_TYPE || // Note: Memo only checks outer props here. + // Inner props are checked in the reconciler. + type.$$typeof === REACT_MEMO_TYPE)) { + propTypes = type.propTypes; + } else { + return; + } + if (propTypes) { + var name = getComponentNameFromType(type); + checkPropTypes(propTypes, element.props, "prop", name, element); + } else if (type.PropTypes !== void 0 && !propTypesMisspellWarningShown) { + propTypesMisspellWarningShown = true; + var _name = getComponentNameFromType(type); + error("Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?", _name || "Unknown"); + } + if (typeof type.getDefaultProps === "function" && !type.getDefaultProps.isReactClassApproved) { + error("getDefaultProps is only used on classic React.createClass definitions. Use a static property named `defaultProps` instead."); + } + } + } + function validateFragmentProps(fragment) { + { + var keys = Object.keys(fragment.props); + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + if (key !== "children" && key !== "key") { + setCurrentlyValidatingElement$1(fragment); + error("Invalid prop `%s` supplied to `React.Fragment`. React.Fragment can only have `key` and `children` props.", key); + setCurrentlyValidatingElement$1(null); + break; + } + } + if (fragment.ref !== null) { + setCurrentlyValidatingElement$1(fragment); + error("Invalid attribute `ref` supplied to `React.Fragment`."); + setCurrentlyValidatingElement$1(null); + } + } + } + var didWarnAboutKeySpread = {}; + function jsxWithValidation(type, props, key, isStaticChildren, source, self) { + { + var validType = isValidElementType(type); + if (!validType) { + var info = ""; + if (type === void 0 || typeof type === "object" && type !== null && Object.keys(type).length === 0) { + info += " You likely forgot to export your component from the file it's defined in, or you might have mixed up default and named imports."; + } + var sourceInfo = getSourceInfoErrorAddendum(source); + if (sourceInfo) { + info += sourceInfo; + } else { + info += getDeclarationErrorAddendum(); + } + var typeString; + if (type === null) { + typeString = "null"; + } else if (isArray(type)) { + typeString = "array"; + } else if (type !== void 0 && type.$$typeof === REACT_ELEMENT_TYPE) { + typeString = "<" + (getComponentNameFromType(type.type) || "Unknown") + " />"; + info = " Did you accidentally export a JSX literal instead of a component?"; + } else { + typeString = typeof type; + } + error("React.jsx: type is invalid -- expected a string (for built-in components) or a class/function (for composite components) but got: %s.%s", typeString, info); + } + var element = jsxDEV(type, props, key, source, self); + if (element == null) { + return element; + } + if (validType) { + var children = props.children; + if (children !== void 0) { + if (isStaticChildren) { + if (isArray(children)) { + for (var i = 0; i < children.length; i++) { + validateChildKeys(children[i], type); + } + if (Object.freeze) { + Object.freeze(children); + } + } else { + error("React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead."); + } + } else { + validateChildKeys(children, type); + } + } + } + { + if (hasOwnProperty.call(props, "key")) { + var componentName = getComponentNameFromType(type); + var keys = Object.keys(props).filter(function(k) { + return k !== "key"; + }); + var beforeExample = keys.length > 0 ? "{key: someKey, " + keys.join(": ..., ") + ": ...}" : "{key: someKey}"; + if (!didWarnAboutKeySpread[componentName + beforeExample]) { + var afterExample = keys.length > 0 ? "{" + keys.join(": ..., ") + ": ...}" : "{}"; + error('A props object containing a "key" prop is being spread into JSX:\n let props = %s;\n <%s {...props} />\nReact keys must be passed directly to JSX without using spread:\n let props = %s;\n <%s key={someKey} {...props} />', beforeExample, componentName, afterExample, componentName); + didWarnAboutKeySpread[componentName + beforeExample] = true; + } + } + } + if (type === REACT_FRAGMENT_TYPE) { + validateFragmentProps(element); + } else { + validatePropTypes(element); + } + return element; + } + } + function jsxWithValidationStatic(type, props, key) { + { + return jsxWithValidation(type, props, key, true); + } + } + function jsxWithValidationDynamic(type, props, key) { + { + return jsxWithValidation(type, props, key, false); + } + } + var jsx = jsxWithValidationDynamic; + var jsxs = jsxWithValidationStatic; + exports.Fragment = REACT_FRAGMENT_TYPE; + exports.jsx = jsx; + exports.jsxs = jsxs; + })(); + } + } +}); + +// node_modules/react/jsx-runtime.js +var require_jsx_runtime = __commonJS({ + "node_modules/react/jsx-runtime.js"(exports, module) { + if (false) { + module.exports = null; + } else { + module.exports = require_react_jsx_runtime_development(); + } + } +}); + +export { + require_jsx_runtime +}; +/*! Bundled license information: + +react/cjs/react-jsx-runtime.development.js: + (** + * @license React + * react-jsx-runtime.development.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + *) +*/ +//# sourceMappingURL=chunk-GRWX7YRK.js.map diff --git a/visual_workflow_builder/frontend_v4/node_modules/.vite/deps/chunk-GRWX7YRK.js.map b/visual_workflow_builder/frontend_v4/node_modules/.vite/deps/chunk-GRWX7YRK.js.map new file mode 100644 index 000000000..352d575b7 --- /dev/null +++ b/visual_workflow_builder/frontend_v4/node_modules/.vite/deps/chunk-GRWX7YRK.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../react/cjs/react-jsx-runtime.development.js", "../../react/jsx-runtime.js"], + "sourcesContent": ["/**\n * @license React\n * react-jsx-runtime.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nif (process.env.NODE_ENV !== \"production\") {\n (function() {\n'use strict';\n\nvar React = require('react');\n\n// ATTENTION\n// When adding new symbols to this file,\n// Please consider also adding to 'react-devtools-shared/src/backend/ReactSymbols'\n// The Symbol used to tag the ReactElement-like types.\nvar REACT_ELEMENT_TYPE = Symbol.for('react.element');\nvar REACT_PORTAL_TYPE = Symbol.for('react.portal');\nvar REACT_FRAGMENT_TYPE = Symbol.for('react.fragment');\nvar REACT_STRICT_MODE_TYPE = Symbol.for('react.strict_mode');\nvar REACT_PROFILER_TYPE = Symbol.for('react.profiler');\nvar REACT_PROVIDER_TYPE = Symbol.for('react.provider');\nvar REACT_CONTEXT_TYPE = Symbol.for('react.context');\nvar REACT_FORWARD_REF_TYPE = Symbol.for('react.forward_ref');\nvar REACT_SUSPENSE_TYPE = Symbol.for('react.suspense');\nvar REACT_SUSPENSE_LIST_TYPE = Symbol.for('react.suspense_list');\nvar REACT_MEMO_TYPE = Symbol.for('react.memo');\nvar REACT_LAZY_TYPE = Symbol.for('react.lazy');\nvar REACT_OFFSCREEN_TYPE = Symbol.for('react.offscreen');\nvar MAYBE_ITERATOR_SYMBOL = Symbol.iterator;\nvar FAUX_ITERATOR_SYMBOL = '@@iterator';\nfunction getIteratorFn(maybeIterable) {\n if (maybeIterable === null || typeof maybeIterable !== 'object') {\n return null;\n }\n\n var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL];\n\n if (typeof maybeIterator === 'function') {\n return maybeIterator;\n }\n\n return null;\n}\n\nvar ReactSharedInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;\n\nfunction error(format) {\n {\n {\n for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n\n printWarning('error', format, args);\n }\n }\n}\n\nfunction printWarning(level, format, args) {\n // When changing this logic, you might want to also\n // update consoleWithStackDev.www.js as well.\n {\n var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;\n var stack = ReactDebugCurrentFrame.getStackAddendum();\n\n if (stack !== '') {\n format += '%s';\n args = args.concat([stack]);\n } // eslint-disable-next-line react-internal/safe-string-coercion\n\n\n var argsWithFormat = args.map(function (item) {\n return String(item);\n }); // Careful: RN currently depends on this prefix\n\n argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it\n // breaks IE9: https://github.com/facebook/react/issues/13610\n // eslint-disable-next-line react-internal/no-production-logging\n\n Function.prototype.apply.call(console[level], console, argsWithFormat);\n }\n}\n\n// -----------------------------------------------------------------------------\n\nvar enableScopeAPI = false; // Experimental Create Event Handle API.\nvar enableCacheElement = false;\nvar enableTransitionTracing = false; // No known bugs, but needs performance testing\n\nvar enableLegacyHidden = false; // Enables unstable_avoidThisFallback feature in Fiber\n// stuff. Intended to enable React core members to more easily debug scheduling\n// issues in DEV builds.\n\nvar enableDebugTracing = false; // Track which Fiber(s) schedule render work.\n\nvar REACT_MODULE_REFERENCE;\n\n{\n REACT_MODULE_REFERENCE = Symbol.for('react.module.reference');\n}\n\nfunction isValidElementType(type) {\n if (typeof type === 'string' || typeof type === 'function') {\n return true;\n } // Note: typeof might be other than 'symbol' or 'number' (e.g. if it's a polyfill).\n\n\n if (type === REACT_FRAGMENT_TYPE || type === REACT_PROFILER_TYPE || enableDebugTracing || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || enableLegacyHidden || type === REACT_OFFSCREEN_TYPE || enableScopeAPI || enableCacheElement || enableTransitionTracing ) {\n return true;\n }\n\n if (typeof type === 'object' && type !== null) {\n if (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || // This needs to include all possible module reference object\n // types supported by any Flight configuration anywhere since\n // we don't know which Flight build this will end up being used\n // with.\n type.$$typeof === REACT_MODULE_REFERENCE || type.getModuleId !== undefined) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction getWrappedName(outerType, innerType, wrapperName) {\n var displayName = outerType.displayName;\n\n if (displayName) {\n return displayName;\n }\n\n var functionName = innerType.displayName || innerType.name || '';\n return functionName !== '' ? wrapperName + \"(\" + functionName + \")\" : wrapperName;\n} // Keep in sync with react-reconciler/getComponentNameFromFiber\n\n\nfunction getContextName(type) {\n return type.displayName || 'Context';\n} // Note that the reconciler package should generally prefer to use getComponentNameFromFiber() instead.\n\n\nfunction getComponentNameFromType(type) {\n if (type == null) {\n // Host root, text node or just invalid type.\n return null;\n }\n\n {\n if (typeof type.tag === 'number') {\n error('Received an unexpected object in getComponentNameFromType(). ' + 'This is likely a bug in React. Please file an issue.');\n }\n }\n\n if (typeof type === 'function') {\n return type.displayName || type.name || null;\n }\n\n if (typeof type === 'string') {\n return type;\n }\n\n switch (type) {\n case REACT_FRAGMENT_TYPE:\n return 'Fragment';\n\n case REACT_PORTAL_TYPE:\n return 'Portal';\n\n case REACT_PROFILER_TYPE:\n return 'Profiler';\n\n case REACT_STRICT_MODE_TYPE:\n return 'StrictMode';\n\n case REACT_SUSPENSE_TYPE:\n return 'Suspense';\n\n case REACT_SUSPENSE_LIST_TYPE:\n return 'SuspenseList';\n\n }\n\n if (typeof type === 'object') {\n switch (type.$$typeof) {\n case REACT_CONTEXT_TYPE:\n var context = type;\n return getContextName(context) + '.Consumer';\n\n case REACT_PROVIDER_TYPE:\n var provider = type;\n return getContextName(provider._context) + '.Provider';\n\n case REACT_FORWARD_REF_TYPE:\n return getWrappedName(type, type.render, 'ForwardRef');\n\n case REACT_MEMO_TYPE:\n var outerName = type.displayName || null;\n\n if (outerName !== null) {\n return outerName;\n }\n\n return getComponentNameFromType(type.type) || 'Memo';\n\n case REACT_LAZY_TYPE:\n {\n var lazyComponent = type;\n var payload = lazyComponent._payload;\n var init = lazyComponent._init;\n\n try {\n return getComponentNameFromType(init(payload));\n } catch (x) {\n return null;\n }\n }\n\n // eslint-disable-next-line no-fallthrough\n }\n }\n\n return null;\n}\n\nvar assign = Object.assign;\n\n// Helpers to patch console.logs to avoid logging during side-effect free\n// replaying on render function. This currently only patches the object\n// lazily which won't cover if the log function was extracted eagerly.\n// We could also eagerly patch the method.\nvar disabledDepth = 0;\nvar prevLog;\nvar prevInfo;\nvar prevWarn;\nvar prevError;\nvar prevGroup;\nvar prevGroupCollapsed;\nvar prevGroupEnd;\n\nfunction disabledLog() {}\n\ndisabledLog.__reactDisabledLog = true;\nfunction disableLogs() {\n {\n if (disabledDepth === 0) {\n /* eslint-disable react-internal/no-production-logging */\n prevLog = console.log;\n prevInfo = console.info;\n prevWarn = console.warn;\n prevError = console.error;\n prevGroup = console.group;\n prevGroupCollapsed = console.groupCollapsed;\n prevGroupEnd = console.groupEnd; // https://github.com/facebook/react/issues/19099\n\n var props = {\n configurable: true,\n enumerable: true,\n value: disabledLog,\n writable: true\n }; // $FlowFixMe Flow thinks console is immutable.\n\n Object.defineProperties(console, {\n info: props,\n log: props,\n warn: props,\n error: props,\n group: props,\n groupCollapsed: props,\n groupEnd: props\n });\n /* eslint-enable react-internal/no-production-logging */\n }\n\n disabledDepth++;\n }\n}\nfunction reenableLogs() {\n {\n disabledDepth--;\n\n if (disabledDepth === 0) {\n /* eslint-disable react-internal/no-production-logging */\n var props = {\n configurable: true,\n enumerable: true,\n writable: true\n }; // $FlowFixMe Flow thinks console is immutable.\n\n Object.defineProperties(console, {\n log: assign({}, props, {\n value: prevLog\n }),\n info: assign({}, props, {\n value: prevInfo\n }),\n warn: assign({}, props, {\n value: prevWarn\n }),\n error: assign({}, props, {\n value: prevError\n }),\n group: assign({}, props, {\n value: prevGroup\n }),\n groupCollapsed: assign({}, props, {\n value: prevGroupCollapsed\n }),\n groupEnd: assign({}, props, {\n value: prevGroupEnd\n })\n });\n /* eslint-enable react-internal/no-production-logging */\n }\n\n if (disabledDepth < 0) {\n error('disabledDepth fell below zero. ' + 'This is a bug in React. Please file an issue.');\n }\n }\n}\n\nvar ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher;\nvar prefix;\nfunction describeBuiltInComponentFrame(name, source, ownerFn) {\n {\n if (prefix === undefined) {\n // Extract the VM specific prefix used by each line.\n try {\n throw Error();\n } catch (x) {\n var match = x.stack.trim().match(/\\n( *(at )?)/);\n prefix = match && match[1] || '';\n }\n } // We use the prefix to ensure our stacks line up with native stack frames.\n\n\n return '\\n' + prefix + name;\n }\n}\nvar reentry = false;\nvar componentFrameCache;\n\n{\n var PossiblyWeakMap = typeof WeakMap === 'function' ? WeakMap : Map;\n componentFrameCache = new PossiblyWeakMap();\n}\n\nfunction describeNativeComponentFrame(fn, construct) {\n // If something asked for a stack inside a fake render, it should get ignored.\n if ( !fn || reentry) {\n return '';\n }\n\n {\n var frame = componentFrameCache.get(fn);\n\n if (frame !== undefined) {\n return frame;\n }\n }\n\n var control;\n reentry = true;\n var previousPrepareStackTrace = Error.prepareStackTrace; // $FlowFixMe It does accept undefined.\n\n Error.prepareStackTrace = undefined;\n var previousDispatcher;\n\n {\n previousDispatcher = ReactCurrentDispatcher.current; // Set the dispatcher in DEV because this might be call in the render function\n // for warnings.\n\n ReactCurrentDispatcher.current = null;\n disableLogs();\n }\n\n try {\n // This should throw.\n if (construct) {\n // Something should be setting the props in the constructor.\n var Fake = function () {\n throw Error();\n }; // $FlowFixMe\n\n\n Object.defineProperty(Fake.prototype, 'props', {\n set: function () {\n // We use a throwing setter instead of frozen or non-writable props\n // because that won't throw in a non-strict mode function.\n throw Error();\n }\n });\n\n if (typeof Reflect === 'object' && Reflect.construct) {\n // We construct a different control for this case to include any extra\n // frames added by the construct call.\n try {\n Reflect.construct(Fake, []);\n } catch (x) {\n control = x;\n }\n\n Reflect.construct(fn, [], Fake);\n } else {\n try {\n Fake.call();\n } catch (x) {\n control = x;\n }\n\n fn.call(Fake.prototype);\n }\n } else {\n try {\n throw Error();\n } catch (x) {\n control = x;\n }\n\n fn();\n }\n } catch (sample) {\n // This is inlined manually because closure doesn't do it for us.\n if (sample && control && typeof sample.stack === 'string') {\n // This extracts the first frame from the sample that isn't also in the control.\n // Skipping one frame that we assume is the frame that calls the two.\n var sampleLines = sample.stack.split('\\n');\n var controlLines = control.stack.split('\\n');\n var s = sampleLines.length - 1;\n var c = controlLines.length - 1;\n\n while (s >= 1 && c >= 0 && sampleLines[s] !== controlLines[c]) {\n // We expect at least one stack frame to be shared.\n // Typically this will be the root most one. However, stack frames may be\n // cut off due to maximum stack limits. In this case, one maybe cut off\n // earlier than the other. We assume that the sample is longer or the same\n // and there for cut off earlier. So we should find the root most frame in\n // the sample somewhere in the control.\n c--;\n }\n\n for (; s >= 1 && c >= 0; s--, c--) {\n // Next we find the first one that isn't the same which should be the\n // frame that called our sample function and the control.\n if (sampleLines[s] !== controlLines[c]) {\n // In V8, the first line is describing the message but other VMs don't.\n // If we're about to return the first line, and the control is also on the same\n // line, that's a pretty good indicator that our sample threw at same line as\n // the control. I.e. before we entered the sample frame. So we ignore this result.\n // This can happen if you passed a class to function component, or non-function.\n if (s !== 1 || c !== 1) {\n do {\n s--;\n c--; // We may still have similar intermediate frames from the construct call.\n // The next one that isn't the same should be our match though.\n\n if (c < 0 || sampleLines[s] !== controlLines[c]) {\n // V8 adds a \"new\" prefix for native classes. Let's remove it to make it prettier.\n var _frame = '\\n' + sampleLines[s].replace(' at new ', ' at '); // If our component frame is labeled \"\"\n // but we have a user-provided \"displayName\"\n // splice it in to make the stack more readable.\n\n\n if (fn.displayName && _frame.includes('')) {\n _frame = _frame.replace('', fn.displayName);\n }\n\n {\n if (typeof fn === 'function') {\n componentFrameCache.set(fn, _frame);\n }\n } // Return the line we found.\n\n\n return _frame;\n }\n } while (s >= 1 && c >= 0);\n }\n\n break;\n }\n }\n }\n } finally {\n reentry = false;\n\n {\n ReactCurrentDispatcher.current = previousDispatcher;\n reenableLogs();\n }\n\n Error.prepareStackTrace = previousPrepareStackTrace;\n } // Fallback to just using the name if we couldn't make it throw.\n\n\n var name = fn ? fn.displayName || fn.name : '';\n var syntheticFrame = name ? describeBuiltInComponentFrame(name) : '';\n\n {\n if (typeof fn === 'function') {\n componentFrameCache.set(fn, syntheticFrame);\n }\n }\n\n return syntheticFrame;\n}\nfunction describeFunctionComponentFrame(fn, source, ownerFn) {\n {\n return describeNativeComponentFrame(fn, false);\n }\n}\n\nfunction shouldConstruct(Component) {\n var prototype = Component.prototype;\n return !!(prototype && prototype.isReactComponent);\n}\n\nfunction describeUnknownElementTypeFrameInDEV(type, source, ownerFn) {\n\n if (type == null) {\n return '';\n }\n\n if (typeof type === 'function') {\n {\n return describeNativeComponentFrame(type, shouldConstruct(type));\n }\n }\n\n if (typeof type === 'string') {\n return describeBuiltInComponentFrame(type);\n }\n\n switch (type) {\n case REACT_SUSPENSE_TYPE:\n return describeBuiltInComponentFrame('Suspense');\n\n case REACT_SUSPENSE_LIST_TYPE:\n return describeBuiltInComponentFrame('SuspenseList');\n }\n\n if (typeof type === 'object') {\n switch (type.$$typeof) {\n case REACT_FORWARD_REF_TYPE:\n return describeFunctionComponentFrame(type.render);\n\n case REACT_MEMO_TYPE:\n // Memo may contain any component type so we recursively resolve it.\n return describeUnknownElementTypeFrameInDEV(type.type, source, ownerFn);\n\n case REACT_LAZY_TYPE:\n {\n var lazyComponent = type;\n var payload = lazyComponent._payload;\n var init = lazyComponent._init;\n\n try {\n // Lazy may contain any component type so we recursively resolve it.\n return describeUnknownElementTypeFrameInDEV(init(payload), source, ownerFn);\n } catch (x) {}\n }\n }\n }\n\n return '';\n}\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\nvar loggedTypeFailures = {};\nvar ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;\n\nfunction setCurrentlyValidatingElement(element) {\n {\n if (element) {\n var owner = element._owner;\n var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null);\n ReactDebugCurrentFrame.setExtraStackFrame(stack);\n } else {\n ReactDebugCurrentFrame.setExtraStackFrame(null);\n }\n }\n}\n\nfunction checkPropTypes(typeSpecs, values, location, componentName, element) {\n {\n // $FlowFixMe This is okay but Flow doesn't know it.\n var has = Function.call.bind(hasOwnProperty);\n\n for (var typeSpecName in typeSpecs) {\n if (has(typeSpecs, typeSpecName)) {\n var error$1 = void 0; // Prop type validation may throw. In case they do, we don't want to\n // fail the render phase where it didn't fail before. So we log it.\n // After these have been cleaned up, we'll let them throw.\n\n try {\n // This is intentionally an invariant that gets caught. It's the same\n // behavior as without this statement except with a better message.\n if (typeof typeSpecs[typeSpecName] !== 'function') {\n // eslint-disable-next-line react-internal/prod-error-codes\n var err = Error((componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' + 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.' + 'This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.');\n err.name = 'Invariant Violation';\n throw err;\n }\n\n error$1 = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED');\n } catch (ex) {\n error$1 = ex;\n }\n\n if (error$1 && !(error$1 instanceof Error)) {\n setCurrentlyValidatingElement(element);\n\n error('%s: type specification of %s' + ' `%s` is invalid; the type checker ' + 'function must return `null` or an `Error` but returned a %s. ' + 'You may have forgotten to pass an argument to the type checker ' + 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + 'shape all require an argument).', componentName || 'React class', location, typeSpecName, typeof error$1);\n\n setCurrentlyValidatingElement(null);\n }\n\n if (error$1 instanceof Error && !(error$1.message in loggedTypeFailures)) {\n // Only monitor this failure once because there tends to be a lot of the\n // same error.\n loggedTypeFailures[error$1.message] = true;\n setCurrentlyValidatingElement(element);\n\n error('Failed %s type: %s', location, error$1.message);\n\n setCurrentlyValidatingElement(null);\n }\n }\n }\n }\n}\n\nvar isArrayImpl = Array.isArray; // eslint-disable-next-line no-redeclare\n\nfunction isArray(a) {\n return isArrayImpl(a);\n}\n\n/*\n * The `'' + value` pattern (used in in perf-sensitive code) throws for Symbol\n * and Temporal.* types. See https://github.com/facebook/react/pull/22064.\n *\n * The functions in this module will throw an easier-to-understand,\n * easier-to-debug exception with a clear errors message message explaining the\n * problem. (Instead of a confusing exception thrown inside the implementation\n * of the `value` object).\n */\n// $FlowFixMe only called in DEV, so void return is not possible.\nfunction typeName(value) {\n {\n // toStringTag is needed for namespaced types like Temporal.Instant\n var hasToStringTag = typeof Symbol === 'function' && Symbol.toStringTag;\n var type = hasToStringTag && value[Symbol.toStringTag] || value.constructor.name || 'Object';\n return type;\n }\n} // $FlowFixMe only called in DEV, so void return is not possible.\n\n\nfunction willCoercionThrow(value) {\n {\n try {\n testStringCoercion(value);\n return false;\n } catch (e) {\n return true;\n }\n }\n}\n\nfunction testStringCoercion(value) {\n // If you ended up here by following an exception call stack, here's what's\n // happened: you supplied an object or symbol value to React (as a prop, key,\n // DOM attribute, CSS property, string ref, etc.) and when React tried to\n // coerce it to a string using `'' + value`, an exception was thrown.\n //\n // The most common types that will cause this exception are `Symbol` instances\n // and Temporal objects like `Temporal.Instant`. But any object that has a\n // `valueOf` or `[Symbol.toPrimitive]` method that throws will also cause this\n // exception. (Library authors do this to prevent users from using built-in\n // numeric operators like `+` or comparison operators like `>=` because custom\n // methods are needed to perform accurate arithmetic or comparison.)\n //\n // To fix the problem, coerce this object or symbol value to a string before\n // passing it to React. The most reliable way is usually `String(value)`.\n //\n // To find which value is throwing, check the browser or debugger console.\n // Before this exception was thrown, there should be `console.error` output\n // that shows the type (Symbol, Temporal.PlainDate, etc.) that caused the\n // problem and how that type was used: key, atrribute, input value prop, etc.\n // In most cases, this console output also shows the component and its\n // ancestor components where the exception happened.\n //\n // eslint-disable-next-line react-internal/safe-string-coercion\n return '' + value;\n}\nfunction checkKeyStringCoercion(value) {\n {\n if (willCoercionThrow(value)) {\n error('The provided key is an unsupported type %s.' + ' This value must be coerced to a string before before using it here.', typeName(value));\n\n return testStringCoercion(value); // throw (to help callers find troubleshooting comments)\n }\n }\n}\n\nvar ReactCurrentOwner = ReactSharedInternals.ReactCurrentOwner;\nvar RESERVED_PROPS = {\n key: true,\n ref: true,\n __self: true,\n __source: true\n};\nvar specialPropKeyWarningShown;\nvar specialPropRefWarningShown;\nvar didWarnAboutStringRefs;\n\n{\n didWarnAboutStringRefs = {};\n}\n\nfunction hasValidRef(config) {\n {\n if (hasOwnProperty.call(config, 'ref')) {\n var getter = Object.getOwnPropertyDescriptor(config, 'ref').get;\n\n if (getter && getter.isReactWarning) {\n return false;\n }\n }\n }\n\n return config.ref !== undefined;\n}\n\nfunction hasValidKey(config) {\n {\n if (hasOwnProperty.call(config, 'key')) {\n var getter = Object.getOwnPropertyDescriptor(config, 'key').get;\n\n if (getter && getter.isReactWarning) {\n return false;\n }\n }\n }\n\n return config.key !== undefined;\n}\n\nfunction warnIfStringRefCannotBeAutoConverted(config, self) {\n {\n if (typeof config.ref === 'string' && ReactCurrentOwner.current && self && ReactCurrentOwner.current.stateNode !== self) {\n var componentName = getComponentNameFromType(ReactCurrentOwner.current.type);\n\n if (!didWarnAboutStringRefs[componentName]) {\n error('Component \"%s\" contains the string ref \"%s\". ' + 'Support for string refs will be removed in a future major release. ' + 'This case cannot be automatically converted to an arrow function. ' + 'We ask you to manually fix this case by using useRef() or createRef() instead. ' + 'Learn more about using refs safely here: ' + 'https://reactjs.org/link/strict-mode-string-ref', getComponentNameFromType(ReactCurrentOwner.current.type), config.ref);\n\n didWarnAboutStringRefs[componentName] = true;\n }\n }\n }\n}\n\nfunction defineKeyPropWarningGetter(props, displayName) {\n {\n var warnAboutAccessingKey = function () {\n if (!specialPropKeyWarningShown) {\n specialPropKeyWarningShown = true;\n\n error('%s: `key` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName);\n }\n };\n\n warnAboutAccessingKey.isReactWarning = true;\n Object.defineProperty(props, 'key', {\n get: warnAboutAccessingKey,\n configurable: true\n });\n }\n}\n\nfunction defineRefPropWarningGetter(props, displayName) {\n {\n var warnAboutAccessingRef = function () {\n if (!specialPropRefWarningShown) {\n specialPropRefWarningShown = true;\n\n error('%s: `ref` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName);\n }\n };\n\n warnAboutAccessingRef.isReactWarning = true;\n Object.defineProperty(props, 'ref', {\n get: warnAboutAccessingRef,\n configurable: true\n });\n }\n}\n/**\n * Factory method to create a new React element. This no longer adheres to\n * the class pattern, so do not use new to call it. Also, instanceof check\n * will not work. Instead test $$typeof field against Symbol.for('react.element') to check\n * if something is a React Element.\n *\n * @param {*} type\n * @param {*} props\n * @param {*} key\n * @param {string|object} ref\n * @param {*} owner\n * @param {*} self A *temporary* helper to detect places where `this` is\n * different from the `owner` when React.createElement is called, so that we\n * can warn. We want to get rid of owner and replace string `ref`s with arrow\n * functions, and as long as `this` and owner are the same, there will be no\n * change in behavior.\n * @param {*} source An annotation object (added by a transpiler or otherwise)\n * indicating filename, line number, and/or other information.\n * @internal\n */\n\n\nvar ReactElement = function (type, key, ref, self, source, owner, props) {\n var element = {\n // This tag allows us to uniquely identify this as a React Element\n $$typeof: REACT_ELEMENT_TYPE,\n // Built-in properties that belong on the element\n type: type,\n key: key,\n ref: ref,\n props: props,\n // Record the component responsible for creating this element.\n _owner: owner\n };\n\n {\n // The validation flag is currently mutative. We put it on\n // an external backing store so that we can freeze the whole object.\n // This can be replaced with a WeakMap once they are implemented in\n // commonly used development environments.\n element._store = {}; // To make comparing ReactElements easier for testing purposes, we make\n // the validation flag non-enumerable (where possible, which should\n // include every environment we run tests in), so the test framework\n // ignores it.\n\n Object.defineProperty(element._store, 'validated', {\n configurable: false,\n enumerable: false,\n writable: true,\n value: false\n }); // self and source are DEV only properties.\n\n Object.defineProperty(element, '_self', {\n configurable: false,\n enumerable: false,\n writable: false,\n value: self\n }); // Two elements created in two different places should be considered\n // equal for testing purposes and therefore we hide it from enumeration.\n\n Object.defineProperty(element, '_source', {\n configurable: false,\n enumerable: false,\n writable: false,\n value: source\n });\n\n if (Object.freeze) {\n Object.freeze(element.props);\n Object.freeze(element);\n }\n }\n\n return element;\n};\n/**\n * https://github.com/reactjs/rfcs/pull/107\n * @param {*} type\n * @param {object} props\n * @param {string} key\n */\n\nfunction jsxDEV(type, config, maybeKey, source, self) {\n {\n var propName; // Reserved names are extracted\n\n var props = {};\n var key = null;\n var ref = null; // Currently, key can be spread in as a prop. This causes a potential\n // issue if key is also explicitly declared (ie.
\n // or
). We want to deprecate key spread,\n // but as an intermediary step, we will use jsxDEV for everything except\n //
, because we aren't currently able to tell if\n // key is explicitly declared to be undefined or not.\n\n if (maybeKey !== undefined) {\n {\n checkKeyStringCoercion(maybeKey);\n }\n\n key = '' + maybeKey;\n }\n\n if (hasValidKey(config)) {\n {\n checkKeyStringCoercion(config.key);\n }\n\n key = '' + config.key;\n }\n\n if (hasValidRef(config)) {\n ref = config.ref;\n warnIfStringRefCannotBeAutoConverted(config, self);\n } // Remaining properties are added to a new props object\n\n\n for (propName in config) {\n if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) {\n props[propName] = config[propName];\n }\n } // Resolve default props\n\n\n if (type && type.defaultProps) {\n var defaultProps = type.defaultProps;\n\n for (propName in defaultProps) {\n if (props[propName] === undefined) {\n props[propName] = defaultProps[propName];\n }\n }\n }\n\n if (key || ref) {\n var displayName = typeof type === 'function' ? type.displayName || type.name || 'Unknown' : type;\n\n if (key) {\n defineKeyPropWarningGetter(props, displayName);\n }\n\n if (ref) {\n defineRefPropWarningGetter(props, displayName);\n }\n }\n\n return ReactElement(type, key, ref, self, source, ReactCurrentOwner.current, props);\n }\n}\n\nvar ReactCurrentOwner$1 = ReactSharedInternals.ReactCurrentOwner;\nvar ReactDebugCurrentFrame$1 = ReactSharedInternals.ReactDebugCurrentFrame;\n\nfunction setCurrentlyValidatingElement$1(element) {\n {\n if (element) {\n var owner = element._owner;\n var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null);\n ReactDebugCurrentFrame$1.setExtraStackFrame(stack);\n } else {\n ReactDebugCurrentFrame$1.setExtraStackFrame(null);\n }\n }\n}\n\nvar propTypesMisspellWarningShown;\n\n{\n propTypesMisspellWarningShown = false;\n}\n/**\n * Verifies the object is a ReactElement.\n * See https://reactjs.org/docs/react-api.html#isvalidelement\n * @param {?object} object\n * @return {boolean} True if `object` is a ReactElement.\n * @final\n */\n\n\nfunction isValidElement(object) {\n {\n return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;\n }\n}\n\nfunction getDeclarationErrorAddendum() {\n {\n if (ReactCurrentOwner$1.current) {\n var name = getComponentNameFromType(ReactCurrentOwner$1.current.type);\n\n if (name) {\n return '\\n\\nCheck the render method of `' + name + '`.';\n }\n }\n\n return '';\n }\n}\n\nfunction getSourceInfoErrorAddendum(source) {\n {\n if (source !== undefined) {\n var fileName = source.fileName.replace(/^.*[\\\\\\/]/, '');\n var lineNumber = source.lineNumber;\n return '\\n\\nCheck your code at ' + fileName + ':' + lineNumber + '.';\n }\n\n return '';\n }\n}\n/**\n * Warn if there's no key explicitly set on dynamic arrays of children or\n * object keys are not valid. This allows us to keep track of children between\n * updates.\n */\n\n\nvar ownerHasKeyUseWarning = {};\n\nfunction getCurrentComponentErrorInfo(parentType) {\n {\n var info = getDeclarationErrorAddendum();\n\n if (!info) {\n var parentName = typeof parentType === 'string' ? parentType : parentType.displayName || parentType.name;\n\n if (parentName) {\n info = \"\\n\\nCheck the top-level render call using <\" + parentName + \">.\";\n }\n }\n\n return info;\n }\n}\n/**\n * Warn if the element doesn't have an explicit key assigned to it.\n * This element is in an array. The array could grow and shrink or be\n * reordered. All children that haven't already been validated are required to\n * have a \"key\" property assigned to it. Error statuses are cached so a warning\n * will only be shown once.\n *\n * @internal\n * @param {ReactElement} element Element that requires a key.\n * @param {*} parentType element's parent's type.\n */\n\n\nfunction validateExplicitKey(element, parentType) {\n {\n if (!element._store || element._store.validated || element.key != null) {\n return;\n }\n\n element._store.validated = true;\n var currentComponentErrorInfo = getCurrentComponentErrorInfo(parentType);\n\n if (ownerHasKeyUseWarning[currentComponentErrorInfo]) {\n return;\n }\n\n ownerHasKeyUseWarning[currentComponentErrorInfo] = true; // Usually the current owner is the offender, but if it accepts children as a\n // property, it may be the creator of the child that's responsible for\n // assigning it a key.\n\n var childOwner = '';\n\n if (element && element._owner && element._owner !== ReactCurrentOwner$1.current) {\n // Give the component that originally created this child.\n childOwner = \" It was passed a child from \" + getComponentNameFromType(element._owner.type) + \".\";\n }\n\n setCurrentlyValidatingElement$1(element);\n\n error('Each child in a list should have a unique \"key\" prop.' + '%s%s See https://reactjs.org/link/warning-keys for more information.', currentComponentErrorInfo, childOwner);\n\n setCurrentlyValidatingElement$1(null);\n }\n}\n/**\n * Ensure that every element either is passed in a static location, in an\n * array with an explicit keys property defined, or in an object literal\n * with valid key property.\n *\n * @internal\n * @param {ReactNode} node Statically passed child of any type.\n * @param {*} parentType node's parent's type.\n */\n\n\nfunction validateChildKeys(node, parentType) {\n {\n if (typeof node !== 'object') {\n return;\n }\n\n if (isArray(node)) {\n for (var i = 0; i < node.length; i++) {\n var child = node[i];\n\n if (isValidElement(child)) {\n validateExplicitKey(child, parentType);\n }\n }\n } else if (isValidElement(node)) {\n // This element was passed in a valid location.\n if (node._store) {\n node._store.validated = true;\n }\n } else if (node) {\n var iteratorFn = getIteratorFn(node);\n\n if (typeof iteratorFn === 'function') {\n // Entry iterators used to provide implicit keys,\n // but now we print a separate warning for them later.\n if (iteratorFn !== node.entries) {\n var iterator = iteratorFn.call(node);\n var step;\n\n while (!(step = iterator.next()).done) {\n if (isValidElement(step.value)) {\n validateExplicitKey(step.value, parentType);\n }\n }\n }\n }\n }\n }\n}\n/**\n * Given an element, validate that its props follow the propTypes definition,\n * provided by the type.\n *\n * @param {ReactElement} element\n */\n\n\nfunction validatePropTypes(element) {\n {\n var type = element.type;\n\n if (type === null || type === undefined || typeof type === 'string') {\n return;\n }\n\n var propTypes;\n\n if (typeof type === 'function') {\n propTypes = type.propTypes;\n } else if (typeof type === 'object' && (type.$$typeof === REACT_FORWARD_REF_TYPE || // Note: Memo only checks outer props here.\n // Inner props are checked in the reconciler.\n type.$$typeof === REACT_MEMO_TYPE)) {\n propTypes = type.propTypes;\n } else {\n return;\n }\n\n if (propTypes) {\n // Intentionally inside to avoid triggering lazy initializers:\n var name = getComponentNameFromType(type);\n checkPropTypes(propTypes, element.props, 'prop', name, element);\n } else if (type.PropTypes !== undefined && !propTypesMisspellWarningShown) {\n propTypesMisspellWarningShown = true; // Intentionally inside to avoid triggering lazy initializers:\n\n var _name = getComponentNameFromType(type);\n\n error('Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?', _name || 'Unknown');\n }\n\n if (typeof type.getDefaultProps === 'function' && !type.getDefaultProps.isReactClassApproved) {\n error('getDefaultProps is only used on classic React.createClass ' + 'definitions. Use a static property named `defaultProps` instead.');\n }\n }\n}\n/**\n * Given a fragment, validate that it can only be provided with fragment props\n * @param {ReactElement} fragment\n */\n\n\nfunction validateFragmentProps(fragment) {\n {\n var keys = Object.keys(fragment.props);\n\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n\n if (key !== 'children' && key !== 'key') {\n setCurrentlyValidatingElement$1(fragment);\n\n error('Invalid prop `%s` supplied to `React.Fragment`. ' + 'React.Fragment can only have `key` and `children` props.', key);\n\n setCurrentlyValidatingElement$1(null);\n break;\n }\n }\n\n if (fragment.ref !== null) {\n setCurrentlyValidatingElement$1(fragment);\n\n error('Invalid attribute `ref` supplied to `React.Fragment`.');\n\n setCurrentlyValidatingElement$1(null);\n }\n }\n}\n\nvar didWarnAboutKeySpread = {};\nfunction jsxWithValidation(type, props, key, isStaticChildren, source, self) {\n {\n var validType = isValidElementType(type); // We warn in this case but don't throw. We expect the element creation to\n // succeed and there will likely be errors in render.\n\n if (!validType) {\n var info = '';\n\n if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) {\n info += ' You likely forgot to export your component from the file ' + \"it's defined in, or you might have mixed up default and named imports.\";\n }\n\n var sourceInfo = getSourceInfoErrorAddendum(source);\n\n if (sourceInfo) {\n info += sourceInfo;\n } else {\n info += getDeclarationErrorAddendum();\n }\n\n var typeString;\n\n if (type === null) {\n typeString = 'null';\n } else if (isArray(type)) {\n typeString = 'array';\n } else if (type !== undefined && type.$$typeof === REACT_ELEMENT_TYPE) {\n typeString = \"<\" + (getComponentNameFromType(type.type) || 'Unknown') + \" />\";\n info = ' Did you accidentally export a JSX literal instead of a component?';\n } else {\n typeString = typeof type;\n }\n\n error('React.jsx: type is invalid -- expected a string (for ' + 'built-in components) or a class/function (for composite ' + 'components) but got: %s.%s', typeString, info);\n }\n\n var element = jsxDEV(type, props, key, source, self); // The result can be nullish if a mock or a custom function is used.\n // TODO: Drop this when these are no longer allowed as the type argument.\n\n if (element == null) {\n return element;\n } // Skip key warning if the type isn't valid since our key validation logic\n // doesn't expect a non-string/function type and can throw confusing errors.\n // We don't want exception behavior to differ between dev and prod.\n // (Rendering will throw with a helpful message and as soon as the type is\n // fixed, the key warnings will appear.)\n\n\n if (validType) {\n var children = props.children;\n\n if (children !== undefined) {\n if (isStaticChildren) {\n if (isArray(children)) {\n for (var i = 0; i < children.length; i++) {\n validateChildKeys(children[i], type);\n }\n\n if (Object.freeze) {\n Object.freeze(children);\n }\n } else {\n error('React.jsx: Static children should always be an array. ' + 'You are likely explicitly calling React.jsxs or React.jsxDEV. ' + 'Use the Babel transform instead.');\n }\n } else {\n validateChildKeys(children, type);\n }\n }\n }\n\n {\n if (hasOwnProperty.call(props, 'key')) {\n var componentName = getComponentNameFromType(type);\n var keys = Object.keys(props).filter(function (k) {\n return k !== 'key';\n });\n var beforeExample = keys.length > 0 ? '{key: someKey, ' + keys.join(': ..., ') + ': ...}' : '{key: someKey}';\n\n if (!didWarnAboutKeySpread[componentName + beforeExample]) {\n var afterExample = keys.length > 0 ? '{' + keys.join(': ..., ') + ': ...}' : '{}';\n\n error('A props object containing a \"key\" prop is being spread into JSX:\\n' + ' let props = %s;\\n' + ' <%s {...props} />\\n' + 'React keys must be passed directly to JSX without using spread:\\n' + ' let props = %s;\\n' + ' <%s key={someKey} {...props} />', beforeExample, componentName, afterExample, componentName);\n\n didWarnAboutKeySpread[componentName + beforeExample] = true;\n }\n }\n }\n\n if (type === REACT_FRAGMENT_TYPE) {\n validateFragmentProps(element);\n } else {\n validatePropTypes(element);\n }\n\n return element;\n }\n} // These two functions exist to still get child warnings in dev\n// even with the prod transform. This means that jsxDEV is purely\n// opt-in behavior for better messages but that we won't stop\n// giving you warnings if you use production apis.\n\nfunction jsxWithValidationStatic(type, props, key) {\n {\n return jsxWithValidation(type, props, key, true);\n }\n}\nfunction jsxWithValidationDynamic(type, props, key) {\n {\n return jsxWithValidation(type, props, key, false);\n }\n}\n\nvar jsx = jsxWithValidationDynamic ; // we may want to special case jsxs internally to take advantage of static children.\n// for now we can ship identical prod functions\n\nvar jsxs = jsxWithValidationStatic ;\n\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.jsx = jsx;\nexports.jsxs = jsxs;\n })();\n}\n", "'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.min.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n"], + "mappings": "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", + "names": ["ReactDebugCurrentFrame"] +} diff --git a/visual_workflow_builder/frontend_v4/node_modules/.vite/deps/chunk-I4MZPW7S.js b/visual_workflow_builder/frontend_v4/node_modules/.vite/deps/chunk-I4MZPW7S.js new file mode 100644 index 000000000..ffe793ad2 --- /dev/null +++ b/visual_workflow_builder/frontend_v4/node_modules/.vite/deps/chunk-I4MZPW7S.js @@ -0,0 +1,1930 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __commonJS = (cb, mod) => function __require() { + return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); + +// node_modules/react/cjs/react.development.js +var require_react_development = __commonJS({ + "node_modules/react/cjs/react.development.js"(exports, module) { + "use strict"; + if (true) { + (function() { + "use strict"; + if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== "undefined" && typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart === "function") { + __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(new Error()); + } + var ReactVersion = "18.3.1"; + var REACT_ELEMENT_TYPE = Symbol.for("react.element"); + var REACT_PORTAL_TYPE = Symbol.for("react.portal"); + var REACT_FRAGMENT_TYPE = Symbol.for("react.fragment"); + var REACT_STRICT_MODE_TYPE = Symbol.for("react.strict_mode"); + var REACT_PROFILER_TYPE = Symbol.for("react.profiler"); + var REACT_PROVIDER_TYPE = Symbol.for("react.provider"); + var REACT_CONTEXT_TYPE = Symbol.for("react.context"); + var REACT_FORWARD_REF_TYPE = Symbol.for("react.forward_ref"); + var REACT_SUSPENSE_TYPE = Symbol.for("react.suspense"); + var REACT_SUSPENSE_LIST_TYPE = Symbol.for("react.suspense_list"); + var REACT_MEMO_TYPE = Symbol.for("react.memo"); + var REACT_LAZY_TYPE = Symbol.for("react.lazy"); + var REACT_OFFSCREEN_TYPE = Symbol.for("react.offscreen"); + var MAYBE_ITERATOR_SYMBOL = Symbol.iterator; + var FAUX_ITERATOR_SYMBOL = "@@iterator"; + function getIteratorFn(maybeIterable) { + if (maybeIterable === null || typeof maybeIterable !== "object") { + return null; + } + var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]; + if (typeof maybeIterator === "function") { + return maybeIterator; + } + return null; + } + var ReactCurrentDispatcher = { + /** + * @internal + * @type {ReactComponent} + */ + current: null + }; + var ReactCurrentBatchConfig = { + transition: null + }; + var ReactCurrentActQueue = { + current: null, + // Used to reproduce behavior of `batchedUpdates` in legacy mode. + isBatchingLegacy: false, + didScheduleLegacyUpdate: false + }; + var ReactCurrentOwner = { + /** + * @internal + * @type {ReactComponent} + */ + current: null + }; + var ReactDebugCurrentFrame = {}; + var currentExtraStackFrame = null; + function setExtraStackFrame(stack) { + { + currentExtraStackFrame = stack; + } + } + { + ReactDebugCurrentFrame.setExtraStackFrame = function(stack) { + { + currentExtraStackFrame = stack; + } + }; + ReactDebugCurrentFrame.getCurrentStack = null; + ReactDebugCurrentFrame.getStackAddendum = function() { + var stack = ""; + if (currentExtraStackFrame) { + stack += currentExtraStackFrame; + } + var impl = ReactDebugCurrentFrame.getCurrentStack; + if (impl) { + stack += impl() || ""; + } + return stack; + }; + } + var enableScopeAPI = false; + var enableCacheElement = false; + var enableTransitionTracing = false; + var enableLegacyHidden = false; + var enableDebugTracing = false; + var ReactSharedInternals = { + ReactCurrentDispatcher, + ReactCurrentBatchConfig, + ReactCurrentOwner + }; + { + ReactSharedInternals.ReactDebugCurrentFrame = ReactDebugCurrentFrame; + ReactSharedInternals.ReactCurrentActQueue = ReactCurrentActQueue; + } + function warn(format) { + { + { + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + printWarning("warn", format, args); + } + } + } + function error(format) { + { + { + for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { + args[_key2 - 1] = arguments[_key2]; + } + printWarning("error", format, args); + } + } + } + function printWarning(level, format, args) { + { + var ReactDebugCurrentFrame2 = ReactSharedInternals.ReactDebugCurrentFrame; + var stack = ReactDebugCurrentFrame2.getStackAddendum(); + if (stack !== "") { + format += "%s"; + args = args.concat([stack]); + } + var argsWithFormat = args.map(function(item) { + return String(item); + }); + argsWithFormat.unshift("Warning: " + format); + Function.prototype.apply.call(console[level], console, argsWithFormat); + } + } + var didWarnStateUpdateForUnmountedComponent = {}; + function warnNoop(publicInstance, callerName) { + { + var _constructor = publicInstance.constructor; + var componentName = _constructor && (_constructor.displayName || _constructor.name) || "ReactClass"; + var warningKey = componentName + "." + callerName; + if (didWarnStateUpdateForUnmountedComponent[warningKey]) { + return; + } + error("Can't call %s on a component that is not yet mounted. This is a no-op, but it might indicate a bug in your application. Instead, assign to `this.state` directly or define a `state = {};` class property with the desired state in the %s component.", callerName, componentName); + didWarnStateUpdateForUnmountedComponent[warningKey] = true; + } + } + var ReactNoopUpdateQueue = { + /** + * Checks whether or not this composite component is mounted. + * @param {ReactClass} publicInstance The instance we want to test. + * @return {boolean} True if mounted, false otherwise. + * @protected + * @final + */ + isMounted: function(publicInstance) { + return false; + }, + /** + * Forces an update. This should only be invoked when it is known with + * certainty that we are **not** in a DOM transaction. + * + * You may want to call this when you know that some deeper aspect of the + * component's state has changed but `setState` was not called. + * + * This will not invoke `shouldComponentUpdate`, but it will invoke + * `componentWillUpdate` and `componentDidUpdate`. + * + * @param {ReactClass} publicInstance The instance that should rerender. + * @param {?function} callback Called after component is updated. + * @param {?string} callerName name of the calling function in the public API. + * @internal + */ + enqueueForceUpdate: function(publicInstance, callback, callerName) { + warnNoop(publicInstance, "forceUpdate"); + }, + /** + * Replaces all of the state. Always use this or `setState` to mutate state. + * You should treat `this.state` as immutable. + * + * There is no guarantee that `this.state` will be immediately updated, so + * accessing `this.state` after calling this method may return the old value. + * + * @param {ReactClass} publicInstance The instance that should rerender. + * @param {object} completeState Next state. + * @param {?function} callback Called after component is updated. + * @param {?string} callerName name of the calling function in the public API. + * @internal + */ + enqueueReplaceState: function(publicInstance, completeState, callback, callerName) { + warnNoop(publicInstance, "replaceState"); + }, + /** + * Sets a subset of the state. This only exists because _pendingState is + * internal. This provides a merging strategy that is not available to deep + * properties which is confusing. TODO: Expose pendingState or don't use it + * during the merge. + * + * @param {ReactClass} publicInstance The instance that should rerender. + * @param {object} partialState Next partial state to be merged with state. + * @param {?function} callback Called after component is updated. + * @param {?string} Name of the calling function in the public API. + * @internal + */ + enqueueSetState: function(publicInstance, partialState, callback, callerName) { + warnNoop(publicInstance, "setState"); + } + }; + var assign = Object.assign; + var emptyObject = {}; + { + Object.freeze(emptyObject); + } + function Component(props, context, updater) { + this.props = props; + this.context = context; + this.refs = emptyObject; + this.updater = updater || ReactNoopUpdateQueue; + } + Component.prototype.isReactComponent = {}; + Component.prototype.setState = function(partialState, callback) { + if (typeof partialState !== "object" && typeof partialState !== "function" && partialState != null) { + throw new Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables."); + } + this.updater.enqueueSetState(this, partialState, callback, "setState"); + }; + Component.prototype.forceUpdate = function(callback) { + this.updater.enqueueForceUpdate(this, callback, "forceUpdate"); + }; + { + var deprecatedAPIs = { + isMounted: ["isMounted", "Instead, make sure to clean up subscriptions and pending requests in componentWillUnmount to prevent memory leaks."], + replaceState: ["replaceState", "Refactor your code to use setState instead (see https://github.com/facebook/react/issues/3236)."] + }; + var defineDeprecationWarning = function(methodName, info) { + Object.defineProperty(Component.prototype, methodName, { + get: function() { + warn("%s(...) is deprecated in plain JavaScript React classes. %s", info[0], info[1]); + return void 0; + } + }); + }; + for (var fnName in deprecatedAPIs) { + if (deprecatedAPIs.hasOwnProperty(fnName)) { + defineDeprecationWarning(fnName, deprecatedAPIs[fnName]); + } + } + } + function ComponentDummy() { + } + ComponentDummy.prototype = Component.prototype; + function PureComponent(props, context, updater) { + this.props = props; + this.context = context; + this.refs = emptyObject; + this.updater = updater || ReactNoopUpdateQueue; + } + var pureComponentPrototype = PureComponent.prototype = new ComponentDummy(); + pureComponentPrototype.constructor = PureComponent; + assign(pureComponentPrototype, Component.prototype); + pureComponentPrototype.isPureReactComponent = true; + function createRef() { + var refObject = { + current: null + }; + { + Object.seal(refObject); + } + return refObject; + } + var isArrayImpl = Array.isArray; + function isArray(a) { + return isArrayImpl(a); + } + function typeName(value) { + { + var hasToStringTag = typeof Symbol === "function" && Symbol.toStringTag; + var type = hasToStringTag && value[Symbol.toStringTag] || value.constructor.name || "Object"; + return type; + } + } + function willCoercionThrow(value) { + { + try { + testStringCoercion(value); + return false; + } catch (e) { + return true; + } + } + } + function testStringCoercion(value) { + return "" + value; + } + function checkKeyStringCoercion(value) { + { + if (willCoercionThrow(value)) { + error("The provided key is an unsupported type %s. This value must be coerced to a string before before using it here.", typeName(value)); + return testStringCoercion(value); + } + } + } + function getWrappedName(outerType, innerType, wrapperName) { + var displayName = outerType.displayName; + if (displayName) { + return displayName; + } + var functionName = innerType.displayName || innerType.name || ""; + return functionName !== "" ? wrapperName + "(" + functionName + ")" : wrapperName; + } + function getContextName(type) { + return type.displayName || "Context"; + } + function getComponentNameFromType(type) { + if (type == null) { + return null; + } + { + if (typeof type.tag === "number") { + error("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."); + } + } + if (typeof type === "function") { + return type.displayName || type.name || null; + } + if (typeof type === "string") { + return type; + } + switch (type) { + case REACT_FRAGMENT_TYPE: + return "Fragment"; + case REACT_PORTAL_TYPE: + return "Portal"; + case REACT_PROFILER_TYPE: + return "Profiler"; + case REACT_STRICT_MODE_TYPE: + return "StrictMode"; + case REACT_SUSPENSE_TYPE: + return "Suspense"; + case REACT_SUSPENSE_LIST_TYPE: + return "SuspenseList"; + } + if (typeof type === "object") { + switch (type.$$typeof) { + case REACT_CONTEXT_TYPE: + var context = type; + return getContextName(context) + ".Consumer"; + case REACT_PROVIDER_TYPE: + var provider = type; + return getContextName(provider._context) + ".Provider"; + case REACT_FORWARD_REF_TYPE: + return getWrappedName(type, type.render, "ForwardRef"); + case REACT_MEMO_TYPE: + var outerName = type.displayName || null; + if (outerName !== null) { + return outerName; + } + return getComponentNameFromType(type.type) || "Memo"; + case REACT_LAZY_TYPE: { + var lazyComponent = type; + var payload = lazyComponent._payload; + var init = lazyComponent._init; + try { + return getComponentNameFromType(init(payload)); + } catch (x) { + return null; + } + } + } + } + return null; + } + var hasOwnProperty = Object.prototype.hasOwnProperty; + var RESERVED_PROPS = { + key: true, + ref: true, + __self: true, + __source: true + }; + var specialPropKeyWarningShown, specialPropRefWarningShown, didWarnAboutStringRefs; + { + didWarnAboutStringRefs = {}; + } + function hasValidRef(config) { + { + if (hasOwnProperty.call(config, "ref")) { + var getter = Object.getOwnPropertyDescriptor(config, "ref").get; + if (getter && getter.isReactWarning) { + return false; + } + } + } + return config.ref !== void 0; + } + function hasValidKey(config) { + { + if (hasOwnProperty.call(config, "key")) { + var getter = Object.getOwnPropertyDescriptor(config, "key").get; + if (getter && getter.isReactWarning) { + return false; + } + } + } + return config.key !== void 0; + } + function defineKeyPropWarningGetter(props, displayName) { + var warnAboutAccessingKey = function() { + { + if (!specialPropKeyWarningShown) { + specialPropKeyWarningShown = true; + error("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://reactjs.org/link/special-props)", displayName); + } + } + }; + warnAboutAccessingKey.isReactWarning = true; + Object.defineProperty(props, "key", { + get: warnAboutAccessingKey, + configurable: true + }); + } + function defineRefPropWarningGetter(props, displayName) { + var warnAboutAccessingRef = function() { + { + if (!specialPropRefWarningShown) { + specialPropRefWarningShown = true; + error("%s: `ref` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://reactjs.org/link/special-props)", displayName); + } + } + }; + warnAboutAccessingRef.isReactWarning = true; + Object.defineProperty(props, "ref", { + get: warnAboutAccessingRef, + configurable: true + }); + } + function warnIfStringRefCannotBeAutoConverted(config) { + { + if (typeof config.ref === "string" && ReactCurrentOwner.current && config.__self && ReactCurrentOwner.current.stateNode !== config.__self) { + var componentName = getComponentNameFromType(ReactCurrentOwner.current.type); + if (!didWarnAboutStringRefs[componentName]) { + error('Component "%s" contains the string ref "%s". Support for string refs will be removed in a future major release. This case cannot be automatically converted to an arrow function. We ask you to manually fix this case by using useRef() or createRef() instead. Learn more about using refs safely here: https://reactjs.org/link/strict-mode-string-ref', componentName, config.ref); + didWarnAboutStringRefs[componentName] = true; + } + } + } + } + var ReactElement = function(type, key, ref, self, source, owner, props) { + var element = { + // This tag allows us to uniquely identify this as a React Element + $$typeof: REACT_ELEMENT_TYPE, + // Built-in properties that belong on the element + type, + key, + ref, + props, + // Record the component responsible for creating this element. + _owner: owner + }; + { + element._store = {}; + Object.defineProperty(element._store, "validated", { + configurable: false, + enumerable: false, + writable: true, + value: false + }); + Object.defineProperty(element, "_self", { + configurable: false, + enumerable: false, + writable: false, + value: self + }); + Object.defineProperty(element, "_source", { + configurable: false, + enumerable: false, + writable: false, + value: source + }); + if (Object.freeze) { + Object.freeze(element.props); + Object.freeze(element); + } + } + return element; + }; + function createElement(type, config, children) { + var propName; + var props = {}; + var key = null; + var ref = null; + var self = null; + var source = null; + if (config != null) { + if (hasValidRef(config)) { + ref = config.ref; + { + warnIfStringRefCannotBeAutoConverted(config); + } + } + if (hasValidKey(config)) { + { + checkKeyStringCoercion(config.key); + } + key = "" + config.key; + } + self = config.__self === void 0 ? null : config.__self; + source = config.__source === void 0 ? null : config.__source; + for (propName in config) { + if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) { + props[propName] = config[propName]; + } + } + } + var childrenLength = arguments.length - 2; + if (childrenLength === 1) { + props.children = children; + } else if (childrenLength > 1) { + var childArray = Array(childrenLength); + for (var i = 0; i < childrenLength; i++) { + childArray[i] = arguments[i + 2]; + } + { + if (Object.freeze) { + Object.freeze(childArray); + } + } + props.children = childArray; + } + if (type && type.defaultProps) { + var defaultProps = type.defaultProps; + for (propName in defaultProps) { + if (props[propName] === void 0) { + props[propName] = defaultProps[propName]; + } + } + } + { + if (key || ref) { + var displayName = typeof type === "function" ? type.displayName || type.name || "Unknown" : type; + if (key) { + defineKeyPropWarningGetter(props, displayName); + } + if (ref) { + defineRefPropWarningGetter(props, displayName); + } + } + } + return ReactElement(type, key, ref, self, source, ReactCurrentOwner.current, props); + } + function cloneAndReplaceKey(oldElement, newKey) { + var newElement = ReactElement(oldElement.type, newKey, oldElement.ref, oldElement._self, oldElement._source, oldElement._owner, oldElement.props); + return newElement; + } + function cloneElement(element, config, children) { + if (element === null || element === void 0) { + throw new Error("React.cloneElement(...): The argument must be a React element, but you passed " + element + "."); + } + var propName; + var props = assign({}, element.props); + var key = element.key; + var ref = element.ref; + var self = element._self; + var source = element._source; + var owner = element._owner; + if (config != null) { + if (hasValidRef(config)) { + ref = config.ref; + owner = ReactCurrentOwner.current; + } + if (hasValidKey(config)) { + { + checkKeyStringCoercion(config.key); + } + key = "" + config.key; + } + var defaultProps; + if (element.type && element.type.defaultProps) { + defaultProps = element.type.defaultProps; + } + for (propName in config) { + if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) { + if (config[propName] === void 0 && defaultProps !== void 0) { + props[propName] = defaultProps[propName]; + } else { + props[propName] = config[propName]; + } + } + } + } + var childrenLength = arguments.length - 2; + if (childrenLength === 1) { + props.children = children; + } else if (childrenLength > 1) { + var childArray = Array(childrenLength); + for (var i = 0; i < childrenLength; i++) { + childArray[i] = arguments[i + 2]; + } + props.children = childArray; + } + return ReactElement(element.type, key, ref, self, source, owner, props); + } + function isValidElement(object) { + return typeof object === "object" && object !== null && object.$$typeof === REACT_ELEMENT_TYPE; + } + var SEPARATOR = "."; + var SUBSEPARATOR = ":"; + function escape(key) { + var escapeRegex = /[=:]/g; + var escaperLookup = { + "=": "=0", + ":": "=2" + }; + var escapedString = key.replace(escapeRegex, function(match) { + return escaperLookup[match]; + }); + return "$" + escapedString; + } + var didWarnAboutMaps = false; + var userProvidedKeyEscapeRegex = /\/+/g; + function escapeUserProvidedKey(text) { + return text.replace(userProvidedKeyEscapeRegex, "$&/"); + } + function getElementKey(element, index) { + if (typeof element === "object" && element !== null && element.key != null) { + { + checkKeyStringCoercion(element.key); + } + return escape("" + element.key); + } + return index.toString(36); + } + function mapIntoArray(children, array, escapedPrefix, nameSoFar, callback) { + var type = typeof children; + if (type === "undefined" || type === "boolean") { + children = null; + } + var invokeCallback = false; + if (children === null) { + invokeCallback = true; + } else { + switch (type) { + case "string": + case "number": + invokeCallback = true; + break; + case "object": + switch (children.$$typeof) { + case REACT_ELEMENT_TYPE: + case REACT_PORTAL_TYPE: + invokeCallback = true; + } + } + } + if (invokeCallback) { + var _child = children; + var mappedChild = callback(_child); + var childKey = nameSoFar === "" ? SEPARATOR + getElementKey(_child, 0) : nameSoFar; + if (isArray(mappedChild)) { + var escapedChildKey = ""; + if (childKey != null) { + escapedChildKey = escapeUserProvidedKey(childKey) + "/"; + } + mapIntoArray(mappedChild, array, escapedChildKey, "", function(c) { + return c; + }); + } else if (mappedChild != null) { + if (isValidElement(mappedChild)) { + { + if (mappedChild.key && (!_child || _child.key !== mappedChild.key)) { + checkKeyStringCoercion(mappedChild.key); + } + } + mappedChild = cloneAndReplaceKey( + mappedChild, + // Keep both the (mapped) and old keys if they differ, just as + // traverseAllChildren used to do for objects as children + escapedPrefix + // $FlowFixMe Flow incorrectly thinks React.Portal doesn't have a key + (mappedChild.key && (!_child || _child.key !== mappedChild.key) ? ( + // $FlowFixMe Flow incorrectly thinks existing element's key can be a number + // eslint-disable-next-line react-internal/safe-string-coercion + escapeUserProvidedKey("" + mappedChild.key) + "/" + ) : "") + childKey + ); + } + array.push(mappedChild); + } + return 1; + } + var child; + var nextName; + var subtreeCount = 0; + var nextNamePrefix = nameSoFar === "" ? SEPARATOR : nameSoFar + SUBSEPARATOR; + if (isArray(children)) { + for (var i = 0; i < children.length; i++) { + child = children[i]; + nextName = nextNamePrefix + getElementKey(child, i); + subtreeCount += mapIntoArray(child, array, escapedPrefix, nextName, callback); + } + } else { + var iteratorFn = getIteratorFn(children); + if (typeof iteratorFn === "function") { + var iterableChildren = children; + { + if (iteratorFn === iterableChildren.entries) { + if (!didWarnAboutMaps) { + warn("Using Maps as children is not supported. Use an array of keyed ReactElements instead."); + } + didWarnAboutMaps = true; + } + } + var iterator = iteratorFn.call(iterableChildren); + var step; + var ii = 0; + while (!(step = iterator.next()).done) { + child = step.value; + nextName = nextNamePrefix + getElementKey(child, ii++); + subtreeCount += mapIntoArray(child, array, escapedPrefix, nextName, callback); + } + } else if (type === "object") { + var childrenString = String(children); + throw new Error("Objects are not valid as a React child (found: " + (childrenString === "[object Object]" ? "object with keys {" + Object.keys(children).join(", ") + "}" : childrenString) + "). If you meant to render a collection of children, use an array instead."); + } + } + return subtreeCount; + } + function mapChildren(children, func, context) { + if (children == null) { + return children; + } + var result = []; + var count = 0; + mapIntoArray(children, result, "", "", function(child) { + return func.call(context, child, count++); + }); + return result; + } + function countChildren(children) { + var n = 0; + mapChildren(children, function() { + n++; + }); + return n; + } + function forEachChildren(children, forEachFunc, forEachContext) { + mapChildren(children, function() { + forEachFunc.apply(this, arguments); + }, forEachContext); + } + function toArray(children) { + return mapChildren(children, function(child) { + return child; + }) || []; + } + function onlyChild(children) { + if (!isValidElement(children)) { + throw new Error("React.Children.only expected to receive a single React element child."); + } + return children; + } + function createContext(defaultValue) { + var context = { + $$typeof: REACT_CONTEXT_TYPE, + // As a workaround to support multiple concurrent renderers, we categorize + // some renderers as primary and others as secondary. We only expect + // there to be two concurrent renderers at most: React Native (primary) and + // Fabric (secondary); React DOM (primary) and React ART (secondary). + // Secondary renderers store their context values on separate fields. + _currentValue: defaultValue, + _currentValue2: defaultValue, + // Used to track how many concurrent renderers this context currently + // supports within in a single renderer. Such as parallel server rendering. + _threadCount: 0, + // These are circular + Provider: null, + Consumer: null, + // Add these to use same hidden class in VM as ServerContext + _defaultValue: null, + _globalName: null + }; + context.Provider = { + $$typeof: REACT_PROVIDER_TYPE, + _context: context + }; + var hasWarnedAboutUsingNestedContextConsumers = false; + var hasWarnedAboutUsingConsumerProvider = false; + var hasWarnedAboutDisplayNameOnConsumer = false; + { + var Consumer = { + $$typeof: REACT_CONTEXT_TYPE, + _context: context + }; + Object.defineProperties(Consumer, { + Provider: { + get: function() { + if (!hasWarnedAboutUsingConsumerProvider) { + hasWarnedAboutUsingConsumerProvider = true; + error("Rendering is not supported and will be removed in a future major release. Did you mean to render instead?"); + } + return context.Provider; + }, + set: function(_Provider) { + context.Provider = _Provider; + } + }, + _currentValue: { + get: function() { + return context._currentValue; + }, + set: function(_currentValue) { + context._currentValue = _currentValue; + } + }, + _currentValue2: { + get: function() { + return context._currentValue2; + }, + set: function(_currentValue2) { + context._currentValue2 = _currentValue2; + } + }, + _threadCount: { + get: function() { + return context._threadCount; + }, + set: function(_threadCount) { + context._threadCount = _threadCount; + } + }, + Consumer: { + get: function() { + if (!hasWarnedAboutUsingNestedContextConsumers) { + hasWarnedAboutUsingNestedContextConsumers = true; + error("Rendering is not supported and will be removed in a future major release. Did you mean to render instead?"); + } + return context.Consumer; + } + }, + displayName: { + get: function() { + return context.displayName; + }, + set: function(displayName) { + if (!hasWarnedAboutDisplayNameOnConsumer) { + warn("Setting `displayName` on Context.Consumer has no effect. You should set it directly on the context with Context.displayName = '%s'.", displayName); + hasWarnedAboutDisplayNameOnConsumer = true; + } + } + } + }); + context.Consumer = Consumer; + } + { + context._currentRenderer = null; + context._currentRenderer2 = null; + } + return context; + } + var Uninitialized = -1; + var Pending = 0; + var Resolved = 1; + var Rejected = 2; + function lazyInitializer(payload) { + if (payload._status === Uninitialized) { + var ctor = payload._result; + var thenable = ctor(); + thenable.then(function(moduleObject2) { + if (payload._status === Pending || payload._status === Uninitialized) { + var resolved = payload; + resolved._status = Resolved; + resolved._result = moduleObject2; + } + }, function(error2) { + if (payload._status === Pending || payload._status === Uninitialized) { + var rejected = payload; + rejected._status = Rejected; + rejected._result = error2; + } + }); + if (payload._status === Uninitialized) { + var pending = payload; + pending._status = Pending; + pending._result = thenable; + } + } + if (payload._status === Resolved) { + var moduleObject = payload._result; + { + if (moduleObject === void 0) { + error("lazy: Expected the result of a dynamic import() call. Instead received: %s\n\nYour code should look like: \n const MyComponent = lazy(() => import('./MyComponent'))\n\nDid you accidentally put curly braces around the import?", moduleObject); + } + } + { + if (!("default" in moduleObject)) { + error("lazy: Expected the result of a dynamic import() call. Instead received: %s\n\nYour code should look like: \n const MyComponent = lazy(() => import('./MyComponent'))", moduleObject); + } + } + return moduleObject.default; + } else { + throw payload._result; + } + } + function lazy(ctor) { + var payload = { + // We use these fields to store the result. + _status: Uninitialized, + _result: ctor + }; + var lazyType = { + $$typeof: REACT_LAZY_TYPE, + _payload: payload, + _init: lazyInitializer + }; + { + var defaultProps; + var propTypes; + Object.defineProperties(lazyType, { + defaultProps: { + configurable: true, + get: function() { + return defaultProps; + }, + set: function(newDefaultProps) { + error("React.lazy(...): It is not supported to assign `defaultProps` to a lazy component import. Either specify them where the component is defined, or create a wrapping component around it."); + defaultProps = newDefaultProps; + Object.defineProperty(lazyType, "defaultProps", { + enumerable: true + }); + } + }, + propTypes: { + configurable: true, + get: function() { + return propTypes; + }, + set: function(newPropTypes) { + error("React.lazy(...): It is not supported to assign `propTypes` to a lazy component import. Either specify them where the component is defined, or create a wrapping component around it."); + propTypes = newPropTypes; + Object.defineProperty(lazyType, "propTypes", { + enumerable: true + }); + } + } + }); + } + return lazyType; + } + function forwardRef(render) { + { + if (render != null && render.$$typeof === REACT_MEMO_TYPE) { + error("forwardRef requires a render function but received a `memo` component. Instead of forwardRef(memo(...)), use memo(forwardRef(...))."); + } else if (typeof render !== "function") { + error("forwardRef requires a render function but was given %s.", render === null ? "null" : typeof render); + } else { + if (render.length !== 0 && render.length !== 2) { + error("forwardRef render functions accept exactly two parameters: props and ref. %s", render.length === 1 ? "Did you forget to use the ref parameter?" : "Any additional parameter will be undefined."); + } + } + if (render != null) { + if (render.defaultProps != null || render.propTypes != null) { + error("forwardRef render functions do not support propTypes or defaultProps. Did you accidentally pass a React component?"); + } + } + } + var elementType = { + $$typeof: REACT_FORWARD_REF_TYPE, + render + }; + { + var ownName; + Object.defineProperty(elementType, "displayName", { + enumerable: false, + configurable: true, + get: function() { + return ownName; + }, + set: function(name) { + ownName = name; + if (!render.name && !render.displayName) { + render.displayName = name; + } + } + }); + } + return elementType; + } + var REACT_MODULE_REFERENCE; + { + REACT_MODULE_REFERENCE = Symbol.for("react.module.reference"); + } + function isValidElementType(type) { + if (typeof type === "string" || typeof type === "function") { + return true; + } + if (type === REACT_FRAGMENT_TYPE || type === REACT_PROFILER_TYPE || enableDebugTracing || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || enableLegacyHidden || type === REACT_OFFSCREEN_TYPE || enableScopeAPI || enableCacheElement || enableTransitionTracing) { + return true; + } + if (typeof type === "object" && type !== null) { + if (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || // This needs to include all possible module reference object + // types supported by any Flight configuration anywhere since + // we don't know which Flight build this will end up being used + // with. + type.$$typeof === REACT_MODULE_REFERENCE || type.getModuleId !== void 0) { + return true; + } + } + return false; + } + function memo(type, compare) { + { + if (!isValidElementType(type)) { + error("memo: The first argument must be a component. Instead received: %s", type === null ? "null" : typeof type); + } + } + var elementType = { + $$typeof: REACT_MEMO_TYPE, + type, + compare: compare === void 0 ? null : compare + }; + { + var ownName; + Object.defineProperty(elementType, "displayName", { + enumerable: false, + configurable: true, + get: function() { + return ownName; + }, + set: function(name) { + ownName = name; + if (!type.name && !type.displayName) { + type.displayName = name; + } + } + }); + } + return elementType; + } + function resolveDispatcher() { + var dispatcher = ReactCurrentDispatcher.current; + { + if (dispatcher === null) { + error("Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:\n1. You might have mismatching versions of React and the renderer (such as React DOM)\n2. You might be breaking the Rules of Hooks\n3. You might have more than one copy of React in the same app\nSee https://reactjs.org/link/invalid-hook-call for tips about how to debug and fix this problem."); + } + } + return dispatcher; + } + function useContext(Context) { + var dispatcher = resolveDispatcher(); + { + if (Context._context !== void 0) { + var realContext = Context._context; + if (realContext.Consumer === Context) { + error("Calling useContext(Context.Consumer) is not supported, may cause bugs, and will be removed in a future major release. Did you mean to call useContext(Context) instead?"); + } else if (realContext.Provider === Context) { + error("Calling useContext(Context.Provider) is not supported. Did you mean to call useContext(Context) instead?"); + } + } + } + return dispatcher.useContext(Context); + } + function useState(initialState) { + var dispatcher = resolveDispatcher(); + return dispatcher.useState(initialState); + } + function useReducer(reducer, initialArg, init) { + var dispatcher = resolveDispatcher(); + return dispatcher.useReducer(reducer, initialArg, init); + } + function useRef(initialValue) { + var dispatcher = resolveDispatcher(); + return dispatcher.useRef(initialValue); + } + function useEffect(create, deps) { + var dispatcher = resolveDispatcher(); + return dispatcher.useEffect(create, deps); + } + function useInsertionEffect(create, deps) { + var dispatcher = resolveDispatcher(); + return dispatcher.useInsertionEffect(create, deps); + } + function useLayoutEffect(create, deps) { + var dispatcher = resolveDispatcher(); + return dispatcher.useLayoutEffect(create, deps); + } + function useCallback(callback, deps) { + var dispatcher = resolveDispatcher(); + return dispatcher.useCallback(callback, deps); + } + function useMemo(create, deps) { + var dispatcher = resolveDispatcher(); + return dispatcher.useMemo(create, deps); + } + function useImperativeHandle(ref, create, deps) { + var dispatcher = resolveDispatcher(); + return dispatcher.useImperativeHandle(ref, create, deps); + } + function useDebugValue(value, formatterFn) { + { + var dispatcher = resolveDispatcher(); + return dispatcher.useDebugValue(value, formatterFn); + } + } + function useTransition() { + var dispatcher = resolveDispatcher(); + return dispatcher.useTransition(); + } + function useDeferredValue(value) { + var dispatcher = resolveDispatcher(); + return dispatcher.useDeferredValue(value); + } + function useId() { + var dispatcher = resolveDispatcher(); + return dispatcher.useId(); + } + function useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot) { + var dispatcher = resolveDispatcher(); + return dispatcher.useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot); + } + var disabledDepth = 0; + var prevLog; + var prevInfo; + var prevWarn; + var prevError; + var prevGroup; + var prevGroupCollapsed; + var prevGroupEnd; + function disabledLog() { + } + disabledLog.__reactDisabledLog = true; + function disableLogs() { + { + if (disabledDepth === 0) { + prevLog = console.log; + prevInfo = console.info; + prevWarn = console.warn; + prevError = console.error; + prevGroup = console.group; + prevGroupCollapsed = console.groupCollapsed; + prevGroupEnd = console.groupEnd; + var props = { + configurable: true, + enumerable: true, + value: disabledLog, + writable: true + }; + Object.defineProperties(console, { + info: props, + log: props, + warn: props, + error: props, + group: props, + groupCollapsed: props, + groupEnd: props + }); + } + disabledDepth++; + } + } + function reenableLogs() { + { + disabledDepth--; + if (disabledDepth === 0) { + var props = { + configurable: true, + enumerable: true, + writable: true + }; + Object.defineProperties(console, { + log: assign({}, props, { + value: prevLog + }), + info: assign({}, props, { + value: prevInfo + }), + warn: assign({}, props, { + value: prevWarn + }), + error: assign({}, props, { + value: prevError + }), + group: assign({}, props, { + value: prevGroup + }), + groupCollapsed: assign({}, props, { + value: prevGroupCollapsed + }), + groupEnd: assign({}, props, { + value: prevGroupEnd + }) + }); + } + if (disabledDepth < 0) { + error("disabledDepth fell below zero. This is a bug in React. Please file an issue."); + } + } + } + var ReactCurrentDispatcher$1 = ReactSharedInternals.ReactCurrentDispatcher; + var prefix; + function describeBuiltInComponentFrame(name, source, ownerFn) { + { + if (prefix === void 0) { + try { + throw Error(); + } catch (x) { + var match = x.stack.trim().match(/\n( *(at )?)/); + prefix = match && match[1] || ""; + } + } + return "\n" + prefix + name; + } + } + var reentry = false; + var componentFrameCache; + { + var PossiblyWeakMap = typeof WeakMap === "function" ? WeakMap : Map; + componentFrameCache = new PossiblyWeakMap(); + } + function describeNativeComponentFrame(fn, construct) { + if (!fn || reentry) { + return ""; + } + { + var frame = componentFrameCache.get(fn); + if (frame !== void 0) { + return frame; + } + } + var control; + reentry = true; + var previousPrepareStackTrace = Error.prepareStackTrace; + Error.prepareStackTrace = void 0; + var previousDispatcher; + { + previousDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = null; + disableLogs(); + } + try { + if (construct) { + var Fake = function() { + throw Error(); + }; + Object.defineProperty(Fake.prototype, "props", { + set: function() { + throw Error(); + } + }); + if (typeof Reflect === "object" && Reflect.construct) { + try { + Reflect.construct(Fake, []); + } catch (x) { + control = x; + } + Reflect.construct(fn, [], Fake); + } else { + try { + Fake.call(); + } catch (x) { + control = x; + } + fn.call(Fake.prototype); + } + } else { + try { + throw Error(); + } catch (x) { + control = x; + } + fn(); + } + } catch (sample) { + if (sample && control && typeof sample.stack === "string") { + var sampleLines = sample.stack.split("\n"); + var controlLines = control.stack.split("\n"); + var s = sampleLines.length - 1; + var c = controlLines.length - 1; + while (s >= 1 && c >= 0 && sampleLines[s] !== controlLines[c]) { + c--; + } + for (; s >= 1 && c >= 0; s--, c--) { + if (sampleLines[s] !== controlLines[c]) { + if (s !== 1 || c !== 1) { + do { + s--; + c--; + if (c < 0 || sampleLines[s] !== controlLines[c]) { + var _frame = "\n" + sampleLines[s].replace(" at new ", " at "); + if (fn.displayName && _frame.includes("")) { + _frame = _frame.replace("", fn.displayName); + } + { + if (typeof fn === "function") { + componentFrameCache.set(fn, _frame); + } + } + return _frame; + } + } while (s >= 1 && c >= 0); + } + break; + } + } + } + } finally { + reentry = false; + { + ReactCurrentDispatcher$1.current = previousDispatcher; + reenableLogs(); + } + Error.prepareStackTrace = previousPrepareStackTrace; + } + var name = fn ? fn.displayName || fn.name : ""; + var syntheticFrame = name ? describeBuiltInComponentFrame(name) : ""; + { + if (typeof fn === "function") { + componentFrameCache.set(fn, syntheticFrame); + } + } + return syntheticFrame; + } + function describeFunctionComponentFrame(fn, source, ownerFn) { + { + return describeNativeComponentFrame(fn, false); + } + } + function shouldConstruct(Component2) { + var prototype = Component2.prototype; + return !!(prototype && prototype.isReactComponent); + } + function describeUnknownElementTypeFrameInDEV(type, source, ownerFn) { + if (type == null) { + return ""; + } + if (typeof type === "function") { + { + return describeNativeComponentFrame(type, shouldConstruct(type)); + } + } + if (typeof type === "string") { + return describeBuiltInComponentFrame(type); + } + switch (type) { + case REACT_SUSPENSE_TYPE: + return describeBuiltInComponentFrame("Suspense"); + case REACT_SUSPENSE_LIST_TYPE: + return describeBuiltInComponentFrame("SuspenseList"); + } + if (typeof type === "object") { + switch (type.$$typeof) { + case REACT_FORWARD_REF_TYPE: + return describeFunctionComponentFrame(type.render); + case REACT_MEMO_TYPE: + return describeUnknownElementTypeFrameInDEV(type.type, source, ownerFn); + case REACT_LAZY_TYPE: { + var lazyComponent = type; + var payload = lazyComponent._payload; + var init = lazyComponent._init; + try { + return describeUnknownElementTypeFrameInDEV(init(payload), source, ownerFn); + } catch (x) { + } + } + } + } + return ""; + } + var loggedTypeFailures = {}; + var ReactDebugCurrentFrame$1 = ReactSharedInternals.ReactDebugCurrentFrame; + function setCurrentlyValidatingElement(element) { + { + if (element) { + var owner = element._owner; + var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null); + ReactDebugCurrentFrame$1.setExtraStackFrame(stack); + } else { + ReactDebugCurrentFrame$1.setExtraStackFrame(null); + } + } + } + function checkPropTypes(typeSpecs, values, location, componentName, element) { + { + var has = Function.call.bind(hasOwnProperty); + for (var typeSpecName in typeSpecs) { + if (has(typeSpecs, typeSpecName)) { + var error$1 = void 0; + try { + if (typeof typeSpecs[typeSpecName] !== "function") { + var err = Error((componentName || "React class") + ": " + location + " type `" + typeSpecName + "` is invalid; it must be a function, usually from the `prop-types` package, but received `" + typeof typeSpecs[typeSpecName] + "`.This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`."); + err.name = "Invariant Violation"; + throw err; + } + error$1 = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, "SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"); + } catch (ex) { + error$1 = ex; + } + if (error$1 && !(error$1 instanceof Error)) { + setCurrentlyValidatingElement(element); + error("%s: type specification of %s `%s` is invalid; the type checker function must return `null` or an `Error` but returned a %s. You may have forgotten to pass an argument to the type checker creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and shape all require an argument).", componentName || "React class", location, typeSpecName, typeof error$1); + setCurrentlyValidatingElement(null); + } + if (error$1 instanceof Error && !(error$1.message in loggedTypeFailures)) { + loggedTypeFailures[error$1.message] = true; + setCurrentlyValidatingElement(element); + error("Failed %s type: %s", location, error$1.message); + setCurrentlyValidatingElement(null); + } + } + } + } + } + function setCurrentlyValidatingElement$1(element) { + { + if (element) { + var owner = element._owner; + var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null); + setExtraStackFrame(stack); + } else { + setExtraStackFrame(null); + } + } + } + var propTypesMisspellWarningShown; + { + propTypesMisspellWarningShown = false; + } + function getDeclarationErrorAddendum() { + if (ReactCurrentOwner.current) { + var name = getComponentNameFromType(ReactCurrentOwner.current.type); + if (name) { + return "\n\nCheck the render method of `" + name + "`."; + } + } + return ""; + } + function getSourceInfoErrorAddendum(source) { + if (source !== void 0) { + var fileName = source.fileName.replace(/^.*[\\\/]/, ""); + var lineNumber = source.lineNumber; + return "\n\nCheck your code at " + fileName + ":" + lineNumber + "."; + } + return ""; + } + function getSourceInfoErrorAddendumForProps(elementProps) { + if (elementProps !== null && elementProps !== void 0) { + return getSourceInfoErrorAddendum(elementProps.__source); + } + return ""; + } + var ownerHasKeyUseWarning = {}; + function getCurrentComponentErrorInfo(parentType) { + var info = getDeclarationErrorAddendum(); + if (!info) { + var parentName = typeof parentType === "string" ? parentType : parentType.displayName || parentType.name; + if (parentName) { + info = "\n\nCheck the top-level render call using <" + parentName + ">."; + } + } + return info; + } + function validateExplicitKey(element, parentType) { + if (!element._store || element._store.validated || element.key != null) { + return; + } + element._store.validated = true; + var currentComponentErrorInfo = getCurrentComponentErrorInfo(parentType); + if (ownerHasKeyUseWarning[currentComponentErrorInfo]) { + return; + } + ownerHasKeyUseWarning[currentComponentErrorInfo] = true; + var childOwner = ""; + if (element && element._owner && element._owner !== ReactCurrentOwner.current) { + childOwner = " It was passed a child from " + getComponentNameFromType(element._owner.type) + "."; + } + { + setCurrentlyValidatingElement$1(element); + error('Each child in a list should have a unique "key" prop.%s%s See https://reactjs.org/link/warning-keys for more information.', currentComponentErrorInfo, childOwner); + setCurrentlyValidatingElement$1(null); + } + } + function validateChildKeys(node, parentType) { + if (typeof node !== "object") { + return; + } + if (isArray(node)) { + for (var i = 0; i < node.length; i++) { + var child = node[i]; + if (isValidElement(child)) { + validateExplicitKey(child, parentType); + } + } + } else if (isValidElement(node)) { + if (node._store) { + node._store.validated = true; + } + } else if (node) { + var iteratorFn = getIteratorFn(node); + if (typeof iteratorFn === "function") { + if (iteratorFn !== node.entries) { + var iterator = iteratorFn.call(node); + var step; + while (!(step = iterator.next()).done) { + if (isValidElement(step.value)) { + validateExplicitKey(step.value, parentType); + } + } + } + } + } + } + function validatePropTypes(element) { + { + var type = element.type; + if (type === null || type === void 0 || typeof type === "string") { + return; + } + var propTypes; + if (typeof type === "function") { + propTypes = type.propTypes; + } else if (typeof type === "object" && (type.$$typeof === REACT_FORWARD_REF_TYPE || // Note: Memo only checks outer props here. + // Inner props are checked in the reconciler. + type.$$typeof === REACT_MEMO_TYPE)) { + propTypes = type.propTypes; + } else { + return; + } + if (propTypes) { + var name = getComponentNameFromType(type); + checkPropTypes(propTypes, element.props, "prop", name, element); + } else if (type.PropTypes !== void 0 && !propTypesMisspellWarningShown) { + propTypesMisspellWarningShown = true; + var _name = getComponentNameFromType(type); + error("Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?", _name || "Unknown"); + } + if (typeof type.getDefaultProps === "function" && !type.getDefaultProps.isReactClassApproved) { + error("getDefaultProps is only used on classic React.createClass definitions. Use a static property named `defaultProps` instead."); + } + } + } + function validateFragmentProps(fragment) { + { + var keys = Object.keys(fragment.props); + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + if (key !== "children" && key !== "key") { + setCurrentlyValidatingElement$1(fragment); + error("Invalid prop `%s` supplied to `React.Fragment`. React.Fragment can only have `key` and `children` props.", key); + setCurrentlyValidatingElement$1(null); + break; + } + } + if (fragment.ref !== null) { + setCurrentlyValidatingElement$1(fragment); + error("Invalid attribute `ref` supplied to `React.Fragment`."); + setCurrentlyValidatingElement$1(null); + } + } + } + function createElementWithValidation(type, props, children) { + var validType = isValidElementType(type); + if (!validType) { + var info = ""; + if (type === void 0 || typeof type === "object" && type !== null && Object.keys(type).length === 0) { + info += " You likely forgot to export your component from the file it's defined in, or you might have mixed up default and named imports."; + } + var sourceInfo = getSourceInfoErrorAddendumForProps(props); + if (sourceInfo) { + info += sourceInfo; + } else { + info += getDeclarationErrorAddendum(); + } + var typeString; + if (type === null) { + typeString = "null"; + } else if (isArray(type)) { + typeString = "array"; + } else if (type !== void 0 && type.$$typeof === REACT_ELEMENT_TYPE) { + typeString = "<" + (getComponentNameFromType(type.type) || "Unknown") + " />"; + info = " Did you accidentally export a JSX literal instead of a component?"; + } else { + typeString = typeof type; + } + { + error("React.createElement: type is invalid -- expected a string (for built-in components) or a class/function (for composite components) but got: %s.%s", typeString, info); + } + } + var element = createElement.apply(this, arguments); + if (element == null) { + return element; + } + if (validType) { + for (var i = 2; i < arguments.length; i++) { + validateChildKeys(arguments[i], type); + } + } + if (type === REACT_FRAGMENT_TYPE) { + validateFragmentProps(element); + } else { + validatePropTypes(element); + } + return element; + } + var didWarnAboutDeprecatedCreateFactory = false; + function createFactoryWithValidation(type) { + var validatedFactory = createElementWithValidation.bind(null, type); + validatedFactory.type = type; + { + if (!didWarnAboutDeprecatedCreateFactory) { + didWarnAboutDeprecatedCreateFactory = true; + warn("React.createFactory() is deprecated and will be removed in a future major release. Consider using JSX or use React.createElement() directly instead."); + } + Object.defineProperty(validatedFactory, "type", { + enumerable: false, + get: function() { + warn("Factory.type is deprecated. Access the class directly before passing it to createFactory."); + Object.defineProperty(this, "type", { + value: type + }); + return type; + } + }); + } + return validatedFactory; + } + function cloneElementWithValidation(element, props, children) { + var newElement = cloneElement.apply(this, arguments); + for (var i = 2; i < arguments.length; i++) { + validateChildKeys(arguments[i], newElement.type); + } + validatePropTypes(newElement); + return newElement; + } + function startTransition(scope, options) { + var prevTransition = ReactCurrentBatchConfig.transition; + ReactCurrentBatchConfig.transition = {}; + var currentTransition = ReactCurrentBatchConfig.transition; + { + ReactCurrentBatchConfig.transition._updatedFibers = /* @__PURE__ */ new Set(); + } + try { + scope(); + } finally { + ReactCurrentBatchConfig.transition = prevTransition; + { + if (prevTransition === null && currentTransition._updatedFibers) { + var updatedFibersCount = currentTransition._updatedFibers.size; + if (updatedFibersCount > 10) { + warn("Detected a large number of updates inside startTransition. If this is due to a subscription please re-write it to use React provided hooks. Otherwise concurrent mode guarantees are off the table."); + } + currentTransition._updatedFibers.clear(); + } + } + } + } + var didWarnAboutMessageChannel = false; + var enqueueTaskImpl = null; + function enqueueTask(task) { + if (enqueueTaskImpl === null) { + try { + var requireString = ("require" + Math.random()).slice(0, 7); + var nodeRequire = module && module[requireString]; + enqueueTaskImpl = nodeRequire.call(module, "timers").setImmediate; + } catch (_err) { + enqueueTaskImpl = function(callback) { + { + if (didWarnAboutMessageChannel === false) { + didWarnAboutMessageChannel = true; + if (typeof MessageChannel === "undefined") { + error("This browser does not have a MessageChannel implementation, so enqueuing tasks via await act(async () => ...) will fail. Please file an issue at https://github.com/facebook/react/issues if you encounter this warning."); + } + } + } + var channel = new MessageChannel(); + channel.port1.onmessage = callback; + channel.port2.postMessage(void 0); + }; + } + } + return enqueueTaskImpl(task); + } + var actScopeDepth = 0; + var didWarnNoAwaitAct = false; + function act(callback) { + { + var prevActScopeDepth = actScopeDepth; + actScopeDepth++; + if (ReactCurrentActQueue.current === null) { + ReactCurrentActQueue.current = []; + } + var prevIsBatchingLegacy = ReactCurrentActQueue.isBatchingLegacy; + var result; + try { + ReactCurrentActQueue.isBatchingLegacy = true; + result = callback(); + if (!prevIsBatchingLegacy && ReactCurrentActQueue.didScheduleLegacyUpdate) { + var queue = ReactCurrentActQueue.current; + if (queue !== null) { + ReactCurrentActQueue.didScheduleLegacyUpdate = false; + flushActQueue(queue); + } + } + } catch (error2) { + popActScope(prevActScopeDepth); + throw error2; + } finally { + ReactCurrentActQueue.isBatchingLegacy = prevIsBatchingLegacy; + } + if (result !== null && typeof result === "object" && typeof result.then === "function") { + var thenableResult = result; + var wasAwaited = false; + var thenable = { + then: function(resolve, reject) { + wasAwaited = true; + thenableResult.then(function(returnValue2) { + popActScope(prevActScopeDepth); + if (actScopeDepth === 0) { + recursivelyFlushAsyncActWork(returnValue2, resolve, reject); + } else { + resolve(returnValue2); + } + }, function(error2) { + popActScope(prevActScopeDepth); + reject(error2); + }); + } + }; + { + if (!didWarnNoAwaitAct && typeof Promise !== "undefined") { + Promise.resolve().then(function() { + }).then(function() { + if (!wasAwaited) { + didWarnNoAwaitAct = true; + error("You called act(async () => ...) without await. This could lead to unexpected testing behaviour, interleaving multiple act calls and mixing their scopes. You should - await act(async () => ...);"); + } + }); + } + } + return thenable; + } else { + var returnValue = result; + popActScope(prevActScopeDepth); + if (actScopeDepth === 0) { + var _queue = ReactCurrentActQueue.current; + if (_queue !== null) { + flushActQueue(_queue); + ReactCurrentActQueue.current = null; + } + var _thenable = { + then: function(resolve, reject) { + if (ReactCurrentActQueue.current === null) { + ReactCurrentActQueue.current = []; + recursivelyFlushAsyncActWork(returnValue, resolve, reject); + } else { + resolve(returnValue); + } + } + }; + return _thenable; + } else { + var _thenable2 = { + then: function(resolve, reject) { + resolve(returnValue); + } + }; + return _thenable2; + } + } + } + } + function popActScope(prevActScopeDepth) { + { + if (prevActScopeDepth !== actScopeDepth - 1) { + error("You seem to have overlapping act() calls, this is not supported. Be sure to await previous act() calls before making a new one. "); + } + actScopeDepth = prevActScopeDepth; + } + } + function recursivelyFlushAsyncActWork(returnValue, resolve, reject) { + { + var queue = ReactCurrentActQueue.current; + if (queue !== null) { + try { + flushActQueue(queue); + enqueueTask(function() { + if (queue.length === 0) { + ReactCurrentActQueue.current = null; + resolve(returnValue); + } else { + recursivelyFlushAsyncActWork(returnValue, resolve, reject); + } + }); + } catch (error2) { + reject(error2); + } + } else { + resolve(returnValue); + } + } + } + var isFlushing = false; + function flushActQueue(queue) { + { + if (!isFlushing) { + isFlushing = true; + var i = 0; + try { + for (; i < queue.length; i++) { + var callback = queue[i]; + do { + callback = callback(true); + } while (callback !== null); + } + queue.length = 0; + } catch (error2) { + queue = queue.slice(i + 1); + throw error2; + } finally { + isFlushing = false; + } + } + } + } + var createElement$1 = createElementWithValidation; + var cloneElement$1 = cloneElementWithValidation; + var createFactory = createFactoryWithValidation; + var Children = { + map: mapChildren, + forEach: forEachChildren, + count: countChildren, + toArray, + only: onlyChild + }; + exports.Children = Children; + exports.Component = Component; + exports.Fragment = REACT_FRAGMENT_TYPE; + exports.Profiler = REACT_PROFILER_TYPE; + exports.PureComponent = PureComponent; + exports.StrictMode = REACT_STRICT_MODE_TYPE; + exports.Suspense = REACT_SUSPENSE_TYPE; + exports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = ReactSharedInternals; + exports.act = act; + exports.cloneElement = cloneElement$1; + exports.createContext = createContext; + exports.createElement = createElement$1; + exports.createFactory = createFactory; + exports.createRef = createRef; + exports.forwardRef = forwardRef; + exports.isValidElement = isValidElement; + exports.lazy = lazy; + exports.memo = memo; + exports.startTransition = startTransition; + exports.unstable_act = act; + exports.useCallback = useCallback; + exports.useContext = useContext; + exports.useDebugValue = useDebugValue; + exports.useDeferredValue = useDeferredValue; + exports.useEffect = useEffect; + exports.useId = useId; + exports.useImperativeHandle = useImperativeHandle; + exports.useInsertionEffect = useInsertionEffect; + exports.useLayoutEffect = useLayoutEffect; + exports.useMemo = useMemo; + exports.useReducer = useReducer; + exports.useRef = useRef; + exports.useState = useState; + exports.useSyncExternalStore = useSyncExternalStore; + exports.useTransition = useTransition; + exports.version = ReactVersion; + if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== "undefined" && typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop === "function") { + __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(new Error()); + } + })(); + } + } +}); + +// node_modules/react/index.js +var require_react = __commonJS({ + "node_modules/react/index.js"(exports, module) { + if (false) { + module.exports = null; + } else { + module.exports = require_react_development(); + } + } +}); + +export { + __commonJS, + __toESM, + require_react +}; +/*! Bundled license information: + +react/cjs/react.development.js: + (** + * @license React + * react.development.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + *) +*/ +//# sourceMappingURL=chunk-I4MZPW7S.js.map diff --git a/visual_workflow_builder/frontend_v4/node_modules/.vite/deps/chunk-I4MZPW7S.js.map b/visual_workflow_builder/frontend_v4/node_modules/.vite/deps/chunk-I4MZPW7S.js.map new file mode 100644 index 000000000..290d89479 --- /dev/null +++ b/visual_workflow_builder/frontend_v4/node_modules/.vite/deps/chunk-I4MZPW7S.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../react/cjs/react.development.js", "../../react/index.js"], + "sourcesContent": ["/**\n * @license React\n * react.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nif (process.env.NODE_ENV !== \"production\") {\n (function() {\n\n 'use strict';\n\n/* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */\nif (\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' &&\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart ===\n 'function'\n) {\n __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(new Error());\n}\n var ReactVersion = '18.3.1';\n\n// ATTENTION\n// When adding new symbols to this file,\n// Please consider also adding to 'react-devtools-shared/src/backend/ReactSymbols'\n// The Symbol used to tag the ReactElement-like types.\nvar REACT_ELEMENT_TYPE = Symbol.for('react.element');\nvar REACT_PORTAL_TYPE = Symbol.for('react.portal');\nvar REACT_FRAGMENT_TYPE = Symbol.for('react.fragment');\nvar REACT_STRICT_MODE_TYPE = Symbol.for('react.strict_mode');\nvar REACT_PROFILER_TYPE = Symbol.for('react.profiler');\nvar REACT_PROVIDER_TYPE = Symbol.for('react.provider');\nvar REACT_CONTEXT_TYPE = Symbol.for('react.context');\nvar REACT_FORWARD_REF_TYPE = Symbol.for('react.forward_ref');\nvar REACT_SUSPENSE_TYPE = Symbol.for('react.suspense');\nvar REACT_SUSPENSE_LIST_TYPE = Symbol.for('react.suspense_list');\nvar REACT_MEMO_TYPE = Symbol.for('react.memo');\nvar REACT_LAZY_TYPE = Symbol.for('react.lazy');\nvar REACT_OFFSCREEN_TYPE = Symbol.for('react.offscreen');\nvar MAYBE_ITERATOR_SYMBOL = Symbol.iterator;\nvar FAUX_ITERATOR_SYMBOL = '@@iterator';\nfunction getIteratorFn(maybeIterable) {\n if (maybeIterable === null || typeof maybeIterable !== 'object') {\n return null;\n }\n\n var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL];\n\n if (typeof maybeIterator === 'function') {\n return maybeIterator;\n }\n\n return null;\n}\n\n/**\n * Keeps track of the current dispatcher.\n */\nvar ReactCurrentDispatcher = {\n /**\n * @internal\n * @type {ReactComponent}\n */\n current: null\n};\n\n/**\n * Keeps track of the current batch's configuration such as how long an update\n * should suspend for if it needs to.\n */\nvar ReactCurrentBatchConfig = {\n transition: null\n};\n\nvar ReactCurrentActQueue = {\n current: null,\n // Used to reproduce behavior of `batchedUpdates` in legacy mode.\n isBatchingLegacy: false,\n didScheduleLegacyUpdate: false\n};\n\n/**\n * Keeps track of the current owner.\n *\n * The current owner is the component who should own any components that are\n * currently being constructed.\n */\nvar ReactCurrentOwner = {\n /**\n * @internal\n * @type {ReactComponent}\n */\n current: null\n};\n\nvar ReactDebugCurrentFrame = {};\nvar currentExtraStackFrame = null;\nfunction setExtraStackFrame(stack) {\n {\n currentExtraStackFrame = stack;\n }\n}\n\n{\n ReactDebugCurrentFrame.setExtraStackFrame = function (stack) {\n {\n currentExtraStackFrame = stack;\n }\n }; // Stack implementation injected by the current renderer.\n\n\n ReactDebugCurrentFrame.getCurrentStack = null;\n\n ReactDebugCurrentFrame.getStackAddendum = function () {\n var stack = ''; // Add an extra top frame while an element is being validated\n\n if (currentExtraStackFrame) {\n stack += currentExtraStackFrame;\n } // Delegate to the injected renderer-specific implementation\n\n\n var impl = ReactDebugCurrentFrame.getCurrentStack;\n\n if (impl) {\n stack += impl() || '';\n }\n\n return stack;\n };\n}\n\n// -----------------------------------------------------------------------------\n\nvar enableScopeAPI = false; // Experimental Create Event Handle API.\nvar enableCacheElement = false;\nvar enableTransitionTracing = false; // No known bugs, but needs performance testing\n\nvar enableLegacyHidden = false; // Enables unstable_avoidThisFallback feature in Fiber\n// stuff. Intended to enable React core members to more easily debug scheduling\n// issues in DEV builds.\n\nvar enableDebugTracing = false; // Track which Fiber(s) schedule render work.\n\nvar ReactSharedInternals = {\n ReactCurrentDispatcher: ReactCurrentDispatcher,\n ReactCurrentBatchConfig: ReactCurrentBatchConfig,\n ReactCurrentOwner: ReactCurrentOwner\n};\n\n{\n ReactSharedInternals.ReactDebugCurrentFrame = ReactDebugCurrentFrame;\n ReactSharedInternals.ReactCurrentActQueue = ReactCurrentActQueue;\n}\n\n// by calls to these methods by a Babel plugin.\n//\n// In PROD (or in packages without access to React internals),\n// they are left as they are instead.\n\nfunction warn(format) {\n {\n {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n printWarning('warn', format, args);\n }\n }\n}\nfunction error(format) {\n {\n {\n for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n\n printWarning('error', format, args);\n }\n }\n}\n\nfunction printWarning(level, format, args) {\n // When changing this logic, you might want to also\n // update consoleWithStackDev.www.js as well.\n {\n var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;\n var stack = ReactDebugCurrentFrame.getStackAddendum();\n\n if (stack !== '') {\n format += '%s';\n args = args.concat([stack]);\n } // eslint-disable-next-line react-internal/safe-string-coercion\n\n\n var argsWithFormat = args.map(function (item) {\n return String(item);\n }); // Careful: RN currently depends on this prefix\n\n argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it\n // breaks IE9: https://github.com/facebook/react/issues/13610\n // eslint-disable-next-line react-internal/no-production-logging\n\n Function.prototype.apply.call(console[level], console, argsWithFormat);\n }\n}\n\nvar didWarnStateUpdateForUnmountedComponent = {};\n\nfunction warnNoop(publicInstance, callerName) {\n {\n var _constructor = publicInstance.constructor;\n var componentName = _constructor && (_constructor.displayName || _constructor.name) || 'ReactClass';\n var warningKey = componentName + \".\" + callerName;\n\n if (didWarnStateUpdateForUnmountedComponent[warningKey]) {\n return;\n }\n\n error(\"Can't call %s on a component that is not yet mounted. \" + 'This is a no-op, but it might indicate a bug in your application. ' + 'Instead, assign to `this.state` directly or define a `state = {};` ' + 'class property with the desired state in the %s component.', callerName, componentName);\n\n didWarnStateUpdateForUnmountedComponent[warningKey] = true;\n }\n}\n/**\n * This is the abstract API for an update queue.\n */\n\n\nvar ReactNoopUpdateQueue = {\n /**\n * Checks whether or not this composite component is mounted.\n * @param {ReactClass} publicInstance The instance we want to test.\n * @return {boolean} True if mounted, false otherwise.\n * @protected\n * @final\n */\n isMounted: function (publicInstance) {\n return false;\n },\n\n /**\n * Forces an update. This should only be invoked when it is known with\n * certainty that we are **not** in a DOM transaction.\n *\n * You may want to call this when you know that some deeper aspect of the\n * component's state has changed but `setState` was not called.\n *\n * This will not invoke `shouldComponentUpdate`, but it will invoke\n * `componentWillUpdate` and `componentDidUpdate`.\n *\n * @param {ReactClass} publicInstance The instance that should rerender.\n * @param {?function} callback Called after component is updated.\n * @param {?string} callerName name of the calling function in the public API.\n * @internal\n */\n enqueueForceUpdate: function (publicInstance, callback, callerName) {\n warnNoop(publicInstance, 'forceUpdate');\n },\n\n /**\n * Replaces all of the state. Always use this or `setState` to mutate state.\n * You should treat `this.state` as immutable.\n *\n * There is no guarantee that `this.state` will be immediately updated, so\n * accessing `this.state` after calling this method may return the old value.\n *\n * @param {ReactClass} publicInstance The instance that should rerender.\n * @param {object} completeState Next state.\n * @param {?function} callback Called after component is updated.\n * @param {?string} callerName name of the calling function in the public API.\n * @internal\n */\n enqueueReplaceState: function (publicInstance, completeState, callback, callerName) {\n warnNoop(publicInstance, 'replaceState');\n },\n\n /**\n * Sets a subset of the state. This only exists because _pendingState is\n * internal. This provides a merging strategy that is not available to deep\n * properties which is confusing. TODO: Expose pendingState or don't use it\n * during the merge.\n *\n * @param {ReactClass} publicInstance The instance that should rerender.\n * @param {object} partialState Next partial state to be merged with state.\n * @param {?function} callback Called after component is updated.\n * @param {?string} Name of the calling function in the public API.\n * @internal\n */\n enqueueSetState: function (publicInstance, partialState, callback, callerName) {\n warnNoop(publicInstance, 'setState');\n }\n};\n\nvar assign = Object.assign;\n\nvar emptyObject = {};\n\n{\n Object.freeze(emptyObject);\n}\n/**\n * Base class helpers for the updating state of a component.\n */\n\n\nfunction Component(props, context, updater) {\n this.props = props;\n this.context = context; // If a component has string refs, we will assign a different object later.\n\n this.refs = emptyObject; // We initialize the default updater but the real one gets injected by the\n // renderer.\n\n this.updater = updater || ReactNoopUpdateQueue;\n}\n\nComponent.prototype.isReactComponent = {};\n/**\n * Sets a subset of the state. Always use this to mutate\n * state. You should treat `this.state` as immutable.\n *\n * There is no guarantee that `this.state` will be immediately updated, so\n * accessing `this.state` after calling this method may return the old value.\n *\n * There is no guarantee that calls to `setState` will run synchronously,\n * as they may eventually be batched together. You can provide an optional\n * callback that will be executed when the call to setState is actually\n * completed.\n *\n * When a function is provided to setState, it will be called at some point in\n * the future (not synchronously). It will be called with the up to date\n * component arguments (state, props, context). These values can be different\n * from this.* because your function may be called after receiveProps but before\n * shouldComponentUpdate, and this new state, props, and context will not yet be\n * assigned to this.\n *\n * @param {object|function} partialState Next partial state or function to\n * produce next partial state to be merged with current state.\n * @param {?function} callback Called after state is updated.\n * @final\n * @protected\n */\n\nComponent.prototype.setState = function (partialState, callback) {\n if (typeof partialState !== 'object' && typeof partialState !== 'function' && partialState != null) {\n throw new Error('setState(...): takes an object of state variables to update or a ' + 'function which returns an object of state variables.');\n }\n\n this.updater.enqueueSetState(this, partialState, callback, 'setState');\n};\n/**\n * Forces an update. This should only be invoked when it is known with\n * certainty that we are **not** in a DOM transaction.\n *\n * You may want to call this when you know that some deeper aspect of the\n * component's state has changed but `setState` was not called.\n *\n * This will not invoke `shouldComponentUpdate`, but it will invoke\n * `componentWillUpdate` and `componentDidUpdate`.\n *\n * @param {?function} callback Called after update is complete.\n * @final\n * @protected\n */\n\n\nComponent.prototype.forceUpdate = function (callback) {\n this.updater.enqueueForceUpdate(this, callback, 'forceUpdate');\n};\n/**\n * Deprecated APIs. These APIs used to exist on classic React classes but since\n * we would like to deprecate them, we're not going to move them over to this\n * modern base class. Instead, we define a getter that warns if it's accessed.\n */\n\n\n{\n var deprecatedAPIs = {\n isMounted: ['isMounted', 'Instead, make sure to clean up subscriptions and pending requests in ' + 'componentWillUnmount to prevent memory leaks.'],\n replaceState: ['replaceState', 'Refactor your code to use setState instead (see ' + 'https://github.com/facebook/react/issues/3236).']\n };\n\n var defineDeprecationWarning = function (methodName, info) {\n Object.defineProperty(Component.prototype, methodName, {\n get: function () {\n warn('%s(...) is deprecated in plain JavaScript React classes. %s', info[0], info[1]);\n\n return undefined;\n }\n });\n };\n\n for (var fnName in deprecatedAPIs) {\n if (deprecatedAPIs.hasOwnProperty(fnName)) {\n defineDeprecationWarning(fnName, deprecatedAPIs[fnName]);\n }\n }\n}\n\nfunction ComponentDummy() {}\n\nComponentDummy.prototype = Component.prototype;\n/**\n * Convenience component with default shallow equality check for sCU.\n */\n\nfunction PureComponent(props, context, updater) {\n this.props = props;\n this.context = context; // If a component has string refs, we will assign a different object later.\n\n this.refs = emptyObject;\n this.updater = updater || ReactNoopUpdateQueue;\n}\n\nvar pureComponentPrototype = PureComponent.prototype = new ComponentDummy();\npureComponentPrototype.constructor = PureComponent; // Avoid an extra prototype jump for these methods.\n\nassign(pureComponentPrototype, Component.prototype);\npureComponentPrototype.isPureReactComponent = true;\n\n// an immutable object with a single mutable value\nfunction createRef() {\n var refObject = {\n current: null\n };\n\n {\n Object.seal(refObject);\n }\n\n return refObject;\n}\n\nvar isArrayImpl = Array.isArray; // eslint-disable-next-line no-redeclare\n\nfunction isArray(a) {\n return isArrayImpl(a);\n}\n\n/*\n * The `'' + value` pattern (used in in perf-sensitive code) throws for Symbol\n * and Temporal.* types. See https://github.com/facebook/react/pull/22064.\n *\n * The functions in this module will throw an easier-to-understand,\n * easier-to-debug exception with a clear errors message message explaining the\n * problem. (Instead of a confusing exception thrown inside the implementation\n * of the `value` object).\n */\n// $FlowFixMe only called in DEV, so void return is not possible.\nfunction typeName(value) {\n {\n // toStringTag is needed for namespaced types like Temporal.Instant\n var hasToStringTag = typeof Symbol === 'function' && Symbol.toStringTag;\n var type = hasToStringTag && value[Symbol.toStringTag] || value.constructor.name || 'Object';\n return type;\n }\n} // $FlowFixMe only called in DEV, so void return is not possible.\n\n\nfunction willCoercionThrow(value) {\n {\n try {\n testStringCoercion(value);\n return false;\n } catch (e) {\n return true;\n }\n }\n}\n\nfunction testStringCoercion(value) {\n // If you ended up here by following an exception call stack, here's what's\n // happened: you supplied an object or symbol value to React (as a prop, key,\n // DOM attribute, CSS property, string ref, etc.) and when React tried to\n // coerce it to a string using `'' + value`, an exception was thrown.\n //\n // The most common types that will cause this exception are `Symbol` instances\n // and Temporal objects like `Temporal.Instant`. But any object that has a\n // `valueOf` or `[Symbol.toPrimitive]` method that throws will also cause this\n // exception. (Library authors do this to prevent users from using built-in\n // numeric operators like `+` or comparison operators like `>=` because custom\n // methods are needed to perform accurate arithmetic or comparison.)\n //\n // To fix the problem, coerce this object or symbol value to a string before\n // passing it to React. The most reliable way is usually `String(value)`.\n //\n // To find which value is throwing, check the browser or debugger console.\n // Before this exception was thrown, there should be `console.error` output\n // that shows the type (Symbol, Temporal.PlainDate, etc.) that caused the\n // problem and how that type was used: key, atrribute, input value prop, etc.\n // In most cases, this console output also shows the component and its\n // ancestor components where the exception happened.\n //\n // eslint-disable-next-line react-internal/safe-string-coercion\n return '' + value;\n}\nfunction checkKeyStringCoercion(value) {\n {\n if (willCoercionThrow(value)) {\n error('The provided key is an unsupported type %s.' + ' This value must be coerced to a string before before using it here.', typeName(value));\n\n return testStringCoercion(value); // throw (to help callers find troubleshooting comments)\n }\n }\n}\n\nfunction getWrappedName(outerType, innerType, wrapperName) {\n var displayName = outerType.displayName;\n\n if (displayName) {\n return displayName;\n }\n\n var functionName = innerType.displayName || innerType.name || '';\n return functionName !== '' ? wrapperName + \"(\" + functionName + \")\" : wrapperName;\n} // Keep in sync with react-reconciler/getComponentNameFromFiber\n\n\nfunction getContextName(type) {\n return type.displayName || 'Context';\n} // Note that the reconciler package should generally prefer to use getComponentNameFromFiber() instead.\n\n\nfunction getComponentNameFromType(type) {\n if (type == null) {\n // Host root, text node or just invalid type.\n return null;\n }\n\n {\n if (typeof type.tag === 'number') {\n error('Received an unexpected object in getComponentNameFromType(). ' + 'This is likely a bug in React. Please file an issue.');\n }\n }\n\n if (typeof type === 'function') {\n return type.displayName || type.name || null;\n }\n\n if (typeof type === 'string') {\n return type;\n }\n\n switch (type) {\n case REACT_FRAGMENT_TYPE:\n return 'Fragment';\n\n case REACT_PORTAL_TYPE:\n return 'Portal';\n\n case REACT_PROFILER_TYPE:\n return 'Profiler';\n\n case REACT_STRICT_MODE_TYPE:\n return 'StrictMode';\n\n case REACT_SUSPENSE_TYPE:\n return 'Suspense';\n\n case REACT_SUSPENSE_LIST_TYPE:\n return 'SuspenseList';\n\n }\n\n if (typeof type === 'object') {\n switch (type.$$typeof) {\n case REACT_CONTEXT_TYPE:\n var context = type;\n return getContextName(context) + '.Consumer';\n\n case REACT_PROVIDER_TYPE:\n var provider = type;\n return getContextName(provider._context) + '.Provider';\n\n case REACT_FORWARD_REF_TYPE:\n return getWrappedName(type, type.render, 'ForwardRef');\n\n case REACT_MEMO_TYPE:\n var outerName = type.displayName || null;\n\n if (outerName !== null) {\n return outerName;\n }\n\n return getComponentNameFromType(type.type) || 'Memo';\n\n case REACT_LAZY_TYPE:\n {\n var lazyComponent = type;\n var payload = lazyComponent._payload;\n var init = lazyComponent._init;\n\n try {\n return getComponentNameFromType(init(payload));\n } catch (x) {\n return null;\n }\n }\n\n // eslint-disable-next-line no-fallthrough\n }\n }\n\n return null;\n}\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\nvar RESERVED_PROPS = {\n key: true,\n ref: true,\n __self: true,\n __source: true\n};\nvar specialPropKeyWarningShown, specialPropRefWarningShown, didWarnAboutStringRefs;\n\n{\n didWarnAboutStringRefs = {};\n}\n\nfunction hasValidRef(config) {\n {\n if (hasOwnProperty.call(config, 'ref')) {\n var getter = Object.getOwnPropertyDescriptor(config, 'ref').get;\n\n if (getter && getter.isReactWarning) {\n return false;\n }\n }\n }\n\n return config.ref !== undefined;\n}\n\nfunction hasValidKey(config) {\n {\n if (hasOwnProperty.call(config, 'key')) {\n var getter = Object.getOwnPropertyDescriptor(config, 'key').get;\n\n if (getter && getter.isReactWarning) {\n return false;\n }\n }\n }\n\n return config.key !== undefined;\n}\n\nfunction defineKeyPropWarningGetter(props, displayName) {\n var warnAboutAccessingKey = function () {\n {\n if (!specialPropKeyWarningShown) {\n specialPropKeyWarningShown = true;\n\n error('%s: `key` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName);\n }\n }\n };\n\n warnAboutAccessingKey.isReactWarning = true;\n Object.defineProperty(props, 'key', {\n get: warnAboutAccessingKey,\n configurable: true\n });\n}\n\nfunction defineRefPropWarningGetter(props, displayName) {\n var warnAboutAccessingRef = function () {\n {\n if (!specialPropRefWarningShown) {\n specialPropRefWarningShown = true;\n\n error('%s: `ref` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName);\n }\n }\n };\n\n warnAboutAccessingRef.isReactWarning = true;\n Object.defineProperty(props, 'ref', {\n get: warnAboutAccessingRef,\n configurable: true\n });\n}\n\nfunction warnIfStringRefCannotBeAutoConverted(config) {\n {\n if (typeof config.ref === 'string' && ReactCurrentOwner.current && config.__self && ReactCurrentOwner.current.stateNode !== config.__self) {\n var componentName = getComponentNameFromType(ReactCurrentOwner.current.type);\n\n if (!didWarnAboutStringRefs[componentName]) {\n error('Component \"%s\" contains the string ref \"%s\". ' + 'Support for string refs will be removed in a future major release. ' + 'This case cannot be automatically converted to an arrow function. ' + 'We ask you to manually fix this case by using useRef() or createRef() instead. ' + 'Learn more about using refs safely here: ' + 'https://reactjs.org/link/strict-mode-string-ref', componentName, config.ref);\n\n didWarnAboutStringRefs[componentName] = true;\n }\n }\n }\n}\n/**\n * Factory method to create a new React element. This no longer adheres to\n * the class pattern, so do not use new to call it. Also, instanceof check\n * will not work. Instead test $$typeof field against Symbol.for('react.element') to check\n * if something is a React Element.\n *\n * @param {*} type\n * @param {*} props\n * @param {*} key\n * @param {string|object} ref\n * @param {*} owner\n * @param {*} self A *temporary* helper to detect places where `this` is\n * different from the `owner` when React.createElement is called, so that we\n * can warn. We want to get rid of owner and replace string `ref`s with arrow\n * functions, and as long as `this` and owner are the same, there will be no\n * change in behavior.\n * @param {*} source An annotation object (added by a transpiler or otherwise)\n * indicating filename, line number, and/or other information.\n * @internal\n */\n\n\nvar ReactElement = function (type, key, ref, self, source, owner, props) {\n var element = {\n // This tag allows us to uniquely identify this as a React Element\n $$typeof: REACT_ELEMENT_TYPE,\n // Built-in properties that belong on the element\n type: type,\n key: key,\n ref: ref,\n props: props,\n // Record the component responsible for creating this element.\n _owner: owner\n };\n\n {\n // The validation flag is currently mutative. We put it on\n // an external backing store so that we can freeze the whole object.\n // This can be replaced with a WeakMap once they are implemented in\n // commonly used development environments.\n element._store = {}; // To make comparing ReactElements easier for testing purposes, we make\n // the validation flag non-enumerable (where possible, which should\n // include every environment we run tests in), so the test framework\n // ignores it.\n\n Object.defineProperty(element._store, 'validated', {\n configurable: false,\n enumerable: false,\n writable: true,\n value: false\n }); // self and source are DEV only properties.\n\n Object.defineProperty(element, '_self', {\n configurable: false,\n enumerable: false,\n writable: false,\n value: self\n }); // Two elements created in two different places should be considered\n // equal for testing purposes and therefore we hide it from enumeration.\n\n Object.defineProperty(element, '_source', {\n configurable: false,\n enumerable: false,\n writable: false,\n value: source\n });\n\n if (Object.freeze) {\n Object.freeze(element.props);\n Object.freeze(element);\n }\n }\n\n return element;\n};\n/**\n * Create and return a new ReactElement of the given type.\n * See https://reactjs.org/docs/react-api.html#createelement\n */\n\nfunction createElement(type, config, children) {\n var propName; // Reserved names are extracted\n\n var props = {};\n var key = null;\n var ref = null;\n var self = null;\n var source = null;\n\n if (config != null) {\n if (hasValidRef(config)) {\n ref = config.ref;\n\n {\n warnIfStringRefCannotBeAutoConverted(config);\n }\n }\n\n if (hasValidKey(config)) {\n {\n checkKeyStringCoercion(config.key);\n }\n\n key = '' + config.key;\n }\n\n self = config.__self === undefined ? null : config.__self;\n source = config.__source === undefined ? null : config.__source; // Remaining properties are added to a new props object\n\n for (propName in config) {\n if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) {\n props[propName] = config[propName];\n }\n }\n } // Children can be more than one argument, and those are transferred onto\n // the newly allocated props object.\n\n\n var childrenLength = arguments.length - 2;\n\n if (childrenLength === 1) {\n props.children = children;\n } else if (childrenLength > 1) {\n var childArray = Array(childrenLength);\n\n for (var i = 0; i < childrenLength; i++) {\n childArray[i] = arguments[i + 2];\n }\n\n {\n if (Object.freeze) {\n Object.freeze(childArray);\n }\n }\n\n props.children = childArray;\n } // Resolve default props\n\n\n if (type && type.defaultProps) {\n var defaultProps = type.defaultProps;\n\n for (propName in defaultProps) {\n if (props[propName] === undefined) {\n props[propName] = defaultProps[propName];\n }\n }\n }\n\n {\n if (key || ref) {\n var displayName = typeof type === 'function' ? type.displayName || type.name || 'Unknown' : type;\n\n if (key) {\n defineKeyPropWarningGetter(props, displayName);\n }\n\n if (ref) {\n defineRefPropWarningGetter(props, displayName);\n }\n }\n }\n\n return ReactElement(type, key, ref, self, source, ReactCurrentOwner.current, props);\n}\nfunction cloneAndReplaceKey(oldElement, newKey) {\n var newElement = ReactElement(oldElement.type, newKey, oldElement.ref, oldElement._self, oldElement._source, oldElement._owner, oldElement.props);\n return newElement;\n}\n/**\n * Clone and return a new ReactElement using element as the starting point.\n * See https://reactjs.org/docs/react-api.html#cloneelement\n */\n\nfunction cloneElement(element, config, children) {\n if (element === null || element === undefined) {\n throw new Error(\"React.cloneElement(...): The argument must be a React element, but you passed \" + element + \".\");\n }\n\n var propName; // Original props are copied\n\n var props = assign({}, element.props); // Reserved names are extracted\n\n var key = element.key;\n var ref = element.ref; // Self is preserved since the owner is preserved.\n\n var self = element._self; // Source is preserved since cloneElement is unlikely to be targeted by a\n // transpiler, and the original source is probably a better indicator of the\n // true owner.\n\n var source = element._source; // Owner will be preserved, unless ref is overridden\n\n var owner = element._owner;\n\n if (config != null) {\n if (hasValidRef(config)) {\n // Silently steal the ref from the parent.\n ref = config.ref;\n owner = ReactCurrentOwner.current;\n }\n\n if (hasValidKey(config)) {\n {\n checkKeyStringCoercion(config.key);\n }\n\n key = '' + config.key;\n } // Remaining properties override existing props\n\n\n var defaultProps;\n\n if (element.type && element.type.defaultProps) {\n defaultProps = element.type.defaultProps;\n }\n\n for (propName in config) {\n if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) {\n if (config[propName] === undefined && defaultProps !== undefined) {\n // Resolve default props\n props[propName] = defaultProps[propName];\n } else {\n props[propName] = config[propName];\n }\n }\n }\n } // Children can be more than one argument, and those are transferred onto\n // the newly allocated props object.\n\n\n var childrenLength = arguments.length - 2;\n\n if (childrenLength === 1) {\n props.children = children;\n } else if (childrenLength > 1) {\n var childArray = Array(childrenLength);\n\n for (var i = 0; i < childrenLength; i++) {\n childArray[i] = arguments[i + 2];\n }\n\n props.children = childArray;\n }\n\n return ReactElement(element.type, key, ref, self, source, owner, props);\n}\n/**\n * Verifies the object is a ReactElement.\n * See https://reactjs.org/docs/react-api.html#isvalidelement\n * @param {?object} object\n * @return {boolean} True if `object` is a ReactElement.\n * @final\n */\n\nfunction isValidElement(object) {\n return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;\n}\n\nvar SEPARATOR = '.';\nvar SUBSEPARATOR = ':';\n/**\n * Escape and wrap key so it is safe to use as a reactid\n *\n * @param {string} key to be escaped.\n * @return {string} the escaped key.\n */\n\nfunction escape(key) {\n var escapeRegex = /[=:]/g;\n var escaperLookup = {\n '=': '=0',\n ':': '=2'\n };\n var escapedString = key.replace(escapeRegex, function (match) {\n return escaperLookup[match];\n });\n return '$' + escapedString;\n}\n/**\n * TODO: Test that a single child and an array with one item have the same key\n * pattern.\n */\n\n\nvar didWarnAboutMaps = false;\nvar userProvidedKeyEscapeRegex = /\\/+/g;\n\nfunction escapeUserProvidedKey(text) {\n return text.replace(userProvidedKeyEscapeRegex, '$&/');\n}\n/**\n * Generate a key string that identifies a element within a set.\n *\n * @param {*} element A element that could contain a manual key.\n * @param {number} index Index that is used if a manual key is not provided.\n * @return {string}\n */\n\n\nfunction getElementKey(element, index) {\n // Do some typechecking here since we call this blindly. We want to ensure\n // that we don't block potential future ES APIs.\n if (typeof element === 'object' && element !== null && element.key != null) {\n // Explicit key\n {\n checkKeyStringCoercion(element.key);\n }\n\n return escape('' + element.key);\n } // Implicit key determined by the index in the set\n\n\n return index.toString(36);\n}\n\nfunction mapIntoArray(children, array, escapedPrefix, nameSoFar, callback) {\n var type = typeof children;\n\n if (type === 'undefined' || type === 'boolean') {\n // All of the above are perceived as null.\n children = null;\n }\n\n var invokeCallback = false;\n\n if (children === null) {\n invokeCallback = true;\n } else {\n switch (type) {\n case 'string':\n case 'number':\n invokeCallback = true;\n break;\n\n case 'object':\n switch (children.$$typeof) {\n case REACT_ELEMENT_TYPE:\n case REACT_PORTAL_TYPE:\n invokeCallback = true;\n }\n\n }\n }\n\n if (invokeCallback) {\n var _child = children;\n var mappedChild = callback(_child); // If it's the only child, treat the name as if it was wrapped in an array\n // so that it's consistent if the number of children grows:\n\n var childKey = nameSoFar === '' ? SEPARATOR + getElementKey(_child, 0) : nameSoFar;\n\n if (isArray(mappedChild)) {\n var escapedChildKey = '';\n\n if (childKey != null) {\n escapedChildKey = escapeUserProvidedKey(childKey) + '/';\n }\n\n mapIntoArray(mappedChild, array, escapedChildKey, '', function (c) {\n return c;\n });\n } else if (mappedChild != null) {\n if (isValidElement(mappedChild)) {\n {\n // The `if` statement here prevents auto-disabling of the safe\n // coercion ESLint rule, so we must manually disable it below.\n // $FlowFixMe Flow incorrectly thinks React.Portal doesn't have a key\n if (mappedChild.key && (!_child || _child.key !== mappedChild.key)) {\n checkKeyStringCoercion(mappedChild.key);\n }\n }\n\n mappedChild = cloneAndReplaceKey(mappedChild, // Keep both the (mapped) and old keys if they differ, just as\n // traverseAllChildren used to do for objects as children\n escapedPrefix + ( // $FlowFixMe Flow incorrectly thinks React.Portal doesn't have a key\n mappedChild.key && (!_child || _child.key !== mappedChild.key) ? // $FlowFixMe Flow incorrectly thinks existing element's key can be a number\n // eslint-disable-next-line react-internal/safe-string-coercion\n escapeUserProvidedKey('' + mappedChild.key) + '/' : '') + childKey);\n }\n\n array.push(mappedChild);\n }\n\n return 1;\n }\n\n var child;\n var nextName;\n var subtreeCount = 0; // Count of children found in the current subtree.\n\n var nextNamePrefix = nameSoFar === '' ? SEPARATOR : nameSoFar + SUBSEPARATOR;\n\n if (isArray(children)) {\n for (var i = 0; i < children.length; i++) {\n child = children[i];\n nextName = nextNamePrefix + getElementKey(child, i);\n subtreeCount += mapIntoArray(child, array, escapedPrefix, nextName, callback);\n }\n } else {\n var iteratorFn = getIteratorFn(children);\n\n if (typeof iteratorFn === 'function') {\n var iterableChildren = children;\n\n {\n // Warn about using Maps as children\n if (iteratorFn === iterableChildren.entries) {\n if (!didWarnAboutMaps) {\n warn('Using Maps as children is not supported. ' + 'Use an array of keyed ReactElements instead.');\n }\n\n didWarnAboutMaps = true;\n }\n }\n\n var iterator = iteratorFn.call(iterableChildren);\n var step;\n var ii = 0;\n\n while (!(step = iterator.next()).done) {\n child = step.value;\n nextName = nextNamePrefix + getElementKey(child, ii++);\n subtreeCount += mapIntoArray(child, array, escapedPrefix, nextName, callback);\n }\n } else if (type === 'object') {\n // eslint-disable-next-line react-internal/safe-string-coercion\n var childrenString = String(children);\n throw new Error(\"Objects are not valid as a React child (found: \" + (childrenString === '[object Object]' ? 'object with keys {' + Object.keys(children).join(', ') + '}' : childrenString) + \"). \" + 'If you meant to render a collection of children, use an array ' + 'instead.');\n }\n }\n\n return subtreeCount;\n}\n\n/**\n * Maps children that are typically specified as `props.children`.\n *\n * See https://reactjs.org/docs/react-api.html#reactchildrenmap\n *\n * The provided mapFunction(child, index) will be called for each\n * leaf child.\n *\n * @param {?*} children Children tree container.\n * @param {function(*, int)} func The map function.\n * @param {*} context Context for mapFunction.\n * @return {object} Object containing the ordered map of results.\n */\nfunction mapChildren(children, func, context) {\n if (children == null) {\n return children;\n }\n\n var result = [];\n var count = 0;\n mapIntoArray(children, result, '', '', function (child) {\n return func.call(context, child, count++);\n });\n return result;\n}\n/**\n * Count the number of children that are typically specified as\n * `props.children`.\n *\n * See https://reactjs.org/docs/react-api.html#reactchildrencount\n *\n * @param {?*} children Children tree container.\n * @return {number} The number of children.\n */\n\n\nfunction countChildren(children) {\n var n = 0;\n mapChildren(children, function () {\n n++; // Don't return anything\n });\n return n;\n}\n\n/**\n * Iterates through children that are typically specified as `props.children`.\n *\n * See https://reactjs.org/docs/react-api.html#reactchildrenforeach\n *\n * The provided forEachFunc(child, index) will be called for each\n * leaf child.\n *\n * @param {?*} children Children tree container.\n * @param {function(*, int)} forEachFunc\n * @param {*} forEachContext Context for forEachContext.\n */\nfunction forEachChildren(children, forEachFunc, forEachContext) {\n mapChildren(children, function () {\n forEachFunc.apply(this, arguments); // Don't return anything.\n }, forEachContext);\n}\n/**\n * Flatten a children object (typically specified as `props.children`) and\n * return an array with appropriately re-keyed children.\n *\n * See https://reactjs.org/docs/react-api.html#reactchildrentoarray\n */\n\n\nfunction toArray(children) {\n return mapChildren(children, function (child) {\n return child;\n }) || [];\n}\n/**\n * Returns the first child in a collection of children and verifies that there\n * is only one child in the collection.\n *\n * See https://reactjs.org/docs/react-api.html#reactchildrenonly\n *\n * The current implementation of this function assumes that a single child gets\n * passed without a wrapper, but the purpose of this helper function is to\n * abstract away the particular structure of children.\n *\n * @param {?object} children Child collection structure.\n * @return {ReactElement} The first and only `ReactElement` contained in the\n * structure.\n */\n\n\nfunction onlyChild(children) {\n if (!isValidElement(children)) {\n throw new Error('React.Children.only expected to receive a single React element child.');\n }\n\n return children;\n}\n\nfunction createContext(defaultValue) {\n // TODO: Second argument used to be an optional `calculateChangedBits`\n // function. Warn to reserve for future use?\n var context = {\n $$typeof: REACT_CONTEXT_TYPE,\n // As a workaround to support multiple concurrent renderers, we categorize\n // some renderers as primary and others as secondary. We only expect\n // there to be two concurrent renderers at most: React Native (primary) and\n // Fabric (secondary); React DOM (primary) and React ART (secondary).\n // Secondary renderers store their context values on separate fields.\n _currentValue: defaultValue,\n _currentValue2: defaultValue,\n // Used to track how many concurrent renderers this context currently\n // supports within in a single renderer. Such as parallel server rendering.\n _threadCount: 0,\n // These are circular\n Provider: null,\n Consumer: null,\n // Add these to use same hidden class in VM as ServerContext\n _defaultValue: null,\n _globalName: null\n };\n context.Provider = {\n $$typeof: REACT_PROVIDER_TYPE,\n _context: context\n };\n var hasWarnedAboutUsingNestedContextConsumers = false;\n var hasWarnedAboutUsingConsumerProvider = false;\n var hasWarnedAboutDisplayNameOnConsumer = false;\n\n {\n // A separate object, but proxies back to the original context object for\n // backwards compatibility. It has a different $$typeof, so we can properly\n // warn for the incorrect usage of Context as a Consumer.\n var Consumer = {\n $$typeof: REACT_CONTEXT_TYPE,\n _context: context\n }; // $FlowFixMe: Flow complains about not setting a value, which is intentional here\n\n Object.defineProperties(Consumer, {\n Provider: {\n get: function () {\n if (!hasWarnedAboutUsingConsumerProvider) {\n hasWarnedAboutUsingConsumerProvider = true;\n\n error('Rendering is not supported and will be removed in ' + 'a future major release. Did you mean to render instead?');\n }\n\n return context.Provider;\n },\n set: function (_Provider) {\n context.Provider = _Provider;\n }\n },\n _currentValue: {\n get: function () {\n return context._currentValue;\n },\n set: function (_currentValue) {\n context._currentValue = _currentValue;\n }\n },\n _currentValue2: {\n get: function () {\n return context._currentValue2;\n },\n set: function (_currentValue2) {\n context._currentValue2 = _currentValue2;\n }\n },\n _threadCount: {\n get: function () {\n return context._threadCount;\n },\n set: function (_threadCount) {\n context._threadCount = _threadCount;\n }\n },\n Consumer: {\n get: function () {\n if (!hasWarnedAboutUsingNestedContextConsumers) {\n hasWarnedAboutUsingNestedContextConsumers = true;\n\n error('Rendering is not supported and will be removed in ' + 'a future major release. Did you mean to render instead?');\n }\n\n return context.Consumer;\n }\n },\n displayName: {\n get: function () {\n return context.displayName;\n },\n set: function (displayName) {\n if (!hasWarnedAboutDisplayNameOnConsumer) {\n warn('Setting `displayName` on Context.Consumer has no effect. ' + \"You should set it directly on the context with Context.displayName = '%s'.\", displayName);\n\n hasWarnedAboutDisplayNameOnConsumer = true;\n }\n }\n }\n }); // $FlowFixMe: Flow complains about missing properties because it doesn't understand defineProperty\n\n context.Consumer = Consumer;\n }\n\n {\n context._currentRenderer = null;\n context._currentRenderer2 = null;\n }\n\n return context;\n}\n\nvar Uninitialized = -1;\nvar Pending = 0;\nvar Resolved = 1;\nvar Rejected = 2;\n\nfunction lazyInitializer(payload) {\n if (payload._status === Uninitialized) {\n var ctor = payload._result;\n var thenable = ctor(); // Transition to the next state.\n // This might throw either because it's missing or throws. If so, we treat it\n // as still uninitialized and try again next time. Which is the same as what\n // happens if the ctor or any wrappers processing the ctor throws. This might\n // end up fixing it if the resolution was a concurrency bug.\n\n thenable.then(function (moduleObject) {\n if (payload._status === Pending || payload._status === Uninitialized) {\n // Transition to the next state.\n var resolved = payload;\n resolved._status = Resolved;\n resolved._result = moduleObject;\n }\n }, function (error) {\n if (payload._status === Pending || payload._status === Uninitialized) {\n // Transition to the next state.\n var rejected = payload;\n rejected._status = Rejected;\n rejected._result = error;\n }\n });\n\n if (payload._status === Uninitialized) {\n // In case, we're still uninitialized, then we're waiting for the thenable\n // to resolve. Set it as pending in the meantime.\n var pending = payload;\n pending._status = Pending;\n pending._result = thenable;\n }\n }\n\n if (payload._status === Resolved) {\n var moduleObject = payload._result;\n\n {\n if (moduleObject === undefined) {\n error('lazy: Expected the result of a dynamic imp' + 'ort() call. ' + 'Instead received: %s\\n\\nYour code should look like: \\n ' + // Break up imports to avoid accidentally parsing them as dependencies.\n 'const MyComponent = lazy(() => imp' + \"ort('./MyComponent'))\\n\\n\" + 'Did you accidentally put curly braces around the import?', moduleObject);\n }\n }\n\n {\n if (!('default' in moduleObject)) {\n error('lazy: Expected the result of a dynamic imp' + 'ort() call. ' + 'Instead received: %s\\n\\nYour code should look like: \\n ' + // Break up imports to avoid accidentally parsing them as dependencies.\n 'const MyComponent = lazy(() => imp' + \"ort('./MyComponent'))\", moduleObject);\n }\n }\n\n return moduleObject.default;\n } else {\n throw payload._result;\n }\n}\n\nfunction lazy(ctor) {\n var payload = {\n // We use these fields to store the result.\n _status: Uninitialized,\n _result: ctor\n };\n var lazyType = {\n $$typeof: REACT_LAZY_TYPE,\n _payload: payload,\n _init: lazyInitializer\n };\n\n {\n // In production, this would just set it on the object.\n var defaultProps;\n var propTypes; // $FlowFixMe\n\n Object.defineProperties(lazyType, {\n defaultProps: {\n configurable: true,\n get: function () {\n return defaultProps;\n },\n set: function (newDefaultProps) {\n error('React.lazy(...): It is not supported to assign `defaultProps` to ' + 'a lazy component import. Either specify them where the component ' + 'is defined, or create a wrapping component around it.');\n\n defaultProps = newDefaultProps; // Match production behavior more closely:\n // $FlowFixMe\n\n Object.defineProperty(lazyType, 'defaultProps', {\n enumerable: true\n });\n }\n },\n propTypes: {\n configurable: true,\n get: function () {\n return propTypes;\n },\n set: function (newPropTypes) {\n error('React.lazy(...): It is not supported to assign `propTypes` to ' + 'a lazy component import. Either specify them where the component ' + 'is defined, or create a wrapping component around it.');\n\n propTypes = newPropTypes; // Match production behavior more closely:\n // $FlowFixMe\n\n Object.defineProperty(lazyType, 'propTypes', {\n enumerable: true\n });\n }\n }\n });\n }\n\n return lazyType;\n}\n\nfunction forwardRef(render) {\n {\n if (render != null && render.$$typeof === REACT_MEMO_TYPE) {\n error('forwardRef requires a render function but received a `memo` ' + 'component. Instead of forwardRef(memo(...)), use ' + 'memo(forwardRef(...)).');\n } else if (typeof render !== 'function') {\n error('forwardRef requires a render function but was given %s.', render === null ? 'null' : typeof render);\n } else {\n if (render.length !== 0 && render.length !== 2) {\n error('forwardRef render functions accept exactly two parameters: props and ref. %s', render.length === 1 ? 'Did you forget to use the ref parameter?' : 'Any additional parameter will be undefined.');\n }\n }\n\n if (render != null) {\n if (render.defaultProps != null || render.propTypes != null) {\n error('forwardRef render functions do not support propTypes or defaultProps. ' + 'Did you accidentally pass a React component?');\n }\n }\n }\n\n var elementType = {\n $$typeof: REACT_FORWARD_REF_TYPE,\n render: render\n };\n\n {\n var ownName;\n Object.defineProperty(elementType, 'displayName', {\n enumerable: false,\n configurable: true,\n get: function () {\n return ownName;\n },\n set: function (name) {\n ownName = name; // The inner component shouldn't inherit this display name in most cases,\n // because the component may be used elsewhere.\n // But it's nice for anonymous functions to inherit the name,\n // so that our component-stack generation logic will display their frames.\n // An anonymous function generally suggests a pattern like:\n // React.forwardRef((props, ref) => {...});\n // This kind of inner function is not used elsewhere so the side effect is okay.\n\n if (!render.name && !render.displayName) {\n render.displayName = name;\n }\n }\n });\n }\n\n return elementType;\n}\n\nvar REACT_MODULE_REFERENCE;\n\n{\n REACT_MODULE_REFERENCE = Symbol.for('react.module.reference');\n}\n\nfunction isValidElementType(type) {\n if (typeof type === 'string' || typeof type === 'function') {\n return true;\n } // Note: typeof might be other than 'symbol' or 'number' (e.g. if it's a polyfill).\n\n\n if (type === REACT_FRAGMENT_TYPE || type === REACT_PROFILER_TYPE || enableDebugTracing || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || enableLegacyHidden || type === REACT_OFFSCREEN_TYPE || enableScopeAPI || enableCacheElement || enableTransitionTracing ) {\n return true;\n }\n\n if (typeof type === 'object' && type !== null) {\n if (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || // This needs to include all possible module reference object\n // types supported by any Flight configuration anywhere since\n // we don't know which Flight build this will end up being used\n // with.\n type.$$typeof === REACT_MODULE_REFERENCE || type.getModuleId !== undefined) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction memo(type, compare) {\n {\n if (!isValidElementType(type)) {\n error('memo: The first argument must be a component. Instead ' + 'received: %s', type === null ? 'null' : typeof type);\n }\n }\n\n var elementType = {\n $$typeof: REACT_MEMO_TYPE,\n type: type,\n compare: compare === undefined ? null : compare\n };\n\n {\n var ownName;\n Object.defineProperty(elementType, 'displayName', {\n enumerable: false,\n configurable: true,\n get: function () {\n return ownName;\n },\n set: function (name) {\n ownName = name; // The inner component shouldn't inherit this display name in most cases,\n // because the component may be used elsewhere.\n // But it's nice for anonymous functions to inherit the name,\n // so that our component-stack generation logic will display their frames.\n // An anonymous function generally suggests a pattern like:\n // React.memo((props) => {...});\n // This kind of inner function is not used elsewhere so the side effect is okay.\n\n if (!type.name && !type.displayName) {\n type.displayName = name;\n }\n }\n });\n }\n\n return elementType;\n}\n\nfunction resolveDispatcher() {\n var dispatcher = ReactCurrentDispatcher.current;\n\n {\n if (dispatcher === null) {\n error('Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for' + ' one of the following reasons:\\n' + '1. You might have mismatching versions of React and the renderer (such as React DOM)\\n' + '2. You might be breaking the Rules of Hooks\\n' + '3. You might have more than one copy of React in the same app\\n' + 'See https://reactjs.org/link/invalid-hook-call for tips about how to debug and fix this problem.');\n }\n } // Will result in a null access error if accessed outside render phase. We\n // intentionally don't throw our own error because this is in a hot path.\n // Also helps ensure this is inlined.\n\n\n return dispatcher;\n}\nfunction useContext(Context) {\n var dispatcher = resolveDispatcher();\n\n {\n // TODO: add a more generic warning for invalid values.\n if (Context._context !== undefined) {\n var realContext = Context._context; // Don't deduplicate because this legitimately causes bugs\n // and nobody should be using this in existing code.\n\n if (realContext.Consumer === Context) {\n error('Calling useContext(Context.Consumer) is not supported, may cause bugs, and will be ' + 'removed in a future major release. Did you mean to call useContext(Context) instead?');\n } else if (realContext.Provider === Context) {\n error('Calling useContext(Context.Provider) is not supported. ' + 'Did you mean to call useContext(Context) instead?');\n }\n }\n }\n\n return dispatcher.useContext(Context);\n}\nfunction useState(initialState) {\n var dispatcher = resolveDispatcher();\n return dispatcher.useState(initialState);\n}\nfunction useReducer(reducer, initialArg, init) {\n var dispatcher = resolveDispatcher();\n return dispatcher.useReducer(reducer, initialArg, init);\n}\nfunction useRef(initialValue) {\n var dispatcher = resolveDispatcher();\n return dispatcher.useRef(initialValue);\n}\nfunction useEffect(create, deps) {\n var dispatcher = resolveDispatcher();\n return dispatcher.useEffect(create, deps);\n}\nfunction useInsertionEffect(create, deps) {\n var dispatcher = resolveDispatcher();\n return dispatcher.useInsertionEffect(create, deps);\n}\nfunction useLayoutEffect(create, deps) {\n var dispatcher = resolveDispatcher();\n return dispatcher.useLayoutEffect(create, deps);\n}\nfunction useCallback(callback, deps) {\n var dispatcher = resolveDispatcher();\n return dispatcher.useCallback(callback, deps);\n}\nfunction useMemo(create, deps) {\n var dispatcher = resolveDispatcher();\n return dispatcher.useMemo(create, deps);\n}\nfunction useImperativeHandle(ref, create, deps) {\n var dispatcher = resolveDispatcher();\n return dispatcher.useImperativeHandle(ref, create, deps);\n}\nfunction useDebugValue(value, formatterFn) {\n {\n var dispatcher = resolveDispatcher();\n return dispatcher.useDebugValue(value, formatterFn);\n }\n}\nfunction useTransition() {\n var dispatcher = resolveDispatcher();\n return dispatcher.useTransition();\n}\nfunction useDeferredValue(value) {\n var dispatcher = resolveDispatcher();\n return dispatcher.useDeferredValue(value);\n}\nfunction useId() {\n var dispatcher = resolveDispatcher();\n return dispatcher.useId();\n}\nfunction useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot) {\n var dispatcher = resolveDispatcher();\n return dispatcher.useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);\n}\n\n// Helpers to patch console.logs to avoid logging during side-effect free\n// replaying on render function. This currently only patches the object\n// lazily which won't cover if the log function was extracted eagerly.\n// We could also eagerly patch the method.\nvar disabledDepth = 0;\nvar prevLog;\nvar prevInfo;\nvar prevWarn;\nvar prevError;\nvar prevGroup;\nvar prevGroupCollapsed;\nvar prevGroupEnd;\n\nfunction disabledLog() {}\n\ndisabledLog.__reactDisabledLog = true;\nfunction disableLogs() {\n {\n if (disabledDepth === 0) {\n /* eslint-disable react-internal/no-production-logging */\n prevLog = console.log;\n prevInfo = console.info;\n prevWarn = console.warn;\n prevError = console.error;\n prevGroup = console.group;\n prevGroupCollapsed = console.groupCollapsed;\n prevGroupEnd = console.groupEnd; // https://github.com/facebook/react/issues/19099\n\n var props = {\n configurable: true,\n enumerable: true,\n value: disabledLog,\n writable: true\n }; // $FlowFixMe Flow thinks console is immutable.\n\n Object.defineProperties(console, {\n info: props,\n log: props,\n warn: props,\n error: props,\n group: props,\n groupCollapsed: props,\n groupEnd: props\n });\n /* eslint-enable react-internal/no-production-logging */\n }\n\n disabledDepth++;\n }\n}\nfunction reenableLogs() {\n {\n disabledDepth--;\n\n if (disabledDepth === 0) {\n /* eslint-disable react-internal/no-production-logging */\n var props = {\n configurable: true,\n enumerable: true,\n writable: true\n }; // $FlowFixMe Flow thinks console is immutable.\n\n Object.defineProperties(console, {\n log: assign({}, props, {\n value: prevLog\n }),\n info: assign({}, props, {\n value: prevInfo\n }),\n warn: assign({}, props, {\n value: prevWarn\n }),\n error: assign({}, props, {\n value: prevError\n }),\n group: assign({}, props, {\n value: prevGroup\n }),\n groupCollapsed: assign({}, props, {\n value: prevGroupCollapsed\n }),\n groupEnd: assign({}, props, {\n value: prevGroupEnd\n })\n });\n /* eslint-enable react-internal/no-production-logging */\n }\n\n if (disabledDepth < 0) {\n error('disabledDepth fell below zero. ' + 'This is a bug in React. Please file an issue.');\n }\n }\n}\n\nvar ReactCurrentDispatcher$1 = ReactSharedInternals.ReactCurrentDispatcher;\nvar prefix;\nfunction describeBuiltInComponentFrame(name, source, ownerFn) {\n {\n if (prefix === undefined) {\n // Extract the VM specific prefix used by each line.\n try {\n throw Error();\n } catch (x) {\n var match = x.stack.trim().match(/\\n( *(at )?)/);\n prefix = match && match[1] || '';\n }\n } // We use the prefix to ensure our stacks line up with native stack frames.\n\n\n return '\\n' + prefix + name;\n }\n}\nvar reentry = false;\nvar componentFrameCache;\n\n{\n var PossiblyWeakMap = typeof WeakMap === 'function' ? WeakMap : Map;\n componentFrameCache = new PossiblyWeakMap();\n}\n\nfunction describeNativeComponentFrame(fn, construct) {\n // If something asked for a stack inside a fake render, it should get ignored.\n if ( !fn || reentry) {\n return '';\n }\n\n {\n var frame = componentFrameCache.get(fn);\n\n if (frame !== undefined) {\n return frame;\n }\n }\n\n var control;\n reentry = true;\n var previousPrepareStackTrace = Error.prepareStackTrace; // $FlowFixMe It does accept undefined.\n\n Error.prepareStackTrace = undefined;\n var previousDispatcher;\n\n {\n previousDispatcher = ReactCurrentDispatcher$1.current; // Set the dispatcher in DEV because this might be call in the render function\n // for warnings.\n\n ReactCurrentDispatcher$1.current = null;\n disableLogs();\n }\n\n try {\n // This should throw.\n if (construct) {\n // Something should be setting the props in the constructor.\n var Fake = function () {\n throw Error();\n }; // $FlowFixMe\n\n\n Object.defineProperty(Fake.prototype, 'props', {\n set: function () {\n // We use a throwing setter instead of frozen or non-writable props\n // because that won't throw in a non-strict mode function.\n throw Error();\n }\n });\n\n if (typeof Reflect === 'object' && Reflect.construct) {\n // We construct a different control for this case to include any extra\n // frames added by the construct call.\n try {\n Reflect.construct(Fake, []);\n } catch (x) {\n control = x;\n }\n\n Reflect.construct(fn, [], Fake);\n } else {\n try {\n Fake.call();\n } catch (x) {\n control = x;\n }\n\n fn.call(Fake.prototype);\n }\n } else {\n try {\n throw Error();\n } catch (x) {\n control = x;\n }\n\n fn();\n }\n } catch (sample) {\n // This is inlined manually because closure doesn't do it for us.\n if (sample && control && typeof sample.stack === 'string') {\n // This extracts the first frame from the sample that isn't also in the control.\n // Skipping one frame that we assume is the frame that calls the two.\n var sampleLines = sample.stack.split('\\n');\n var controlLines = control.stack.split('\\n');\n var s = sampleLines.length - 1;\n var c = controlLines.length - 1;\n\n while (s >= 1 && c >= 0 && sampleLines[s] !== controlLines[c]) {\n // We expect at least one stack frame to be shared.\n // Typically this will be the root most one. However, stack frames may be\n // cut off due to maximum stack limits. In this case, one maybe cut off\n // earlier than the other. We assume that the sample is longer or the same\n // and there for cut off earlier. So we should find the root most frame in\n // the sample somewhere in the control.\n c--;\n }\n\n for (; s >= 1 && c >= 0; s--, c--) {\n // Next we find the first one that isn't the same which should be the\n // frame that called our sample function and the control.\n if (sampleLines[s] !== controlLines[c]) {\n // In V8, the first line is describing the message but other VMs don't.\n // If we're about to return the first line, and the control is also on the same\n // line, that's a pretty good indicator that our sample threw at same line as\n // the control. I.e. before we entered the sample frame. So we ignore this result.\n // This can happen if you passed a class to function component, or non-function.\n if (s !== 1 || c !== 1) {\n do {\n s--;\n c--; // We may still have similar intermediate frames from the construct call.\n // The next one that isn't the same should be our match though.\n\n if (c < 0 || sampleLines[s] !== controlLines[c]) {\n // V8 adds a \"new\" prefix for native classes. Let's remove it to make it prettier.\n var _frame = '\\n' + sampleLines[s].replace(' at new ', ' at '); // If our component frame is labeled \"\"\n // but we have a user-provided \"displayName\"\n // splice it in to make the stack more readable.\n\n\n if (fn.displayName && _frame.includes('')) {\n _frame = _frame.replace('', fn.displayName);\n }\n\n {\n if (typeof fn === 'function') {\n componentFrameCache.set(fn, _frame);\n }\n } // Return the line we found.\n\n\n return _frame;\n }\n } while (s >= 1 && c >= 0);\n }\n\n break;\n }\n }\n }\n } finally {\n reentry = false;\n\n {\n ReactCurrentDispatcher$1.current = previousDispatcher;\n reenableLogs();\n }\n\n Error.prepareStackTrace = previousPrepareStackTrace;\n } // Fallback to just using the name if we couldn't make it throw.\n\n\n var name = fn ? fn.displayName || fn.name : '';\n var syntheticFrame = name ? describeBuiltInComponentFrame(name) : '';\n\n {\n if (typeof fn === 'function') {\n componentFrameCache.set(fn, syntheticFrame);\n }\n }\n\n return syntheticFrame;\n}\nfunction describeFunctionComponentFrame(fn, source, ownerFn) {\n {\n return describeNativeComponentFrame(fn, false);\n }\n}\n\nfunction shouldConstruct(Component) {\n var prototype = Component.prototype;\n return !!(prototype && prototype.isReactComponent);\n}\n\nfunction describeUnknownElementTypeFrameInDEV(type, source, ownerFn) {\n\n if (type == null) {\n return '';\n }\n\n if (typeof type === 'function') {\n {\n return describeNativeComponentFrame(type, shouldConstruct(type));\n }\n }\n\n if (typeof type === 'string') {\n return describeBuiltInComponentFrame(type);\n }\n\n switch (type) {\n case REACT_SUSPENSE_TYPE:\n return describeBuiltInComponentFrame('Suspense');\n\n case REACT_SUSPENSE_LIST_TYPE:\n return describeBuiltInComponentFrame('SuspenseList');\n }\n\n if (typeof type === 'object') {\n switch (type.$$typeof) {\n case REACT_FORWARD_REF_TYPE:\n return describeFunctionComponentFrame(type.render);\n\n case REACT_MEMO_TYPE:\n // Memo may contain any component type so we recursively resolve it.\n return describeUnknownElementTypeFrameInDEV(type.type, source, ownerFn);\n\n case REACT_LAZY_TYPE:\n {\n var lazyComponent = type;\n var payload = lazyComponent._payload;\n var init = lazyComponent._init;\n\n try {\n // Lazy may contain any component type so we recursively resolve it.\n return describeUnknownElementTypeFrameInDEV(init(payload), source, ownerFn);\n } catch (x) {}\n }\n }\n }\n\n return '';\n}\n\nvar loggedTypeFailures = {};\nvar ReactDebugCurrentFrame$1 = ReactSharedInternals.ReactDebugCurrentFrame;\n\nfunction setCurrentlyValidatingElement(element) {\n {\n if (element) {\n var owner = element._owner;\n var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null);\n ReactDebugCurrentFrame$1.setExtraStackFrame(stack);\n } else {\n ReactDebugCurrentFrame$1.setExtraStackFrame(null);\n }\n }\n}\n\nfunction checkPropTypes(typeSpecs, values, location, componentName, element) {\n {\n // $FlowFixMe This is okay but Flow doesn't know it.\n var has = Function.call.bind(hasOwnProperty);\n\n for (var typeSpecName in typeSpecs) {\n if (has(typeSpecs, typeSpecName)) {\n var error$1 = void 0; // Prop type validation may throw. In case they do, we don't want to\n // fail the render phase where it didn't fail before. So we log it.\n // After these have been cleaned up, we'll let them throw.\n\n try {\n // This is intentionally an invariant that gets caught. It's the same\n // behavior as without this statement except with a better message.\n if (typeof typeSpecs[typeSpecName] !== 'function') {\n // eslint-disable-next-line react-internal/prod-error-codes\n var err = Error((componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' + 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.' + 'This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.');\n err.name = 'Invariant Violation';\n throw err;\n }\n\n error$1 = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED');\n } catch (ex) {\n error$1 = ex;\n }\n\n if (error$1 && !(error$1 instanceof Error)) {\n setCurrentlyValidatingElement(element);\n\n error('%s: type specification of %s' + ' `%s` is invalid; the type checker ' + 'function must return `null` or an `Error` but returned a %s. ' + 'You may have forgotten to pass an argument to the type checker ' + 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + 'shape all require an argument).', componentName || 'React class', location, typeSpecName, typeof error$1);\n\n setCurrentlyValidatingElement(null);\n }\n\n if (error$1 instanceof Error && !(error$1.message in loggedTypeFailures)) {\n // Only monitor this failure once because there tends to be a lot of the\n // same error.\n loggedTypeFailures[error$1.message] = true;\n setCurrentlyValidatingElement(element);\n\n error('Failed %s type: %s', location, error$1.message);\n\n setCurrentlyValidatingElement(null);\n }\n }\n }\n }\n}\n\nfunction setCurrentlyValidatingElement$1(element) {\n {\n if (element) {\n var owner = element._owner;\n var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null);\n setExtraStackFrame(stack);\n } else {\n setExtraStackFrame(null);\n }\n }\n}\n\nvar propTypesMisspellWarningShown;\n\n{\n propTypesMisspellWarningShown = false;\n}\n\nfunction getDeclarationErrorAddendum() {\n if (ReactCurrentOwner.current) {\n var name = getComponentNameFromType(ReactCurrentOwner.current.type);\n\n if (name) {\n return '\\n\\nCheck the render method of `' + name + '`.';\n }\n }\n\n return '';\n}\n\nfunction getSourceInfoErrorAddendum(source) {\n if (source !== undefined) {\n var fileName = source.fileName.replace(/^.*[\\\\\\/]/, '');\n var lineNumber = source.lineNumber;\n return '\\n\\nCheck your code at ' + fileName + ':' + lineNumber + '.';\n }\n\n return '';\n}\n\nfunction getSourceInfoErrorAddendumForProps(elementProps) {\n if (elementProps !== null && elementProps !== undefined) {\n return getSourceInfoErrorAddendum(elementProps.__source);\n }\n\n return '';\n}\n/**\n * Warn if there's no key explicitly set on dynamic arrays of children or\n * object keys are not valid. This allows us to keep track of children between\n * updates.\n */\n\n\nvar ownerHasKeyUseWarning = {};\n\nfunction getCurrentComponentErrorInfo(parentType) {\n var info = getDeclarationErrorAddendum();\n\n if (!info) {\n var parentName = typeof parentType === 'string' ? parentType : parentType.displayName || parentType.name;\n\n if (parentName) {\n info = \"\\n\\nCheck the top-level render call using <\" + parentName + \">.\";\n }\n }\n\n return info;\n}\n/**\n * Warn if the element doesn't have an explicit key assigned to it.\n * This element is in an array. The array could grow and shrink or be\n * reordered. All children that haven't already been validated are required to\n * have a \"key\" property assigned to it. Error statuses are cached so a warning\n * will only be shown once.\n *\n * @internal\n * @param {ReactElement} element Element that requires a key.\n * @param {*} parentType element's parent's type.\n */\n\n\nfunction validateExplicitKey(element, parentType) {\n if (!element._store || element._store.validated || element.key != null) {\n return;\n }\n\n element._store.validated = true;\n var currentComponentErrorInfo = getCurrentComponentErrorInfo(parentType);\n\n if (ownerHasKeyUseWarning[currentComponentErrorInfo]) {\n return;\n }\n\n ownerHasKeyUseWarning[currentComponentErrorInfo] = true; // Usually the current owner is the offender, but if it accepts children as a\n // property, it may be the creator of the child that's responsible for\n // assigning it a key.\n\n var childOwner = '';\n\n if (element && element._owner && element._owner !== ReactCurrentOwner.current) {\n // Give the component that originally created this child.\n childOwner = \" It was passed a child from \" + getComponentNameFromType(element._owner.type) + \".\";\n }\n\n {\n setCurrentlyValidatingElement$1(element);\n\n error('Each child in a list should have a unique \"key\" prop.' + '%s%s See https://reactjs.org/link/warning-keys for more information.', currentComponentErrorInfo, childOwner);\n\n setCurrentlyValidatingElement$1(null);\n }\n}\n/**\n * Ensure that every element either is passed in a static location, in an\n * array with an explicit keys property defined, or in an object literal\n * with valid key property.\n *\n * @internal\n * @param {ReactNode} node Statically passed child of any type.\n * @param {*} parentType node's parent's type.\n */\n\n\nfunction validateChildKeys(node, parentType) {\n if (typeof node !== 'object') {\n return;\n }\n\n if (isArray(node)) {\n for (var i = 0; i < node.length; i++) {\n var child = node[i];\n\n if (isValidElement(child)) {\n validateExplicitKey(child, parentType);\n }\n }\n } else if (isValidElement(node)) {\n // This element was passed in a valid location.\n if (node._store) {\n node._store.validated = true;\n }\n } else if (node) {\n var iteratorFn = getIteratorFn(node);\n\n if (typeof iteratorFn === 'function') {\n // Entry iterators used to provide implicit keys,\n // but now we print a separate warning for them later.\n if (iteratorFn !== node.entries) {\n var iterator = iteratorFn.call(node);\n var step;\n\n while (!(step = iterator.next()).done) {\n if (isValidElement(step.value)) {\n validateExplicitKey(step.value, parentType);\n }\n }\n }\n }\n }\n}\n/**\n * Given an element, validate that its props follow the propTypes definition,\n * provided by the type.\n *\n * @param {ReactElement} element\n */\n\n\nfunction validatePropTypes(element) {\n {\n var type = element.type;\n\n if (type === null || type === undefined || typeof type === 'string') {\n return;\n }\n\n var propTypes;\n\n if (typeof type === 'function') {\n propTypes = type.propTypes;\n } else if (typeof type === 'object' && (type.$$typeof === REACT_FORWARD_REF_TYPE || // Note: Memo only checks outer props here.\n // Inner props are checked in the reconciler.\n type.$$typeof === REACT_MEMO_TYPE)) {\n propTypes = type.propTypes;\n } else {\n return;\n }\n\n if (propTypes) {\n // Intentionally inside to avoid triggering lazy initializers:\n var name = getComponentNameFromType(type);\n checkPropTypes(propTypes, element.props, 'prop', name, element);\n } else if (type.PropTypes !== undefined && !propTypesMisspellWarningShown) {\n propTypesMisspellWarningShown = true; // Intentionally inside to avoid triggering lazy initializers:\n\n var _name = getComponentNameFromType(type);\n\n error('Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?', _name || 'Unknown');\n }\n\n if (typeof type.getDefaultProps === 'function' && !type.getDefaultProps.isReactClassApproved) {\n error('getDefaultProps is only used on classic React.createClass ' + 'definitions. Use a static property named `defaultProps` instead.');\n }\n }\n}\n/**\n * Given a fragment, validate that it can only be provided with fragment props\n * @param {ReactElement} fragment\n */\n\n\nfunction validateFragmentProps(fragment) {\n {\n var keys = Object.keys(fragment.props);\n\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n\n if (key !== 'children' && key !== 'key') {\n setCurrentlyValidatingElement$1(fragment);\n\n error('Invalid prop `%s` supplied to `React.Fragment`. ' + 'React.Fragment can only have `key` and `children` props.', key);\n\n setCurrentlyValidatingElement$1(null);\n break;\n }\n }\n\n if (fragment.ref !== null) {\n setCurrentlyValidatingElement$1(fragment);\n\n error('Invalid attribute `ref` supplied to `React.Fragment`.');\n\n setCurrentlyValidatingElement$1(null);\n }\n }\n}\nfunction createElementWithValidation(type, props, children) {\n var validType = isValidElementType(type); // We warn in this case but don't throw. We expect the element creation to\n // succeed and there will likely be errors in render.\n\n if (!validType) {\n var info = '';\n\n if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) {\n info += ' You likely forgot to export your component from the file ' + \"it's defined in, or you might have mixed up default and named imports.\";\n }\n\n var sourceInfo = getSourceInfoErrorAddendumForProps(props);\n\n if (sourceInfo) {\n info += sourceInfo;\n } else {\n info += getDeclarationErrorAddendum();\n }\n\n var typeString;\n\n if (type === null) {\n typeString = 'null';\n } else if (isArray(type)) {\n typeString = 'array';\n } else if (type !== undefined && type.$$typeof === REACT_ELEMENT_TYPE) {\n typeString = \"<\" + (getComponentNameFromType(type.type) || 'Unknown') + \" />\";\n info = ' Did you accidentally export a JSX literal instead of a component?';\n } else {\n typeString = typeof type;\n }\n\n {\n error('React.createElement: type is invalid -- expected a string (for ' + 'built-in components) or a class/function (for composite ' + 'components) but got: %s.%s', typeString, info);\n }\n }\n\n var element = createElement.apply(this, arguments); // The result can be nullish if a mock or a custom function is used.\n // TODO: Drop this when these are no longer allowed as the type argument.\n\n if (element == null) {\n return element;\n } // Skip key warning if the type isn't valid since our key validation logic\n // doesn't expect a non-string/function type and can throw confusing errors.\n // We don't want exception behavior to differ between dev and prod.\n // (Rendering will throw with a helpful message and as soon as the type is\n // fixed, the key warnings will appear.)\n\n\n if (validType) {\n for (var i = 2; i < arguments.length; i++) {\n validateChildKeys(arguments[i], type);\n }\n }\n\n if (type === REACT_FRAGMENT_TYPE) {\n validateFragmentProps(element);\n } else {\n validatePropTypes(element);\n }\n\n return element;\n}\nvar didWarnAboutDeprecatedCreateFactory = false;\nfunction createFactoryWithValidation(type) {\n var validatedFactory = createElementWithValidation.bind(null, type);\n validatedFactory.type = type;\n\n {\n if (!didWarnAboutDeprecatedCreateFactory) {\n didWarnAboutDeprecatedCreateFactory = true;\n\n warn('React.createFactory() is deprecated and will be removed in ' + 'a future major release. Consider using JSX ' + 'or use React.createElement() directly instead.');\n } // Legacy hook: remove it\n\n\n Object.defineProperty(validatedFactory, 'type', {\n enumerable: false,\n get: function () {\n warn('Factory.type is deprecated. Access the class directly ' + 'before passing it to createFactory.');\n\n Object.defineProperty(this, 'type', {\n value: type\n });\n return type;\n }\n });\n }\n\n return validatedFactory;\n}\nfunction cloneElementWithValidation(element, props, children) {\n var newElement = cloneElement.apply(this, arguments);\n\n for (var i = 2; i < arguments.length; i++) {\n validateChildKeys(arguments[i], newElement.type);\n }\n\n validatePropTypes(newElement);\n return newElement;\n}\n\nfunction startTransition(scope, options) {\n var prevTransition = ReactCurrentBatchConfig.transition;\n ReactCurrentBatchConfig.transition = {};\n var currentTransition = ReactCurrentBatchConfig.transition;\n\n {\n ReactCurrentBatchConfig.transition._updatedFibers = new Set();\n }\n\n try {\n scope();\n } finally {\n ReactCurrentBatchConfig.transition = prevTransition;\n\n {\n if (prevTransition === null && currentTransition._updatedFibers) {\n var updatedFibersCount = currentTransition._updatedFibers.size;\n\n if (updatedFibersCount > 10) {\n warn('Detected a large number of updates inside startTransition. ' + 'If this is due to a subscription please re-write it to use React provided hooks. ' + 'Otherwise concurrent mode guarantees are off the table.');\n }\n\n currentTransition._updatedFibers.clear();\n }\n }\n }\n}\n\nvar didWarnAboutMessageChannel = false;\nvar enqueueTaskImpl = null;\nfunction enqueueTask(task) {\n if (enqueueTaskImpl === null) {\n try {\n // read require off the module object to get around the bundlers.\n // we don't want them to detect a require and bundle a Node polyfill.\n var requireString = ('require' + Math.random()).slice(0, 7);\n var nodeRequire = module && module[requireString]; // assuming we're in node, let's try to get node's\n // version of setImmediate, bypassing fake timers if any.\n\n enqueueTaskImpl = nodeRequire.call(module, 'timers').setImmediate;\n } catch (_err) {\n // we're in a browser\n // we can't use regular timers because they may still be faked\n // so we try MessageChannel+postMessage instead\n enqueueTaskImpl = function (callback) {\n {\n if (didWarnAboutMessageChannel === false) {\n didWarnAboutMessageChannel = true;\n\n if (typeof MessageChannel === 'undefined') {\n error('This browser does not have a MessageChannel implementation, ' + 'so enqueuing tasks via await act(async () => ...) will fail. ' + 'Please file an issue at https://github.com/facebook/react/issues ' + 'if you encounter this warning.');\n }\n }\n }\n\n var channel = new MessageChannel();\n channel.port1.onmessage = callback;\n channel.port2.postMessage(undefined);\n };\n }\n }\n\n return enqueueTaskImpl(task);\n}\n\nvar actScopeDepth = 0;\nvar didWarnNoAwaitAct = false;\nfunction act(callback) {\n {\n // `act` calls can be nested, so we track the depth. This represents the\n // number of `act` scopes on the stack.\n var prevActScopeDepth = actScopeDepth;\n actScopeDepth++;\n\n if (ReactCurrentActQueue.current === null) {\n // This is the outermost `act` scope. Initialize the queue. The reconciler\n // will detect the queue and use it instead of Scheduler.\n ReactCurrentActQueue.current = [];\n }\n\n var prevIsBatchingLegacy = ReactCurrentActQueue.isBatchingLegacy;\n var result;\n\n try {\n // Used to reproduce behavior of `batchedUpdates` in legacy mode. Only\n // set to `true` while the given callback is executed, not for updates\n // triggered during an async event, because this is how the legacy\n // implementation of `act` behaved.\n ReactCurrentActQueue.isBatchingLegacy = true;\n result = callback(); // Replicate behavior of original `act` implementation in legacy mode,\n // which flushed updates immediately after the scope function exits, even\n // if it's an async function.\n\n if (!prevIsBatchingLegacy && ReactCurrentActQueue.didScheduleLegacyUpdate) {\n var queue = ReactCurrentActQueue.current;\n\n if (queue !== null) {\n ReactCurrentActQueue.didScheduleLegacyUpdate = false;\n flushActQueue(queue);\n }\n }\n } catch (error) {\n popActScope(prevActScopeDepth);\n throw error;\n } finally {\n ReactCurrentActQueue.isBatchingLegacy = prevIsBatchingLegacy;\n }\n\n if (result !== null && typeof result === 'object' && typeof result.then === 'function') {\n var thenableResult = result; // The callback is an async function (i.e. returned a promise). Wait\n // for it to resolve before exiting the current scope.\n\n var wasAwaited = false;\n var thenable = {\n then: function (resolve, reject) {\n wasAwaited = true;\n thenableResult.then(function (returnValue) {\n popActScope(prevActScopeDepth);\n\n if (actScopeDepth === 0) {\n // We've exited the outermost act scope. Recursively flush the\n // queue until there's no remaining work.\n recursivelyFlushAsyncActWork(returnValue, resolve, reject);\n } else {\n resolve(returnValue);\n }\n }, function (error) {\n // The callback threw an error.\n popActScope(prevActScopeDepth);\n reject(error);\n });\n }\n };\n\n {\n if (!didWarnNoAwaitAct && typeof Promise !== 'undefined') {\n // eslint-disable-next-line no-undef\n Promise.resolve().then(function () {}).then(function () {\n if (!wasAwaited) {\n didWarnNoAwaitAct = true;\n\n error('You called act(async () => ...) without await. ' + 'This could lead to unexpected testing behaviour, ' + 'interleaving multiple act calls and mixing their ' + 'scopes. ' + 'You should - await act(async () => ...);');\n }\n });\n }\n }\n\n return thenable;\n } else {\n var returnValue = result; // The callback is not an async function. Exit the current scope\n // immediately, without awaiting.\n\n popActScope(prevActScopeDepth);\n\n if (actScopeDepth === 0) {\n // Exiting the outermost act scope. Flush the queue.\n var _queue = ReactCurrentActQueue.current;\n\n if (_queue !== null) {\n flushActQueue(_queue);\n ReactCurrentActQueue.current = null;\n } // Return a thenable. If the user awaits it, we'll flush again in\n // case additional work was scheduled by a microtask.\n\n\n var _thenable = {\n then: function (resolve, reject) {\n // Confirm we haven't re-entered another `act` scope, in case\n // the user does something weird like await the thenable\n // multiple times.\n if (ReactCurrentActQueue.current === null) {\n // Recursively flush the queue until there's no remaining work.\n ReactCurrentActQueue.current = [];\n recursivelyFlushAsyncActWork(returnValue, resolve, reject);\n } else {\n resolve(returnValue);\n }\n }\n };\n return _thenable;\n } else {\n // Since we're inside a nested `act` scope, the returned thenable\n // immediately resolves. The outer scope will flush the queue.\n var _thenable2 = {\n then: function (resolve, reject) {\n resolve(returnValue);\n }\n };\n return _thenable2;\n }\n }\n }\n}\n\nfunction popActScope(prevActScopeDepth) {\n {\n if (prevActScopeDepth !== actScopeDepth - 1) {\n error('You seem to have overlapping act() calls, this is not supported. ' + 'Be sure to await previous act() calls before making a new one. ');\n }\n\n actScopeDepth = prevActScopeDepth;\n }\n}\n\nfunction recursivelyFlushAsyncActWork(returnValue, resolve, reject) {\n {\n var queue = ReactCurrentActQueue.current;\n\n if (queue !== null) {\n try {\n flushActQueue(queue);\n enqueueTask(function () {\n if (queue.length === 0) {\n // No additional work was scheduled. Finish.\n ReactCurrentActQueue.current = null;\n resolve(returnValue);\n } else {\n // Keep flushing work until there's none left.\n recursivelyFlushAsyncActWork(returnValue, resolve, reject);\n }\n });\n } catch (error) {\n reject(error);\n }\n } else {\n resolve(returnValue);\n }\n }\n}\n\nvar isFlushing = false;\n\nfunction flushActQueue(queue) {\n {\n if (!isFlushing) {\n // Prevent re-entrance.\n isFlushing = true;\n var i = 0;\n\n try {\n for (; i < queue.length; i++) {\n var callback = queue[i];\n\n do {\n callback = callback(true);\n } while (callback !== null);\n }\n\n queue.length = 0;\n } catch (error) {\n // If something throws, leave the remaining callbacks on the queue.\n queue = queue.slice(i + 1);\n throw error;\n } finally {\n isFlushing = false;\n }\n }\n }\n}\n\nvar createElement$1 = createElementWithValidation ;\nvar cloneElement$1 = cloneElementWithValidation ;\nvar createFactory = createFactoryWithValidation ;\nvar Children = {\n map: mapChildren,\n forEach: forEachChildren,\n count: countChildren,\n toArray: toArray,\n only: onlyChild\n};\n\nexports.Children = Children;\nexports.Component = Component;\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.Profiler = REACT_PROFILER_TYPE;\nexports.PureComponent = PureComponent;\nexports.StrictMode = REACT_STRICT_MODE_TYPE;\nexports.Suspense = REACT_SUSPENSE_TYPE;\nexports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = ReactSharedInternals;\nexports.act = act;\nexports.cloneElement = cloneElement$1;\nexports.createContext = createContext;\nexports.createElement = createElement$1;\nexports.createFactory = createFactory;\nexports.createRef = createRef;\nexports.forwardRef = forwardRef;\nexports.isValidElement = isValidElement;\nexports.lazy = lazy;\nexports.memo = memo;\nexports.startTransition = startTransition;\nexports.unstable_act = act;\nexports.useCallback = useCallback;\nexports.useContext = useContext;\nexports.useDebugValue = useDebugValue;\nexports.useDeferredValue = useDeferredValue;\nexports.useEffect = useEffect;\nexports.useId = useId;\nexports.useImperativeHandle = useImperativeHandle;\nexports.useInsertionEffect = useInsertionEffect;\nexports.useLayoutEffect = useLayoutEffect;\nexports.useMemo = useMemo;\nexports.useReducer = useReducer;\nexports.useRef = useRef;\nexports.useState = useState;\nexports.useSyncExternalStore = useSyncExternalStore;\nexports.useTransition = useTransition;\nexports.version = ReactVersion;\n /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */\nif (\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' &&\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop ===\n 'function'\n) {\n __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(new Error());\n}\n \n })();\n}\n", "'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react.production.min.js');\n} else {\n module.exports = require('./cjs/react.development.js');\n}\n"], + "mappings": "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", + "names": ["ReactDebugCurrentFrame", "moduleObject", "error", "Component", "returnValue"] +} diff --git a/visual_workflow_builder/frontend_v4/node_modules/.vite/deps/chunk-XPR23Y44.js b/visual_workflow_builder/frontend_v4/node_modules/.vite/deps/chunk-XPR23Y44.js new file mode 100644 index 000000000..e04663d88 --- /dev/null +++ b/visual_workflow_builder/frontend_v4/node_modules/.vite/deps/chunk-XPR23Y44.js @@ -0,0 +1,21626 @@ +import { + __commonJS, + require_react +} from "./chunk-I4MZPW7S.js"; + +// node_modules/scheduler/cjs/scheduler.development.js +var require_scheduler_development = __commonJS({ + "node_modules/scheduler/cjs/scheduler.development.js"(exports) { + "use strict"; + if (true) { + (function() { + "use strict"; + if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== "undefined" && typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart === "function") { + __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(new Error()); + } + var enableSchedulerDebugging = false; + var enableProfiling = false; + var frameYieldMs = 5; + function push(heap, node) { + var index = heap.length; + heap.push(node); + siftUp(heap, node, index); + } + function peek(heap) { + return heap.length === 0 ? null : heap[0]; + } + function pop(heap) { + if (heap.length === 0) { + return null; + } + var first = heap[0]; + var last = heap.pop(); + if (last !== first) { + heap[0] = last; + siftDown(heap, last, 0); + } + return first; + } + function siftUp(heap, node, i) { + var index = i; + while (index > 0) { + var parentIndex = index - 1 >>> 1; + var parent = heap[parentIndex]; + if (compare(parent, node) > 0) { + heap[parentIndex] = node; + heap[index] = parent; + index = parentIndex; + } else { + return; + } + } + } + function siftDown(heap, node, i) { + var index = i; + var length = heap.length; + var halfLength = length >>> 1; + while (index < halfLength) { + var leftIndex = (index + 1) * 2 - 1; + var left = heap[leftIndex]; + var rightIndex = leftIndex + 1; + var right = heap[rightIndex]; + if (compare(left, node) < 0) { + if (rightIndex < length && compare(right, left) < 0) { + heap[index] = right; + heap[rightIndex] = node; + index = rightIndex; + } else { + heap[index] = left; + heap[leftIndex] = node; + index = leftIndex; + } + } else if (rightIndex < length && compare(right, node) < 0) { + heap[index] = right; + heap[rightIndex] = node; + index = rightIndex; + } else { + return; + } + } + } + function compare(a, b) { + var diff = a.sortIndex - b.sortIndex; + return diff !== 0 ? diff : a.id - b.id; + } + var ImmediatePriority = 1; + var UserBlockingPriority = 2; + var NormalPriority = 3; + var LowPriority = 4; + var IdlePriority = 5; + function markTaskErrored(task, ms) { + } + var hasPerformanceNow = typeof performance === "object" && typeof performance.now === "function"; + if (hasPerformanceNow) { + var localPerformance = performance; + exports.unstable_now = function() { + return localPerformance.now(); + }; + } else { + var localDate = Date; + var initialTime = localDate.now(); + exports.unstable_now = function() { + return localDate.now() - initialTime; + }; + } + var maxSigned31BitInt = 1073741823; + var IMMEDIATE_PRIORITY_TIMEOUT = -1; + var USER_BLOCKING_PRIORITY_TIMEOUT = 250; + var NORMAL_PRIORITY_TIMEOUT = 5e3; + var LOW_PRIORITY_TIMEOUT = 1e4; + var IDLE_PRIORITY_TIMEOUT = maxSigned31BitInt; + var taskQueue = []; + var timerQueue = []; + var taskIdCounter = 1; + var currentTask = null; + var currentPriorityLevel = NormalPriority; + var isPerformingWork = false; + var isHostCallbackScheduled = false; + var isHostTimeoutScheduled = false; + var localSetTimeout = typeof setTimeout === "function" ? setTimeout : null; + var localClearTimeout = typeof clearTimeout === "function" ? clearTimeout : null; + var localSetImmediate = typeof setImmediate !== "undefined" ? setImmediate : null; + var isInputPending = typeof navigator !== "undefined" && navigator.scheduling !== void 0 && navigator.scheduling.isInputPending !== void 0 ? navigator.scheduling.isInputPending.bind(navigator.scheduling) : null; + function advanceTimers(currentTime) { + var timer = peek(timerQueue); + while (timer !== null) { + if (timer.callback === null) { + pop(timerQueue); + } else if (timer.startTime <= currentTime) { + pop(timerQueue); + timer.sortIndex = timer.expirationTime; + push(taskQueue, timer); + } else { + return; + } + timer = peek(timerQueue); + } + } + function handleTimeout(currentTime) { + isHostTimeoutScheduled = false; + advanceTimers(currentTime); + if (!isHostCallbackScheduled) { + if (peek(taskQueue) !== null) { + isHostCallbackScheduled = true; + requestHostCallback(flushWork); + } else { + var firstTimer = peek(timerQueue); + if (firstTimer !== null) { + requestHostTimeout(handleTimeout, firstTimer.startTime - currentTime); + } + } + } + } + function flushWork(hasTimeRemaining, initialTime2) { + isHostCallbackScheduled = false; + if (isHostTimeoutScheduled) { + isHostTimeoutScheduled = false; + cancelHostTimeout(); + } + isPerformingWork = true; + var previousPriorityLevel = currentPriorityLevel; + try { + if (enableProfiling) { + try { + return workLoop(hasTimeRemaining, initialTime2); + } catch (error) { + if (currentTask !== null) { + var currentTime = exports.unstable_now(); + markTaskErrored(currentTask, currentTime); + currentTask.isQueued = false; + } + throw error; + } + } else { + return workLoop(hasTimeRemaining, initialTime2); + } + } finally { + currentTask = null; + currentPriorityLevel = previousPriorityLevel; + isPerformingWork = false; + } + } + function workLoop(hasTimeRemaining, initialTime2) { + var currentTime = initialTime2; + advanceTimers(currentTime); + currentTask = peek(taskQueue); + while (currentTask !== null && !enableSchedulerDebugging) { + if (currentTask.expirationTime > currentTime && (!hasTimeRemaining || shouldYieldToHost())) { + break; + } + var callback = currentTask.callback; + if (typeof callback === "function") { + currentTask.callback = null; + currentPriorityLevel = currentTask.priorityLevel; + var didUserCallbackTimeout = currentTask.expirationTime <= currentTime; + var continuationCallback = callback(didUserCallbackTimeout); + currentTime = exports.unstable_now(); + if (typeof continuationCallback === "function") { + currentTask.callback = continuationCallback; + } else { + if (currentTask === peek(taskQueue)) { + pop(taskQueue); + } + } + advanceTimers(currentTime); + } else { + pop(taskQueue); + } + currentTask = peek(taskQueue); + } + if (currentTask !== null) { + return true; + } else { + var firstTimer = peek(timerQueue); + if (firstTimer !== null) { + requestHostTimeout(handleTimeout, firstTimer.startTime - currentTime); + } + return false; + } + } + function unstable_runWithPriority(priorityLevel, eventHandler) { + switch (priorityLevel) { + case ImmediatePriority: + case UserBlockingPriority: + case NormalPriority: + case LowPriority: + case IdlePriority: + break; + default: + priorityLevel = NormalPriority; + } + var previousPriorityLevel = currentPriorityLevel; + currentPriorityLevel = priorityLevel; + try { + return eventHandler(); + } finally { + currentPriorityLevel = previousPriorityLevel; + } + } + function unstable_next(eventHandler) { + var priorityLevel; + switch (currentPriorityLevel) { + case ImmediatePriority: + case UserBlockingPriority: + case NormalPriority: + priorityLevel = NormalPriority; + break; + default: + priorityLevel = currentPriorityLevel; + break; + } + var previousPriorityLevel = currentPriorityLevel; + currentPriorityLevel = priorityLevel; + try { + return eventHandler(); + } finally { + currentPriorityLevel = previousPriorityLevel; + } + } + function unstable_wrapCallback(callback) { + var parentPriorityLevel = currentPriorityLevel; + return function() { + var previousPriorityLevel = currentPriorityLevel; + currentPriorityLevel = parentPriorityLevel; + try { + return callback.apply(this, arguments); + } finally { + currentPriorityLevel = previousPriorityLevel; + } + }; + } + function unstable_scheduleCallback(priorityLevel, callback, options) { + var currentTime = exports.unstable_now(); + var startTime2; + if (typeof options === "object" && options !== null) { + var delay = options.delay; + if (typeof delay === "number" && delay > 0) { + startTime2 = currentTime + delay; + } else { + startTime2 = currentTime; + } + } else { + startTime2 = currentTime; + } + var timeout; + switch (priorityLevel) { + case ImmediatePriority: + timeout = IMMEDIATE_PRIORITY_TIMEOUT; + break; + case UserBlockingPriority: + timeout = USER_BLOCKING_PRIORITY_TIMEOUT; + break; + case IdlePriority: + timeout = IDLE_PRIORITY_TIMEOUT; + break; + case LowPriority: + timeout = LOW_PRIORITY_TIMEOUT; + break; + case NormalPriority: + default: + timeout = NORMAL_PRIORITY_TIMEOUT; + break; + } + var expirationTime = startTime2 + timeout; + var newTask = { + id: taskIdCounter++, + callback, + priorityLevel, + startTime: startTime2, + expirationTime, + sortIndex: -1 + }; + if (startTime2 > currentTime) { + newTask.sortIndex = startTime2; + push(timerQueue, newTask); + if (peek(taskQueue) === null && newTask === peek(timerQueue)) { + if (isHostTimeoutScheduled) { + cancelHostTimeout(); + } else { + isHostTimeoutScheduled = true; + } + requestHostTimeout(handleTimeout, startTime2 - currentTime); + } + } else { + newTask.sortIndex = expirationTime; + push(taskQueue, newTask); + if (!isHostCallbackScheduled && !isPerformingWork) { + isHostCallbackScheduled = true; + requestHostCallback(flushWork); + } + } + return newTask; + } + function unstable_pauseExecution() { + } + function unstable_continueExecution() { + if (!isHostCallbackScheduled && !isPerformingWork) { + isHostCallbackScheduled = true; + requestHostCallback(flushWork); + } + } + function unstable_getFirstCallbackNode() { + return peek(taskQueue); + } + function unstable_cancelCallback(task) { + task.callback = null; + } + function unstable_getCurrentPriorityLevel() { + return currentPriorityLevel; + } + var isMessageLoopRunning = false; + var scheduledHostCallback = null; + var taskTimeoutID = -1; + var frameInterval = frameYieldMs; + var startTime = -1; + function shouldYieldToHost() { + var timeElapsed = exports.unstable_now() - startTime; + if (timeElapsed < frameInterval) { + return false; + } + return true; + } + function requestPaint() { + } + function forceFrameRate(fps) { + if (fps < 0 || fps > 125) { + console["error"]("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"); + return; + } + if (fps > 0) { + frameInterval = Math.floor(1e3 / fps); + } else { + frameInterval = frameYieldMs; + } + } + var performWorkUntilDeadline = function() { + if (scheduledHostCallback !== null) { + var currentTime = exports.unstable_now(); + startTime = currentTime; + var hasTimeRemaining = true; + var hasMoreWork = true; + try { + hasMoreWork = scheduledHostCallback(hasTimeRemaining, currentTime); + } finally { + if (hasMoreWork) { + schedulePerformWorkUntilDeadline(); + } else { + isMessageLoopRunning = false; + scheduledHostCallback = null; + } + } + } else { + isMessageLoopRunning = false; + } + }; + var schedulePerformWorkUntilDeadline; + if (typeof localSetImmediate === "function") { + schedulePerformWorkUntilDeadline = function() { + localSetImmediate(performWorkUntilDeadline); + }; + } else if (typeof MessageChannel !== "undefined") { + var channel = new MessageChannel(); + var port = channel.port2; + channel.port1.onmessage = performWorkUntilDeadline; + schedulePerformWorkUntilDeadline = function() { + port.postMessage(null); + }; + } else { + schedulePerformWorkUntilDeadline = function() { + localSetTimeout(performWorkUntilDeadline, 0); + }; + } + function requestHostCallback(callback) { + scheduledHostCallback = callback; + if (!isMessageLoopRunning) { + isMessageLoopRunning = true; + schedulePerformWorkUntilDeadline(); + } + } + function requestHostTimeout(callback, ms) { + taskTimeoutID = localSetTimeout(function() { + callback(exports.unstable_now()); + }, ms); + } + function cancelHostTimeout() { + localClearTimeout(taskTimeoutID); + taskTimeoutID = -1; + } + var unstable_requestPaint = requestPaint; + var unstable_Profiling = null; + exports.unstable_IdlePriority = IdlePriority; + exports.unstable_ImmediatePriority = ImmediatePriority; + exports.unstable_LowPriority = LowPriority; + exports.unstable_NormalPriority = NormalPriority; + exports.unstable_Profiling = unstable_Profiling; + exports.unstable_UserBlockingPriority = UserBlockingPriority; + exports.unstable_cancelCallback = unstable_cancelCallback; + exports.unstable_continueExecution = unstable_continueExecution; + exports.unstable_forceFrameRate = forceFrameRate; + exports.unstable_getCurrentPriorityLevel = unstable_getCurrentPriorityLevel; + exports.unstable_getFirstCallbackNode = unstable_getFirstCallbackNode; + exports.unstable_next = unstable_next; + exports.unstable_pauseExecution = unstable_pauseExecution; + exports.unstable_requestPaint = unstable_requestPaint; + exports.unstable_runWithPriority = unstable_runWithPriority; + exports.unstable_scheduleCallback = unstable_scheduleCallback; + exports.unstable_shouldYield = shouldYieldToHost; + exports.unstable_wrapCallback = unstable_wrapCallback; + if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== "undefined" && typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop === "function") { + __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(new Error()); + } + })(); + } + } +}); + +// node_modules/scheduler/index.js +var require_scheduler = __commonJS({ + "node_modules/scheduler/index.js"(exports, module) { + "use strict"; + if (false) { + module.exports = null; + } else { + module.exports = require_scheduler_development(); + } + } +}); + +// node_modules/react-dom/cjs/react-dom.development.js +var require_react_dom_development = __commonJS({ + "node_modules/react-dom/cjs/react-dom.development.js"(exports) { + "use strict"; + if (true) { + (function() { + "use strict"; + if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== "undefined" && typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart === "function") { + __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(new Error()); + } + var React = require_react(); + var Scheduler = require_scheduler(); + var ReactSharedInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED; + var suppressWarning = false; + function setSuppressWarning(newSuppressWarning) { + { + suppressWarning = newSuppressWarning; + } + } + function warn(format) { + { + if (!suppressWarning) { + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + printWarning("warn", format, args); + } + } + } + function error(format) { + { + if (!suppressWarning) { + for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { + args[_key2 - 1] = arguments[_key2]; + } + printWarning("error", format, args); + } + } + } + function printWarning(level, format, args) { + { + var ReactDebugCurrentFrame2 = ReactSharedInternals.ReactDebugCurrentFrame; + var stack = ReactDebugCurrentFrame2.getStackAddendum(); + if (stack !== "") { + format += "%s"; + args = args.concat([stack]); + } + var argsWithFormat = args.map(function(item) { + return String(item); + }); + argsWithFormat.unshift("Warning: " + format); + Function.prototype.apply.call(console[level], console, argsWithFormat); + } + } + var FunctionComponent = 0; + var ClassComponent = 1; + var IndeterminateComponent = 2; + var HostRoot = 3; + var HostPortal = 4; + var HostComponent = 5; + var HostText = 6; + var Fragment = 7; + var Mode = 8; + var ContextConsumer = 9; + var ContextProvider = 10; + var ForwardRef = 11; + var Profiler = 12; + var SuspenseComponent = 13; + var MemoComponent = 14; + var SimpleMemoComponent = 15; + var LazyComponent = 16; + var IncompleteClassComponent = 17; + var DehydratedFragment = 18; + var SuspenseListComponent = 19; + var ScopeComponent = 21; + var OffscreenComponent = 22; + var LegacyHiddenComponent = 23; + var CacheComponent = 24; + var TracingMarkerComponent = 25; + var enableClientRenderFallbackOnTextMismatch = true; + var enableNewReconciler = false; + var enableLazyContextPropagation = false; + var enableLegacyHidden = false; + var enableSuspenseAvoidThisFallback = false; + var disableCommentsAsDOMContainers = true; + var enableCustomElementPropertySupport = false; + var warnAboutStringRefs = true; + var enableSchedulingProfiler = true; + var enableProfilerTimer = true; + var enableProfilerCommitHooks = true; + var allNativeEvents = /* @__PURE__ */ new Set(); + var registrationNameDependencies = {}; + var possibleRegistrationNames = {}; + function registerTwoPhaseEvent(registrationName, dependencies) { + registerDirectEvent(registrationName, dependencies); + registerDirectEvent(registrationName + "Capture", dependencies); + } + function registerDirectEvent(registrationName, dependencies) { + { + if (registrationNameDependencies[registrationName]) { + error("EventRegistry: More than one plugin attempted to publish the same registration name, `%s`.", registrationName); + } + } + registrationNameDependencies[registrationName] = dependencies; + { + var lowerCasedName = registrationName.toLowerCase(); + possibleRegistrationNames[lowerCasedName] = registrationName; + if (registrationName === "onDoubleClick") { + possibleRegistrationNames.ondblclick = registrationName; + } + } + for (var i = 0; i < dependencies.length; i++) { + allNativeEvents.add(dependencies[i]); + } + } + var canUseDOM = !!(typeof window !== "undefined" && typeof window.document !== "undefined" && typeof window.document.createElement !== "undefined"); + var hasOwnProperty = Object.prototype.hasOwnProperty; + function typeName(value) { + { + var hasToStringTag = typeof Symbol === "function" && Symbol.toStringTag; + var type = hasToStringTag && value[Symbol.toStringTag] || value.constructor.name || "Object"; + return type; + } + } + function willCoercionThrow(value) { + { + try { + testStringCoercion(value); + return false; + } catch (e) { + return true; + } + } + } + function testStringCoercion(value) { + return "" + value; + } + function checkAttributeStringCoercion(value, attributeName) { + { + if (willCoercionThrow(value)) { + error("The provided `%s` attribute is an unsupported type %s. This value must be coerced to a string before before using it here.", attributeName, typeName(value)); + return testStringCoercion(value); + } + } + } + function checkKeyStringCoercion(value) { + { + if (willCoercionThrow(value)) { + error("The provided key is an unsupported type %s. This value must be coerced to a string before before using it here.", typeName(value)); + return testStringCoercion(value); + } + } + } + function checkPropStringCoercion(value, propName) { + { + if (willCoercionThrow(value)) { + error("The provided `%s` prop is an unsupported type %s. This value must be coerced to a string before before using it here.", propName, typeName(value)); + return testStringCoercion(value); + } + } + } + function checkCSSPropertyStringCoercion(value, propName) { + { + if (willCoercionThrow(value)) { + error("The provided `%s` CSS property is an unsupported type %s. This value must be coerced to a string before before using it here.", propName, typeName(value)); + return testStringCoercion(value); + } + } + } + function checkHtmlStringCoercion(value) { + { + if (willCoercionThrow(value)) { + error("The provided HTML markup uses a value of unsupported type %s. This value must be coerced to a string before before using it here.", typeName(value)); + return testStringCoercion(value); + } + } + } + function checkFormFieldValueStringCoercion(value) { + { + if (willCoercionThrow(value)) { + error("Form field values (value, checked, defaultValue, or defaultChecked props) must be strings, not %s. This value must be coerced to a string before before using it here.", typeName(value)); + return testStringCoercion(value); + } + } + } + var RESERVED = 0; + var STRING = 1; + var BOOLEANISH_STRING = 2; + var BOOLEAN = 3; + var OVERLOADED_BOOLEAN = 4; + var NUMERIC = 5; + var POSITIVE_NUMERIC = 6; + var ATTRIBUTE_NAME_START_CHAR = ":A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD"; + var ATTRIBUTE_NAME_CHAR = ATTRIBUTE_NAME_START_CHAR + "\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040"; + var VALID_ATTRIBUTE_NAME_REGEX = new RegExp("^[" + ATTRIBUTE_NAME_START_CHAR + "][" + ATTRIBUTE_NAME_CHAR + "]*$"); + var illegalAttributeNameCache = {}; + var validatedAttributeNameCache = {}; + function isAttributeNameSafe(attributeName) { + if (hasOwnProperty.call(validatedAttributeNameCache, attributeName)) { + return true; + } + if (hasOwnProperty.call(illegalAttributeNameCache, attributeName)) { + return false; + } + if (VALID_ATTRIBUTE_NAME_REGEX.test(attributeName)) { + validatedAttributeNameCache[attributeName] = true; + return true; + } + illegalAttributeNameCache[attributeName] = true; + { + error("Invalid attribute name: `%s`", attributeName); + } + return false; + } + function shouldIgnoreAttribute(name, propertyInfo, isCustomComponentTag) { + if (propertyInfo !== null) { + return propertyInfo.type === RESERVED; + } + if (isCustomComponentTag) { + return false; + } + if (name.length > 2 && (name[0] === "o" || name[0] === "O") && (name[1] === "n" || name[1] === "N")) { + return true; + } + return false; + } + function shouldRemoveAttributeWithWarning(name, value, propertyInfo, isCustomComponentTag) { + if (propertyInfo !== null && propertyInfo.type === RESERVED) { + return false; + } + switch (typeof value) { + case "function": + case "symbol": + return true; + case "boolean": { + if (isCustomComponentTag) { + return false; + } + if (propertyInfo !== null) { + return !propertyInfo.acceptsBooleans; + } else { + var prefix2 = name.toLowerCase().slice(0, 5); + return prefix2 !== "data-" && prefix2 !== "aria-"; + } + } + default: + return false; + } + } + function shouldRemoveAttribute(name, value, propertyInfo, isCustomComponentTag) { + if (value === null || typeof value === "undefined") { + return true; + } + if (shouldRemoveAttributeWithWarning(name, value, propertyInfo, isCustomComponentTag)) { + return true; + } + if (isCustomComponentTag) { + return false; + } + if (propertyInfo !== null) { + switch (propertyInfo.type) { + case BOOLEAN: + return !value; + case OVERLOADED_BOOLEAN: + return value === false; + case NUMERIC: + return isNaN(value); + case POSITIVE_NUMERIC: + return isNaN(value) || value < 1; + } + } + return false; + } + function getPropertyInfo(name) { + return properties.hasOwnProperty(name) ? properties[name] : null; + } + function PropertyInfoRecord(name, type, mustUseProperty, attributeName, attributeNamespace, sanitizeURL2, removeEmptyString) { + this.acceptsBooleans = type === BOOLEANISH_STRING || type === BOOLEAN || type === OVERLOADED_BOOLEAN; + this.attributeName = attributeName; + this.attributeNamespace = attributeNamespace; + this.mustUseProperty = mustUseProperty; + this.propertyName = name; + this.type = type; + this.sanitizeURL = sanitizeURL2; + this.removeEmptyString = removeEmptyString; + } + var properties = {}; + var reservedProps = [ + "children", + "dangerouslySetInnerHTML", + // TODO: This prevents the assignment of defaultValue to regular + // elements (not just inputs). Now that ReactDOMInput assigns to the + // defaultValue property -- do we need this? + "defaultValue", + "defaultChecked", + "innerHTML", + "suppressContentEditableWarning", + "suppressHydrationWarning", + "style" + ]; + reservedProps.forEach(function(name) { + properties[name] = new PropertyInfoRecord( + name, + RESERVED, + false, + // mustUseProperty + name, + // attributeName + null, + // attributeNamespace + false, + // sanitizeURL + false + ); + }); + [["acceptCharset", "accept-charset"], ["className", "class"], ["htmlFor", "for"], ["httpEquiv", "http-equiv"]].forEach(function(_ref) { + var name = _ref[0], attributeName = _ref[1]; + properties[name] = new PropertyInfoRecord( + name, + STRING, + false, + // mustUseProperty + attributeName, + // attributeName + null, + // attributeNamespace + false, + // sanitizeURL + false + ); + }); + ["contentEditable", "draggable", "spellCheck", "value"].forEach(function(name) { + properties[name] = new PropertyInfoRecord( + name, + BOOLEANISH_STRING, + false, + // mustUseProperty + name.toLowerCase(), + // attributeName + null, + // attributeNamespace + false, + // sanitizeURL + false + ); + }); + ["autoReverse", "externalResourcesRequired", "focusable", "preserveAlpha"].forEach(function(name) { + properties[name] = new PropertyInfoRecord( + name, + BOOLEANISH_STRING, + false, + // mustUseProperty + name, + // attributeName + null, + // attributeNamespace + false, + // sanitizeURL + false + ); + }); + [ + "allowFullScreen", + "async", + // Note: there is a special case that prevents it from being written to the DOM + // on the client side because the browsers are inconsistent. Instead we call focus(). + "autoFocus", + "autoPlay", + "controls", + "default", + "defer", + "disabled", + "disablePictureInPicture", + "disableRemotePlayback", + "formNoValidate", + "hidden", + "loop", + "noModule", + "noValidate", + "open", + "playsInline", + "readOnly", + "required", + "reversed", + "scoped", + "seamless", + // Microdata + "itemScope" + ].forEach(function(name) { + properties[name] = new PropertyInfoRecord( + name, + BOOLEAN, + false, + // mustUseProperty + name.toLowerCase(), + // attributeName + null, + // attributeNamespace + false, + // sanitizeURL + false + ); + }); + [ + "checked", + // Note: `option.selected` is not updated if `select.multiple` is + // disabled with `removeAttribute`. We have special logic for handling this. + "multiple", + "muted", + "selected" + // NOTE: if you add a camelCased prop to this list, + // you'll need to set attributeName to name.toLowerCase() + // instead in the assignment below. + ].forEach(function(name) { + properties[name] = new PropertyInfoRecord( + name, + BOOLEAN, + true, + // mustUseProperty + name, + // attributeName + null, + // attributeNamespace + false, + // sanitizeURL + false + ); + }); + [ + "capture", + "download" + // NOTE: if you add a camelCased prop to this list, + // you'll need to set attributeName to name.toLowerCase() + // instead in the assignment below. + ].forEach(function(name) { + properties[name] = new PropertyInfoRecord( + name, + OVERLOADED_BOOLEAN, + false, + // mustUseProperty + name, + // attributeName + null, + // attributeNamespace + false, + // sanitizeURL + false + ); + }); + [ + "cols", + "rows", + "size", + "span" + // NOTE: if you add a camelCased prop to this list, + // you'll need to set attributeName to name.toLowerCase() + // instead in the assignment below. + ].forEach(function(name) { + properties[name] = new PropertyInfoRecord( + name, + POSITIVE_NUMERIC, + false, + // mustUseProperty + name, + // attributeName + null, + // attributeNamespace + false, + // sanitizeURL + false + ); + }); + ["rowSpan", "start"].forEach(function(name) { + properties[name] = new PropertyInfoRecord( + name, + NUMERIC, + false, + // mustUseProperty + name.toLowerCase(), + // attributeName + null, + // attributeNamespace + false, + // sanitizeURL + false + ); + }); + var CAMELIZE = /[\-\:]([a-z])/g; + var capitalize = function(token) { + return token[1].toUpperCase(); + }; + [ + "accent-height", + "alignment-baseline", + "arabic-form", + "baseline-shift", + "cap-height", + "clip-path", + "clip-rule", + "color-interpolation", + "color-interpolation-filters", + "color-profile", + "color-rendering", + "dominant-baseline", + "enable-background", + "fill-opacity", + "fill-rule", + "flood-color", + "flood-opacity", + "font-family", + "font-size", + "font-size-adjust", + "font-stretch", + "font-style", + "font-variant", + "font-weight", + "glyph-name", + "glyph-orientation-horizontal", + "glyph-orientation-vertical", + "horiz-adv-x", + "horiz-origin-x", + "image-rendering", + "letter-spacing", + "lighting-color", + "marker-end", + "marker-mid", + "marker-start", + "overline-position", + "overline-thickness", + "paint-order", + "panose-1", + "pointer-events", + "rendering-intent", + "shape-rendering", + "stop-color", + "stop-opacity", + "strikethrough-position", + "strikethrough-thickness", + "stroke-dasharray", + "stroke-dashoffset", + "stroke-linecap", + "stroke-linejoin", + "stroke-miterlimit", + "stroke-opacity", + "stroke-width", + "text-anchor", + "text-decoration", + "text-rendering", + "underline-position", + "underline-thickness", + "unicode-bidi", + "unicode-range", + "units-per-em", + "v-alphabetic", + "v-hanging", + "v-ideographic", + "v-mathematical", + "vector-effect", + "vert-adv-y", + "vert-origin-x", + "vert-origin-y", + "word-spacing", + "writing-mode", + "xmlns:xlink", + "x-height" + // NOTE: if you add a camelCased prop to this list, + // you'll need to set attributeName to name.toLowerCase() + // instead in the assignment below. + ].forEach(function(attributeName) { + var name = attributeName.replace(CAMELIZE, capitalize); + properties[name] = new PropertyInfoRecord( + name, + STRING, + false, + // mustUseProperty + attributeName, + null, + // attributeNamespace + false, + // sanitizeURL + false + ); + }); + [ + "xlink:actuate", + "xlink:arcrole", + "xlink:role", + "xlink:show", + "xlink:title", + "xlink:type" + // NOTE: if you add a camelCased prop to this list, + // you'll need to set attributeName to name.toLowerCase() + // instead in the assignment below. + ].forEach(function(attributeName) { + var name = attributeName.replace(CAMELIZE, capitalize); + properties[name] = new PropertyInfoRecord( + name, + STRING, + false, + // mustUseProperty + attributeName, + "http://www.w3.org/1999/xlink", + false, + // sanitizeURL + false + ); + }); + [ + "xml:base", + "xml:lang", + "xml:space" + // NOTE: if you add a camelCased prop to this list, + // you'll need to set attributeName to name.toLowerCase() + // instead in the assignment below. + ].forEach(function(attributeName) { + var name = attributeName.replace(CAMELIZE, capitalize); + properties[name] = new PropertyInfoRecord( + name, + STRING, + false, + // mustUseProperty + attributeName, + "http://www.w3.org/XML/1998/namespace", + false, + // sanitizeURL + false + ); + }); + ["tabIndex", "crossOrigin"].forEach(function(attributeName) { + properties[attributeName] = new PropertyInfoRecord( + attributeName, + STRING, + false, + // mustUseProperty + attributeName.toLowerCase(), + // attributeName + null, + // attributeNamespace + false, + // sanitizeURL + false + ); + }); + var xlinkHref = "xlinkHref"; + properties[xlinkHref] = new PropertyInfoRecord( + "xlinkHref", + STRING, + false, + // mustUseProperty + "xlink:href", + "http://www.w3.org/1999/xlink", + true, + // sanitizeURL + false + ); + ["src", "href", "action", "formAction"].forEach(function(attributeName) { + properties[attributeName] = new PropertyInfoRecord( + attributeName, + STRING, + false, + // mustUseProperty + attributeName.toLowerCase(), + // attributeName + null, + // attributeNamespace + true, + // sanitizeURL + true + ); + }); + var isJavaScriptProtocol = /^[\u0000-\u001F ]*j[\r\n\t]*a[\r\n\t]*v[\r\n\t]*a[\r\n\t]*s[\r\n\t]*c[\r\n\t]*r[\r\n\t]*i[\r\n\t]*p[\r\n\t]*t[\r\n\t]*\:/i; + var didWarn = false; + function sanitizeURL(url) { + { + if (!didWarn && isJavaScriptProtocol.test(url)) { + didWarn = true; + error("A future version of React will block javascript: URLs as a security precaution. Use event handlers instead if you can. If you need to generate unsafe HTML try using dangerouslySetInnerHTML instead. React was passed %s.", JSON.stringify(url)); + } + } + } + function getValueForProperty(node, name, expected, propertyInfo) { + { + if (propertyInfo.mustUseProperty) { + var propertyName = propertyInfo.propertyName; + return node[propertyName]; + } else { + { + checkAttributeStringCoercion(expected, name); + } + if (propertyInfo.sanitizeURL) { + sanitizeURL("" + expected); + } + var attributeName = propertyInfo.attributeName; + var stringValue = null; + if (propertyInfo.type === OVERLOADED_BOOLEAN) { + if (node.hasAttribute(attributeName)) { + var value = node.getAttribute(attributeName); + if (value === "") { + return true; + } + if (shouldRemoveAttribute(name, expected, propertyInfo, false)) { + return value; + } + if (value === "" + expected) { + return expected; + } + return value; + } + } else if (node.hasAttribute(attributeName)) { + if (shouldRemoveAttribute(name, expected, propertyInfo, false)) { + return node.getAttribute(attributeName); + } + if (propertyInfo.type === BOOLEAN) { + return expected; + } + stringValue = node.getAttribute(attributeName); + } + if (shouldRemoveAttribute(name, expected, propertyInfo, false)) { + return stringValue === null ? expected : stringValue; + } else if (stringValue === "" + expected) { + return expected; + } else { + return stringValue; + } + } + } + } + function getValueForAttribute(node, name, expected, isCustomComponentTag) { + { + if (!isAttributeNameSafe(name)) { + return; + } + if (!node.hasAttribute(name)) { + return expected === void 0 ? void 0 : null; + } + var value = node.getAttribute(name); + { + checkAttributeStringCoercion(expected, name); + } + if (value === "" + expected) { + return expected; + } + return value; + } + } + function setValueForProperty(node, name, value, isCustomComponentTag) { + var propertyInfo = getPropertyInfo(name); + if (shouldIgnoreAttribute(name, propertyInfo, isCustomComponentTag)) { + return; + } + if (shouldRemoveAttribute(name, value, propertyInfo, isCustomComponentTag)) { + value = null; + } + if (isCustomComponentTag || propertyInfo === null) { + if (isAttributeNameSafe(name)) { + var _attributeName = name; + if (value === null) { + node.removeAttribute(_attributeName); + } else { + { + checkAttributeStringCoercion(value, name); + } + node.setAttribute(_attributeName, "" + value); + } + } + return; + } + var mustUseProperty = propertyInfo.mustUseProperty; + if (mustUseProperty) { + var propertyName = propertyInfo.propertyName; + if (value === null) { + var type = propertyInfo.type; + node[propertyName] = type === BOOLEAN ? false : ""; + } else { + node[propertyName] = value; + } + return; + } + var attributeName = propertyInfo.attributeName, attributeNamespace = propertyInfo.attributeNamespace; + if (value === null) { + node.removeAttribute(attributeName); + } else { + var _type = propertyInfo.type; + var attributeValue; + if (_type === BOOLEAN || _type === OVERLOADED_BOOLEAN && value === true) { + attributeValue = ""; + } else { + { + { + checkAttributeStringCoercion(value, attributeName); + } + attributeValue = "" + value; + } + if (propertyInfo.sanitizeURL) { + sanitizeURL(attributeValue.toString()); + } + } + if (attributeNamespace) { + node.setAttributeNS(attributeNamespace, attributeName, attributeValue); + } else { + node.setAttribute(attributeName, attributeValue); + } + } + } + var REACT_ELEMENT_TYPE = Symbol.for("react.element"); + var REACT_PORTAL_TYPE = Symbol.for("react.portal"); + var REACT_FRAGMENT_TYPE = Symbol.for("react.fragment"); + var REACT_STRICT_MODE_TYPE = Symbol.for("react.strict_mode"); + var REACT_PROFILER_TYPE = Symbol.for("react.profiler"); + var REACT_PROVIDER_TYPE = Symbol.for("react.provider"); + var REACT_CONTEXT_TYPE = Symbol.for("react.context"); + var REACT_FORWARD_REF_TYPE = Symbol.for("react.forward_ref"); + var REACT_SUSPENSE_TYPE = Symbol.for("react.suspense"); + var REACT_SUSPENSE_LIST_TYPE = Symbol.for("react.suspense_list"); + var REACT_MEMO_TYPE = Symbol.for("react.memo"); + var REACT_LAZY_TYPE = Symbol.for("react.lazy"); + var REACT_SCOPE_TYPE = Symbol.for("react.scope"); + var REACT_DEBUG_TRACING_MODE_TYPE = Symbol.for("react.debug_trace_mode"); + var REACT_OFFSCREEN_TYPE = Symbol.for("react.offscreen"); + var REACT_LEGACY_HIDDEN_TYPE = Symbol.for("react.legacy_hidden"); + var REACT_CACHE_TYPE = Symbol.for("react.cache"); + var REACT_TRACING_MARKER_TYPE = Symbol.for("react.tracing_marker"); + var MAYBE_ITERATOR_SYMBOL = Symbol.iterator; + var FAUX_ITERATOR_SYMBOL = "@@iterator"; + function getIteratorFn(maybeIterable) { + if (maybeIterable === null || typeof maybeIterable !== "object") { + return null; + } + var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]; + if (typeof maybeIterator === "function") { + return maybeIterator; + } + return null; + } + var assign = Object.assign; + var disabledDepth = 0; + var prevLog; + var prevInfo; + var prevWarn; + var prevError; + var prevGroup; + var prevGroupCollapsed; + var prevGroupEnd; + function disabledLog() { + } + disabledLog.__reactDisabledLog = true; + function disableLogs() { + { + if (disabledDepth === 0) { + prevLog = console.log; + prevInfo = console.info; + prevWarn = console.warn; + prevError = console.error; + prevGroup = console.group; + prevGroupCollapsed = console.groupCollapsed; + prevGroupEnd = console.groupEnd; + var props = { + configurable: true, + enumerable: true, + value: disabledLog, + writable: true + }; + Object.defineProperties(console, { + info: props, + log: props, + warn: props, + error: props, + group: props, + groupCollapsed: props, + groupEnd: props + }); + } + disabledDepth++; + } + } + function reenableLogs() { + { + disabledDepth--; + if (disabledDepth === 0) { + var props = { + configurable: true, + enumerable: true, + writable: true + }; + Object.defineProperties(console, { + log: assign({}, props, { + value: prevLog + }), + info: assign({}, props, { + value: prevInfo + }), + warn: assign({}, props, { + value: prevWarn + }), + error: assign({}, props, { + value: prevError + }), + group: assign({}, props, { + value: prevGroup + }), + groupCollapsed: assign({}, props, { + value: prevGroupCollapsed + }), + groupEnd: assign({}, props, { + value: prevGroupEnd + }) + }); + } + if (disabledDepth < 0) { + error("disabledDepth fell below zero. This is a bug in React. Please file an issue."); + } + } + } + var ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher; + var prefix; + function describeBuiltInComponentFrame(name, source, ownerFn) { + { + if (prefix === void 0) { + try { + throw Error(); + } catch (x) { + var match = x.stack.trim().match(/\n( *(at )?)/); + prefix = match && match[1] || ""; + } + } + return "\n" + prefix + name; + } + } + var reentry = false; + var componentFrameCache; + { + var PossiblyWeakMap = typeof WeakMap === "function" ? WeakMap : Map; + componentFrameCache = new PossiblyWeakMap(); + } + function describeNativeComponentFrame(fn, construct) { + if (!fn || reentry) { + return ""; + } + { + var frame = componentFrameCache.get(fn); + if (frame !== void 0) { + return frame; + } + } + var control; + reentry = true; + var previousPrepareStackTrace = Error.prepareStackTrace; + Error.prepareStackTrace = void 0; + var previousDispatcher; + { + previousDispatcher = ReactCurrentDispatcher.current; + ReactCurrentDispatcher.current = null; + disableLogs(); + } + try { + if (construct) { + var Fake = function() { + throw Error(); + }; + Object.defineProperty(Fake.prototype, "props", { + set: function() { + throw Error(); + } + }); + if (typeof Reflect === "object" && Reflect.construct) { + try { + Reflect.construct(Fake, []); + } catch (x) { + control = x; + } + Reflect.construct(fn, [], Fake); + } else { + try { + Fake.call(); + } catch (x) { + control = x; + } + fn.call(Fake.prototype); + } + } else { + try { + throw Error(); + } catch (x) { + control = x; + } + fn(); + } + } catch (sample) { + if (sample && control && typeof sample.stack === "string") { + var sampleLines = sample.stack.split("\n"); + var controlLines = control.stack.split("\n"); + var s = sampleLines.length - 1; + var c = controlLines.length - 1; + while (s >= 1 && c >= 0 && sampleLines[s] !== controlLines[c]) { + c--; + } + for (; s >= 1 && c >= 0; s--, c--) { + if (sampleLines[s] !== controlLines[c]) { + if (s !== 1 || c !== 1) { + do { + s--; + c--; + if (c < 0 || sampleLines[s] !== controlLines[c]) { + var _frame = "\n" + sampleLines[s].replace(" at new ", " at "); + if (fn.displayName && _frame.includes("")) { + _frame = _frame.replace("", fn.displayName); + } + { + if (typeof fn === "function") { + componentFrameCache.set(fn, _frame); + } + } + return _frame; + } + } while (s >= 1 && c >= 0); + } + break; + } + } + } + } finally { + reentry = false; + { + ReactCurrentDispatcher.current = previousDispatcher; + reenableLogs(); + } + Error.prepareStackTrace = previousPrepareStackTrace; + } + var name = fn ? fn.displayName || fn.name : ""; + var syntheticFrame = name ? describeBuiltInComponentFrame(name) : ""; + { + if (typeof fn === "function") { + componentFrameCache.set(fn, syntheticFrame); + } + } + return syntheticFrame; + } + function describeClassComponentFrame(ctor, source, ownerFn) { + { + return describeNativeComponentFrame(ctor, true); + } + } + function describeFunctionComponentFrame(fn, source, ownerFn) { + { + return describeNativeComponentFrame(fn, false); + } + } + function shouldConstruct(Component) { + var prototype = Component.prototype; + return !!(prototype && prototype.isReactComponent); + } + function describeUnknownElementTypeFrameInDEV(type, source, ownerFn) { + if (type == null) { + return ""; + } + if (typeof type === "function") { + { + return describeNativeComponentFrame(type, shouldConstruct(type)); + } + } + if (typeof type === "string") { + return describeBuiltInComponentFrame(type); + } + switch (type) { + case REACT_SUSPENSE_TYPE: + return describeBuiltInComponentFrame("Suspense"); + case REACT_SUSPENSE_LIST_TYPE: + return describeBuiltInComponentFrame("SuspenseList"); + } + if (typeof type === "object") { + switch (type.$$typeof) { + case REACT_FORWARD_REF_TYPE: + return describeFunctionComponentFrame(type.render); + case REACT_MEMO_TYPE: + return describeUnknownElementTypeFrameInDEV(type.type, source, ownerFn); + case REACT_LAZY_TYPE: { + var lazyComponent = type; + var payload = lazyComponent._payload; + var init = lazyComponent._init; + try { + return describeUnknownElementTypeFrameInDEV(init(payload), source, ownerFn); + } catch (x) { + } + } + } + } + return ""; + } + function describeFiber(fiber) { + var owner = fiber._debugOwner ? fiber._debugOwner.type : null; + var source = fiber._debugSource; + switch (fiber.tag) { + case HostComponent: + return describeBuiltInComponentFrame(fiber.type); + case LazyComponent: + return describeBuiltInComponentFrame("Lazy"); + case SuspenseComponent: + return describeBuiltInComponentFrame("Suspense"); + case SuspenseListComponent: + return describeBuiltInComponentFrame("SuspenseList"); + case FunctionComponent: + case IndeterminateComponent: + case SimpleMemoComponent: + return describeFunctionComponentFrame(fiber.type); + case ForwardRef: + return describeFunctionComponentFrame(fiber.type.render); + case ClassComponent: + return describeClassComponentFrame(fiber.type); + default: + return ""; + } + } + function getStackByFiberInDevAndProd(workInProgress2) { + try { + var info = ""; + var node = workInProgress2; + do { + info += describeFiber(node); + node = node.return; + } while (node); + return info; + } catch (x) { + return "\nError generating stack: " + x.message + "\n" + x.stack; + } + } + function getWrappedName(outerType, innerType, wrapperName) { + var displayName = outerType.displayName; + if (displayName) { + return displayName; + } + var functionName = innerType.displayName || innerType.name || ""; + return functionName !== "" ? wrapperName + "(" + functionName + ")" : wrapperName; + } + function getContextName(type) { + return type.displayName || "Context"; + } + function getComponentNameFromType(type) { + if (type == null) { + return null; + } + { + if (typeof type.tag === "number") { + error("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."); + } + } + if (typeof type === "function") { + return type.displayName || type.name || null; + } + if (typeof type === "string") { + return type; + } + switch (type) { + case REACT_FRAGMENT_TYPE: + return "Fragment"; + case REACT_PORTAL_TYPE: + return "Portal"; + case REACT_PROFILER_TYPE: + return "Profiler"; + case REACT_STRICT_MODE_TYPE: + return "StrictMode"; + case REACT_SUSPENSE_TYPE: + return "Suspense"; + case REACT_SUSPENSE_LIST_TYPE: + return "SuspenseList"; + } + if (typeof type === "object") { + switch (type.$$typeof) { + case REACT_CONTEXT_TYPE: + var context = type; + return getContextName(context) + ".Consumer"; + case REACT_PROVIDER_TYPE: + var provider = type; + return getContextName(provider._context) + ".Provider"; + case REACT_FORWARD_REF_TYPE: + return getWrappedName(type, type.render, "ForwardRef"); + case REACT_MEMO_TYPE: + var outerName = type.displayName || null; + if (outerName !== null) { + return outerName; + } + return getComponentNameFromType(type.type) || "Memo"; + case REACT_LAZY_TYPE: { + var lazyComponent = type; + var payload = lazyComponent._payload; + var init = lazyComponent._init; + try { + return getComponentNameFromType(init(payload)); + } catch (x) { + return null; + } + } + } + } + return null; + } + function getWrappedName$1(outerType, innerType, wrapperName) { + var functionName = innerType.displayName || innerType.name || ""; + return outerType.displayName || (functionName !== "" ? wrapperName + "(" + functionName + ")" : wrapperName); + } + function getContextName$1(type) { + return type.displayName || "Context"; + } + function getComponentNameFromFiber(fiber) { + var tag = fiber.tag, type = fiber.type; + switch (tag) { + case CacheComponent: + return "Cache"; + case ContextConsumer: + var context = type; + return getContextName$1(context) + ".Consumer"; + case ContextProvider: + var provider = type; + return getContextName$1(provider._context) + ".Provider"; + case DehydratedFragment: + return "DehydratedFragment"; + case ForwardRef: + return getWrappedName$1(type, type.render, "ForwardRef"); + case Fragment: + return "Fragment"; + case HostComponent: + return type; + case HostPortal: + return "Portal"; + case HostRoot: + return "Root"; + case HostText: + return "Text"; + case LazyComponent: + return getComponentNameFromType(type); + case Mode: + if (type === REACT_STRICT_MODE_TYPE) { + return "StrictMode"; + } + return "Mode"; + case OffscreenComponent: + return "Offscreen"; + case Profiler: + return "Profiler"; + case ScopeComponent: + return "Scope"; + case SuspenseComponent: + return "Suspense"; + case SuspenseListComponent: + return "SuspenseList"; + case TracingMarkerComponent: + return "TracingMarker"; + case ClassComponent: + case FunctionComponent: + case IncompleteClassComponent: + case IndeterminateComponent: + case MemoComponent: + case SimpleMemoComponent: + if (typeof type === "function") { + return type.displayName || type.name || null; + } + if (typeof type === "string") { + return type; + } + break; + } + return null; + } + var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame; + var current = null; + var isRendering = false; + function getCurrentFiberOwnerNameInDevOrNull() { + { + if (current === null) { + return null; + } + var owner = current._debugOwner; + if (owner !== null && typeof owner !== "undefined") { + return getComponentNameFromFiber(owner); + } + } + return null; + } + function getCurrentFiberStackInDev() { + { + if (current === null) { + return ""; + } + return getStackByFiberInDevAndProd(current); + } + } + function resetCurrentFiber() { + { + ReactDebugCurrentFrame.getCurrentStack = null; + current = null; + isRendering = false; + } + } + function setCurrentFiber(fiber) { + { + ReactDebugCurrentFrame.getCurrentStack = fiber === null ? null : getCurrentFiberStackInDev; + current = fiber; + isRendering = false; + } + } + function getCurrentFiber() { + { + return current; + } + } + function setIsRendering(rendering) { + { + isRendering = rendering; + } + } + function toString(value) { + return "" + value; + } + function getToStringValue(value) { + switch (typeof value) { + case "boolean": + case "number": + case "string": + case "undefined": + return value; + case "object": + { + checkFormFieldValueStringCoercion(value); + } + return value; + default: + return ""; + } + } + var hasReadOnlyValue = { + button: true, + checkbox: true, + image: true, + hidden: true, + radio: true, + reset: true, + submit: true + }; + function checkControlledValueProps(tagName, props) { + { + if (!(hasReadOnlyValue[props.type] || props.onChange || props.onInput || props.readOnly || props.disabled || props.value == null)) { + error("You provided a `value` prop to a form field without an `onChange` handler. This will render a read-only field. If the field should be mutable use `defaultValue`. Otherwise, set either `onChange` or `readOnly`."); + } + if (!(props.onChange || props.readOnly || props.disabled || props.checked == null)) { + error("You provided a `checked` prop to a form field without an `onChange` handler. This will render a read-only field. If the field should be mutable use `defaultChecked`. Otherwise, set either `onChange` or `readOnly`."); + } + } + } + function isCheckable(elem) { + var type = elem.type; + var nodeName = elem.nodeName; + return nodeName && nodeName.toLowerCase() === "input" && (type === "checkbox" || type === "radio"); + } + function getTracker(node) { + return node._valueTracker; + } + function detachTracker(node) { + node._valueTracker = null; + } + function getValueFromNode(node) { + var value = ""; + if (!node) { + return value; + } + if (isCheckable(node)) { + value = node.checked ? "true" : "false"; + } else { + value = node.value; + } + return value; + } + function trackValueOnNode(node) { + var valueField = isCheckable(node) ? "checked" : "value"; + var descriptor = Object.getOwnPropertyDescriptor(node.constructor.prototype, valueField); + { + checkFormFieldValueStringCoercion(node[valueField]); + } + var currentValue = "" + node[valueField]; + if (node.hasOwnProperty(valueField) || typeof descriptor === "undefined" || typeof descriptor.get !== "function" || typeof descriptor.set !== "function") { + return; + } + var get2 = descriptor.get, set2 = descriptor.set; + Object.defineProperty(node, valueField, { + configurable: true, + get: function() { + return get2.call(this); + }, + set: function(value) { + { + checkFormFieldValueStringCoercion(value); + } + currentValue = "" + value; + set2.call(this, value); + } + }); + Object.defineProperty(node, valueField, { + enumerable: descriptor.enumerable + }); + var tracker = { + getValue: function() { + return currentValue; + }, + setValue: function(value) { + { + checkFormFieldValueStringCoercion(value); + } + currentValue = "" + value; + }, + stopTracking: function() { + detachTracker(node); + delete node[valueField]; + } + }; + return tracker; + } + function track(node) { + if (getTracker(node)) { + return; + } + node._valueTracker = trackValueOnNode(node); + } + function updateValueIfChanged(node) { + if (!node) { + return false; + } + var tracker = getTracker(node); + if (!tracker) { + return true; + } + var lastValue = tracker.getValue(); + var nextValue = getValueFromNode(node); + if (nextValue !== lastValue) { + tracker.setValue(nextValue); + return true; + } + return false; + } + function getActiveElement(doc) { + doc = doc || (typeof document !== "undefined" ? document : void 0); + if (typeof doc === "undefined") { + return null; + } + try { + return doc.activeElement || doc.body; + } catch (e) { + return doc.body; + } + } + var didWarnValueDefaultValue = false; + var didWarnCheckedDefaultChecked = false; + var didWarnControlledToUncontrolled = false; + var didWarnUncontrolledToControlled = false; + function isControlled(props) { + var usesChecked = props.type === "checkbox" || props.type === "radio"; + return usesChecked ? props.checked != null : props.value != null; + } + function getHostProps(element, props) { + var node = element; + var checked = props.checked; + var hostProps = assign({}, props, { + defaultChecked: void 0, + defaultValue: void 0, + value: void 0, + checked: checked != null ? checked : node._wrapperState.initialChecked + }); + return hostProps; + } + function initWrapperState(element, props) { + { + checkControlledValueProps("input", props); + if (props.checked !== void 0 && props.defaultChecked !== void 0 && !didWarnCheckedDefaultChecked) { + error("%s contains an input of type %s with both checked and defaultChecked props. Input elements must be either controlled or uncontrolled (specify either the checked prop, or the defaultChecked prop, but not both). Decide between using a controlled or uncontrolled input element and remove one of these props. More info: https://reactjs.org/link/controlled-components", getCurrentFiberOwnerNameInDevOrNull() || "A component", props.type); + didWarnCheckedDefaultChecked = true; + } + if (props.value !== void 0 && props.defaultValue !== void 0 && !didWarnValueDefaultValue) { + error("%s contains an input of type %s with both value and defaultValue props. Input elements must be either controlled or uncontrolled (specify either the value prop, or the defaultValue prop, but not both). Decide between using a controlled or uncontrolled input element and remove one of these props. More info: https://reactjs.org/link/controlled-components", getCurrentFiberOwnerNameInDevOrNull() || "A component", props.type); + didWarnValueDefaultValue = true; + } + } + var node = element; + var defaultValue = props.defaultValue == null ? "" : props.defaultValue; + node._wrapperState = { + initialChecked: props.checked != null ? props.checked : props.defaultChecked, + initialValue: getToStringValue(props.value != null ? props.value : defaultValue), + controlled: isControlled(props) + }; + } + function updateChecked(element, props) { + var node = element; + var checked = props.checked; + if (checked != null) { + setValueForProperty(node, "checked", checked, false); + } + } + function updateWrapper(element, props) { + var node = element; + { + var controlled = isControlled(props); + if (!node._wrapperState.controlled && controlled && !didWarnUncontrolledToControlled) { + error("A component is changing an uncontrolled input to be controlled. This is likely caused by the value changing from undefined to a defined value, which should not happen. Decide between using a controlled or uncontrolled input element for the lifetime of the component. More info: https://reactjs.org/link/controlled-components"); + didWarnUncontrolledToControlled = true; + } + if (node._wrapperState.controlled && !controlled && !didWarnControlledToUncontrolled) { + error("A component is changing a controlled input to be uncontrolled. This is likely caused by the value changing from a defined to undefined, which should not happen. Decide between using a controlled or uncontrolled input element for the lifetime of the component. More info: https://reactjs.org/link/controlled-components"); + didWarnControlledToUncontrolled = true; + } + } + updateChecked(element, props); + var value = getToStringValue(props.value); + var type = props.type; + if (value != null) { + if (type === "number") { + if (value === 0 && node.value === "" || // We explicitly want to coerce to number here if possible. + // eslint-disable-next-line + node.value != value) { + node.value = toString(value); + } + } else if (node.value !== toString(value)) { + node.value = toString(value); + } + } else if (type === "submit" || type === "reset") { + node.removeAttribute("value"); + return; + } + { + if (props.hasOwnProperty("value")) { + setDefaultValue(node, props.type, value); + } else if (props.hasOwnProperty("defaultValue")) { + setDefaultValue(node, props.type, getToStringValue(props.defaultValue)); + } + } + { + if (props.checked == null && props.defaultChecked != null) { + node.defaultChecked = !!props.defaultChecked; + } + } + } + function postMountWrapper(element, props, isHydrating2) { + var node = element; + if (props.hasOwnProperty("value") || props.hasOwnProperty("defaultValue")) { + var type = props.type; + var isButton = type === "submit" || type === "reset"; + if (isButton && (props.value === void 0 || props.value === null)) { + return; + } + var initialValue = toString(node._wrapperState.initialValue); + if (!isHydrating2) { + { + if (initialValue !== node.value) { + node.value = initialValue; + } + } + } + { + node.defaultValue = initialValue; + } + } + var name = node.name; + if (name !== "") { + node.name = ""; + } + { + node.defaultChecked = !node.defaultChecked; + node.defaultChecked = !!node._wrapperState.initialChecked; + } + if (name !== "") { + node.name = name; + } + } + function restoreControlledState(element, props) { + var node = element; + updateWrapper(node, props); + updateNamedCousins(node, props); + } + function updateNamedCousins(rootNode, props) { + var name = props.name; + if (props.type === "radio" && name != null) { + var queryRoot = rootNode; + while (queryRoot.parentNode) { + queryRoot = queryRoot.parentNode; + } + { + checkAttributeStringCoercion(name, "name"); + } + var group = queryRoot.querySelectorAll("input[name=" + JSON.stringify("" + name) + '][type="radio"]'); + for (var i = 0; i < group.length; i++) { + var otherNode = group[i]; + if (otherNode === rootNode || otherNode.form !== rootNode.form) { + continue; + } + var otherProps = getFiberCurrentPropsFromNode(otherNode); + if (!otherProps) { + throw new Error("ReactDOMInput: Mixing React and non-React radio inputs with the same `name` is not supported."); + } + updateValueIfChanged(otherNode); + updateWrapper(otherNode, otherProps); + } + } + } + function setDefaultValue(node, type, value) { + if ( + // Focused number inputs synchronize on blur. See ChangeEventPlugin.js + type !== "number" || getActiveElement(node.ownerDocument) !== node + ) { + if (value == null) { + node.defaultValue = toString(node._wrapperState.initialValue); + } else if (node.defaultValue !== toString(value)) { + node.defaultValue = toString(value); + } + } + } + var didWarnSelectedSetOnOption = false; + var didWarnInvalidChild = false; + var didWarnInvalidInnerHTML = false; + function validateProps(element, props) { + { + if (props.value == null) { + if (typeof props.children === "object" && props.children !== null) { + React.Children.forEach(props.children, function(child) { + if (child == null) { + return; + } + if (typeof child === "string" || typeof child === "number") { + return; + } + if (!didWarnInvalidChild) { + didWarnInvalidChild = true; + error("Cannot infer the option value of complex children. Pass a `value` prop or use a plain string as children to