diff --git a/.gitea/workflows/ampel-ci.yml b/.gitea/workflows/ampel-ci.yml index b3f4e37..c8dc65f 100644 --- a/.gitea/workflows/ampel-ci.yml +++ b/.gitea/workflows/ampel-ci.yml @@ -9,7 +9,8 @@ # # Darum prueft die MC2-Ampel, was im Container EHRLICH gruen sein kann und trotzdem echte # Fehler faengt: Lint (ruff, Projekt-Politik in ruff.toml) + Import/Syntax (compileall) + -# Frontend-Build inkl. TypeScript-Typecheck (tsc). Rot ist ein Ergebnis, kein Aergernis. +# Frontend-Build inkl. TypeScript-Typecheck (tsc) + Frontend-Tests (vitest/jsdom) + ESLint +# + Buendel-Budget. Rot ist ein Ergebnis, kein Aergernis. name: Ampel on: [push, pull_request] @@ -43,6 +44,20 @@ jobs: else ( cd frontend && npm ci --no-audit --no-fund && npm run build ) || rot=1 + # Frontend-Tests + Linter (v3-Umbau P1, 28.08.2026). + # Bis dahin lief das Frontend als einziger Teil des Stacks voellig ungeprueft + # durch das Gate — 10 500 Zeilen, null Tests. Die Begruendung weiter oben + # ("echte Tests sind der Pruefstand mit LIVE-Diensten") gilt fuer die + # ML-schweren Python-Dienste, nicht fuer Frontend-Unit-Tests: die laufen in + # jsdom, brauchen weder Modell noch GPU und sind in Sekunden durch. + # Der Linter meldet 0 Fehler / ~90 Warnungen; rot wird nur bei Fehlern. + if [ $rot -eq 0 ]; then + echo "-- Vitest" + ( cd frontend && npm test --silent ) || rot=1 + echo "-- ESLint (Warnungen sind erlaubt, Fehler nicht)" + ( cd frontend && npm run lint --silent ) || rot=1 + fi + # Bündel-Budget (v3-Umbau P0, 28.08.2026): Der Start-Chunk ist das, was der # Nutzer VOR dem ersten Bild lädt. Er lag bei 220 kB gzip, weil das eifrig # geladene Cockpit Recharts mitzog; dist lag bei 27 MB wegen eines verwaisten diff --git a/backend/routers/maintenance.py b/backend/routers/maintenance.py index 91b7af9..25af859 100644 --- a/backend/routers/maintenance.py +++ b/backend/routers/maintenance.py @@ -1,19 +1,28 @@ -"""Wartungs-Endpoints: Update-Badge, OS-/Engine-Update, Reboot, Restart, Logs.""" +"""Wartungs-Endpoints: Update-Badge, OS-/Engine-Update, Reboot, Restart, Logs. -from fastapi import APIRouter, Header, HTTPException +v3-Umbau P1 (28.08.2026): Das Sudo-Passwort ist hier ersatzlos entfallen. Auf der Box +gemessen — `sudo -n true` läuft durch, weil `/etc/sudoers` den Dienst-Nutzer mit +`NOPASSWD: ALL` führt. Das Passwort wurde also nie gebraucht, lag aber im +`localStorage` des Browsers und reiste bei jedem mutierenden Request mit. Sollte die +sudoers-Zeile je fallen, meldet `services.maintenance` sauber `password_required` +statt still zu scheitern — das ist dann ein Konfigurations-Signal und nichts, was man +mit einem im Browser geparkten Geheimnis übertüncht. +""" + +from fastapi import APIRouter, HTTPException from pydantic import BaseModel -from services import maintenance +from services import geheimnisse, maintenance router = APIRouter(prefix="/api") -class SudoReq(BaseModel): - sudo_password: str | None = None - - class RestartReq(BaseModel): service: str - sudo_password: str | None = None + + +class GeheimnisReq(BaseModel): + schluessel: str + wert: str | None = None @router.get("/maintenance/updates") @@ -28,32 +37,32 @@ def update_details(kind: str) -> dict: return maintenance.update_details(kind) @router.post("/maintenance/check-updates") -def check_updates(body: SudoReq) -> dict: - res = maintenance.check_updates_job(body.sudo_password) +def check_updates() -> dict: + res = maintenance.check_updates_job() if isinstance(res, dict) and not res.get("ok", True): return res return res @router.post("/maintenance/os-update") -def os_update(body: SudoReq) -> dict: - res = maintenance.os_update_job(body.sudo_password) +def os_update() -> dict: + res = maintenance.os_update_job() if isinstance(res, dict) and not res.get("ok", True): return res return res @router.post("/maintenance/engine-update") -def engine_update(body: SudoReq) -> dict: - res = maintenance.engine_update_job(body.sudo_password) +def engine_update() -> dict: + res = maintenance.engine_update_job() if not res: raise HTTPException(400, "Kein Engine-Update-Befehl gesetzt (MC_ENGINE_UPDATE_CMD).") return res @router.post("/maintenance/swap-update") -def swap_update(body: SudoReq) -> dict: - res = maintenance.swap_update_job(body.sudo_password) +def swap_update() -> dict: + res = maintenance.swap_update_job() if not res: raise HTTPException(400, "Kein Router-Update-Befehl gesetzt (MC_SWAP_UPDATE_CMD).") return res @@ -65,20 +74,34 @@ def hermes_update() -> dict: @router.post("/maintenance/update-all") -def update_all(body: SudoReq) -> dict: - return maintenance.update_all_job(body.sudo_password) +def update_all() -> dict: + return maintenance.update_all_job() @router.post("/maintenance/reboot") -def reboot(body: SudoReq) -> dict: - return maintenance.reboot(body.sudo_password) +def reboot() -> dict: + return maintenance.reboot() @router.post("/maintenance/restart") def restart(body: RestartReq) -> dict: - return maintenance.restart_service(body.service, body.sudo_password) + return maintenance.restart_service(body.service) @router.get("/maintenance/logs") -def logs(service: str, lines: int = 200, x_sudo_password: str | None = Header(None)) -> dict: - return maintenance.logs(service, lines, x_sudo_password) +def logs(service: str, lines: int = 200) -> dict: + return maintenance.logs(service, lines) + + +@router.get("/maintenance/geheimnisse") +def geheimnisse_status() -> dict: + """Nur der Zustand — ob ein Token gesetzt ist, niemals sein Wert.""" + return geheimnisse.status() + + +@router.post("/maintenance/geheimnisse") +def geheimnisse_setzen(body: GeheimnisReq) -> dict: + """Setzt (oder löscht bei leerem Wert) ein Geheimnis in der Box-Ablage.""" + if not geheimnisse.setzen(body.schluessel, body.wert): + raise HTTPException(400, f"Geheimnis '{body.schluessel}' konnte nicht gespeichert werden.") + return {"ok": True, **geheimnisse.status()} diff --git a/backend/routers/models.py b/backend/routers/models.py index 5c28297..d7322e3 100644 --- a/backend/routers/models.py +++ b/backend/routers/models.py @@ -4,7 +4,7 @@ import psutil from config import HF_DOWNLOAD_ENV, MODELS_DIR from fastapi import APIRouter, HTTPException from pydantic import BaseModel -from services import budget, discover, hf, jobengine, llamaswap +from services import budget, discover, geheimnisse, hf, jobengine, llamaswap from services.fit import evaluate_fit, max_ctx_for router = APIRouter(prefix="/api") @@ -77,7 +77,9 @@ class InstallReq(BaseModel): quant: str = "Q4_K_M" ctx: int | None = None jinja: bool = False - hf_token: str | None = None + # Kein hf_token mehr im Request (v3-Umbau P1): der Token lag frueher im localStorage + # des Browsers und reiste hier mit. Jetzt liegt er auf der Box (services.geheimnisse) + # und wird unten von dort gelesen — die Oberflaeche sieht ihn nie wieder. @router.get("/hf/search") @@ -144,8 +146,8 @@ def install(req: InstallReq) -> dict: args.append(info["mmproj"]) args += ["--local-dir", str(target)] env = dict(HF_DOWNLOAD_ENV) - if req.hf_token: - env["HF_TOKEN"] = req.hf_token + if token := geheimnisse.hf_token(): + env["HF_TOKEN"] = token job_id = jobengine.start_job(args, f"download {req.repo}", env=env, on_done=_apply_role if role else None) jobengine.attach_download_progress(job_id, str(target), info["total_bytes"]) diff --git a/backend/services/geheimnisse.py b/backend/services/geheimnisse.py new file mode 100644 index 0000000..7cf4b96 --- /dev/null +++ b/backend/services/geheimnisse.py @@ -0,0 +1,100 @@ +"""Geheimnis-Ablage auf der Box (v3-Umbau P1). + +WARUM ES DAS GIBT: Bis zum 28.08.2026 lagen das Box-Sudo-Passwort und der +HuggingFace-Token im `localStorage` des Browsers und reisten bei jedem mutierenden +Request mit (Header `X-Sudo-Password` **und** im JSON-Rumpf). Da der Dienst-Nutzer +laut `/etc/sudoers` mit `NOPASSWD: ALL` läuft, wäre ein einziger XSS in der SPA +gleichbedeutend mit Root auf der Box gewesen. + +Das Sudo-Passwort ist ersatzlos entfallen — auf der Box gemessen: `sudo -n true` +läuft durch, es wurde also nie gebraucht. Bleibt der HF-Token; der liegt jetzt hier: +eine Datei neben den anderen `mc2-*.json` unter MODELS_DIR, Rechte 0600, und er wird +**nie** an den Browser zurückgegeben. Die Oberfläche erfährt nur, OB einer gesetzt ist. + +Absichtlich kein Verschlüsseln: Der Schlüssel müsste auf derselben Maschine liegen und +wäre damit Theater. Der Gewinn ist, dass das Geheimnis den Browser gar nicht erst +erreicht — nicht, dass die Datei unlesbar wäre. +""" + +import json +import logging +import os +from pathlib import Path + +from config import MODELS_DIR + +log = logging.getLogger(__name__) + +PFAD = Path(os.environ.get("MC_GEHEIMNISSE_PFAD", str(MODELS_DIR / "mc2-geheimnisse.json"))) + +# Was hier abgelegt werden darf. Neue Schlüssel bewusst eintragen — so kann ein +# fehlgeleiteter Request keine beliebigen Felder in die Datei schreiben. +ERLAUBT = frozenset({"hf_token"}) + + +def _lesen() -> dict[str, str]: + """Ganze Ablage. Fehlt die Datei (frische Box, Windows-Entwicklungsrechner ohne + /srv/models), ist das kein Fehler, sondern schlicht 'nichts gesetzt'.""" + try: + daten = json.loads(PFAD.read_text(encoding="utf-8")) + return {k: v for k, v in daten.items() if k in ERLAUBT and isinstance(v, str)} + except (OSError, ValueError): + return {} + + +def _schreiben(daten: dict[str, str]) -> bool: + """Atomar über eine Nachbardatei, damit ein Absturz mittendrin keine halbe Datei + hinterlässt. Rechte 0600 werden VOR dem Umbenennen gesetzt — sonst gäbe es ein + Zeitfenster, in dem das Geheimnis world-readable auf der Platte liegt.""" + try: + PFAD.parent.mkdir(parents=True, exist_ok=True) + tmp = PFAD.with_suffix(".json.tmp") + tmp.write_text(json.dumps(daten, indent=2, ensure_ascii=False), encoding="utf-8") + try: + os.chmod(tmp, 0o600) + except OSError: + pass # Windows kennt keine Unix-Rechte — lokal harmlos, auf der Box greift es + tmp.replace(PFAD) + return True + except OSError as exc: + log.warning("Geheimnis-Ablage nicht schreibbar (%s): %s", PFAD, exc) + return False + + +def hf_token() -> str | None: + """Der HF-Token für Modell-Downloads. Reihenfolge: Prozess-Env schlägt Datei — + so kann die systemd-Unit ihn setzen, ohne dass jemand die Oberfläche anfassen muss.""" + return os.environ.get("HF_TOKEN") or _lesen().get("hf_token") or None + + +def setzen(schluessel: str, wert: str | None) -> bool: + """Setzt oder löscht (wert=None oder leer) ein Geheimnis.""" + if schluessel not in ERLAUBT: + return False + daten = _lesen() + if wert: + daten[schluessel] = wert + else: + daten.pop(schluessel, None) + return _schreiben(daten) + + +def status() -> dict[str, bool]: + """Was die Oberfläche erfahren darf: nur, OB etwas gesetzt ist — nie der Wert. + `aus_env` sagt dem Nutzer, warum ein Löschen in der Oberfläche wirkungslos bliebe.""" + daten = _lesen() + return { + "hf_token_gesetzt": bool(daten.get("hf_token") or os.environ.get("HF_TOKEN")), + "hf_token_aus_env": bool(os.environ.get("HF_TOKEN")), + "schreibbar": _schreibbar(), + } + + +def _schreibbar() -> bool: + """Ehrlich melden, wenn die Ablage nicht beschreibbar ist (z. B. lokal auf Windows + ohne /srv/models) — sonst speichert die Oberfläche scheinbar erfolgreich ins Leere.""" + try: + PFAD.parent.mkdir(parents=True, exist_ok=True) + return os.access(PFAD.parent, os.W_OK) + except OSError: + return False diff --git a/backend/services/jobengine.py b/backend/services/jobengine.py index cfda835..ed93d6b 100644 --- a/backend/services/jobengine.py +++ b/backend/services/jobengine.py @@ -57,39 +57,29 @@ def _pump_output(job: dict, stream) -> None: commit() -def _run_job(job_id: str, args: list[str], env: dict | None = None, sudo_password: str | None = None): +def _run_job(job_id: str, args: list[str], env: dict | None = None): + """Job-Prozess starten und mitschreiben. + + v3-Umbau P1 (28.08.2026): Hier wurde frueher ein Sudo-Passwort aus dem Browser an + stdin gefuettert (und dafuer `sudo -n` in den Argumenten zu `sudo -S` umgeschrieben). + Auf der Box laeuft sudo passwortlos (`NOPASSWD: ALL`), der Pfad war tot. Ohne ihn + braucht der Prozess auch keine stdin-Pipe mehr: DEVNULL sorgt dafuer, dass ein Job, + der wider Erwarten nach einem Passwort fragt, sofort scheitert statt still zu haengen.""" job = JOBS[job_id] job["state"] = "running" try: - actual_args = list(args) - if sudo_password is not None: - for i, arg in enumerate(actual_args): - if isinstance(arg, str): - actual_args[i] = arg.replace("sudo -n", "sudo -S").replace("sudo ", "sudo -S ") - proc = subprocess.Popen( - actual_args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, - stdin=subprocess.PIPE if sudo_password is not None else None, + list(args), stdout=subprocess.PIPE, stderr=subprocess.STDOUT, + stdin=subprocess.DEVNULL, bufsize=0, env={**os.environ, **(env or {})}, ) _PROCS[job_id] = proc - if sudo_password is not None and proc.stdin: - proc.stdin.write((sudo_password + "\n").encode("utf-8")) - proc.stdin.flush() - proc.stdin.close() - _pump_output(job, proc.stdout) proc.wait() job["returncode"] = proc.returncode job["state"] = "canceled" if job.get("canceled") else ("done" if proc.returncode == 0 else "failed") - - # Check if failed due to sudo authorization failure - if proc.returncode != 0 and job["log"]: - log_str = "\n".join(job["log"]) - if "a password is required" in log_str or "password" in log_str.lower() or "sudo:" in log_str: - job["sudo_failed"] = True except Exception as exc: _append_log(job, f"[mc] Fehler: {exc}") job["state"] = "failed" @@ -148,9 +138,8 @@ def attach_download_progress(job_id: str, local_dir: str, total_bytes: int) -> N def start_job(args: list[str], label: str, env: dict | None = None, on_done=None, - sudo_password: str | None = None, group: str | None = None) -> str: + group: str | None = None) -> str: job_id = uuid.uuid4().hex[:12] - # Mask password in log if present in args log_args = list(args) JOBS[job_id] = { "id": job_id, "label": label, "state": "queued", "group": group, @@ -159,7 +148,7 @@ def start_job(args: list[str], label: str, env: dict | None = None, on_done=None } if on_done: JOBS[job_id]["_on_done"] = on_done - threading.Thread(target=_run_job, args=(job_id, args, env, sudo_password), daemon=True).start() + threading.Thread(target=_run_job, args=(job_id, args, env), daemon=True).start() return job_id diff --git a/backend/services/maintenance.py b/backend/services/maintenance.py index 7a0f95c..9ec3e0e 100644 --- a/backend/services/maintenance.py +++ b/backend/services/maintenance.py @@ -1,802 +1,801 @@ -""" -Wartung: Updates (OS/Engine/Modelle), Dienst-Neustart (system- vs user-aware), -Reboot, Logs. Portiert/modernisiert aus Mission Control v1 (routers/maintenance.py). - -Passwortfrei über NOPASSWD-Whitelist (sudo -n). OS-Update/Reboot brauchen einmalig -erweiterte sudoers (siehe docs/BEDIENUNG.md). Lange Ops laufen als jobengine-Job. -""" - -import os -import re -import subprocess -import time -from datetime import datetime - -import httpx -import psutil - -from services import catalog, discover, jobengine, llamaswap, system - -# System-Dienste (root, via sudo -n NOPASSWD) vs. User-Dienste (systemctl --user). -SYSTEM_SERVICES = {"llama-swap"} -USER_SERVICES = {"mission-control-2", "mc2-gateway", "mc2-steward", "box-console", - "hermes-gateway", "hermes-builtin-ui", "voice-service"} - -# Engine-Update: lädt den neuesten Vulkan-Build (deploy/update-engine.sh, läuft als root). -_REPO_ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..")) -ENGINE_UPDATE_CMD = os.environ.get( - "MC_ENGINE_UPDATE_CMD", f"sudo bash {_REPO_ROOT}/deploy/update-engine.sh") -# Engine = offizieller Vulkan-Build von ggml-org/llama.cpp (RADV auf Strix Halo). -ENGINE_PATH = os.environ.get("MC_ENGINE_PATH", "/opt/llamacpp-vulkan") -ENGINE_REPO = os.environ.get("MC_ENGINE_REPO", "ggml-org/llama.cpp") -_engine_cache = {"ts": 0.0, "avail": False} - -# Neueste Release, die WIRKLICH ein Vulkan-x64-Binary trägt. Die allerneueste Release hat -# manchmal noch keine CI-Assets (0 Assets) → ihr Download-Link 404t. Sowohl der Update-Check -# als auch der Download (update-engine.sh) müssen daher die neueste ASSET-tragende Release -# nehmen, sonst zeigt das UI „Update verfügbar", das dann beim Einspielen scheitert. -_ENGINE_ASSET_RX = re.compile(r"ubuntu-vulkan-x64\.tar\.gz$", re.IGNORECASE) - - -def _latest_engine_asset_release() -> dict | None: - try: - rels = httpx.get(f"https://api.github.com/repos/{ENGINE_REPO}/releases?per_page=15", - timeout=8, headers={"User-Agent": "MissionControl2"}).json() - for rel in (rels if isinstance(rels, list) else []): - if any(_ENGINE_ASSET_RX.search(a.get("name", "")) for a in (rel.get("assets") or [])): - return rel - except Exception: - pass - return None - -# Router = llama-swap (mostlygeek): proxyt Anfragen und wechselt die Modelle heiß. Eigenes -# Upstream-Projekt mit eigenem Release-Zyklus → getrennt von der Engine geführt. -SWAP_UPDATE_CMD = os.environ.get( - "MC_SWAP_UPDATE_CMD", f"sudo bash {_REPO_ROOT}/deploy/update-swap.sh") -SWAP_BIN = os.environ.get("MC_SWAP_BIN", "/usr/local/bin/llama-swap") -SWAP_REPO = os.environ.get("MC_SWAP_REPO", "mostlygeek/llama-swap") -_swap_cache = {"ts": 0.0, "avail": False} - -# Stack-Funktionsprüfung NACH jedem Update (OS/Engine/Router): verifiziert per echter -# Inferenz, dass der Stack noch läuft → Job wird rot, wenn ein Update etwas zerschossen hat. -STACK_POSTCHECK = os.path.join(_REPO_ROOT, "deploy", "stack-postcheck.sh") - - -def _installed_engine_build() -> int | None: - """Build-Nummer der installierten llama-server-Binary (z.B. 9821), oder None. - Vulkan-Build braucht LD_LIBRARY_PATH=ENGINE_PATH zum Start von --version.""" - bin_path = os.path.join(ENGINE_PATH, "llama-server") - if not os.path.exists(bin_path): - return None - try: - env = dict(os.environ, LD_LIBRARY_PATH=ENGINE_PATH) - out = subprocess.run([bin_path, "--version"], capture_output=True, text=True, - timeout=20, env=env) - txt = (out.stderr or "") + (out.stdout or "") - # Formate je nach Build: "version: 0.1.0-dev (build 10426, ...)", "version: 9821 (hash)", "build: (9821)", "b9821". - if (m := re.search(r"\bbuild\s+(\d{3,})\b", txt)) \ - or (m := re.search(r"version:\s*(\d{3,})", txt)) \ - or (m := re.search(r"build:\s*\S+\s*\((\d+)\)", txt)) \ - or (m := re.search(r"\bb(\d{3,})\b", txt)): - return int(m.group(1)) - except Exception: - return None - return None - - -def _ram_gb() -> float: - return psutil.virtual_memory().total / (1024 ** 3) - - -def _os_upgradable() -> int: - try: - # LC_ALL=C erzwingt englische apt-Ausgabe ("[upgradable from: ...]") — sonst zählt - # grep auf einer deutschen Box ("[aktualisierbar von:]") nichts und meldet faelschlich 0. - out = subprocess.run( - ["bash", "-c", "LC_ALL=C apt list --upgradable 2>/dev/null | grep -c upgradable || true"], - capture_output=True, text=True, timeout=10) - return int((out.stdout or "0").strip() or 0) - except Exception: - return 0 - - -def _engine_update_available() -> bool: - now = time.time() - if now - _engine_cache["ts"] < 3600: - return _engine_cache["avail"] - avail = False - try: - rel = _latest_engine_asset_release() or {} - tag = str(rel.get("tag_name", "")) - latest = int(m.group(1)) if (m := re.search(r"(\d{3,})", tag)) else None - installed = _installed_engine_build() - if latest is not None and installed is not None: - avail = latest > installed # präziser Build-Nummer-Vergleich - elif rel.get("published_at"): # Fallback: Release-Datum vs. Engine-mtime - pub = datetime.fromisoformat(rel["published_at"].replace("Z", "+00:00")).timestamp() - avail = pub > os.path.getmtime(ENGINE_PATH) + 86400 - except Exception: - avail = False - _engine_cache.update(ts=now, avail=avail) - return avail - - -def _installed_swap_version() -> int | None: - """Versions-Nummer der installierten llama-swap-Binary (z.B. 228), oder None.""" - if not os.path.exists(SWAP_BIN): - return None - try: - out = subprocess.run([SWAP_BIN, "--version"], capture_output=True, text=True, timeout=15) - txt = (out.stdout or "") + (out.stderr or "") - if (m := re.search(r"version:\s*(\d+)", txt)) or (m := re.search(r"\bv?(\d{2,})\b", txt)): - return int(m.group(1)) - except Exception: - return None - return None - - -def _swap_update_available() -> bool: - now = time.time() - if now - _swap_cache["ts"] < 3600: - return _swap_cache["avail"] - avail = False - try: - rel = httpx.get(f"https://api.github.com/repos/{SWAP_REPO}/releases/latest", - timeout=6, headers={"User-Agent": "MissionControl2"}).json() - tag = str(rel.get("tag_name", "")) - latest = int(m.group(1)) if (m := re.search(r"(\d{2,})", tag)) else None - installed = _installed_swap_version() - if latest is not None and installed is not None: - avail = latest > installed - except Exception: - avail = False - _swap_cache.update(ts=now, avail=avail) - return avail - - -_comp_cache = {"ts": 0.0, "data": []} - - -def _hermes_agent_update() -> dict: - """Hermes-Agent wird aus **git** aktualisiert (CLI `hermes update` = git pull origin ). - Darum HEAD vs. origin/ prüfen (fetch + behind-count) — NICHT GitHub-Releases: die - werden selten getaggt, main läuft ihnen voraus → sonst zeigt das UI nie ein Update an.""" - info = {"key": "hermes_agent", "name": "Hermes Agent", "current": None, - "latest": None, "update": False, "reachable": None} - git = system.find_hermes_agent_git() - if not git or not git.get("path"): - return info - path = git["path"] - info["current"] = git.get("hash") - try: - branch = (subprocess.run(["git", "-C", path, "rev-parse", "--abbrev-ref", "HEAD"], - capture_output=True, text=True, timeout=8).stdout.strip() or "main") - fetch = subprocess.run(["git", "-C", path, "fetch", "-q", "origin", branch], - capture_output=True, text=True, timeout=25) - info["reachable"] = (fetch.returncode == 0) - if fetch.returncode == 0: - cnt = subprocess.run(["git", "-C", path, "rev-list", "--count", f"HEAD..origin/{branch}"], - capture_output=True, text=True, timeout=8) - behind = int(cnt.stdout.strip() or "0") if cnt.returncode == 0 else 0 - info["behind"] = behind - info["update"] = behind > 0 - oh = subprocess.run(["git", "-C", path, "rev-parse", "--short", f"origin/{branch}"], - capture_output=True, text=True, timeout=8).stdout.strip() - info["latest"] = (f"{oh} ({behind} neu)" if behind else (oh or info["current"])) - except Exception: - info["reachable"] = False - return info - - -def _components_cached() -> list[dict]: - """Update-Status von Hermes-Agent (1h-Cache → GitHub schonen).""" - now = time.time() - if now - _comp_cache["ts"] < 3600 and _comp_cache["data"]: - return _comp_cache["data"] - data = [_hermes_agent_update()] - _comp_cache.update(ts=now, data=data) - return data - - -def _params_of(m: dict) -> float: - """Größen-bewusste Parameterzahl eines installierten Modells: max aus Namens-Schätzung - und Dateigröße (fängt namenlose wie 'Qwen3-Coder-Next' UND Split-GGUFs ab).""" - from services.fit import QUANT_BYTES_PER_PARAM - caps = m.get("capabilities") or {} - bpp = QUANT_BYTES_PER_PARAM.get((m.get("quant") or "Q4_K_M").upper(), 0.55) - size_gb = (m.get("size_bytes") or 0) / (1024 ** 3) - pb_size = (size_gb / bpp) if size_gb > 1.0 else 0.0 - return max(float(caps.get("params_b") or 0), pb_size, 0.0) - - -# Familien-Subtyp + Generations-Version aus dem Modellnamen (für „echtes Upgrade?"). -_FAM_PATS = (("qwen", r"qwen(\d+(?:\.\d+)?)"), ("gemma", r"gemma[-_ ]?(\d+(?:\.\d+)?)"), - ("llama", r"llama[-_ ]?(\d+(?:\.\d+)?)"), ("phi", r"phi[-_ ]?(\d+(?:\.\d+)?)"), - ("mistral", r"mistral"), ("hermes", r"hermes[-_ ]?(\d+(?:\.\d+)?)")) - - -def _gen_key(name: str): - """(Familie+Subtyp, Generations-Version) oder None. Z.B. 'Qwen3-VL-2B' → ('qwen-vl', 3.0), - 'Qwen2.5-VL-7B' → ('qwen-vl', 2.5). Nur gleiche Familie ist sinnvoll vergleichbar.""" - low = (name or "").lower() - sub = "-vl" if any(k in low for k in ("-vl", "vl-", "vision", "llava", "pixtral")) else \ - "-coder" if ("coder" in low or "-code" in low) else "" - for fam, pat in _FAM_PATS: - m = re.search(pat, low) - if m: - ver = float(m.group(1)) if (m.groups() and m.group(1)) else 0.0 - return (fam + sub, ver) - return None - - -def _meta(name: str, model_dict: dict | None = None, im: dict | None = None) -> dict: - """Metadaten (family, gen, total, active, moe) — bevorzugt den kuratierten Katalog, - sonst die Felder eines Discover-/Modell-Dicts, sonst Namens-/Größen-Heuristik.""" - cm = catalog.meta_for_name(name) - if cm: - return {"family": cm.get("family"), "gen": cm.get("generation"), - "total": float(cm.get("total_params_b") or 0), - "active": cm.get("active_params_b"), "moe": bool(cm.get("moe"))} - d = model_dict or {} - g = _gen_key(name) - total = float(d.get("params_b") or 0) or (_params_of(im) if im else 0.0) - return {"family": (d.get("family") or (g[0] if g else None)), - "gen": (d.get("generation") if d.get("generation") is not None else (g[1] if g else None)), - "total": total, "active": d.get("active_b"), "moe": bool(d.get("moe"))} - - -def model_upgrades() -> list[dict]: - """Je Rolle ein ECHTES Upgrade — nur wenn die Empfehlung wirklich besser ist: - gleiche Familie UND (neuere Generation ODER deutlich größer) UND kein Tempo-Downgrade - (MoE-first für die bandbreiten-limitierte Box: dense ersetzt MoE nur bei großem Wissens- - Sprung). Metadaten kommen aus dem kuratierten Katalog → keine Namens-Raterei.""" - disc = discover.safe_discover(_ram_gb()) - if not disc: - return [] - - installed = llamaswap.list_models() - inst_by_role = {m["role"]: m for m in installed if m.get("role")} - cmds = " ".join(str(s.get("cmd", "")).lower() - for s in (llamaswap.read_config().get("models") or {}).values()) - out = [] - - for c in disc.get("categories", []): - role = c["role"] - im = inst_by_role.get(role) - if im is None: - continue - rec = c.get("recommended") - if not rec: - continue - rec_model = next((x for x in c.get("models", []) if x.get("repo") == rec), None) - - i = _meta(im["name"], im=im) - r = _meta(rec, model_dict=rec_model) - - if not i["family"] or not r["family"] or i["family"] != r["family"]: - continue # andere/unbekannte Familie → kein Upgrade - if r["gen"] is not None and i["gen"] is not None and r["gen"] < i["gen"] - 1e-6: - continue # ältere Generation → niemals - same_gen = (r["gen"] is None or i["gen"] is None or abs(r["gen"] - i["gen"]) < 1e-6) - if same_gen: - if r["total"] and i["total"] and r["total"] < i["total"] * 1.05: - continue # gleiche Gen, nicht größer → kein Upgrade - # MoE-first: ein MoE durch dense ersetzen nur bei deutlichem Wissens-Sprung - if i["moe"] and not r["moe"] and r["total"] < i["total"] * 1.5: - continue - # Tempo nicht verschlechtern (aktive Params), außer großer Wissens-Gewinn - ia, ra = (i["active"] or i["total"]), (r["active"] or r["total"]) - if ia and ra > ia * 1.3 and r["total"] < i["total"] * 1.3: - continue - - base = rec.split("/")[-1].lower() - stem = base.removesuffix("-gguf") - if base in cmds or (stem and stem in cmds): - continue # schon installiert - out.append({"role": role, "title": c["title"], "repo": rec}) - return out - - -def _last_apt_update() -> float | None: - for path in ["/var/lib/apt/periodic/update-success-stamp", "/var/cache/apt/pkgcache.bin"]: - if os.path.exists(path): - try: - return os.path.getmtime(path) - except Exception: - pass - return None - - -def updates() -> dict: - ups = model_upgrades() - return {"os": _os_upgradable(), "engine": 1 if _engine_update_available() else 0, - "swap": 1 if _swap_update_available() else 0, - "models": len(ups), "model_list": ups, "last_check": _last_apt_update(), - "components": _components_cached()} - - -# ── Update-Details (was genau wird aktualisiert) — on-demand beim Öffnen des Fensters ── - -def _os_held_back() -> list[dict]: - """Pakete, die apt aktuell NICHT einspielt, obwohl es sie gäbe — mit ehrlichem Grund. - Zwei Fälle, aus `apt-get -s upgrade` (Simulation) gelesen: - • Phasen-Rollout (Ubuntu staffelt Updates prozentual aus) → 'deferred due to phasing'. - • zurückgehalten wegen neuer Abhängigkeiten → 'kept back'. - Beides ist normal und löst sich von selbst — verhindert nur das 'hängt fest'-Gefühl, - wenn nach 'Fertig' noch aktualisierbare Pakete übrig scheinen.""" - held: list[dict] = [] - sections = { - "The following upgrades have been deferred due to phasing:": "phasing", - "The following packages have been kept back:": "kept_back", - } - try: - out = subprocess.run( - ["bash", "-c", "LC_ALL=C apt-get -s upgrade 2>/dev/null"], - capture_output=True, text=True, timeout=25) - reason: str | None = None - for line in (out.stdout or "").splitlines(): - hdr = sections.get(line.strip()) - if hdr: # Abschnitts-Kopf → folgende Zeilen sammeln - reason = hdr - continue - if reason and line.startswith((" ", "\t")): # eingerückt = Paketnamen des Abschnitts - for name in line.split(): - held.append({"name": name, "reason": reason}) - elif reason: # nicht eingerückt → Abschnitt zu Ende - reason = None - except Exception: - pass - held.sort(key=lambda p: p["name"]) - return held - - -def os_update_details() -> dict: - """Liste der aktualisierbaren apt-Pakete (Name, installiert → Kandidat) + ehrliche - Anzeige der vom System zurückgestellten Pakete (Phasen-Rollout / kept back).""" - out_pkgs: list[dict] = [] - try: - # LC_ALL=C → englische Ausgabe, damit der Regex "[upgradable from: ...]" greift - # (deutsche Box meldet sonst "[aktualisierbar von:]" und die Liste bliebe leer). - out = subprocess.run(["bash", "-c", "LC_ALL=C apt list --upgradable 2>/dev/null"], - capture_output=True, text=True, timeout=20) - for line in (out.stdout or "").splitlines(): - # Format: name/repo neue_version arch [upgradable from: alte_version] - m = re.match(r"^([^/\s]+)/\S+\s+(\S+)\s+\S+\s+\[upgradable from:\s*([^\]]+)\]", - line.strip()) - if m: - out_pkgs.append({"name": m.group(1), "candidate": m.group(2), - "current": m.group(3).strip()}) - out_pkgs.sort(key=lambda p: p["name"]) - return {"kind": "os", "count": len(out_pkgs), "packages": out_pkgs, - "held_back": _os_held_back()} - except Exception as exc: - return {"kind": "os", "count": len(out_pkgs), "packages": out_pkgs, "error": str(exc)} - - -def engine_update_details() -> dict: - """Installierte vs. neueste Engine-Build-Nummer + Release-Name/-Notizen/-Link.""" - info: dict = {"kind": "engine", "installed_build": _installed_engine_build(), - "latest_build": None, "latest_tag": None, "name": None, - "url": None, "body": None} - try: - rel = _latest_engine_asset_release() or {} - tag = str(rel.get("tag_name", "")) - info["latest_tag"] = tag - info["latest_build"] = int(m.group(1)) if (m := re.search(r"(\d{3,})", tag)) else None - info["name"] = rel.get("name") or tag - info["url"] = rel.get("html_url") - body = (rel.get("body") or "").strip() - info["body"] = body[:2000] if body else None - # Nur zusammenfassen, wenn wirklich ein neuerer Build ansteht (spart einen LLM-Call, - # wenn das Modal bei aktuellem Stand geöffnet wird). - if body and info["latest_build"] and info["installed_build"] \ - and info["latest_build"] > info["installed_build"]: - ctx = ("Es geht um ein Update der Inferenz-Engine llama.cpp (Vulkan-Build, treibt alle " - "Sprachmodelle der Box auf der AMD-Strix-Halo-GPU).") - info.update(_summarize_release("engine", tag, ctx, body[:6000])) - except Exception as exc: - info["error"] = str(exc) - return info - - -def swap_update_details() -> dict: - """Installierte vs. neueste llama-swap-Version + Release-Name/-Notizen/-Link.""" - info: dict = {"kind": "swap", "installed_build": _installed_swap_version(), - "latest_build": None, "latest_tag": None, "name": None, - "url": None, "body": None} - try: - rel = httpx.get(f"https://api.github.com/repos/{SWAP_REPO}/releases/latest", - timeout=8, headers={"User-Agent": "MissionControl2"}).json() - tag = str(rel.get("tag_name", "")) - info["latest_tag"] = tag - info["latest_build"] = int(m.group(1)) if (m := re.search(r"(\d{2,})", tag)) else None - info["name"] = rel.get("name") or tag - info["url"] = rel.get("html_url") - body = (rel.get("body") or "").strip() - info["body"] = body[:2000] if body else None - if body and info["latest_build"] and info["installed_build"] \ - and info["latest_build"] > info["installed_build"]: - ctx = ("Es geht um ein Update von llama-swap (der Router, der Anfragen an die Box " - "verteilt und Sprachmodelle heiß nachlädt).") - info.update(_summarize_release("swap", tag, ctx, body[:6000])) - except Exception as exc: - info["error"] = str(exc) - return info - - -# LLM-Zusammenfassung anstehender Updates in Lucys Stimme (die Box liest ihre Release-Notes -# selbst). Jede Zusammenfassung beginnt mit einem klaren Aktions-Verdikt für den Besitzer -# (kein Entwickler): "Musst du etwas tun? NEIN — das Fangnetz regelt das / JA: …". -# Gecacht je Komponente auf den neuesten Commit-Hash/Release-Tag — das Modal darf beliebig -# oft geöffnet werden, ohne das Modell jedes Mal neu zu befragen. -_relnotes_caches: dict = {"hermes": {}, "engine": {}, "swap": {}} - -# Erste Zeile jeder Modell-Antwort: "AKTION: NEIN" oder "AKTION: JA — ". -# Toleriert Markdown-Deko (**fett**, Bullet, Überschrift), die 'fast' gern einstreut. -_ACTION_RX = re.compile( - r"^[\s*_>#\-]*AKTION:?\s*\**\s*(JA|NEIN)\b[\s—:,.\-*_]*(.*?)[\s*_]*$", re.IGNORECASE) - - -def _summarize_release(kind: str, key: str, context: str, changes: str) -> dict: - """Fasst Release-Notes/Commits in Lucys Stimme zusammen und trennt das Aktions-Verdikt - ab. Rückgabe: {summary, action_needed, action_text}. Cache je Komponente auf `key`.""" - empty = {"summary": "", "action_needed": None, "action_text": ""} - if not key: - return empty - cache = _relnotes_caches.setdefault(kind, {}) - if cache.get("key") == key and cache.get("data"): - return cache["data"] - from config import LLAMA_SWAP_URL - prompt = ( - "Du bist Lucy, die Stimme einer lokalen AI-Box, und erklärst dem Besitzer (KEIN Entwickler, " - "fasst nie eine Konsole an) ein anstehendes Update ruhig und verständlich.\n" - f"{context}\n\n" - "Anstehende Änderungen:\n" + changes + "\n\n" - "Antworte auf DEUTSCH, knapp und klar. HALTE DICH GENAU an dieses Format:\n" - "Zeile 1 ist das Aktions-Verdikt und beginnt mit 'AKTION: ':\n" - " • 'AKTION: NEIN' — wenn der Besitzer nichts tun muss (die Box spielt es selbst ein, das " - "Fangnetz prüft danach automatisch und rollt bei Problemen von allein zurück). Das ist der " - "Normalfall.\n" - " • 'AKTION: JA — ' — NUR wenn er wirklich selbst " - "handeln muss.\n" - "Danach maximal 5 kurze Stichpunkte (je mit '- '), Wichtigstes zuerst: Breaking Changes oder " - "geänderte/entfernte Config-Schlüssel ZUERST und mit '⚠️' markiert, dann was unser Setup " - "betrifft, dann lohnende neue Features. Keine Einleitung, keine Überschrift." - ) - try: - r = httpx.post(f"{LLAMA_SWAP_URL}/v1/chat/completions", timeout=90.0, json={ - "model": "fast", "max_tokens": 550, "temperature": 0.2, - "chat_template_kwargs": {"enable_thinking": False}, - "messages": [{"role": "user", "content": prompt}], - }) - r.raise_for_status() - resp = r.json() - choice = (resp.get("choices") or [{}])[0] - text = ((choice.get("message") or {}).get("content") or "").strip() - finish_reason = choice.get("finish_reason") or "" - - # finish_reason == "length" → Antwort wurde wegen Token-Limits abgeschnitten → - # letzten (unvollständigen) Stichpunkt entfernen. Bei "stop"/None → vollständig. - if finish_reason == "length" and text: - head, _, _tail = text.rpartition("\n") - text = head if head else "" - - # Aktions-Verdikt herauslösen (strukturiertes Feld fürs UI). Normalerweise Zeile 1, - # aber tolerant: erste passende Zeile suchen (Modell startet manchmal mit Leerzeile). - action_needed: bool | None = None - action_text = "" - lines = text.splitlines() - for idx, ln in enumerate(lines): - if m := _ACTION_RX.match(ln): - action_needed = m.group(1).upper() == "JA" - action_text = (m.group(2) or "").strip() - text = "\n".join(lines[:idx] + lines[idx + 1:]).strip() - break - - data = {"summary": text, "action_needed": action_needed, "action_text": action_text} - if text: - cache.update(key=key, data=data) - return data - except Exception as exc: - return {"summary": f"(Zusammenfassung nicht verfügbar: {exc})", - "action_needed": None, "action_text": ""} - - -def _summarize_hermes_commits(commits: list[dict]) -> dict: - subjects = "\n".join(f"- {c['subject']}" for c in commits[:100]) - context = ("Es geht um ein Update des Hermes-Agenten (das Gehirn/Werkzeug-System der Box auf " - "Strix Halo; genutzt werden: api_server/Gateway, memory-provider-Plugin 'mc2-memory', " - "terminal-/web-Tools, approvals, cron).") - return _summarize_release("hermes", commits[0]["hash"] if commits else "", context, subjects) - - -def hermes_update_details() -> dict: - """Commits, die ein Hermes-Update einspielen würde (HEAD..origin/) + LLM-Zusammenfassung.""" - info: dict = {"kind": "hermes", "branch": None, "behind": 0, "commits": []} - git = system.find_hermes_agent_git() - if not git or not git.get("path"): - info["error"] = "Hermes-Agent-Repo nicht gefunden." - return info - path = git["path"] - try: - branch = (subprocess.run(["git", "-C", path, "rev-parse", "--abbrev-ref", "HEAD"], - capture_output=True, text=True, timeout=8).stdout.strip() or "main") - info["branch"] = branch - subprocess.run(["git", "-C", path, "fetch", "-q", "origin", branch], - capture_output=True, text=True, timeout=25) - log = subprocess.run(["git", "-C", path, "log", "--pretty=format:%h\x1f%s\x1f%cr", - f"HEAD..origin/{branch}"], capture_output=True, text=True, timeout=10) - commits = [] - for line in (log.stdout or "").splitlines(): - parts = line.split("\x1f") - if len(parts) == 3: - commits.append({"hash": parts[0], "subject": parts[1], "when": parts[2]}) - info["commits"] = commits - info["behind"] = len(commits) - if commits: - info.update(_summarize_hermes_commits(commits)) - except Exception as exc: - info["error"] = str(exc) - return info - - -def update_details(kind: str) -> dict: - return {"os": os_update_details, "engine": engine_update_details, - "swap": swap_update_details, - "hermes": hermes_update_details}.get(kind, lambda: {"error": "unbekannt"})() - - -def _run(cmd: list[str], sudo_password: str | None = None) -> dict: - actual_cmd = list(cmd) - has_sudo = False - - if cmd and cmd[0] == "sudo": - has_sudo = True - # If we have a password, use -S instead of -n - if sudo_password is not None: - if "-n" in actual_cmd: - actual_cmd = [x for x in actual_cmd if x != "-n"] - if "-S" not in actual_cmd: - actual_cmd.insert(1, "-S") - else: - # Force -n to fail cleanly if password is required - if "-S" in actual_cmd: - actual_cmd = [x for x in actual_cmd if x != "-S"] - if "-n" not in actual_cmd: - actual_cmd.insert(1, "-n") - - try: - input_data = (sudo_password + "\n") if (has_sudo and sudo_password is not None) else None - p = subprocess.run(actual_cmd, input=input_data, capture_output=True, text=True, timeout=120) - - err_msg = p.stderr or "" - if p.returncode != 0 and ("a password is required" in err_msg or "password" in err_msg.lower() or "sudo:" in err_msg): - if sudo_password is not None: - return {"ok": False, "status": "incorrect_password", "out": p.stdout or "", "err": "Falsches Sudo-Passwort."} - return {"ok": False, "status": "password_required", "out": p.stdout or "", "err": "Sudo-Passwort erforderlich."} - - return {"ok": p.returncode == 0, "out": (p.stdout or "")[-4000:], "err": (p.stderr or "")[-2000:]} - except Exception as exc: - return {"ok": False, "out": "", "err": str(exc)} - - -def check_sudo_needs_password(sudo_password: str | None = None) -> dict | None: - """Checks if sudo needs a password. Returns error dict if password required/incorrect, else None.""" - res = _run(["sudo", "true"], sudo_password=sudo_password) - if not res["ok"]: - return res - return None - - -def restart_service(name: str, sudo_password: str | None = None) -> dict: - if name in SYSTEM_SERVICES: - if err := check_sudo_needs_password(sudo_password): - return err - return _run(["sudo", "systemctl", "restart", name], sudo_password=sudo_password) - if name in USER_SERVICES: - return _run(["systemctl", "--user", "restart", name]) - return {"ok": False, "err": f"Dienst '{name}' nicht erlaubt."} - - -def logs(service: str, lines: int = 200, sudo_password: str | None = None) -> dict: - lines = max(1, min(lines, 1000)) - if service in USER_SERVICES: - r = _run(["journalctl", "--user", "-u", service, "-n", str(lines), "--no-pager"]) - return {"ok": r["ok"], "text": r["out"] or r["err"]} - if service in SYSTEM_SERVICES: - # Journal-Lesen braucht i.d.R. KEIN sudo (User ist in Gruppe adm/systemd-journal). - # Erst ohne sudo versuchen; nur bei fehlenden Rechten auf sudo zurückfallen. - r = _run(["journalctl", "-u", service, "-n", str(lines), "--no-pager"]) - if r["ok"]: - return {"ok": True, "text": r["out"] or "(keine Log-Einträge)"} - if err := check_sudo_needs_password(sudo_password): - return err - r = _run(["sudo", "journalctl", "-u", service, "-n", str(lines), "--no-pager"], - sudo_password=sudo_password) - return {"ok": r["ok"], "text": r["out"] or r["err"]} - return {"ok": False, "text": "", "err": "Dienst nicht erlaubt."} - -def check_updates_job(sudo_password: str | None = None) -> dict: - if err := check_sudo_needs_password(sudo_password): - return err - - def on_done(): - _engine_cache.update(ts=0.0, avail=False) - _comp_cache.update(ts=0.0, data=[]) # Hermes-Status ebenfalls neu berechnen lassen - - cmd = "sudo apt-get update" - job_id = jobengine.start_job(["bash", "-c", cmd], "Nach Updates suchen", on_done=on_done, sudo_password=sudo_password) - return {"ok": True, "job_id": job_id} - - -def _maintenance_busy() -> dict | None: - """Wartungs-Riegel: nur EIN binär-/dienst-veränderndes Update gleichzeitig. Verhindert - Doppelklick UND parallele Updates aus zwei Tabs/Sessions (racende .bak-Sicherung/Restarts).""" - if j := jobengine.active_in_group("maintenance"): - return {"ok": False, "status": "busy", "running": j.get("label")} - return None - - -def os_update_job(sudo_password: str | None = None) -> dict: - if busy := _maintenance_busy(): - return busy - if err := check_sudo_needs_password(sudo_password): - return err - # Nach dem apt-Upgrade den Stack funktional prüfen (Job wird rot, wenn etwas kaputt ging). - # DEBIAN_FRONTEND wird INNERHALB von `sudo bash -c` gesetzt (nicht als `sudo VAR=… cmd`) — - # sonst lehnt sudos env-Policy die Variable ggf. ab und das Upgrade bricht ab. - cmd = ("sudo apt-get update && " - "sudo bash -c 'DEBIAN_FRONTEND=noninteractive apt-get upgrade -y' " - f"&& bash {STACK_POSTCHECK}") - job_id = jobengine.start_job(["bash", "-c", cmd], "OS-Update (apt)", - group="maintenance", sudo_password=sudo_password) - return {"ok": True, "job_id": job_id} - - -def engine_update_job(sudo_password: str | None = None) -> dict | None: - if not ENGINE_UPDATE_CMD: - return None - if busy := _maintenance_busy(): - return busy - # KEIN sudo-Passwort-Gate: update-engine.sh ist per sudoers NOPASSWD freigegeben - # (sudoers-mc2-autonomie) und läuft passwortlos. Das frühere `sudo true`-Gate hat das - # Update fälschlich blockiert, wenn (noch) kein Box-Passwort hinterlegt war. - - def on_done(): - _engine_cache.update(ts=0.0, avail=False) # Cache leeren → frischer Build-Vergleich - - # update-engine.sh sichert den alten Build, aktualisiert, startet llama-swap neu, prüft den - # Stack (stack-postcheck.sh) und rollt bei Fehler selbst zurück. Exit 0 nur bei verifiziertem - # neuen Build → on_done (Cache leeren) läuft nur dann; bei Rollback (Exit 1/2) bleibt das Badge. - job_id = jobengine.start_job(["bash", "-c", ENGINE_UPDATE_CMD], - "Engine-Update (llama.cpp Vulkan)", - group="maintenance", on_done=on_done) - return {"ok": True, "job_id": job_id} - - -def swap_update_job(sudo_password: str | None = None) -> dict | None: - if not SWAP_UPDATE_CMD: - return None - if busy := _maintenance_busy(): - return busy - # KEIN sudo-Passwort-Gate: update-swap.sh ist per sudoers NOPASSWD freigegeben (wie die Engine). - - def on_done(): - _swap_cache.update(ts=0.0, avail=False) # Cache leeren → frischer Versions-Vergleich - - # update-swap.sh sichert die alte Binary, aktualisiert, startet llama-swap neu, prüft den Stack - # (stack-postcheck.sh) und rollt bei Fehler selbst zurück. Exit 0 nur bei verifizierter neuer - # Version → on_done (Cache leeren) läuft nur dann; bei Rollback (Exit 1/2) bleibt das Badge. - job_id = jobengine.start_job(["bash", "-c", SWAP_UPDATE_CMD], - "Router-Update (llama-swap)", - group="maintenance", on_done=on_done) - return {"ok": True, "job_id": job_id} - - -def _hermes_update_cmd() -> str: - """Die komplette Hermes-Update-Befehlskette (Backup → Update → Doctor → UI-Build → - Neustarts → Postcheck) — geteilt von hermes_update_job und update_all_job.""" - git = system.find_hermes_agent_git() - path = (git or {}).get("path") or os.path.expanduser("~/.hermes/hermes-agent") - py = os.path.join(path, "venv", "bin", "python") - backup = os.path.join(_REPO_ROOT, "deploy", "backup.sh") - postcheck = os.path.join(_REPO_ROOT, "deploy", "hermes-postcheck.sh") - # Backup → Stop UI (verhindert Crash durch Löschen der Sourcen) → update → doctor → - # UI-Build mit MC2-Basepath (/hermes-ui/) → Gateway + UI-Neustart → Smoke-Test. - hui_web = os.path.join(path, "web") - hui_dist = os.path.join(path, "hermes_cli", "web_dist") - npm_path = os.path.expanduser("~/.hermes/node/bin") - - build_cmd = ( - f"if [ -d {hui_web} ]; then " - f"cd {hui_web} && PATH={npm_path}:$PATH npx --no-install vite build --base=/hermes-ui/ --outDir /tmp/h-build --emptyOutDir " - f"&& rm -rf {hui_dist} && cp -r /tmp/h-build {hui_dist}; fi" - ) - - # EHRLICHER Exit-Code (Lehre 08.07.): Die Dienste müssen auch bei einem GESCHEITERTEN - # Update wieder hochkommen (die UI wurde ja gestoppt) — aber der Job darf dann nicht - # grün sein. Früher schluckte das `;` vor dem Neustart jeden Update-Fehler: Job rc=0, - # Badge blieb, User sah „done aber nichts passiert" (Update scheiterte real an einem - # verwaisten .git/index.lock). Jetzt: RC festhalten, Dienste immer starten, RC melden. - return ("RC=0; " - f"bash {backup} || true; " - f"systemctl --user stop hermes-builtin-ui || true; " - f"{{ cd {path} && {py} -m hermes_cli.main update --yes " - f"&& {py} -m hermes_cli.main doctor " - f"&& {build_cmd}; }} || RC=1; " - f"systemctl --user reset-failed hermes-builtin-ui 2>/dev/null; " - f"systemctl --user restart hermes-gateway hermes-builtin-ui || RC=1; " - f"sleep 6; bash {postcheck} || RC=1; " - f"if [ $RC -ne 0 ]; then echo '✗ HERMES-UPDATE FEHLGESCHLAGEN (Dienste laufen wieder, aber alter Stand)'; fi; " - f"exit $RC") - - -def hermes_update_job() -> dict: - """Hermes-Agent aktualisieren wie die CLI (`hermes update` = git pull + Deps), danach - den Gateway neu starten. Davor ein Sicherheits-Backup (unser deploy/backup.sh). Kein sudo - (alles im User-Space). Läuft als Hintergrund-Job (kann ~1 Min dauern).""" - if busy := _maintenance_busy(): - return busy - - def on_done(): - _comp_cache.update(ts=0.0, data=[]) # Update-Status neu berechnen lassen - - job_id = jobengine.start_job(["bash", "-c", _hermes_update_cmd()], "Hermes-Agent-Update", - group="maintenance", on_done=on_done) - return {"ok": True, "job_id": job_id} - - -def update_all_job(sudo_password: str | None = None) -> dict: - """„Alle aktualisieren": kettet die AUSSTEHENDEN Updates sequenziell in EINEM Job — - Engine → Router → Hermes → OS. Bewusst nur Wiederverwendung: jeder Teil ist exakt der - Befehl des Einzel-Updates (mit eigenem Backup/Postcheck/Rollback). `&&`-Kette = bei - Fehler stoppt der Rest (das Log zeigt, wo). OS zuletzt, weil apt am breitesten eingreift; - es braucht als einziges das Box-Passwort — fehlt es, laufen die sudo-freien Teile trotzdem.""" - if busy := _maintenance_busy(): - return busy - upd = updates() - parts: list[tuple[str, str]] = [] - if upd.get("engine") and ENGINE_UPDATE_CMD: - parts.append(("Engine (llama.cpp)", ENGINE_UPDATE_CMD)) - if upd.get("swap") and SWAP_UPDATE_CMD: - parts.append(("Router (llama-swap)", SWAP_UPDATE_CMD)) - if any(c.get("update") is True for c in upd.get("components") or []): - parts.append(("Hermes-Agent", _hermes_update_cmd())) - os_pending = (upd.get("os") or 0) > 0 - if os_pending: - if err := check_sudo_needs_password(sudo_password): - # Ohne Passwort: OS auslassen statt alles zu blockieren — aber nur, wenn - # es überhaupt sudo-freie Teile gibt; sonst ehrlich das Passwort verlangen. - if not parts: - return err - os_pending = False - else: - parts.append(("OS (apt)", ( - "sudo apt-get update && " - "sudo bash -c 'DEBIAN_FRONTEND=noninteractive apt-get upgrade -y' " - f"&& bash {STACK_POSTCHECK}"))) - if not parts: - return {"ok": False, "status": "nothing", "detail": "Keine Updates ausstehend."} - - cmd = " && ".join( - f"(echo; echo '════════ [{i + 1}/{len(parts)}] {label} ════════'; {c})" - for i, (label, c) in enumerate(parts)) - if not os_pending: - cmd += f" && bash {STACK_POSTCHECK}" # Abschluss-Check, falls apt ihn nicht schon lieferte - - def on_done(): - _engine_cache.update(ts=0.0, avail=False) - _swap_cache.update(ts=0.0, avail=False) - _comp_cache.update(ts=0.0, data=[]) - - labels = " → ".join(label for label, _ in parts) - job_id = jobengine.start_job(["bash", "-c", cmd], f"Alle aktualisieren ({labels})", - group="maintenance", on_done=on_done, - sudo_password=sudo_password) - return {"ok": True, "job_id": job_id, "parts": [label for label, _ in parts]} - - -def reboot(sudo_password: str | None = None) -> dict: - if err := check_sudo_needs_password(sudo_password): - return err - return _run(["sudo", "reboot"], sudo_password=sudo_password) +""" +Wartung: Updates (OS/Engine/Modelle), Dienst-Neustart (system- vs user-aware), +Reboot, Logs. Portiert/modernisiert aus Mission Control v1 (routers/maintenance.py). + +Passwortfrei über NOPASSWD-Whitelist (sudo -n). OS-Update/Reboot brauchen einmalig +erweiterte sudoers (siehe docs/BEDIENUNG.md). Lange Ops laufen als jobengine-Job. +""" + +import os +import re +import subprocess +import time +from datetime import datetime + +import httpx +import psutil + +from services import catalog, discover, jobengine, llamaswap, system + +# System-Dienste (root, via sudo -n NOPASSWD) vs. User-Dienste (systemctl --user). +SYSTEM_SERVICES = {"llama-swap"} +USER_SERVICES = {"mission-control-2", "mc2-gateway", "mc2-steward", "box-console", + "hermes-gateway", "hermes-builtin-ui", "voice-service"} + +# Engine-Update: lädt den neuesten Vulkan-Build (deploy/update-engine.sh, läuft als root). +_REPO_ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..")) +ENGINE_UPDATE_CMD = os.environ.get( + "MC_ENGINE_UPDATE_CMD", f"sudo bash {_REPO_ROOT}/deploy/update-engine.sh") +# Engine = offizieller Vulkan-Build von ggml-org/llama.cpp (RADV auf Strix Halo). +ENGINE_PATH = os.environ.get("MC_ENGINE_PATH", "/opt/llamacpp-vulkan") +ENGINE_REPO = os.environ.get("MC_ENGINE_REPO", "ggml-org/llama.cpp") +_engine_cache = {"ts": 0.0, "avail": False} + +# Neueste Release, die WIRKLICH ein Vulkan-x64-Binary trägt. Die allerneueste Release hat +# manchmal noch keine CI-Assets (0 Assets) → ihr Download-Link 404t. Sowohl der Update-Check +# als auch der Download (update-engine.sh) müssen daher die neueste ASSET-tragende Release +# nehmen, sonst zeigt das UI „Update verfügbar", das dann beim Einspielen scheitert. +_ENGINE_ASSET_RX = re.compile(r"ubuntu-vulkan-x64\.tar\.gz$", re.IGNORECASE) + + +def _latest_engine_asset_release() -> dict | None: + try: + rels = httpx.get(f"https://api.github.com/repos/{ENGINE_REPO}/releases?per_page=15", + timeout=8, headers={"User-Agent": "MissionControl2"}).json() + for rel in (rels if isinstance(rels, list) else []): + if any(_ENGINE_ASSET_RX.search(a.get("name", "")) for a in (rel.get("assets") or [])): + return rel + except Exception: + pass + return None + +# Router = llama-swap (mostlygeek): proxyt Anfragen und wechselt die Modelle heiß. Eigenes +# Upstream-Projekt mit eigenem Release-Zyklus → getrennt von der Engine geführt. +SWAP_UPDATE_CMD = os.environ.get( + "MC_SWAP_UPDATE_CMD", f"sudo bash {_REPO_ROOT}/deploy/update-swap.sh") +SWAP_BIN = os.environ.get("MC_SWAP_BIN", "/usr/local/bin/llama-swap") +SWAP_REPO = os.environ.get("MC_SWAP_REPO", "mostlygeek/llama-swap") +_swap_cache = {"ts": 0.0, "avail": False} + +# Stack-Funktionsprüfung NACH jedem Update (OS/Engine/Router): verifiziert per echter +# Inferenz, dass der Stack noch läuft → Job wird rot, wenn ein Update etwas zerschossen hat. +STACK_POSTCHECK = os.path.join(_REPO_ROOT, "deploy", "stack-postcheck.sh") + + +def _installed_engine_build() -> int | None: + """Build-Nummer der installierten llama-server-Binary (z.B. 9821), oder None. + Vulkan-Build braucht LD_LIBRARY_PATH=ENGINE_PATH zum Start von --version.""" + bin_path = os.path.join(ENGINE_PATH, "llama-server") + if not os.path.exists(bin_path): + return None + try: + env = dict(os.environ, LD_LIBRARY_PATH=ENGINE_PATH) + out = subprocess.run([bin_path, "--version"], capture_output=True, text=True, + timeout=20, env=env) + txt = (out.stderr or "") + (out.stdout or "") + # Formate je nach Build: "version: 0.1.0-dev (build 10426, ...)", "version: 9821 (hash)", "build: (9821)", "b9821". + if (m := re.search(r"\bbuild\s+(\d{3,})\b", txt)) \ + or (m := re.search(r"version:\s*(\d{3,})", txt)) \ + or (m := re.search(r"build:\s*\S+\s*\((\d+)\)", txt)) \ + or (m := re.search(r"\bb(\d{3,})\b", txt)): + return int(m.group(1)) + except Exception: + return None + return None + + +def _ram_gb() -> float: + return psutil.virtual_memory().total / (1024 ** 3) + + +def _os_upgradable() -> int: + try: + # LC_ALL=C erzwingt englische apt-Ausgabe ("[upgradable from: ...]") — sonst zählt + # grep auf einer deutschen Box ("[aktualisierbar von:]") nichts und meldet faelschlich 0. + out = subprocess.run( + ["bash", "-c", "LC_ALL=C apt list --upgradable 2>/dev/null | grep -c upgradable || true"], + capture_output=True, text=True, timeout=10) + return int((out.stdout or "0").strip() or 0) + except Exception: + return 0 + + +def _engine_update_available() -> bool: + now = time.time() + if now - _engine_cache["ts"] < 3600: + return _engine_cache["avail"] + avail = False + try: + rel = _latest_engine_asset_release() or {} + tag = str(rel.get("tag_name", "")) + latest = int(m.group(1)) if (m := re.search(r"(\d{3,})", tag)) else None + installed = _installed_engine_build() + if latest is not None and installed is not None: + avail = latest > installed # präziser Build-Nummer-Vergleich + elif rel.get("published_at"): # Fallback: Release-Datum vs. Engine-mtime + pub = datetime.fromisoformat(rel["published_at"].replace("Z", "+00:00")).timestamp() + avail = pub > os.path.getmtime(ENGINE_PATH) + 86400 + except Exception: + avail = False + _engine_cache.update(ts=now, avail=avail) + return avail + + +def _installed_swap_version() -> int | None: + """Versions-Nummer der installierten llama-swap-Binary (z.B. 228), oder None.""" + if not os.path.exists(SWAP_BIN): + return None + try: + out = subprocess.run([SWAP_BIN, "--version"], capture_output=True, text=True, timeout=15) + txt = (out.stdout or "") + (out.stderr or "") + if (m := re.search(r"version:\s*(\d+)", txt)) or (m := re.search(r"\bv?(\d{2,})\b", txt)): + return int(m.group(1)) + except Exception: + return None + return None + + +def _swap_update_available() -> bool: + now = time.time() + if now - _swap_cache["ts"] < 3600: + return _swap_cache["avail"] + avail = False + try: + rel = httpx.get(f"https://api.github.com/repos/{SWAP_REPO}/releases/latest", + timeout=6, headers={"User-Agent": "MissionControl2"}).json() + tag = str(rel.get("tag_name", "")) + latest = int(m.group(1)) if (m := re.search(r"(\d{2,})", tag)) else None + installed = _installed_swap_version() + if latest is not None and installed is not None: + avail = latest > installed + except Exception: + avail = False + _swap_cache.update(ts=now, avail=avail) + return avail + + +_comp_cache = {"ts": 0.0, "data": []} + + +def _hermes_agent_update() -> dict: + """Hermes-Agent wird aus **git** aktualisiert (CLI `hermes update` = git pull origin ). + Darum HEAD vs. origin/ prüfen (fetch + behind-count) — NICHT GitHub-Releases: die + werden selten getaggt, main läuft ihnen voraus → sonst zeigt das UI nie ein Update an.""" + info = {"key": "hermes_agent", "name": "Hermes Agent", "current": None, + "latest": None, "update": False, "reachable": None} + git = system.find_hermes_agent_git() + if not git or not git.get("path"): + return info + path = git["path"] + info["current"] = git.get("hash") + try: + branch = (subprocess.run(["git", "-C", path, "rev-parse", "--abbrev-ref", "HEAD"], + capture_output=True, text=True, timeout=8).stdout.strip() or "main") + fetch = subprocess.run(["git", "-C", path, "fetch", "-q", "origin", branch], + capture_output=True, text=True, timeout=25) + info["reachable"] = (fetch.returncode == 0) + if fetch.returncode == 0: + cnt = subprocess.run(["git", "-C", path, "rev-list", "--count", f"HEAD..origin/{branch}"], + capture_output=True, text=True, timeout=8) + behind = int(cnt.stdout.strip() or "0") if cnt.returncode == 0 else 0 + info["behind"] = behind + info["update"] = behind > 0 + oh = subprocess.run(["git", "-C", path, "rev-parse", "--short", f"origin/{branch}"], + capture_output=True, text=True, timeout=8).stdout.strip() + info["latest"] = (f"{oh} ({behind} neu)" if behind else (oh or info["current"])) + except Exception: + info["reachable"] = False + return info + + +def _components_cached() -> list[dict]: + """Update-Status von Hermes-Agent (1h-Cache → GitHub schonen).""" + now = time.time() + if now - _comp_cache["ts"] < 3600 and _comp_cache["data"]: + return _comp_cache["data"] + data = [_hermes_agent_update()] + _comp_cache.update(ts=now, data=data) + return data + + +def _params_of(m: dict) -> float: + """Größen-bewusste Parameterzahl eines installierten Modells: max aus Namens-Schätzung + und Dateigröße (fängt namenlose wie 'Qwen3-Coder-Next' UND Split-GGUFs ab).""" + from services.fit import QUANT_BYTES_PER_PARAM + caps = m.get("capabilities") or {} + bpp = QUANT_BYTES_PER_PARAM.get((m.get("quant") or "Q4_K_M").upper(), 0.55) + size_gb = (m.get("size_bytes") or 0) / (1024 ** 3) + pb_size = (size_gb / bpp) if size_gb > 1.0 else 0.0 + return max(float(caps.get("params_b") or 0), pb_size, 0.0) + + +# Familien-Subtyp + Generations-Version aus dem Modellnamen (für „echtes Upgrade?"). +_FAM_PATS = (("qwen", r"qwen(\d+(?:\.\d+)?)"), ("gemma", r"gemma[-_ ]?(\d+(?:\.\d+)?)"), + ("llama", r"llama[-_ ]?(\d+(?:\.\d+)?)"), ("phi", r"phi[-_ ]?(\d+(?:\.\d+)?)"), + ("mistral", r"mistral"), ("hermes", r"hermes[-_ ]?(\d+(?:\.\d+)?)")) + + +def _gen_key(name: str): + """(Familie+Subtyp, Generations-Version) oder None. Z.B. 'Qwen3-VL-2B' → ('qwen-vl', 3.0), + 'Qwen2.5-VL-7B' → ('qwen-vl', 2.5). Nur gleiche Familie ist sinnvoll vergleichbar.""" + low = (name or "").lower() + sub = "-vl" if any(k in low for k in ("-vl", "vl-", "vision", "llava", "pixtral")) else \ + "-coder" if ("coder" in low or "-code" in low) else "" + for fam, pat in _FAM_PATS: + m = re.search(pat, low) + if m: + ver = float(m.group(1)) if (m.groups() and m.group(1)) else 0.0 + return (fam + sub, ver) + return None + + +def _meta(name: str, model_dict: dict | None = None, im: dict | None = None) -> dict: + """Metadaten (family, gen, total, active, moe) — bevorzugt den kuratierten Katalog, + sonst die Felder eines Discover-/Modell-Dicts, sonst Namens-/Größen-Heuristik.""" + cm = catalog.meta_for_name(name) + if cm: + return {"family": cm.get("family"), "gen": cm.get("generation"), + "total": float(cm.get("total_params_b") or 0), + "active": cm.get("active_params_b"), "moe": bool(cm.get("moe"))} + d = model_dict or {} + g = _gen_key(name) + total = float(d.get("params_b") or 0) or (_params_of(im) if im else 0.0) + return {"family": (d.get("family") or (g[0] if g else None)), + "gen": (d.get("generation") if d.get("generation") is not None else (g[1] if g else None)), + "total": total, "active": d.get("active_b"), "moe": bool(d.get("moe"))} + + +def model_upgrades() -> list[dict]: + """Je Rolle ein ECHTES Upgrade — nur wenn die Empfehlung wirklich besser ist: + gleiche Familie UND (neuere Generation ODER deutlich größer) UND kein Tempo-Downgrade + (MoE-first für die bandbreiten-limitierte Box: dense ersetzt MoE nur bei großem Wissens- + Sprung). Metadaten kommen aus dem kuratierten Katalog → keine Namens-Raterei.""" + disc = discover.safe_discover(_ram_gb()) + if not disc: + return [] + + installed = llamaswap.list_models() + inst_by_role = {m["role"]: m for m in installed if m.get("role")} + cmds = " ".join(str(s.get("cmd", "")).lower() + for s in (llamaswap.read_config().get("models") or {}).values()) + out = [] + + for c in disc.get("categories", []): + role = c["role"] + im = inst_by_role.get(role) + if im is None: + continue + rec = c.get("recommended") + if not rec: + continue + rec_model = next((x for x in c.get("models", []) if x.get("repo") == rec), None) + + i = _meta(im["name"], im=im) + r = _meta(rec, model_dict=rec_model) + + if not i["family"] or not r["family"] or i["family"] != r["family"]: + continue # andere/unbekannte Familie → kein Upgrade + if r["gen"] is not None and i["gen"] is not None and r["gen"] < i["gen"] - 1e-6: + continue # ältere Generation → niemals + same_gen = (r["gen"] is None or i["gen"] is None or abs(r["gen"] - i["gen"]) < 1e-6) + if same_gen: + if r["total"] and i["total"] and r["total"] < i["total"] * 1.05: + continue # gleiche Gen, nicht größer → kein Upgrade + # MoE-first: ein MoE durch dense ersetzen nur bei deutlichem Wissens-Sprung + if i["moe"] and not r["moe"] and r["total"] < i["total"] * 1.5: + continue + # Tempo nicht verschlechtern (aktive Params), außer großer Wissens-Gewinn + ia, ra = (i["active"] or i["total"]), (r["active"] or r["total"]) + if ia and ra > ia * 1.3 and r["total"] < i["total"] * 1.3: + continue + + base = rec.split("/")[-1].lower() + stem = base.removesuffix("-gguf") + if base in cmds or (stem and stem in cmds): + continue # schon installiert + out.append({"role": role, "title": c["title"], "repo": rec}) + return out + + +def _last_apt_update() -> float | None: + for path in ["/var/lib/apt/periodic/update-success-stamp", "/var/cache/apt/pkgcache.bin"]: + if os.path.exists(path): + try: + return os.path.getmtime(path) + except Exception: + pass + return None + + +def updates() -> dict: + ups = model_upgrades() + return {"os": _os_upgradable(), "engine": 1 if _engine_update_available() else 0, + "swap": 1 if _swap_update_available() else 0, + "models": len(ups), "model_list": ups, "last_check": _last_apt_update(), + "components": _components_cached()} + + +# ── Update-Details (was genau wird aktualisiert) — on-demand beim Öffnen des Fensters ── + +def _os_held_back() -> list[dict]: + """Pakete, die apt aktuell NICHT einspielt, obwohl es sie gäbe — mit ehrlichem Grund. + Zwei Fälle, aus `apt-get -s upgrade` (Simulation) gelesen: + • Phasen-Rollout (Ubuntu staffelt Updates prozentual aus) → 'deferred due to phasing'. + • zurückgehalten wegen neuer Abhängigkeiten → 'kept back'. + Beides ist normal und löst sich von selbst — verhindert nur das 'hängt fest'-Gefühl, + wenn nach 'Fertig' noch aktualisierbare Pakete übrig scheinen.""" + held: list[dict] = [] + sections = { + "The following upgrades have been deferred due to phasing:": "phasing", + "The following packages have been kept back:": "kept_back", + } + try: + out = subprocess.run( + ["bash", "-c", "LC_ALL=C apt-get -s upgrade 2>/dev/null"], + capture_output=True, text=True, timeout=25) + reason: str | None = None + for line in (out.stdout or "").splitlines(): + hdr = sections.get(line.strip()) + if hdr: # Abschnitts-Kopf → folgende Zeilen sammeln + reason = hdr + continue + if reason and line.startswith((" ", "\t")): # eingerückt = Paketnamen des Abschnitts + for name in line.split(): + held.append({"name": name, "reason": reason}) + elif reason: # nicht eingerückt → Abschnitt zu Ende + reason = None + except Exception: + pass + held.sort(key=lambda p: p["name"]) + return held + + +def os_update_details() -> dict: + """Liste der aktualisierbaren apt-Pakete (Name, installiert → Kandidat) + ehrliche + Anzeige der vom System zurückgestellten Pakete (Phasen-Rollout / kept back).""" + out_pkgs: list[dict] = [] + try: + # LC_ALL=C → englische Ausgabe, damit der Regex "[upgradable from: ...]" greift + # (deutsche Box meldet sonst "[aktualisierbar von:]" und die Liste bliebe leer). + out = subprocess.run(["bash", "-c", "LC_ALL=C apt list --upgradable 2>/dev/null"], + capture_output=True, text=True, timeout=20) + for line in (out.stdout or "").splitlines(): + # Format: name/repo neue_version arch [upgradable from: alte_version] + m = re.match(r"^([^/\s]+)/\S+\s+(\S+)\s+\S+\s+\[upgradable from:\s*([^\]]+)\]", + line.strip()) + if m: + out_pkgs.append({"name": m.group(1), "candidate": m.group(2), + "current": m.group(3).strip()}) + out_pkgs.sort(key=lambda p: p["name"]) + return {"kind": "os", "count": len(out_pkgs), "packages": out_pkgs, + "held_back": _os_held_back()} + except Exception as exc: + return {"kind": "os", "count": len(out_pkgs), "packages": out_pkgs, "error": str(exc)} + + +def engine_update_details() -> dict: + """Installierte vs. neueste Engine-Build-Nummer + Release-Name/-Notizen/-Link.""" + info: dict = {"kind": "engine", "installed_build": _installed_engine_build(), + "latest_build": None, "latest_tag": None, "name": None, + "url": None, "body": None} + try: + rel = _latest_engine_asset_release() or {} + tag = str(rel.get("tag_name", "")) + info["latest_tag"] = tag + info["latest_build"] = int(m.group(1)) if (m := re.search(r"(\d{3,})", tag)) else None + info["name"] = rel.get("name") or tag + info["url"] = rel.get("html_url") + body = (rel.get("body") or "").strip() + info["body"] = body[:2000] if body else None + # Nur zusammenfassen, wenn wirklich ein neuerer Build ansteht (spart einen LLM-Call, + # wenn das Modal bei aktuellem Stand geöffnet wird). + if body and info["latest_build"] and info["installed_build"] \ + and info["latest_build"] > info["installed_build"]: + ctx = ("Es geht um ein Update der Inferenz-Engine llama.cpp (Vulkan-Build, treibt alle " + "Sprachmodelle der Box auf der AMD-Strix-Halo-GPU).") + info.update(_summarize_release("engine", tag, ctx, body[:6000])) + except Exception as exc: + info["error"] = str(exc) + return info + + +def swap_update_details() -> dict: + """Installierte vs. neueste llama-swap-Version + Release-Name/-Notizen/-Link.""" + info: dict = {"kind": "swap", "installed_build": _installed_swap_version(), + "latest_build": None, "latest_tag": None, "name": None, + "url": None, "body": None} + try: + rel = httpx.get(f"https://api.github.com/repos/{SWAP_REPO}/releases/latest", + timeout=8, headers={"User-Agent": "MissionControl2"}).json() + tag = str(rel.get("tag_name", "")) + info["latest_tag"] = tag + info["latest_build"] = int(m.group(1)) if (m := re.search(r"(\d{2,})", tag)) else None + info["name"] = rel.get("name") or tag + info["url"] = rel.get("html_url") + body = (rel.get("body") or "").strip() + info["body"] = body[:2000] if body else None + if body and info["latest_build"] and info["installed_build"] \ + and info["latest_build"] > info["installed_build"]: + ctx = ("Es geht um ein Update von llama-swap (der Router, der Anfragen an die Box " + "verteilt und Sprachmodelle heiß nachlädt).") + info.update(_summarize_release("swap", tag, ctx, body[:6000])) + except Exception as exc: + info["error"] = str(exc) + return info + + +# LLM-Zusammenfassung anstehender Updates in Lucys Stimme (die Box liest ihre Release-Notes +# selbst). Jede Zusammenfassung beginnt mit einem klaren Aktions-Verdikt für den Besitzer +# (kein Entwickler): "Musst du etwas tun? NEIN — das Fangnetz regelt das / JA: …". +# Gecacht je Komponente auf den neuesten Commit-Hash/Release-Tag — das Modal darf beliebig +# oft geöffnet werden, ohne das Modell jedes Mal neu zu befragen. +_relnotes_caches: dict = {"hermes": {}, "engine": {}, "swap": {}} + +# Erste Zeile jeder Modell-Antwort: "AKTION: NEIN" oder "AKTION: JA — ". +# Toleriert Markdown-Deko (**fett**, Bullet, Überschrift), die 'fast' gern einstreut. +_ACTION_RX = re.compile( + r"^[\s*_>#\-]*AKTION:?\s*\**\s*(JA|NEIN)\b[\s—:,.\-*_]*(.*?)[\s*_]*$", re.IGNORECASE) + + +def _summarize_release(kind: str, key: str, context: str, changes: str) -> dict: + """Fasst Release-Notes/Commits in Lucys Stimme zusammen und trennt das Aktions-Verdikt + ab. Rückgabe: {summary, action_needed, action_text}. Cache je Komponente auf `key`.""" + empty = {"summary": "", "action_needed": None, "action_text": ""} + if not key: + return empty + cache = _relnotes_caches.setdefault(kind, {}) + if cache.get("key") == key and cache.get("data"): + return cache["data"] + from config import LLAMA_SWAP_URL + prompt = ( + "Du bist Lucy, die Stimme einer lokalen AI-Box, und erklärst dem Besitzer (KEIN Entwickler, " + "fasst nie eine Konsole an) ein anstehendes Update ruhig und verständlich.\n" + f"{context}\n\n" + "Anstehende Änderungen:\n" + changes + "\n\n" + "Antworte auf DEUTSCH, knapp und klar. HALTE DICH GENAU an dieses Format:\n" + "Zeile 1 ist das Aktions-Verdikt und beginnt mit 'AKTION: ':\n" + " • 'AKTION: NEIN' — wenn der Besitzer nichts tun muss (die Box spielt es selbst ein, das " + "Fangnetz prüft danach automatisch und rollt bei Problemen von allein zurück). Das ist der " + "Normalfall.\n" + " • 'AKTION: JA — ' — NUR wenn er wirklich selbst " + "handeln muss.\n" + "Danach maximal 5 kurze Stichpunkte (je mit '- '), Wichtigstes zuerst: Breaking Changes oder " + "geänderte/entfernte Config-Schlüssel ZUERST und mit '⚠️' markiert, dann was unser Setup " + "betrifft, dann lohnende neue Features. Keine Einleitung, keine Überschrift." + ) + try: + r = httpx.post(f"{LLAMA_SWAP_URL}/v1/chat/completions", timeout=90.0, json={ + "model": "fast", "max_tokens": 550, "temperature": 0.2, + "chat_template_kwargs": {"enable_thinking": False}, + "messages": [{"role": "user", "content": prompt}], + }) + r.raise_for_status() + resp = r.json() + choice = (resp.get("choices") or [{}])[0] + text = ((choice.get("message") or {}).get("content") or "").strip() + finish_reason = choice.get("finish_reason") or "" + + # finish_reason == "length" → Antwort wurde wegen Token-Limits abgeschnitten → + # letzten (unvollständigen) Stichpunkt entfernen. Bei "stop"/None → vollständig. + if finish_reason == "length" and text: + head, _, _tail = text.rpartition("\n") + text = head if head else "" + + # Aktions-Verdikt herauslösen (strukturiertes Feld fürs UI). Normalerweise Zeile 1, + # aber tolerant: erste passende Zeile suchen (Modell startet manchmal mit Leerzeile). + action_needed: bool | None = None + action_text = "" + lines = text.splitlines() + for idx, ln in enumerate(lines): + if m := _ACTION_RX.match(ln): + action_needed = m.group(1).upper() == "JA" + action_text = (m.group(2) or "").strip() + text = "\n".join(lines[:idx] + lines[idx + 1:]).strip() + break + + data = {"summary": text, "action_needed": action_needed, "action_text": action_text} + if text: + cache.update(key=key, data=data) + return data + except Exception as exc: + return {"summary": f"(Zusammenfassung nicht verfügbar: {exc})", + "action_needed": None, "action_text": ""} + + +def _summarize_hermes_commits(commits: list[dict]) -> dict: + subjects = "\n".join(f"- {c['subject']}" for c in commits[:100]) + context = ("Es geht um ein Update des Hermes-Agenten (das Gehirn/Werkzeug-System der Box auf " + "Strix Halo; genutzt werden: api_server/Gateway, memory-provider-Plugin 'mc2-memory', " + "terminal-/web-Tools, approvals, cron).") + return _summarize_release("hermes", commits[0]["hash"] if commits else "", context, subjects) + + +def hermes_update_details() -> dict: + """Commits, die ein Hermes-Update einspielen würde (HEAD..origin/) + LLM-Zusammenfassung.""" + info: dict = {"kind": "hermes", "branch": None, "behind": 0, "commits": []} + git = system.find_hermes_agent_git() + if not git or not git.get("path"): + info["error"] = "Hermes-Agent-Repo nicht gefunden." + return info + path = git["path"] + try: + branch = (subprocess.run(["git", "-C", path, "rev-parse", "--abbrev-ref", "HEAD"], + capture_output=True, text=True, timeout=8).stdout.strip() or "main") + info["branch"] = branch + subprocess.run(["git", "-C", path, "fetch", "-q", "origin", branch], + capture_output=True, text=True, timeout=25) + log = subprocess.run(["git", "-C", path, "log", "--pretty=format:%h\x1f%s\x1f%cr", + f"HEAD..origin/{branch}"], capture_output=True, text=True, timeout=10) + commits = [] + for line in (log.stdout or "").splitlines(): + parts = line.split("\x1f") + if len(parts) == 3: + commits.append({"hash": parts[0], "subject": parts[1], "when": parts[2]}) + info["commits"] = commits + info["behind"] = len(commits) + if commits: + info.update(_summarize_hermes_commits(commits)) + except Exception as exc: + info["error"] = str(exc) + return info + + +def update_details(kind: str) -> dict: + return {"os": os_update_details, "engine": engine_update_details, + "swap": swap_update_details, + "hermes": hermes_update_details}.get(kind, lambda: {"error": "unbekannt"})() + + +def _run(cmd: list[str]) -> dict: + """Befehl ausfuehren. sudo laeuft IMMER mit `-n` (never prompt). + + v3-Umbau P1 (28.08.2026): Frueher konnte hier ein Sudo-Passwort durchgereicht und per + `-S` an stdin gefuettert werden — das Passwort kam aus dem `localStorage` des Browsers + und reiste bei jedem mutierenden Request mit. Auf der Box gemessen: `sudo -n true` + laeuft durch, weil `/etc/sudoers` den Dienst-Nutzer mit `NOPASSWD: ALL` fuehrt. Der + ganze Pfad war also totes Risiko ohne Gegenwert. + + `-n` heisst: Braucht sudo je doch ein Passwort, scheitert der Befehl SOFORT und sauber, + statt auf eine Eingabe zu warten, die es hier nicht gibt. Das meldet die Funktion + darunter als `password_required` — ein ehrliches Konfigurations-Signal, das man auf der + Box loest und nicht mit einem im Browser geparkten Geheimnis uebertuencht.""" + actual_cmd = list(cmd) + if cmd and cmd[0] == "sudo": + if "-S" in actual_cmd: + actual_cmd = [x for x in actual_cmd if x != "-S"] + if "-n" not in actual_cmd: + actual_cmd.insert(1, "-n") + + try: + p = subprocess.run(actual_cmd, capture_output=True, text=True, timeout=120) + + err_msg = p.stderr or "" + if p.returncode != 0 and ("a password is required" in err_msg or "password" in err_msg.lower() or "sudo:" in err_msg): + return {"ok": False, "status": "password_required", "out": p.stdout or "", + "err": "sudo verlangt hier ein Passwort. Das ist eine Konfigurations-Frage " + "auf der Box (sudoers), nichts, was die Oberflaeche liefern kann."} + + return {"ok": p.returncode == 0, "out": (p.stdout or "")[-4000:], "err": (p.stderr or "")[-2000:]} + except Exception as exc: + return {"ok": False, "out": "", "err": str(exc)} + + +def check_sudo_needs_password() -> dict | None: + """Laeuft sudo hier passwortlos? Fehler-Dict wenn nein, sonst None.""" + res = _run(["sudo", "true"]) + if not res["ok"]: + return res + return None + + +def restart_service(name: str) -> dict: + if name in SYSTEM_SERVICES: + if err := check_sudo_needs_password(): + return err + return _run(["sudo", "systemctl", "restart", name]) + if name in USER_SERVICES: + return _run(["systemctl", "--user", "restart", name]) + return {"ok": False, "err": f"Dienst '{name}' nicht erlaubt."} + + +def logs(service: str, lines: int = 200) -> dict: + lines = max(1, min(lines, 1000)) + if service in USER_SERVICES: + r = _run(["journalctl", "--user", "-u", service, "-n", str(lines), "--no-pager"]) + return {"ok": r["ok"], "text": r["out"] or r["err"]} + if service in SYSTEM_SERVICES: + # Journal-Lesen braucht i.d.R. KEIN sudo (User ist in Gruppe adm/systemd-journal). + # Erst ohne sudo versuchen; nur bei fehlenden Rechten auf sudo zurückfallen. + r = _run(["journalctl", "-u", service, "-n", str(lines), "--no-pager"]) + if r["ok"]: + return {"ok": True, "text": r["out"] or "(keine Log-Einträge)"} + if err := check_sudo_needs_password(): + return err + r = _run(["sudo", "journalctl", "-u", service, "-n", str(lines), "--no-pager"]) + return {"ok": r["ok"], "text": r["out"] or r["err"]} + return {"ok": False, "text": "", "err": "Dienst nicht erlaubt."} + +def check_updates_job() -> dict: + if err := check_sudo_needs_password(): + return err + + def on_done(): + _engine_cache.update(ts=0.0, avail=False) + _comp_cache.update(ts=0.0, data=[]) # Hermes-Status ebenfalls neu berechnen lassen + + cmd = "sudo apt-get update" + job_id = jobengine.start_job(["bash", "-c", cmd], "Nach Updates suchen", on_done=on_done) + return {"ok": True, "job_id": job_id} + + +def _maintenance_busy() -> dict | None: + """Wartungs-Riegel: nur EIN binär-/dienst-veränderndes Update gleichzeitig. Verhindert + Doppelklick UND parallele Updates aus zwei Tabs/Sessions (racende .bak-Sicherung/Restarts).""" + if j := jobengine.active_in_group("maintenance"): + return {"ok": False, "status": "busy", "running": j.get("label")} + return None + + +def os_update_job() -> dict: + if busy := _maintenance_busy(): + return busy + if err := check_sudo_needs_password(): + return err + # Nach dem apt-Upgrade den Stack funktional prüfen (Job wird rot, wenn etwas kaputt ging). + # DEBIAN_FRONTEND wird INNERHALB von `sudo bash -c` gesetzt (nicht als `sudo VAR=… cmd`) — + # sonst lehnt sudos env-Policy die Variable ggf. ab und das Upgrade bricht ab. + cmd = ("sudo apt-get update && " + "sudo bash -c 'DEBIAN_FRONTEND=noninteractive apt-get upgrade -y' " + f"&& bash {STACK_POSTCHECK}") + job_id = jobengine.start_job(["bash", "-c", cmd], "OS-Update (apt)", + group="maintenance") + return {"ok": True, "job_id": job_id} + + +def engine_update_job() -> dict | None: + if not ENGINE_UPDATE_CMD: + return None + if busy := _maintenance_busy(): + return busy + # KEIN sudo-Passwort-Gate: update-engine.sh ist per sudoers NOPASSWD freigegeben + # (sudoers-mc2-autonomie) und läuft passwortlos. Das frühere `sudo true`-Gate hat das + # Update fälschlich blockiert, wenn (noch) kein Box-Passwort hinterlegt war. + + def on_done(): + _engine_cache.update(ts=0.0, avail=False) # Cache leeren → frischer Build-Vergleich + + # update-engine.sh sichert den alten Build, aktualisiert, startet llama-swap neu, prüft den + # Stack (stack-postcheck.sh) und rollt bei Fehler selbst zurück. Exit 0 nur bei verifiziertem + # neuen Build → on_done (Cache leeren) läuft nur dann; bei Rollback (Exit 1/2) bleibt das Badge. + job_id = jobengine.start_job(["bash", "-c", ENGINE_UPDATE_CMD], + "Engine-Update (llama.cpp Vulkan)", + group="maintenance", on_done=on_done) + return {"ok": True, "job_id": job_id} + + +def swap_update_job() -> dict | None: + if not SWAP_UPDATE_CMD: + return None + if busy := _maintenance_busy(): + return busy + # KEIN sudo-Passwort-Gate: update-swap.sh ist per sudoers NOPASSWD freigegeben (wie die Engine). + + def on_done(): + _swap_cache.update(ts=0.0, avail=False) # Cache leeren → frischer Versions-Vergleich + + # update-swap.sh sichert die alte Binary, aktualisiert, startet llama-swap neu, prüft den Stack + # (stack-postcheck.sh) und rollt bei Fehler selbst zurück. Exit 0 nur bei verifizierter neuer + # Version → on_done (Cache leeren) läuft nur dann; bei Rollback (Exit 1/2) bleibt das Badge. + job_id = jobengine.start_job(["bash", "-c", SWAP_UPDATE_CMD], + "Router-Update (llama-swap)", + group="maintenance", on_done=on_done) + return {"ok": True, "job_id": job_id} + + +def _hermes_update_cmd() -> str: + """Die komplette Hermes-Update-Befehlskette (Backup → Update → Doctor → UI-Build → + Neustarts → Postcheck) — geteilt von hermes_update_job und update_all_job.""" + git = system.find_hermes_agent_git() + path = (git or {}).get("path") or os.path.expanduser("~/.hermes/hermes-agent") + py = os.path.join(path, "venv", "bin", "python") + backup = os.path.join(_REPO_ROOT, "deploy", "backup.sh") + postcheck = os.path.join(_REPO_ROOT, "deploy", "hermes-postcheck.sh") + # Backup → Stop UI (verhindert Crash durch Löschen der Sourcen) → update → doctor → + # UI-Build mit MC2-Basepath (/hermes-ui/) → Gateway + UI-Neustart → Smoke-Test. + hui_web = os.path.join(path, "web") + hui_dist = os.path.join(path, "hermes_cli", "web_dist") + npm_path = os.path.expanduser("~/.hermes/node/bin") + + build_cmd = ( + f"if [ -d {hui_web} ]; then " + f"cd {hui_web} && PATH={npm_path}:$PATH npx --no-install vite build --base=/hermes-ui/ --outDir /tmp/h-build --emptyOutDir " + f"&& rm -rf {hui_dist} && cp -r /tmp/h-build {hui_dist}; fi" + ) + + # EHRLICHER Exit-Code (Lehre 08.07.): Die Dienste müssen auch bei einem GESCHEITERTEN + # Update wieder hochkommen (die UI wurde ja gestoppt) — aber der Job darf dann nicht + # grün sein. Früher schluckte das `;` vor dem Neustart jeden Update-Fehler: Job rc=0, + # Badge blieb, User sah „done aber nichts passiert" (Update scheiterte real an einem + # verwaisten .git/index.lock). Jetzt: RC festhalten, Dienste immer starten, RC melden. + return ("RC=0; " + f"bash {backup} || true; " + f"systemctl --user stop hermes-builtin-ui || true; " + f"{{ cd {path} && {py} -m hermes_cli.main update --yes " + f"&& {py} -m hermes_cli.main doctor " + f"&& {build_cmd}; }} || RC=1; " + f"systemctl --user reset-failed hermes-builtin-ui 2>/dev/null; " + f"systemctl --user restart hermes-gateway hermes-builtin-ui || RC=1; " + f"sleep 6; bash {postcheck} || RC=1; " + f"if [ $RC -ne 0 ]; then echo '✗ HERMES-UPDATE FEHLGESCHLAGEN (Dienste laufen wieder, aber alter Stand)'; fi; " + f"exit $RC") + + +def hermes_update_job() -> dict: + """Hermes-Agent aktualisieren wie die CLI (`hermes update` = git pull + Deps), danach + den Gateway neu starten. Davor ein Sicherheits-Backup (unser deploy/backup.sh). Kein sudo + (alles im User-Space). Läuft als Hintergrund-Job (kann ~1 Min dauern).""" + if busy := _maintenance_busy(): + return busy + + def on_done(): + _comp_cache.update(ts=0.0, data=[]) # Update-Status neu berechnen lassen + + job_id = jobengine.start_job(["bash", "-c", _hermes_update_cmd()], "Hermes-Agent-Update", + group="maintenance", on_done=on_done) + return {"ok": True, "job_id": job_id} + + +def update_all_job() -> dict: + """„Alle aktualisieren": kettet die AUSSTEHENDEN Updates sequenziell in EINEM Job — + Engine → Router → Hermes → OS. Bewusst nur Wiederverwendung: jeder Teil ist exakt der + Befehl des Einzel-Updates (mit eigenem Backup/Postcheck/Rollback). `&&`-Kette = bei + Fehler stoppt der Rest (das Log zeigt, wo). OS zuletzt, weil apt am breitesten eingreift; + es ist das einzige mit sudo — scheitert das, laufen die sudo-freien Teile trotzdem.""" + if busy := _maintenance_busy(): + return busy + upd = updates() + parts: list[tuple[str, str]] = [] + if upd.get("engine") and ENGINE_UPDATE_CMD: + parts.append(("Engine (llama.cpp)", ENGINE_UPDATE_CMD)) + if upd.get("swap") and SWAP_UPDATE_CMD: + parts.append(("Router (llama-swap)", SWAP_UPDATE_CMD)) + if any(c.get("update") is True for c in upd.get("components") or []): + parts.append(("Hermes-Agent", _hermes_update_cmd())) + os_pending = (upd.get("os") or 0) > 0 + if os_pending: + if err := check_sudo_needs_password(): + # sudo verlangt wider Erwarten ein Passwort (sudoers geaendert?): OS auslassen + # statt alles zu blockieren — aber nur, wenn es sudo-freie Teile gibt; sonst + # den Fehler ehrlich durchreichen. + if not parts: + return err + os_pending = False + else: + parts.append(("OS (apt)", ( + "sudo apt-get update && " + "sudo bash -c 'DEBIAN_FRONTEND=noninteractive apt-get upgrade -y' " + f"&& bash {STACK_POSTCHECK}"))) + if not parts: + return {"ok": False, "status": "nothing", "detail": "Keine Updates ausstehend."} + + cmd = " && ".join( + f"(echo; echo '════════ [{i + 1}/{len(parts)}] {label} ════════'; {c})" + for i, (label, c) in enumerate(parts)) + if not os_pending: + cmd += f" && bash {STACK_POSTCHECK}" # Abschluss-Check, falls apt ihn nicht schon lieferte + + def on_done(): + _engine_cache.update(ts=0.0, avail=False) + _swap_cache.update(ts=0.0, avail=False) + _comp_cache.update(ts=0.0, data=[]) + + labels = " → ".join(label for label, _ in parts) + job_id = jobengine.start_job(["bash", "-c", cmd], f"Alle aktualisieren ({labels})", + group="maintenance", on_done=on_done) + return {"ok": True, "job_id": job_id, "parts": [label for label, _ in parts]} + + +def reboot() -> dict: + if err := check_sudo_needs_password(): + return err + return _run(["sudo", "reboot"]) diff --git a/frontend/.prettierignore b/frontend/.prettierignore new file mode 100644 index 0000000..91a3983 --- /dev/null +++ b/frontend/.prettierignore @@ -0,0 +1,3 @@ +dist +node_modules +package-lock.json diff --git a/frontend/.prettierrc.json b/frontend/.prettierrc.json new file mode 100644 index 0000000..64cc984 --- /dev/null +++ b/frontend/.prettierrc.json @@ -0,0 +1,6 @@ +{ + "semi": false, + "printWidth": 110, + "trailingComma": "all", + "arrowParens": "always" +} diff --git a/frontend/dist/assets/AgentView-BJR2UXXN.js b/frontend/dist/assets/AgentView-BgTBq7Qa.js similarity index 99% rename from frontend/dist/assets/AgentView-BJR2UXXN.js rename to frontend/dist/assets/AgentView-BgTBq7Qa.js index cf5149c..6282210 100644 --- a/frontend/dist/assets/AgentView-BJR2UXXN.js +++ b/frontend/dist/assets/AgentView-BgTBq7Qa.js @@ -1,4 +1,4 @@ -import{c as A,I as P,f as M,k as B,u as D,r as z,j as e,J as T,b as a,K as g,M as b,N as W,t as f,W as j,O as G,X as I,C as N,n as y,q as i}from"./index-B57enqf6.js";/** +import{c as A,I as P,f as M,k as B,u as D,r as z,j as e,J as T,b as a,K as g,M as b,N as W,t as f,W as j,O as G,X as I,C as N,n as y,q as i}from"./index-BYlMs6Dj.js";/** * @license lucide-react v0.460.0 - ISC * * This source code is licensed under the ISC license. diff --git a/frontend/dist/assets/AuftragsbuchView-Cr_8mzDy.js b/frontend/dist/assets/AuftragsbuchView-C0bzCKZ0.js similarity index 99% rename from frontend/dist/assets/AuftragsbuchView-Cr_8mzDy.js rename to frontend/dist/assets/AuftragsbuchView-C0bzCKZ0.js index df03ca4..ead28a9 100644 --- a/frontend/dist/assets/AuftragsbuchView-Cr_8mzDy.js +++ b/frontend/dist/assets/AuftragsbuchView-C0bzCKZ0.js @@ -1,4 +1,4 @@ -import{c as W,a1 as H,a2 as F,u as G,k as T,r as b,j as e,R as _,b as y,L as m,C as E,_ as O,D as P,a0 as z,a3 as R,a4 as V,X as D,T as C,F as K,n as $,a5 as q,q as U}from"./index-B57enqf6.js";import{S,H as Q}from"./SectionLabel-C_SwIL8k.js";import{C as M}from"./chevron-down-C-RXUrpR.js";/** +import{c as W,a1 as H,a2 as F,u as G,k as T,r as b,j as e,R as _,b as y,L as m,C as E,_ as O,D as P,a0 as z,a3 as R,a4 as V,X as D,T as C,F as K,n as $,a5 as q,q as U}from"./index-BYlMs6Dj.js";import{S,H as Q}from"./SectionLabel-R1yae0WQ.js";import{C as M}from"./chevron-down-D5zhK_UQ.js";/** * @license lucide-react v0.460.0 - ISC * * This source code is licensed under the ISC license. diff --git a/frontend/dist/assets/ChronikView-xh-P-c-1.js b/frontend/dist/assets/ChronikView-Bz_yVFvS.js similarity index 99% rename from frontend/dist/assets/ChronikView-xh-P-c-1.js rename to frontend/dist/assets/ChronikView-Bz_yVFvS.js index 035c3c8..638733b 100644 --- a/frontend/dist/assets/ChronikView-xh-P-c-1.js +++ b/frontend/dist/assets/ChronikView-Bz_yVFvS.js @@ -1,4 +1,4 @@ -import{c as d,aj as S,r as h,j as e,ak as M,L as p,a0 as z,a5 as C,al as D,am as A,b as B,an as Z,u as E,k as L,n as k,q}from"./index-B57enqf6.js";import{R as j}from"./rotate-ccw-Bz6oQ3_7.js";/** +import{c as d,aj as S,r as h,j as e,ak as M,L as p,a0 as z,a5 as C,al as D,am as A,b as B,an as Z,u as E,k as L,n as k,q}from"./index-BYlMs6Dj.js";import{R as j}from"./rotate-ccw-Dx0bZ_kA.js";/** * @license lucide-react v0.460.0 - ISC * * This source code is licensed under the ISC license. diff --git a/frontend/dist/assets/ConnectView-CxDIL-EH.js b/frontend/dist/assets/ConnectView-Cz-npKrg.js similarity index 99% rename from frontend/dist/assets/ConnectView-CxDIL-EH.js rename to frontend/dist/assets/ConnectView-Cz-npKrg.js index 3b6a48a..1217126 100644 --- a/frontend/dist/assets/ConnectView-CxDIL-EH.js +++ b/frontend/dist/assets/ConnectView-Cz-npKrg.js @@ -1,4 +1,4 @@ -import{c as i,r as p,z as G,A as H,j as e,D as u,t as z,B as I,F as M,b as S,L as B,G as _,C as E}from"./index-B57enqf6.js";import{C as P}from"./chevron-down-C-RXUrpR.js";/** +import{c as i,r as p,z as G,A as H,j as e,D as u,t as z,B as I,F as M,b as S,L as B,G as _,C as E}from"./index-BYlMs6Dj.js";import{C as P}from"./chevron-down-D5zhK_UQ.js";/** * @license lucide-react v0.460.0 - ISC * * This source code is licensed under the ISC license. diff --git a/frontend/dist/assets/GuideView-FadZtBSQ.js b/frontend/dist/assets/GuideView-CP1Y1rbp.js similarity index 99% rename from frontend/dist/assets/GuideView-FadZtBSQ.js rename to frontend/dist/assets/GuideView-CP1Y1rbp.js index 8b56cfc..dd1b0f0 100644 --- a/frontend/dist/assets/GuideView-FadZtBSQ.js +++ b/frontend/dist/assets/GuideView-CP1Y1rbp.js @@ -1,4 +1,4 @@ -import{c as u,j as e,r as M,t as C,V as z,Y as k,Z as y,M as v,_ as L,O as G,$ as D,W as T,b as f,a0 as B}from"./index-B57enqf6.js";import{a as w,L as P,C as E,Z as R}from"./zap-0IkDqAhv.js";import{L as I}from"./layers-BVbGNbDq.js";/** +import{c as u,j as e,r as M,t as C,V as z,Y as k,Z as y,M as v,_ as L,O as G,$ as D,W as T,b as f,a0 as B}from"./index-BYlMs6Dj.js";import{a as w,L as P,C as E,Z as R}from"./zap-B_VSdjfC.js";import{L as I}from"./layers-DCwnbkXd.js";/** * @license lucide-react v0.460.0 - ISC * * This source code is licensed under the ISC license. diff --git a/frontend/dist/assets/IdeenView-CZhoWV4q.js b/frontend/dist/assets/IdeenView-wVxyfCCm.js similarity index 99% rename from frontend/dist/assets/IdeenView-CZhoWV4q.js rename to frontend/dist/assets/IdeenView-wVxyfCCm.js index 23524b7..9ff9208 100644 --- a/frontend/dist/assets/IdeenView-CZhoWV4q.js +++ b/frontend/dist/assets/IdeenView-wVxyfCCm.js @@ -1,4 +1,4 @@ -import{c as $,j as e,b as S,a2 as ve,u as Se,k as De,r as d,n as z,a6 as Ke,_ as O,L as D,X as Q,a7 as xe,F as T,a3 as he,C as Ce,T as ze,a4 as Ee,a8 as pe,q as Ae,R as fe}from"./index-B57enqf6.js";import{S as Le,H as X}from"./SectionLabel-C_SwIL8k.js";import{C as ee}from"./code-xml-ID_kOxxM.js";import{L as Pe}from"./layers-BVbGNbDq.js";import{C as U}from"./chevron-down-C-RXUrpR.js";import{R as We}from"./rotate-ccw-Bz6oQ3_7.js";/** +import{c as $,j as e,b as S,a2 as ve,u as Se,k as De,r as d,n as z,a6 as Ke,_ as O,L as D,X as Q,a7 as xe,F as T,a3 as he,C as Ce,T as ze,a4 as Ee,a8 as pe,q as Ae,R as fe}from"./index-BYlMs6Dj.js";import{S as Le,H as X}from"./SectionLabel-R1yae0WQ.js";import{C as ee}from"./code-xml-DZ6lLr-w.js";import{L as Pe}from"./layers-DCwnbkXd.js";import{C as U}from"./chevron-down-D5zhK_UQ.js";import{R as We}from"./rotate-ccw-Dx0bZ_kA.js";/** * @license lucide-react v0.460.0 - ISC * * This source code is licensed under the ISC license. diff --git a/frontend/dist/assets/JobsBar-D8URwRCr.js b/frontend/dist/assets/JobsBar-B1nmMx5i.js similarity index 96% rename from frontend/dist/assets/JobsBar-D8URwRCr.js rename to frontend/dist/assets/JobsBar-B1nmMx5i.js index 10c2f75..bb3beab 100644 --- a/frontend/dist/assets/JobsBar-D8URwRCr.js +++ b/frontend/dist/assets/JobsBar-B1nmMx5i.js @@ -1 +1 @@ -import{u,ah as m,k as x,j as s,y as n,ai as b,b as p,n as f,q as h}from"./index-B57enqf6.js";function y(){const d=u(),{data:t=[]}=m(),{showAlert:l,dialogElement:o}=x();async function i(e){try{await f(`/api/jobs/${e}/cancel`,{method:"POST"}),d.invalidateQueries({queryKey:h.jobs})}catch(c){l("Fehler",c.message)}}const a=t.filter(e=>e.state==="running"||e.state==="queued"),r=t.filter(e=>e.state!=="running"&&e.state!=="queued").slice(-3);return a.length===0&&r.length===0?null:s.jsxs("div",{className:"space-y-3 mc-card p-4",children:[s.jsx("div",{className:"text-[11px] font-semibold text-muted-foreground uppercase tracking-wider",children:"Aktive Downloads"}),a.map(e=>s.jsxs("div",{className:"space-y-1.5 p-3 rounded-xl bg-background/20 border border-border/40",children:[s.jsxs("div",{className:"flex justify-between items-center text-xs",children:[s.jsx("span",{className:"font-semibold truncate max-w-[250px]",children:e.label}),s.jsxs("div",{className:"flex items-center gap-3",children:[s.jsxs("span",{className:"text-muted-foreground font-mono",children:[e.progress??0,"% • ",n(e.done_bytes),"/",n(e.total_bytes),e.eta_s?` • ETA ${b(e.eta_s)}`:""]}),s.jsx("button",{onClick:()=>i(e.id),className:"text-[10px] text-red-400 hover:text-red-300 font-semibold border border-red-500/25 bg-red-500/5 px-2 py-0.5 rounded transition-all cursor-pointer",children:"Abbrechen"})]})]}),s.jsx("div",{className:"h-1.5 overflow-hidden rounded-full bg-muted",children:s.jsx("div",{className:"h-full rounded-full bg-primary transition-all duration-500",style:{width:`${e.progress??0}%`}})})]},e.id)),r.map(e=>s.jsxs("div",{className:"flex justify-between items-center text-xs text-muted-foreground px-1",children:[s.jsx("span",{className:"truncate",children:e.label}),s.jsx("span",{className:p("font-semibold text-[10px] px-1.5 py-0.5 rounded uppercase font-mono",e.state==="done"?"bg-emerald-500/10 text-emerald-400":"bg-amber-500/10 text-amber-400"),children:e.state})]},e.id)),o]})}export{y as J}; +import{u,ah as m,k as x,j as s,y as n,ai as b,b as p,n as f,q as h}from"./index-BYlMs6Dj.js";function y(){const d=u(),{data:t=[]}=m(),{showAlert:l,dialogElement:o}=x();async function i(e){try{await f(`/api/jobs/${e}/cancel`,{method:"POST"}),d.invalidateQueries({queryKey:h.jobs})}catch(c){l("Fehler",c.message)}}const a=t.filter(e=>e.state==="running"||e.state==="queued"),r=t.filter(e=>e.state!=="running"&&e.state!=="queued").slice(-3);return a.length===0&&r.length===0?null:s.jsxs("div",{className:"space-y-3 mc-card p-4",children:[s.jsx("div",{className:"text-[11px] font-semibold text-muted-foreground uppercase tracking-wider",children:"Aktive Downloads"}),a.map(e=>s.jsxs("div",{className:"space-y-1.5 p-3 rounded-xl bg-background/20 border border-border/40",children:[s.jsxs("div",{className:"flex justify-between items-center text-xs",children:[s.jsx("span",{className:"font-semibold truncate max-w-[250px]",children:e.label}),s.jsxs("div",{className:"flex items-center gap-3",children:[s.jsxs("span",{className:"text-muted-foreground font-mono",children:[e.progress??0,"% • ",n(e.done_bytes),"/",n(e.total_bytes),e.eta_s?` • ETA ${b(e.eta_s)}`:""]}),s.jsx("button",{onClick:()=>i(e.id),className:"text-[10px] text-red-400 hover:text-red-300 font-semibold border border-red-500/25 bg-red-500/5 px-2 py-0.5 rounded transition-all cursor-pointer",children:"Abbrechen"})]})]}),s.jsx("div",{className:"h-1.5 overflow-hidden rounded-full bg-muted",children:s.jsx("div",{className:"h-full rounded-full bg-primary transition-all duration-500",style:{width:`${e.progress??0}%`}})})]},e.id)),r.map(e=>s.jsxs("div",{className:"flex justify-between items-center text-xs text-muted-foreground px-1",children:[s.jsx("span",{className:"truncate",children:e.label}),s.jsx("span",{className:p("font-semibold text-[10px] px-1.5 py-0.5 rounded uppercase font-mono",e.state==="done"?"bg-emerald-500/10 text-emerald-400":"bg-amber-500/10 text-amber-400"),children:e.state})]},e.id)),o]})}export{y as J}; diff --git a/frontend/dist/assets/KonsoleView-BwsSoiDo.js b/frontend/dist/assets/KonsoleView-pXiZKOZ7.js similarity index 98% rename from frontend/dist/assets/KonsoleView-BwsSoiDo.js rename to frontend/dist/assets/KonsoleView-pXiZKOZ7.js index 42df349..67209fc 100644 --- a/frontend/dist/assets/KonsoleView-BwsSoiDo.js +++ b/frontend/dist/assets/KonsoleView-pXiZKOZ7.js @@ -1 +1 @@ -import{I as b,u as f,K as h,r as d,j as e,b as c,J as g,T as p,R as j,Q as N,n as v,U as w,q as x}from"./index-B57enqf6.js";function y(){const{data:s}=b(),m=f(),r=s!=null&&s.box_console_url?h(s.box_console_url):void 0,a=s==null?void 0:s.box_console_reachable,[l,o]=d.useState(!1),[i,n]=d.useState("");async function u(){o(!0),n("");try{const t=await v("/api/maintenance/restart",{method:"POST",body:JSON.stringify({service:"box-console"})});n(t.ok?"Neu gestartet — einen Moment, dann lädt das Terminal.":`Fehlgeschlagen: ${t.err||"Unbekannter Fehler"}`),w(m,x.agentStatus,x.services)}catch(t){n(`Fehlgeschlagen: ${(t==null?void 0:t.message)||t}`)}finally{o(!1)}}return e.jsxs("div",{className:"flex h-full flex-col gap-4",children:[e.jsxs("div",{className:"flex flex-wrap items-end justify-between gap-3",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text font-space text-2xl font-bold tracking-tight text-transparent",children:"Konsole"}),e.jsx("p",{className:"flex items-center gap-2 text-sm text-muted-foreground",children:"Direkte Shell auf der Box — wie ein SSH-Fenster, mitten im Browser."})]}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsxs("span",{className:"flex items-center gap-1.5 text-[11px] font-medium text-muted-foreground",children:[e.jsx("span",{className:c("h-2 w-2 rounded-full",a?"bg-emerald-500 animate-pulse":"bg-amber-500")}),a?"online":"offline"]}),r&&e.jsxs("a",{href:r,target:"_blank",rel:"noopener",className:"flex h-8 items-center gap-1.5 rounded-lg border border-border/60 bg-background/20 px-3 text-xs font-semibold text-muted-foreground transition-all hover:border-primary/50 hover:text-foreground",children:[e.jsx(g,{className:"h-3.5 w-3.5"})," In neuem Tab"]})]})]}),r?e.jsxs("div",{className:"relative min-h-[58vh] flex-1 overflow-hidden rounded-2xl border border-border/60 bg-black/50 shadow-lg shadow-black/25",children:[a===!1&&e.jsxs("div",{className:"absolute inset-0 z-10 flex flex-col items-center justify-center gap-3 bg-black/70 text-center",children:[e.jsx(p,{className:"h-8 w-8 text-amber-400"}),e.jsx("div",{className:"text-sm font-semibold text-amber-300",children:"Konsole nicht erreichbar"}),e.jsxs("p",{className:"max-w-sm text-[11px] leading-normal text-muted-foreground",children:["Der Terminal-Dienst (",e.jsx("code",{className:"font-mono text-primary",children:"box-console"}),") läuft gerade nicht."]}),e.jsxs("button",{onClick:u,disabled:l,className:"flex h-9 items-center gap-1.5 rounded-lg border border-amber-500/40 bg-amber-500/10 px-4 text-[11px] font-bold uppercase tracking-wide text-amber-300 transition-all hover:bg-amber-500/20 cursor-pointer disabled:opacity-50",children:[e.jsx(j,{className:c("h-3.5 w-3.5",l&&"animate-spin")})," Dienst neu starten"]}),i&&e.jsx("p",{className:"max-w-sm text-[11px] text-muted-foreground",children:i})]}),e.jsx("iframe",{src:r,title:"Box-Konsole",className:"h-full w-full border-0",style:{minHeight:"58vh"}})]}):e.jsxs("div",{className:"flex min-h-[58vh] flex-1 items-center justify-center rounded-2xl border border-border/60 bg-background/20 text-xs text-muted-foreground",children:[e.jsx(N,{className:"mr-2 h-4 w-4"})," Lade Konsole…"]})]})}export{y as KonsoleView}; +import{I as b,u as f,K as h,r as d,j as e,b as c,J as g,T as p,R as j,Q as N,n as v,U as w,q as x}from"./index-BYlMs6Dj.js";function y(){const{data:s}=b(),m=f(),r=s!=null&&s.box_console_url?h(s.box_console_url):void 0,a=s==null?void 0:s.box_console_reachable,[l,o]=d.useState(!1),[i,n]=d.useState("");async function u(){o(!0),n("");try{const t=await v("/api/maintenance/restart",{method:"POST",body:JSON.stringify({service:"box-console"})});n(t.ok?"Neu gestartet — einen Moment, dann lädt das Terminal.":`Fehlgeschlagen: ${t.err||"Unbekannter Fehler"}`),w(m,x.agentStatus,x.services)}catch(t){n(`Fehlgeschlagen: ${(t==null?void 0:t.message)||t}`)}finally{o(!1)}}return e.jsxs("div",{className:"flex h-full flex-col gap-4",children:[e.jsxs("div",{className:"flex flex-wrap items-end justify-between gap-3",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text font-space text-2xl font-bold tracking-tight text-transparent",children:"Konsole"}),e.jsx("p",{className:"flex items-center gap-2 text-sm text-muted-foreground",children:"Direkte Shell auf der Box — wie ein SSH-Fenster, mitten im Browser."})]}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsxs("span",{className:"flex items-center gap-1.5 text-[11px] font-medium text-muted-foreground",children:[e.jsx("span",{className:c("h-2 w-2 rounded-full",a?"bg-emerald-500 animate-pulse":"bg-amber-500")}),a?"online":"offline"]}),r&&e.jsxs("a",{href:r,target:"_blank",rel:"noopener",className:"flex h-8 items-center gap-1.5 rounded-lg border border-border/60 bg-background/20 px-3 text-xs font-semibold text-muted-foreground transition-all hover:border-primary/50 hover:text-foreground",children:[e.jsx(g,{className:"h-3.5 w-3.5"})," In neuem Tab"]})]})]}),r?e.jsxs("div",{className:"relative min-h-[58vh] flex-1 overflow-hidden rounded-2xl border border-border/60 bg-black/50 shadow-lg shadow-black/25",children:[a===!1&&e.jsxs("div",{className:"absolute inset-0 z-10 flex flex-col items-center justify-center gap-3 bg-black/70 text-center",children:[e.jsx(p,{className:"h-8 w-8 text-amber-400"}),e.jsx("div",{className:"text-sm font-semibold text-amber-300",children:"Konsole nicht erreichbar"}),e.jsxs("p",{className:"max-w-sm text-[11px] leading-normal text-muted-foreground",children:["Der Terminal-Dienst (",e.jsx("code",{className:"font-mono text-primary",children:"box-console"}),") läuft gerade nicht."]}),e.jsxs("button",{onClick:u,disabled:l,className:"flex h-9 items-center gap-1.5 rounded-lg border border-amber-500/40 bg-amber-500/10 px-4 text-[11px] font-bold uppercase tracking-wide text-amber-300 transition-all hover:bg-amber-500/20 cursor-pointer disabled:opacity-50",children:[e.jsx(j,{className:c("h-3.5 w-3.5",l&&"animate-spin")})," Dienst neu starten"]}),i&&e.jsx("p",{className:"max-w-sm text-[11px] text-muted-foreground",children:i})]}),e.jsx("iframe",{src:r,title:"Box-Konsole",className:"h-full w-full border-0",style:{minHeight:"58vh"}})]}):e.jsxs("div",{className:"flex min-h-[58vh] flex-1 items-center justify-center rounded-2xl border border-border/60 bg-background/20 text-xs text-muted-foreground",children:[e.jsx(N,{className:"mr-2 h-4 w-4"})," Lade Konsole…"]})]})}export{y as KonsoleView}; diff --git a/frontend/dist/assets/LiveAreaChartImpl-BkyPZEnE.js b/frontend/dist/assets/LiveAreaChartImpl-Bb72EW29.js similarity index 99% rename from frontend/dist/assets/LiveAreaChartImpl-BkyPZEnE.js rename to frontend/dist/assets/LiveAreaChartImpl-Bb72EW29.js index 6353d4b..63eb0ec 100644 --- a/frontend/dist/assets/LiveAreaChartImpl-BkyPZEnE.js +++ b/frontend/dist/assets/LiveAreaChartImpl-Bb72EW29.js @@ -1,4 +1,4 @@ -var Zy=Object.defineProperty;var Qy=(e,t,r)=>t in e?Zy(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r;var Hn=(e,t,r)=>Qy(e,typeof t!="symbol"?t+"":t,r);import{r as h,at as ee,au as bu,av as Ud,ap as Jy,aw as eg,j as oe}from"./index-B57enqf6.js";import{m as Zl,d as Ql,o as Kd,e as ot,f as tg,i as Eo,c as Jl,a as ec,b as rg,g as Tt,h as ng}from"./string-DoZi9Vij.js";var ig=["dangerouslySetInnerHTML","onCopy","onCopyCapture","onCut","onCutCapture","onPaste","onPasteCapture","onCompositionEnd","onCompositionEndCapture","onCompositionStart","onCompositionStartCapture","onCompositionUpdate","onCompositionUpdateCapture","onFocus","onFocusCapture","onBlur","onBlurCapture","onChange","onChangeCapture","onBeforeInput","onBeforeInputCapture","onInput","onInputCapture","onReset","onResetCapture","onSubmit","onSubmitCapture","onInvalid","onInvalidCapture","onLoad","onLoadCapture","onError","onErrorCapture","onKeyDown","onKeyDownCapture","onKeyPress","onKeyPressCapture","onKeyUp","onKeyUpCapture","onAbort","onAbortCapture","onCanPlay","onCanPlayCapture","onCanPlayThrough","onCanPlayThroughCapture","onDurationChange","onDurationChangeCapture","onEmptied","onEmptiedCapture","onEncrypted","onEncryptedCapture","onEnded","onEndedCapture","onLoadedData","onLoadedDataCapture","onLoadedMetadata","onLoadedMetadataCapture","onLoadStart","onLoadStartCapture","onPause","onPauseCapture","onPlay","onPlayCapture","onPlaying","onPlayingCapture","onProgress","onProgressCapture","onRateChange","onRateChangeCapture","onSeeked","onSeekedCapture","onSeeking","onSeekingCapture","onStalled","onStalledCapture","onSuspend","onSuspendCapture","onTimeUpdate","onTimeUpdateCapture","onVolumeChange","onVolumeChangeCapture","onWaiting","onWaitingCapture","onAuxClick","onAuxClickCapture","onClick","onClickCapture","onContextMenu","onContextMenuCapture","onDoubleClick","onDoubleClickCapture","onDrag","onDragCapture","onDragEnd","onDragEndCapture","onDragEnter","onDragEnterCapture","onDragExit","onDragExitCapture","onDragLeave","onDragLeaveCapture","onDragOver","onDragOverCapture","onDragStart","onDragStartCapture","onDrop","onDropCapture","onMouseDown","onMouseDownCapture","onMouseEnter","onMouseLeave","onMouseMove","onMouseMoveCapture","onMouseOut","onMouseOutCapture","onMouseOver","onMouseOverCapture","onMouseUp","onMouseUpCapture","onSelect","onSelectCapture","onTouchCancel","onTouchCancelCapture","onTouchEnd","onTouchEndCapture","onTouchMove","onTouchMoveCapture","onTouchStart","onTouchStartCapture","onPointerDown","onPointerDownCapture","onPointerMove","onPointerMoveCapture","onPointerUp","onPointerUpCapture","onPointerCancel","onPointerCancelCapture","onPointerEnter","onPointerEnterCapture","onPointerLeave","onPointerLeaveCapture","onPointerOver","onPointerOverCapture","onPointerOut","onPointerOutCapture","onGotPointerCapture","onGotPointerCaptureCapture","onLostPointerCapture","onLostPointerCaptureCapture","onScroll","onScrollCapture","onWheel","onWheelCapture","onAnimationStart","onAnimationStartCapture","onAnimationEnd","onAnimationEndCapture","onAnimationIteration","onAnimationIterationCapture","onTransitionEnd","onTransitionEndCapture"];function wu(e){if(typeof e!="string")return!1;var t=ig;return t.includes(e)}var ag=["aria-activedescendant","aria-atomic","aria-autocomplete","aria-busy","aria-checked","aria-colcount","aria-colindex","aria-colspan","aria-controls","aria-current","aria-describedby","aria-details","aria-disabled","aria-errormessage","aria-expanded","aria-flowto","aria-haspopup","aria-hidden","aria-invalid","aria-keyshortcuts","aria-label","aria-labelledby","aria-level","aria-live","aria-modal","aria-multiline","aria-multiselectable","aria-orientation","aria-owns","aria-placeholder","aria-posinset","aria-pressed","aria-readonly","aria-relevant","aria-required","aria-roledescription","aria-rowcount","aria-rowindex","aria-rowspan","aria-selected","aria-setsize","aria-sort","aria-valuemax","aria-valuemin","aria-valuenow","aria-valuetext","className","color","height","id","lang","max","media","method","min","name","style","target","width","role","tabIndex","accentHeight","accumulate","additive","alignmentBaseline","allowReorder","alphabetic","amplitude","arabicForm","ascent","attributeName","attributeType","autoReverse","azimuth","baseFrequency","baselineShift","baseProfile","bbox","begin","bias","by","calcMode","capHeight","clip","clipPath","clipPathUnits","clipRule","colorInterpolation","colorInterpolationFilters","colorProfile","colorRendering","contentScriptType","contentStyleType","cursor","cx","cy","d","decelerate","descent","diffuseConstant","direction","display","divisor","dominantBaseline","dur","dx","dy","edgeMode","elevation","enableBackground","end","exponent","externalResourcesRequired","fill","fillOpacity","fillRule","filter","filterRes","filterUnits","floodColor","floodOpacity","focusable","fontFamily","fontSize","fontSizeAdjust","fontStretch","fontStyle","fontVariant","fontWeight","format","from","fx","fy","g1","g2","glyphName","glyphOrientationHorizontal","glyphOrientationVertical","glyphRef","gradientTransform","gradientUnits","hanging","horizAdvX","horizOriginX","href","ideographic","imageRendering","in2","in","intercept","k1","k2","k3","k4","k","kernelMatrix","kernelUnitLength","kerning","keyPoints","keySplines","keyTimes","lengthAdjust","letterSpacing","lightingColor","limitingConeAngle","local","markerEnd","markerHeight","markerMid","markerStart","markerUnits","markerWidth","mask","maskContentUnits","maskUnits","mathematical","mode","numOctaves","offset","opacity","operator","order","orient","orientation","origin","overflow","overlinePosition","overlineThickness","paintOrder","panose1","pathLength","patternContentUnits","patternTransform","patternUnits","pointerEvents","pointsAtX","pointsAtY","pointsAtZ","preserveAlpha","preserveAspectRatio","primitiveUnits","r","radius","refX","refY","renderingIntent","repeatCount","repeatDur","requiredExtensions","requiredFeatures","restart","result","rotate","rx","ry","seed","shapeRendering","slope","spacing","specularConstant","specularExponent","speed","spreadMethod","startOffset","stdDeviation","stemh","stemv","stitchTiles","stopColor","stopOpacity","strikethroughPosition","strikethroughThickness","string","stroke","strokeDasharray","strokeDashoffset","strokeLinecap","strokeLinejoin","strokeMiterlimit","strokeOpacity","strokeWidth","surfaceScale","systemLanguage","tableValues","targetX","targetY","textAnchor","textDecoration","textLength","textRendering","to","transform","u1","u2","underlinePosition","underlineThickness","unicode","unicodeBidi","unicodeRange","unitsPerEm","vAlphabetic","values","vectorEffect","version","vertAdvY","vertOriginX","vertOriginY","vHanging","vIdeographic","viewTarget","visibility","vMathematical","widths","wordSpacing","writingMode","x1","x2","x","xChannelSelector","xHeight","xlinkActuate","xlinkArcrole","xlinkHref","xlinkRole","xlinkShow","xlinkTitle","xlinkType","xmlBase","xmlLang","xmlns","xmlnsXlink","xmlSpace","y1","y2","y","yChannelSelector","z","zoomAndPan","ref","key","angle"],og=new Set(ag);function Hd(e){return typeof e!="string"?!1:og.has(e)}function Yd(e){return typeof e=="string"&&e.startsWith("data-")}function it(e){if(typeof e!="object"||e===null)return{};var t={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(Hd(r)||Yd(r))&&(t[r]=e[r]);return t}function ia(e){if(e==null)return null;if(h.isValidElement(e)&&typeof e.props=="object"&&e.props!==null){var t=e.props;return it(t)}return typeof e=="object"&&!Array.isArray(e)?it(e):null}function Ge(e){var t={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(Hd(r)||Yd(r)||wu(r))&&(t[r]=e[r]);return t}function ug(e){return e==null?null:h.isValidElement(e)?Ge(e.props):typeof e=="object"&&!Array.isArray(e)?Ge(e):null}var lg=["children","width","height","viewBox","className","style","title","desc"];function _o(){return _o=Object.assign?Object.assign.bind():function(e){for(var t=1;t{var r=e.children,n=e.width,i=e.height,a=e.viewBox,o=e.className,u=e.style,l=e.title,c=e.desc,s=cg(e,lg),f=a||{width:n,height:i,x:0,y:0},d=ee("recharts-surface",o);return h.createElement("svg",_o({},Ge(s),{className:d,width:n,height:i,style:u,viewBox:"".concat(f.x," ").concat(f.y," ").concat(f.width," ").concat(f.height),ref:t}),h.createElement("title",null,l),h.createElement("desc",null,c),r)}),fg=["children","className"];function Io(){return Io=Object.assign?Object.assign.bind():function(e){for(var t=1;t{var r=e.children,n=e.className,i=dg(e,fg),a=ee("recharts-layer",n);return h.createElement("g",Io({className:a},Ge(i),{ref:t}),r)}),hg=h.createContext(null);function ne(e){return function(){return e}}const Co=Math.PI,ko=2*Co,er=1e-6,pg=ko-er;function Gd(e){this._+=e[0];for(let t=1,r=e.length;t=0))throw new Error(`invalid digits: ${e}`);if(t>15)return Gd;const r=10**t;return function(n){this._+=n[0];for(let i=1,a=n.length;ier)if(!(Math.abs(f*l-c*s)>er)||!a)this._append`L${this._x1=t},${this._y1=r}`;else{let v=n-o,p=i-u,m=l*l+c*c,y=v*v+p*p,g=Math.sqrt(m),w=Math.sqrt(d),x=a*Math.tan((Co-Math.acos((m+d-y)/(2*g*w)))/2),A=x/w,O=x/g;Math.abs(A-1)>er&&this._append`L${t+A*s},${r+A*f}`,this._append`A${a},${a},0,0,${+(f*v>s*p)},${this._x1=t+O*l},${this._y1=r+O*c}`}}arc(t,r,n,i,a,o){if(t=+t,r=+r,n=+n,o=!!o,n<0)throw new Error(`negative radius: ${n}`);let u=n*Math.cos(i),l=n*Math.sin(i),c=t+u,s=r+l,f=1^o,d=o?i-a:a-i;this._x1===null?this._append`M${c},${s}`:(Math.abs(this._x1-c)>er||Math.abs(this._y1-s)>er)&&this._append`L${c},${s}`,n&&(d<0&&(d=d%ko+ko),d>pg?this._append`A${n},${n},0,1,${f},${t-u},${r-l}A${n},${n},0,1,${f},${this._x1=c},${this._y1=s}`:d>er&&this._append`A${n},${n},0,${+(d>=Co)},${f},${this._x1=t+n*Math.cos(a)},${this._y1=r+n*Math.sin(a)}`)}rect(t,r,n,i){this._append`M${this._x0=this._x1=+t},${this._y0=this._y1=+r}h${n=+n}v${+i}h${-n}Z`}toString(){return this._}}function qd(e){let t=3;return e.digits=function(r){if(!arguments.length)return t;if(r==null)t=null;else{const n=Math.floor(r);if(!(n>=0))throw new RangeError(`invalid digits: ${r}`);t=n}return e},()=>new yg(t)}function xu(e){return typeof e=="object"&&"length"in e?e:Array.from(e)}function Xd(e){this._context=e}Xd.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;default:this._context.lineTo(e,t);break}}};function aa(e){return new Xd(e)}function Zd(e){return e[0]}function Qd(e){return e[1]}function Jd(e,t){var r=ne(!0),n=null,i=aa,a=null,o=qd(u);e=typeof e=="function"?e:e===void 0?Zd:ne(e),t=typeof t=="function"?t:t===void 0?Qd:ne(t);function u(l){var c,s=(l=xu(l)).length,f,d=!1,v;for(n==null&&(a=i(v=o())),c=0;c<=s;++c)!(c=v;--p)u.point(x[p],A[p]);u.lineEnd(),u.areaEnd()}g&&(x[d]=+e(y,d,f),A[d]=+t(y,d,f),u.point(n?+n(y,d,f):x[d],r?+r(y,d,f):A[d]))}if(w)return u=null,w+""||null}function s(){return Jd().defined(i).curve(o).context(a)}return c.x=function(f){return arguments.length?(e=typeof f=="function"?f:ne(+f),n=null,c):e},c.x0=function(f){return arguments.length?(e=typeof f=="function"?f:ne(+f),c):e},c.x1=function(f){return arguments.length?(n=f==null?null:typeof f=="function"?f:ne(+f),c):n},c.y=function(f){return arguments.length?(t=typeof f=="function"?f:ne(+f),r=null,c):t},c.y0=function(f){return arguments.length?(t=typeof f=="function"?f:ne(+f),c):t},c.y1=function(f){return arguments.length?(r=f==null?null:typeof f=="function"?f:ne(+f),c):r},c.lineX0=c.lineY0=function(){return s().x(e).y(t)},c.lineY1=function(){return s().x(e).y(r)},c.lineX1=function(){return s().x(n).y(t)},c.defined=function(f){return arguments.length?(i=typeof f=="function"?f:ne(!!f),c):i},c.curve=function(f){return arguments.length?(o=f,a!=null&&(u=o(a)),c):o},c.context=function(f){return arguments.length?(f==null?a=u=null:u=o(a=f),c):a},c}class ev{constructor(t,r){this._context=t,this._x=r}areaStart(){this._line=0}areaEnd(){this._line=NaN}lineStart(){this._point=0}lineEnd(){(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line}point(t,r){switch(t=+t,r=+r,this._point){case 0:{this._point=1,this._line?this._context.lineTo(t,r):this._context.moveTo(t,r);break}case 1:this._point=2;default:{this._x?this._context.bezierCurveTo(this._x0=(this._x0+t)/2,this._y0,this._x0,r,t,r):this._context.bezierCurveTo(this._x0,this._y0=(this._y0+r)/2,t,this._y0,t,r);break}}this._x0=t,this._y0=r}}function gg(e){return new ev(e,!0)}function bg(e){return new ev(e,!1)}function vi(){}function hi(e,t,r){e._context.bezierCurveTo((2*e._x0+e._x1)/3,(2*e._y0+e._y1)/3,(e._x0+2*e._x1)/3,(e._y0+2*e._y1)/3,(e._x0+4*e._x1+t)/6,(e._y0+4*e._y1+r)/6)}function tv(e){this._context=e}tv.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){switch(this._point){case 3:hi(this,this._x1,this._y1);case 2:this._context.lineTo(this._x1,this._y1);break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;break;case 2:this._point=3,this._context.lineTo((5*this._x0+this._x1)/6,(5*this._y0+this._y1)/6);default:hi(this,e,t);break}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=t}};function wg(e){return new tv(e)}function rv(e){this._context=e}rv.prototype={areaStart:vi,areaEnd:vi,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._y0=this._y1=this._y2=this._y3=this._y4=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:{this._context.moveTo(this._x2,this._y2),this._context.closePath();break}case 2:{this._context.moveTo((this._x2+2*this._x3)/3,(this._y2+2*this._y3)/3),this._context.lineTo((this._x3+2*this._x2)/3,(this._y3+2*this._y2)/3),this._context.closePath();break}case 3:{this.point(this._x2,this._y2),this.point(this._x3,this._y3),this.point(this._x4,this._y4);break}}},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._x2=e,this._y2=t;break;case 1:this._point=2,this._x3=e,this._y3=t;break;case 2:this._point=3,this._x4=e,this._y4=t,this._context.moveTo((this._x0+4*this._x1+e)/6,(this._y0+4*this._y1+t)/6);break;default:hi(this,e,t);break}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=t}};function xg(e){return new rv(e)}function nv(e){this._context=e}nv.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){(this._line||this._line!==0&&this._point===3)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3;var r=(this._x0+4*this._x1+e)/6,n=(this._y0+4*this._y1+t)/6;this._line?this._context.lineTo(r,n):this._context.moveTo(r,n);break;case 3:this._point=4;default:hi(this,e,t);break}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=t}};function Ag(e){return new nv(e)}function iv(e){this._context=e}iv.prototype={areaStart:vi,areaEnd:vi,lineStart:function(){this._point=0},lineEnd:function(){this._point&&this._context.closePath()},point:function(e,t){e=+e,t=+t,this._point?this._context.lineTo(e,t):(this._point=1,this._context.moveTo(e,t))}};function Og(e){return new iv(e)}function tc(e){return e<0?-1:1}function rc(e,t,r){var n=e._x1-e._x0,i=t-e._x1,a=(e._y1-e._y0)/(n||i<0&&-0),o=(r-e._y1)/(i||n<0&&-0),u=(a*i+o*n)/(n+i);return(tc(a)+tc(o))*Math.min(Math.abs(a),Math.abs(o),.5*Math.abs(u))||0}function nc(e,t){var r=e._x1-e._x0;return r?(3*(e._y1-e._y0)/r-t)/2:t}function Va(e,t,r){var n=e._x0,i=e._y0,a=e._x1,o=e._y1,u=(a-n)/3;e._context.bezierCurveTo(n+u,i+u*t,a-u,o-u*r,a,o)}function pi(e){this._context=e}pi.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=this._t0=NaN,this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x1,this._y1);break;case 3:Va(this,this._t0,nc(this,this._t0));break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){var r=NaN;if(e=+e,t=+t,!(e===this._x1&&t===this._y1)){switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;break;case 2:this._point=3,Va(this,nc(this,r=rc(this,e,t)),r);break;default:Va(this,this._t0,r=rc(this,e,t));break}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=t,this._t0=r}}};function av(e){this._context=new ov(e)}(av.prototype=Object.create(pi.prototype)).point=function(e,t){pi.prototype.point.call(this,t,e)};function ov(e){this._context=e}ov.prototype={moveTo:function(e,t){this._context.moveTo(t,e)},closePath:function(){this._context.closePath()},lineTo:function(e,t){this._context.lineTo(t,e)},bezierCurveTo:function(e,t,r,n,i,a){this._context.bezierCurveTo(t,e,n,r,a,i)}};function Pg(e){return new pi(e)}function Sg(e){return new av(e)}function uv(e){this._context=e}uv.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x=[],this._y=[]},lineEnd:function(){var e=this._x,t=this._y,r=e.length;if(r)if(this._line?this._context.lineTo(e[0],t[0]):this._context.moveTo(e[0],t[0]),r===2)this._context.lineTo(e[1],t[1]);else for(var n=ic(e),i=ic(t),a=0,o=1;o=0;--t)i[t]=(o[t]-i[t+1])/a[t];for(a[r-1]=(e[r]+i[r-1])/2,t=0;t=0&&(this._t=1-this._t,this._line=1-this._line)},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;default:{if(this._t<=0)this._context.lineTo(this._x,t),this._context.lineTo(e,t);else{var r=this._x*(1-this._t)+e*this._t;this._context.lineTo(r,this._y),this._context.lineTo(r,t)}break}}this._x=e,this._y=t}};function _g(e){return new oa(e,.5)}function Ig(e){return new oa(e,0)}function Cg(e){return new oa(e,1)}function cr(e,t){if((o=e.length)>1)for(var r=1,n,i,a=e[t[0]],o,u=a.length;r=0;)r[t]=t;return r}function kg(e,t){return e[t]}function jg(e){const t=[];return t.key=e,t}function Tg(){var e=ne([]),t=jo,r=cr,n=kg;function i(a){var o=Array.from(e.apply(this,arguments),jg),u,l=o.length,c=-1,s;for(const f of a)for(u=0,++c;u0){for(var r,n,i=0,a=e[0].length,o;i0){for(var r=0,n=e[t[0]],i,a=n.length;r0)||!((a=(i=e[t[0]]).length)>0))){for(var r=0,n=1,i,a,o;n1&&arguments[1]!==void 0?arguments[1]:Lg,r=10**t,n=Math.round(e*r)/r;return Object.is(n,-0)?0:n}function we(e){for(var t=arguments.length,r=new Array(t>1?t-1:0),n=1;n{var u=r[o-1];return typeof u=="string"?i+u+a:u!==void 0?i+Ut(u)+a:i+a},"")}var He=e=>e===0?0:e>0?1:-1,ht=e=>typeof e=="number"&&e!=+e,sr=e=>typeof e=="string"&&e.length>1&&e.indexOf("%")===e.length-1,D=e=>(typeof e=="number"||e instanceof Number)&&!ht(e),pt=e=>D(e)||typeof e=="string",Rg=0,yn=e=>{var t=++Rg;return"".concat(e||"").concat(t)},Yt=function(t,r){var n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:0,i=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!1;if(!D(t)&&typeof t!="string")return n;var a;if(sr(t)){if(r==null)return n;var o=t.indexOf("%");a=r*parseFloat(t.slice(0,o))/100}else a=+t;return ht(a)&&(a=n),i&&r!=null&&a>r&&(a=r),a},sv=e=>{if(!Array.isArray(e))return!1;for(var t=e.length,r={},n=0;nn&&(typeof t=="function"?t(n):yr(n,t))===r)}var Oe=e=>e===null||typeof e>"u",Pu=e=>Oe(e)?e:"".concat(e.charAt(0).toUpperCase()).concat(e.slice(1));function De(e){return e!=null}function Fr(){}var dv=e=>"radius"in e&&"startAngle"in e&&"endAngle"in e,Su=(e,t)=>{if(!e||typeof e=="function"||typeof e=="boolean")return null;var r=e;if(h.isValidElement(e)&&(r=e.props),typeof r!="object"&&typeof r!="function")return null;var n={};return Object.keys(r).forEach(i=>{wu(i)&&typeof r[i]=="function"&&(n[i]=(a=>r[i](r,a)))}),n},zg=(e,t,r)=>n=>(e(t,r,n),null),Bg=(e,t,r)=>{if(e===null||typeof e!="object"&&typeof e!="function")return null;var n=null;return Object.keys(e).forEach(i=>{var a=e[i];wu(i)&&typeof a=="function"&&(n||(n={}),n[i]=zg(a,t,r))}),n};function ac(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function Fg(e){for(var t=1;t(o[u]===void 0&&n[u]!==void 0&&(o[u]=n[u]),o),r);return a}function Hg(e,t){const r=new Map;for(let n=0;nObject.prototype.propertyIsEnumerable.call(e,t))}function Eu(e){return e==null?e===void 0?"[object Undefined]":"[object Null]":Object.prototype.toString.call(e)}const Xg="[object RegExp]",hv="[object String]",pv="[object Number]",mv="[object Boolean]",yv="[object Arguments]",Zg="[object Symbol]",Qg="[object Date]",Jg="[object Map]",e0="[object Set]",t0="[object Array]",r0="[object ArrayBuffer]",n0="[object Object]",i0="[object DataView]",a0="[object Uint8Array]",o0="[object Uint8ClampedArray]",u0="[object Uint16Array]",l0="[object Uint32Array]",c0="[object Int8Array]",s0="[object Int16Array]",f0="[object Int32Array]",d0="[object Float32Array]",v0="[object Float64Array]",oc=typeof globalThis=="object"&&globalThis||typeof window=="object"&&window||typeof self=="object"&&self||typeof global=="object"&&global||(function(){return this})();function h0(e){return typeof oc.Buffer<"u"&&oc.Buffer.isBuffer(e)}function p0(e,t){return nr(e,void 0,e,new Map,t)}function nr(e,t,r,n=new Map,i=void 0){const a=i==null?void 0:i(e,t,r,n);if(a!==void 0)return a;if(Mo(e))return e;if(n.has(e))return n.get(e);if(Array.isArray(e)){const o=new Array(e.length);n.set(e,o);for(let u=0;u{}):Do(e,t,function n(i,a,o,u,l,c){const s=r(i,a,o,u,l,c);return s!==void 0?!!s:Do(i,a,n,c,!1)},new Map,!0)}function Do(e,t,r,n,i=!1){if(t===e)return!0;switch(typeof t){case"object":return g0(e,t,r,n);case"function":return Object.keys(t).length>0?Do(e,{...t},r,n,i):oi(e,t);default:return gv(e)&&i?typeof t=="string"?t==="":!0:oi(e,t)}}function g0(e,t,r,n){if(t==null)return!0;if(Array.isArray(t))return wv(e,t,r,n);if(t instanceof Map)return b0(e,t,r,n);if(t instanceof Set)return w0(e,t,r,n);const i=Object.keys(t);if(e==null||Mo(e))return i.length===0;if(i.length===0)return!0;if(n!=null&&n.has(t))return n.get(t)===e;n==null||n.set(t,e);try{for(let a=0;a{})}function x0(e){return e=y0(e),t=>xv(t,e)}function A0(e,t){return p0(e,(r,n,i,a)=>{if(typeof e=="object"){if(Eu(e)==="[object Object]"&&typeof e.constructor!="function"){const o={};return a.set(e,o),tt(o,e,i,a),o}switch(Object.prototype.toString.call(e)){case pv:case hv:case mv:{const o=new e.constructor(e==null?void 0:e.valueOf());return tt(o,e),o}case yv:{const o={};return tt(o,e),o.length=e.length,o[Symbol.iterator]=e[Symbol.iterator],o}default:return}}})}function O0(e){return A0(e)}const P0=/^(?:0|[1-9]\d*)$/;function Av(e,t=Number.MAX_SAFE_INTEGER){switch(typeof e){case"number":return Number.isInteger(e)&&e>=0&&e=0}function Ov(e){return e!=null&&typeof e!="function"&&C0(e.length)}function k0(e){return typeof e=="object"&&e!==null}function j0(e){return k0(e)&&Ov(e)}function uc(e,t=vv){return j0(e)?Hg(Array.from(e),Yg(I0(t),1)):[]}function T0(e,t,r){return t===!0?uc(e,r):typeof t=="function"?uc(e,t):e}var Ga={exports:{}},qa={},Xa={exports:{}},Za={};/** +var Zy=Object.defineProperty;var Qy=(e,t,r)=>t in e?Zy(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r;var Hn=(e,t,r)=>Qy(e,typeof t!="symbol"?t+"":t,r);import{r as h,at as ee,au as bu,av as Ud,ap as Jy,aw as eg,j as oe}from"./index-BYlMs6Dj.js";import{m as Zl,d as Ql,o as Kd,e as ot,f as tg,i as Eo,c as Jl,a as ec,b as rg,g as Tt,h as ng}from"./string-DoZi9Vij.js";var ig=["dangerouslySetInnerHTML","onCopy","onCopyCapture","onCut","onCutCapture","onPaste","onPasteCapture","onCompositionEnd","onCompositionEndCapture","onCompositionStart","onCompositionStartCapture","onCompositionUpdate","onCompositionUpdateCapture","onFocus","onFocusCapture","onBlur","onBlurCapture","onChange","onChangeCapture","onBeforeInput","onBeforeInputCapture","onInput","onInputCapture","onReset","onResetCapture","onSubmit","onSubmitCapture","onInvalid","onInvalidCapture","onLoad","onLoadCapture","onError","onErrorCapture","onKeyDown","onKeyDownCapture","onKeyPress","onKeyPressCapture","onKeyUp","onKeyUpCapture","onAbort","onAbortCapture","onCanPlay","onCanPlayCapture","onCanPlayThrough","onCanPlayThroughCapture","onDurationChange","onDurationChangeCapture","onEmptied","onEmptiedCapture","onEncrypted","onEncryptedCapture","onEnded","onEndedCapture","onLoadedData","onLoadedDataCapture","onLoadedMetadata","onLoadedMetadataCapture","onLoadStart","onLoadStartCapture","onPause","onPauseCapture","onPlay","onPlayCapture","onPlaying","onPlayingCapture","onProgress","onProgressCapture","onRateChange","onRateChangeCapture","onSeeked","onSeekedCapture","onSeeking","onSeekingCapture","onStalled","onStalledCapture","onSuspend","onSuspendCapture","onTimeUpdate","onTimeUpdateCapture","onVolumeChange","onVolumeChangeCapture","onWaiting","onWaitingCapture","onAuxClick","onAuxClickCapture","onClick","onClickCapture","onContextMenu","onContextMenuCapture","onDoubleClick","onDoubleClickCapture","onDrag","onDragCapture","onDragEnd","onDragEndCapture","onDragEnter","onDragEnterCapture","onDragExit","onDragExitCapture","onDragLeave","onDragLeaveCapture","onDragOver","onDragOverCapture","onDragStart","onDragStartCapture","onDrop","onDropCapture","onMouseDown","onMouseDownCapture","onMouseEnter","onMouseLeave","onMouseMove","onMouseMoveCapture","onMouseOut","onMouseOutCapture","onMouseOver","onMouseOverCapture","onMouseUp","onMouseUpCapture","onSelect","onSelectCapture","onTouchCancel","onTouchCancelCapture","onTouchEnd","onTouchEndCapture","onTouchMove","onTouchMoveCapture","onTouchStart","onTouchStartCapture","onPointerDown","onPointerDownCapture","onPointerMove","onPointerMoveCapture","onPointerUp","onPointerUpCapture","onPointerCancel","onPointerCancelCapture","onPointerEnter","onPointerEnterCapture","onPointerLeave","onPointerLeaveCapture","onPointerOver","onPointerOverCapture","onPointerOut","onPointerOutCapture","onGotPointerCapture","onGotPointerCaptureCapture","onLostPointerCapture","onLostPointerCaptureCapture","onScroll","onScrollCapture","onWheel","onWheelCapture","onAnimationStart","onAnimationStartCapture","onAnimationEnd","onAnimationEndCapture","onAnimationIteration","onAnimationIterationCapture","onTransitionEnd","onTransitionEndCapture"];function wu(e){if(typeof e!="string")return!1;var t=ig;return t.includes(e)}var ag=["aria-activedescendant","aria-atomic","aria-autocomplete","aria-busy","aria-checked","aria-colcount","aria-colindex","aria-colspan","aria-controls","aria-current","aria-describedby","aria-details","aria-disabled","aria-errormessage","aria-expanded","aria-flowto","aria-haspopup","aria-hidden","aria-invalid","aria-keyshortcuts","aria-label","aria-labelledby","aria-level","aria-live","aria-modal","aria-multiline","aria-multiselectable","aria-orientation","aria-owns","aria-placeholder","aria-posinset","aria-pressed","aria-readonly","aria-relevant","aria-required","aria-roledescription","aria-rowcount","aria-rowindex","aria-rowspan","aria-selected","aria-setsize","aria-sort","aria-valuemax","aria-valuemin","aria-valuenow","aria-valuetext","className","color","height","id","lang","max","media","method","min","name","style","target","width","role","tabIndex","accentHeight","accumulate","additive","alignmentBaseline","allowReorder","alphabetic","amplitude","arabicForm","ascent","attributeName","attributeType","autoReverse","azimuth","baseFrequency","baselineShift","baseProfile","bbox","begin","bias","by","calcMode","capHeight","clip","clipPath","clipPathUnits","clipRule","colorInterpolation","colorInterpolationFilters","colorProfile","colorRendering","contentScriptType","contentStyleType","cursor","cx","cy","d","decelerate","descent","diffuseConstant","direction","display","divisor","dominantBaseline","dur","dx","dy","edgeMode","elevation","enableBackground","end","exponent","externalResourcesRequired","fill","fillOpacity","fillRule","filter","filterRes","filterUnits","floodColor","floodOpacity","focusable","fontFamily","fontSize","fontSizeAdjust","fontStretch","fontStyle","fontVariant","fontWeight","format","from","fx","fy","g1","g2","glyphName","glyphOrientationHorizontal","glyphOrientationVertical","glyphRef","gradientTransform","gradientUnits","hanging","horizAdvX","horizOriginX","href","ideographic","imageRendering","in2","in","intercept","k1","k2","k3","k4","k","kernelMatrix","kernelUnitLength","kerning","keyPoints","keySplines","keyTimes","lengthAdjust","letterSpacing","lightingColor","limitingConeAngle","local","markerEnd","markerHeight","markerMid","markerStart","markerUnits","markerWidth","mask","maskContentUnits","maskUnits","mathematical","mode","numOctaves","offset","opacity","operator","order","orient","orientation","origin","overflow","overlinePosition","overlineThickness","paintOrder","panose1","pathLength","patternContentUnits","patternTransform","patternUnits","pointerEvents","pointsAtX","pointsAtY","pointsAtZ","preserveAlpha","preserveAspectRatio","primitiveUnits","r","radius","refX","refY","renderingIntent","repeatCount","repeatDur","requiredExtensions","requiredFeatures","restart","result","rotate","rx","ry","seed","shapeRendering","slope","spacing","specularConstant","specularExponent","speed","spreadMethod","startOffset","stdDeviation","stemh","stemv","stitchTiles","stopColor","stopOpacity","strikethroughPosition","strikethroughThickness","string","stroke","strokeDasharray","strokeDashoffset","strokeLinecap","strokeLinejoin","strokeMiterlimit","strokeOpacity","strokeWidth","surfaceScale","systemLanguage","tableValues","targetX","targetY","textAnchor","textDecoration","textLength","textRendering","to","transform","u1","u2","underlinePosition","underlineThickness","unicode","unicodeBidi","unicodeRange","unitsPerEm","vAlphabetic","values","vectorEffect","version","vertAdvY","vertOriginX","vertOriginY","vHanging","vIdeographic","viewTarget","visibility","vMathematical","widths","wordSpacing","writingMode","x1","x2","x","xChannelSelector","xHeight","xlinkActuate","xlinkArcrole","xlinkHref","xlinkRole","xlinkShow","xlinkTitle","xlinkType","xmlBase","xmlLang","xmlns","xmlnsXlink","xmlSpace","y1","y2","y","yChannelSelector","z","zoomAndPan","ref","key","angle"],og=new Set(ag);function Hd(e){return typeof e!="string"?!1:og.has(e)}function Yd(e){return typeof e=="string"&&e.startsWith("data-")}function it(e){if(typeof e!="object"||e===null)return{};var t={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(Hd(r)||Yd(r))&&(t[r]=e[r]);return t}function ia(e){if(e==null)return null;if(h.isValidElement(e)&&typeof e.props=="object"&&e.props!==null){var t=e.props;return it(t)}return typeof e=="object"&&!Array.isArray(e)?it(e):null}function Ge(e){var t={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(Hd(r)||Yd(r)||wu(r))&&(t[r]=e[r]);return t}function ug(e){return e==null?null:h.isValidElement(e)?Ge(e.props):typeof e=="object"&&!Array.isArray(e)?Ge(e):null}var lg=["children","width","height","viewBox","className","style","title","desc"];function _o(){return _o=Object.assign?Object.assign.bind():function(e){for(var t=1;t{var r=e.children,n=e.width,i=e.height,a=e.viewBox,o=e.className,u=e.style,l=e.title,c=e.desc,s=cg(e,lg),f=a||{width:n,height:i,x:0,y:0},d=ee("recharts-surface",o);return h.createElement("svg",_o({},Ge(s),{className:d,width:n,height:i,style:u,viewBox:"".concat(f.x," ").concat(f.y," ").concat(f.width," ").concat(f.height),ref:t}),h.createElement("title",null,l),h.createElement("desc",null,c),r)}),fg=["children","className"];function Io(){return Io=Object.assign?Object.assign.bind():function(e){for(var t=1;t{var r=e.children,n=e.className,i=dg(e,fg),a=ee("recharts-layer",n);return h.createElement("g",Io({className:a},Ge(i),{ref:t}),r)}),hg=h.createContext(null);function ne(e){return function(){return e}}const Co=Math.PI,ko=2*Co,er=1e-6,pg=ko-er;function Gd(e){this._+=e[0];for(let t=1,r=e.length;t=0))throw new Error(`invalid digits: ${e}`);if(t>15)return Gd;const r=10**t;return function(n){this._+=n[0];for(let i=1,a=n.length;ier)if(!(Math.abs(f*l-c*s)>er)||!a)this._append`L${this._x1=t},${this._y1=r}`;else{let v=n-o,p=i-u,m=l*l+c*c,y=v*v+p*p,g=Math.sqrt(m),w=Math.sqrt(d),x=a*Math.tan((Co-Math.acos((m+d-y)/(2*g*w)))/2),A=x/w,O=x/g;Math.abs(A-1)>er&&this._append`L${t+A*s},${r+A*f}`,this._append`A${a},${a},0,0,${+(f*v>s*p)},${this._x1=t+O*l},${this._y1=r+O*c}`}}arc(t,r,n,i,a,o){if(t=+t,r=+r,n=+n,o=!!o,n<0)throw new Error(`negative radius: ${n}`);let u=n*Math.cos(i),l=n*Math.sin(i),c=t+u,s=r+l,f=1^o,d=o?i-a:a-i;this._x1===null?this._append`M${c},${s}`:(Math.abs(this._x1-c)>er||Math.abs(this._y1-s)>er)&&this._append`L${c},${s}`,n&&(d<0&&(d=d%ko+ko),d>pg?this._append`A${n},${n},0,1,${f},${t-u},${r-l}A${n},${n},0,1,${f},${this._x1=c},${this._y1=s}`:d>er&&this._append`A${n},${n},0,${+(d>=Co)},${f},${this._x1=t+n*Math.cos(a)},${this._y1=r+n*Math.sin(a)}`)}rect(t,r,n,i){this._append`M${this._x0=this._x1=+t},${this._y0=this._y1=+r}h${n=+n}v${+i}h${-n}Z`}toString(){return this._}}function qd(e){let t=3;return e.digits=function(r){if(!arguments.length)return t;if(r==null)t=null;else{const n=Math.floor(r);if(!(n>=0))throw new RangeError(`invalid digits: ${r}`);t=n}return e},()=>new yg(t)}function xu(e){return typeof e=="object"&&"length"in e?e:Array.from(e)}function Xd(e){this._context=e}Xd.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;default:this._context.lineTo(e,t);break}}};function aa(e){return new Xd(e)}function Zd(e){return e[0]}function Qd(e){return e[1]}function Jd(e,t){var r=ne(!0),n=null,i=aa,a=null,o=qd(u);e=typeof e=="function"?e:e===void 0?Zd:ne(e),t=typeof t=="function"?t:t===void 0?Qd:ne(t);function u(l){var c,s=(l=xu(l)).length,f,d=!1,v;for(n==null&&(a=i(v=o())),c=0;c<=s;++c)!(c=v;--p)u.point(x[p],A[p]);u.lineEnd(),u.areaEnd()}g&&(x[d]=+e(y,d,f),A[d]=+t(y,d,f),u.point(n?+n(y,d,f):x[d],r?+r(y,d,f):A[d]))}if(w)return u=null,w+""||null}function s(){return Jd().defined(i).curve(o).context(a)}return c.x=function(f){return arguments.length?(e=typeof f=="function"?f:ne(+f),n=null,c):e},c.x0=function(f){return arguments.length?(e=typeof f=="function"?f:ne(+f),c):e},c.x1=function(f){return arguments.length?(n=f==null?null:typeof f=="function"?f:ne(+f),c):n},c.y=function(f){return arguments.length?(t=typeof f=="function"?f:ne(+f),r=null,c):t},c.y0=function(f){return arguments.length?(t=typeof f=="function"?f:ne(+f),c):t},c.y1=function(f){return arguments.length?(r=f==null?null:typeof f=="function"?f:ne(+f),c):r},c.lineX0=c.lineY0=function(){return s().x(e).y(t)},c.lineY1=function(){return s().x(e).y(r)},c.lineX1=function(){return s().x(n).y(t)},c.defined=function(f){return arguments.length?(i=typeof f=="function"?f:ne(!!f),c):i},c.curve=function(f){return arguments.length?(o=f,a!=null&&(u=o(a)),c):o},c.context=function(f){return arguments.length?(f==null?a=u=null:u=o(a=f),c):a},c}class ev{constructor(t,r){this._context=t,this._x=r}areaStart(){this._line=0}areaEnd(){this._line=NaN}lineStart(){this._point=0}lineEnd(){(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line}point(t,r){switch(t=+t,r=+r,this._point){case 0:{this._point=1,this._line?this._context.lineTo(t,r):this._context.moveTo(t,r);break}case 1:this._point=2;default:{this._x?this._context.bezierCurveTo(this._x0=(this._x0+t)/2,this._y0,this._x0,r,t,r):this._context.bezierCurveTo(this._x0,this._y0=(this._y0+r)/2,t,this._y0,t,r);break}}this._x0=t,this._y0=r}}function gg(e){return new ev(e,!0)}function bg(e){return new ev(e,!1)}function vi(){}function hi(e,t,r){e._context.bezierCurveTo((2*e._x0+e._x1)/3,(2*e._y0+e._y1)/3,(e._x0+2*e._x1)/3,(e._y0+2*e._y1)/3,(e._x0+4*e._x1+t)/6,(e._y0+4*e._y1+r)/6)}function tv(e){this._context=e}tv.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){switch(this._point){case 3:hi(this,this._x1,this._y1);case 2:this._context.lineTo(this._x1,this._y1);break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;break;case 2:this._point=3,this._context.lineTo((5*this._x0+this._x1)/6,(5*this._y0+this._y1)/6);default:hi(this,e,t);break}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=t}};function wg(e){return new tv(e)}function rv(e){this._context=e}rv.prototype={areaStart:vi,areaEnd:vi,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._y0=this._y1=this._y2=this._y3=this._y4=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:{this._context.moveTo(this._x2,this._y2),this._context.closePath();break}case 2:{this._context.moveTo((this._x2+2*this._x3)/3,(this._y2+2*this._y3)/3),this._context.lineTo((this._x3+2*this._x2)/3,(this._y3+2*this._y2)/3),this._context.closePath();break}case 3:{this.point(this._x2,this._y2),this.point(this._x3,this._y3),this.point(this._x4,this._y4);break}}},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._x2=e,this._y2=t;break;case 1:this._point=2,this._x3=e,this._y3=t;break;case 2:this._point=3,this._x4=e,this._y4=t,this._context.moveTo((this._x0+4*this._x1+e)/6,(this._y0+4*this._y1+t)/6);break;default:hi(this,e,t);break}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=t}};function xg(e){return new rv(e)}function nv(e){this._context=e}nv.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){(this._line||this._line!==0&&this._point===3)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3;var r=(this._x0+4*this._x1+e)/6,n=(this._y0+4*this._y1+t)/6;this._line?this._context.lineTo(r,n):this._context.moveTo(r,n);break;case 3:this._point=4;default:hi(this,e,t);break}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=t}};function Ag(e){return new nv(e)}function iv(e){this._context=e}iv.prototype={areaStart:vi,areaEnd:vi,lineStart:function(){this._point=0},lineEnd:function(){this._point&&this._context.closePath()},point:function(e,t){e=+e,t=+t,this._point?this._context.lineTo(e,t):(this._point=1,this._context.moveTo(e,t))}};function Og(e){return new iv(e)}function tc(e){return e<0?-1:1}function rc(e,t,r){var n=e._x1-e._x0,i=t-e._x1,a=(e._y1-e._y0)/(n||i<0&&-0),o=(r-e._y1)/(i||n<0&&-0),u=(a*i+o*n)/(n+i);return(tc(a)+tc(o))*Math.min(Math.abs(a),Math.abs(o),.5*Math.abs(u))||0}function nc(e,t){var r=e._x1-e._x0;return r?(3*(e._y1-e._y0)/r-t)/2:t}function Va(e,t,r){var n=e._x0,i=e._y0,a=e._x1,o=e._y1,u=(a-n)/3;e._context.bezierCurveTo(n+u,i+u*t,a-u,o-u*r,a,o)}function pi(e){this._context=e}pi.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=this._t0=NaN,this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x1,this._y1);break;case 3:Va(this,this._t0,nc(this,this._t0));break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){var r=NaN;if(e=+e,t=+t,!(e===this._x1&&t===this._y1)){switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;break;case 2:this._point=3,Va(this,nc(this,r=rc(this,e,t)),r);break;default:Va(this,this._t0,r=rc(this,e,t));break}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=t,this._t0=r}}};function av(e){this._context=new ov(e)}(av.prototype=Object.create(pi.prototype)).point=function(e,t){pi.prototype.point.call(this,t,e)};function ov(e){this._context=e}ov.prototype={moveTo:function(e,t){this._context.moveTo(t,e)},closePath:function(){this._context.closePath()},lineTo:function(e,t){this._context.lineTo(t,e)},bezierCurveTo:function(e,t,r,n,i,a){this._context.bezierCurveTo(t,e,n,r,a,i)}};function Pg(e){return new pi(e)}function Sg(e){return new av(e)}function uv(e){this._context=e}uv.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x=[],this._y=[]},lineEnd:function(){var e=this._x,t=this._y,r=e.length;if(r)if(this._line?this._context.lineTo(e[0],t[0]):this._context.moveTo(e[0],t[0]),r===2)this._context.lineTo(e[1],t[1]);else for(var n=ic(e),i=ic(t),a=0,o=1;o=0;--t)i[t]=(o[t]-i[t+1])/a[t];for(a[r-1]=(e[r]+i[r-1])/2,t=0;t=0&&(this._t=1-this._t,this._line=1-this._line)},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;default:{if(this._t<=0)this._context.lineTo(this._x,t),this._context.lineTo(e,t);else{var r=this._x*(1-this._t)+e*this._t;this._context.lineTo(r,this._y),this._context.lineTo(r,t)}break}}this._x=e,this._y=t}};function _g(e){return new oa(e,.5)}function Ig(e){return new oa(e,0)}function Cg(e){return new oa(e,1)}function cr(e,t){if((o=e.length)>1)for(var r=1,n,i,a=e[t[0]],o,u=a.length;r=0;)r[t]=t;return r}function kg(e,t){return e[t]}function jg(e){const t=[];return t.key=e,t}function Tg(){var e=ne([]),t=jo,r=cr,n=kg;function i(a){var o=Array.from(e.apply(this,arguments),jg),u,l=o.length,c=-1,s;for(const f of a)for(u=0,++c;u0){for(var r,n,i=0,a=e[0].length,o;i0){for(var r=0,n=e[t[0]],i,a=n.length;r0)||!((a=(i=e[t[0]]).length)>0))){for(var r=0,n=1,i,a,o;n1&&arguments[1]!==void 0?arguments[1]:Lg,r=10**t,n=Math.round(e*r)/r;return Object.is(n,-0)?0:n}function we(e){for(var t=arguments.length,r=new Array(t>1?t-1:0),n=1;n{var u=r[o-1];return typeof u=="string"?i+u+a:u!==void 0?i+Ut(u)+a:i+a},"")}var He=e=>e===0?0:e>0?1:-1,ht=e=>typeof e=="number"&&e!=+e,sr=e=>typeof e=="string"&&e.length>1&&e.indexOf("%")===e.length-1,D=e=>(typeof e=="number"||e instanceof Number)&&!ht(e),pt=e=>D(e)||typeof e=="string",Rg=0,yn=e=>{var t=++Rg;return"".concat(e||"").concat(t)},Yt=function(t,r){var n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:0,i=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!1;if(!D(t)&&typeof t!="string")return n;var a;if(sr(t)){if(r==null)return n;var o=t.indexOf("%");a=r*parseFloat(t.slice(0,o))/100}else a=+t;return ht(a)&&(a=n),i&&r!=null&&a>r&&(a=r),a},sv=e=>{if(!Array.isArray(e))return!1;for(var t=e.length,r={},n=0;nn&&(typeof t=="function"?t(n):yr(n,t))===r)}var Oe=e=>e===null||typeof e>"u",Pu=e=>Oe(e)?e:"".concat(e.charAt(0).toUpperCase()).concat(e.slice(1));function De(e){return e!=null}function Fr(){}var dv=e=>"radius"in e&&"startAngle"in e&&"endAngle"in e,Su=(e,t)=>{if(!e||typeof e=="function"||typeof e=="boolean")return null;var r=e;if(h.isValidElement(e)&&(r=e.props),typeof r!="object"&&typeof r!="function")return null;var n={};return Object.keys(r).forEach(i=>{wu(i)&&typeof r[i]=="function"&&(n[i]=(a=>r[i](r,a)))}),n},zg=(e,t,r)=>n=>(e(t,r,n),null),Bg=(e,t,r)=>{if(e===null||typeof e!="object"&&typeof e!="function")return null;var n=null;return Object.keys(e).forEach(i=>{var a=e[i];wu(i)&&typeof a=="function"&&(n||(n={}),n[i]=zg(a,t,r))}),n};function ac(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function Fg(e){for(var t=1;t(o[u]===void 0&&n[u]!==void 0&&(o[u]=n[u]),o),r);return a}function Hg(e,t){const r=new Map;for(let n=0;nObject.prototype.propertyIsEnumerable.call(e,t))}function Eu(e){return e==null?e===void 0?"[object Undefined]":"[object Null]":Object.prototype.toString.call(e)}const Xg="[object RegExp]",hv="[object String]",pv="[object Number]",mv="[object Boolean]",yv="[object Arguments]",Zg="[object Symbol]",Qg="[object Date]",Jg="[object Map]",e0="[object Set]",t0="[object Array]",r0="[object ArrayBuffer]",n0="[object Object]",i0="[object DataView]",a0="[object Uint8Array]",o0="[object Uint8ClampedArray]",u0="[object Uint16Array]",l0="[object Uint32Array]",c0="[object Int8Array]",s0="[object Int16Array]",f0="[object Int32Array]",d0="[object Float32Array]",v0="[object Float64Array]",oc=typeof globalThis=="object"&&globalThis||typeof window=="object"&&window||typeof self=="object"&&self||typeof global=="object"&&global||(function(){return this})();function h0(e){return typeof oc.Buffer<"u"&&oc.Buffer.isBuffer(e)}function p0(e,t){return nr(e,void 0,e,new Map,t)}function nr(e,t,r,n=new Map,i=void 0){const a=i==null?void 0:i(e,t,r,n);if(a!==void 0)return a;if(Mo(e))return e;if(n.has(e))return n.get(e);if(Array.isArray(e)){const o=new Array(e.length);n.set(e,o);for(let u=0;u{}):Do(e,t,function n(i,a,o,u,l,c){const s=r(i,a,o,u,l,c);return s!==void 0?!!s:Do(i,a,n,c,!1)},new Map,!0)}function Do(e,t,r,n,i=!1){if(t===e)return!0;switch(typeof t){case"object":return g0(e,t,r,n);case"function":return Object.keys(t).length>0?Do(e,{...t},r,n,i):oi(e,t);default:return gv(e)&&i?typeof t=="string"?t==="":!0:oi(e,t)}}function g0(e,t,r,n){if(t==null)return!0;if(Array.isArray(t))return wv(e,t,r,n);if(t instanceof Map)return b0(e,t,r,n);if(t instanceof Set)return w0(e,t,r,n);const i=Object.keys(t);if(e==null||Mo(e))return i.length===0;if(i.length===0)return!0;if(n!=null&&n.has(t))return n.get(t)===e;n==null||n.set(t,e);try{for(let a=0;a{})}function x0(e){return e=y0(e),t=>xv(t,e)}function A0(e,t){return p0(e,(r,n,i,a)=>{if(typeof e=="object"){if(Eu(e)==="[object Object]"&&typeof e.constructor!="function"){const o={};return a.set(e,o),tt(o,e,i,a),o}switch(Object.prototype.toString.call(e)){case pv:case hv:case mv:{const o=new e.constructor(e==null?void 0:e.valueOf());return tt(o,e),o}case yv:{const o={};return tt(o,e),o.length=e.length,o[Symbol.iterator]=e[Symbol.iterator],o}default:return}}})}function O0(e){return A0(e)}const P0=/^(?:0|[1-9]\d*)$/;function Av(e,t=Number.MAX_SAFE_INTEGER){switch(typeof e){case"number":return Number.isInteger(e)&&e>=0&&e=0}function Ov(e){return e!=null&&typeof e!="function"&&C0(e.length)}function k0(e){return typeof e=="object"&&e!==null}function j0(e){return k0(e)&&Ov(e)}function uc(e,t=vv){return j0(e)?Hg(Array.from(e),Yg(I0(t),1)):[]}function T0(e,t,r){return t===!0?uc(e,r):typeof t=="function"?uc(e,t):e}var Ga={exports:{}},qa={},Xa={exports:{}},Za={};/** * @license React * use-sync-external-store-shim.production.js * diff --git a/frontend/dist/assets/ModelsView-Ck3R7mcg.js b/frontend/dist/assets/ModelsView-BYDzvdzC.js similarity index 63% rename from frontend/dist/assets/ModelsView-Ck3R7mcg.js rename to frontend/dist/assets/ModelsView-BYDzvdzC.js index 9519e07..eba6c66 100644 --- a/frontend/dist/assets/ModelsView-Ck3R7mcg.js +++ b/frontend/dist/assets/ModelsView-BYDzvdzC.js @@ -1,4 +1,4 @@ -import{c as E,u as he,a as qe,r as j,j as e,C as Y,L as Fe,b as k,d as Re,q as V,B as re,e as Ie,E as ze,f as le,g as Be,h as Ae,i as Pe,k as Ge,l as ee,X as me,H as be,T as se,s as Oe,m as Te,n as q,o as U,p as He,S as ge,t as Qe,P as Ue,v as Ve,w as We,x as Ze,y as Je}from"./index-B57enqf6.js";import{J as Xe}from"./JobsBar-D8URwRCr.js";import{C as Ye}from"./code-xml-ID_kOxxM.js";import{R as et}from"./rotate-ccw-Bz6oQ3_7.js";import{C as ue,Z as ie,L as tt,a as rt}from"./zap-0IkDqAhv.js";import{C as De}from"./chevron-down-C-RXUrpR.js";import{L as st}from"./layers-BVbGNbDq.js";/** +import{c as E,u as he,a as qe,r as j,j as e,C as Y,L as Fe,b as k,d as Re,q as V,B as re,e as Ie,E as ze,f as le,g as Be,h as Ae,i as Pe,k as Ge,l as ee,X as xe,H as be,T as se,s as Oe,m as Te,n as q,o as U,p as He,S as ge,t as Qe,P as Ue,v as Ve,w as We,x as Ze,y as Je}from"./index-BYlMs6Dj.js";import{J as Xe}from"./JobsBar-B1nmMx5i.js";import{C as Ye}from"./code-xml-DZ6lLr-w.js";import{R as et}from"./rotate-ccw-Dx0bZ_kA.js";import{C as ue,Z as ie,L as tt,a as rt}from"./zap-B_VSdjfC.js";import{C as $e}from"./chevron-down-D5zhK_UQ.js";import{L as st}from"./layers-DCwnbkXd.js";/** * @license lucide-react v0.460.0 - ISC * * This source code is licensed under the ISC license. @@ -13,7 +13,7 @@ import{c as E,u as he,a as qe,r as j,j as e,C as Y,L as Fe,b as k,d as Re,q as V * * This source code is licensed under the ISC license. * See the LICENSE file in the root directory of this source tree. - */const $e=E("ChevronUp",[["path",{d:"m18 15-6-6-6 6",key:"153udz"}]]);/** + */const De=E("ChevronUp",[["path",{d:"m18 15-6-6-6 6",key:"153udz"}]]);/** * @license lucide-react v0.460.0 - ISC * * This source code is licensed under the ISC license. @@ -48,12 +48,12 @@ import{c as E,u as he,a as qe,r as j,j as e,C as Y,L as Fe,b as k,d as Re,q as V * * This source code is licensed under the ISC license. * See the LICENSE file in the root directory of this source tree. - */const xt=E("Plus",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"M12 5v14",key:"s699le"}]]);/** + */const mt=E("Plus",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"M12 5v14",key:"s699le"}]]);/** * @license lucide-react v0.460.0 - ISC * * This source code is licensed under the ISC license. * See the LICENSE file in the root directory of this source tree. - */const mt=E("PowerOff",[["path",{d:"M18.36 6.64A9 9 0 0 1 20.77 15",key:"dxknvb"}],["path",{d:"M6.16 6.16a9 9 0 1 0 12.68 12.68",key:"1x7qb5"}],["path",{d:"M12 2v4",key:"3427ic"}],["path",{d:"m2 2 20 20",key:"1ooewy"}]]);/** + */const xt=E("PowerOff",[["path",{d:"M18.36 6.64A9 9 0 0 1 20.77 15",key:"dxknvb"}],["path",{d:"M6.16 6.16a9 9 0 1 0 12.68 12.68",key:"1x7qb5"}],["path",{d:"M12 2v4",key:"3427ic"}],["path",{d:"m2 2 20 20",key:"1ooewy"}]]);/** * @license lucide-react v0.460.0 - ISC * * This source code is licensed under the ISC license. @@ -78,6 +78,6 @@ import{c as E,u as he,a as qe,r as j,j as e,C as Y,L as Fe,b as k,d as Re,q as V * * This source code is licensed under the ISC license. * See the LICENSE file in the root directory of this source tree. - */const bt=E("Trash2",[["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6",key:"4alrt4"}],["path",{d:"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2",key:"v07s0e"}],["line",{x1:"10",x2:"10",y1:"11",y2:"17",key:"1uufr5"}],["line",{x1:"14",x2:"14",y1:"11",y2:"17",key:"xtxkd"}]]),gt=["fast","heavy","heavy_chars"],ft=["coder_lite","coder","coding_escalate_chars"];function yt(){const t=he(),{data:r,isLoading:h}=qe(),[a,c]=j.useState(null),[M,w]=j.useState(!1),[N,S]=j.useState(""),[b,z]=j.useState(0);if(j.useEffect(()=>{r!=null&&r.policy&&!a&&c({...r.policy})},[r,a]),h||!r||!a)return e.jsx("div",{className:"mc-card p-5 text-xs text-muted-foreground",children:"Lade Routing-Policy…"});const x=s=>r.fields.find(o=>o.key===s),g=Object.keys(a).some(s=>a[s]!==r.policy[s]),p=(s,o)=>{c(i=>i&&{...i,[s]:o}),S("")},d=s=>p(s,r.defaults[s]);async function L(){if(!a)return;const s={};for(const o of Object.keys(a))a[o]!==r.policy[o]&&(s[o]=a[o]);if(Object.keys(s).length!==0){w(!0),S("");try{const{policy:o}=await Re(s);c({...o}),t.invalidateQueries({queryKey:V.routingPolicy}),t.invalidateQueries({queryKey:V.routing}),z(Date.now()),setTimeout(()=>z(0),2e3)}catch(o){S(o.message||String(o))}finally{w(!1)}}}function A({k:s}){const o=x(s),i=a[s],G=a[s]===r.defaults[s];return e.jsxs("div",{className:"space-y-1",children:[e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsx("label",{className:"text-[10px] font-semibold text-muted-foreground",children:o.label}),!G&&e.jsxs("button",{onClick:()=>d(s),className:"flex items-center gap-0.5 text-[9px] text-muted-foreground/60 hover:text-foreground transition-colors cursor-pointer",title:`Auf Default zurücksetzen (${String(r.defaults[s])||"leer"})`,children:[e.jsx(et,{className:"h-2.5 w-2.5"})," Default"]})]}),o.type==="bool"?e.jsxs("button",{onClick:()=>p(s,!i),className:k("flex h-8 w-full items-center justify-between rounded-lg border px-3 text-[11px] font-semibold transition-all cursor-pointer",i?"border-emerald-500/40 bg-emerald-500/10 text-emerald-300":"border-border/40 bg-background/40 text-muted-foreground"),children:[e.jsx("span",{children:i?"An":"Aus"}),e.jsx("span",{className:k("h-3.5 w-3.5 rounded-full transition-colors",i?"bg-emerald-400":"bg-muted-foreground/40")})]}):o.type==="int"?e.jsx("input",{type:"number",value:i,min:o.min,max:o.max,"aria-label":o.label,onChange:B=>p(s,Number(B.target.value)),className:"h-8 w-full rounded-lg border border-border/40 bg-background/40 px-3 font-mono text-[11px] text-foreground outline-none focus:border-primary/50"}):e.jsx("input",{type:"text",value:i,"aria-label":o.label,spellCheck:!1,placeholder:s==="coder_lite"?"(leer = aus)":"",onChange:B=>p(s,B.target.value),className:"h-8 w-full rounded-lg border border-border/40 bg-background/40 px-3 font-mono text-[11px] text-foreground outline-none focus:border-primary/50"})]})}return e.jsxs("div",{className:"mc-card p-5 space-y-4",children:[e.jsxs("div",{className:"flex items-center justify-between gap-3 flex-wrap",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(ut,{className:"h-4.5 w-4.5 text-primary"}),e.jsx("span",{className:"text-xs font-bold uppercase tracking-wider text-foreground",children:"Lane-Routing & Policy"}),e.jsx("span",{className:"text-[9px] font-mono px-1.5 py-0.5 rounded bg-emerald-500/10 text-emerald-300 border border-emerald-500/20",children:"hot-reload"})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[N&&e.jsx("span",{className:"text-[10px] text-red-400 max-w-[280px] truncate",title:N,children:N}),b>0&&e.jsxs("span",{className:"flex items-center gap-1 text-[10px] text-emerald-400",children:[e.jsx(Y,{className:"h-3.5 w-3.5"})," gespeichert"]}),e.jsxs("button",{onClick:L,disabled:!g||M,className:k("h-8 px-4 rounded-lg text-[10px] font-bold uppercase tracking-wide transition-all flex items-center gap-1.5",g&&!M?"bg-primary text-primary-foreground hover:opacity-90 cursor-pointer shadow-md shadow-primary/10":"bg-background/40 text-muted-foreground/50 border border-border/40 cursor-not-allowed"),children:[M?e.jsx(Fe,{className:"h-3.5 w-3.5 animate-spin"}):null,"Speichern"]})]})]}),e.jsxs("p",{className:"text-[10px] text-muted-foreground/70 leading-relaxed -mt-1",children:["Welches echte Modell hinter den virtuellen Lanes ",e.jsx("code",{className:"text-cyan-300",children:"chat"})," und"," ",e.jsx("code",{className:"text-cyan-300",children:"coding"})," steckt. Änderungen greifen sofort (kein Neustart). Die Keyword-Heuristiken bleiben im Code."]}),e.jsxs("div",{className:"grid gap-4 md:grid-cols-2",children:[e.jsxs("div",{className:"rounded-xl border border-border/40 bg-background/25 p-4 space-y-3",children:[e.jsxs("div",{className:"flex items-center gap-2 border-b border-border/30 pb-2",children:[e.jsx(dt,{className:"h-4 w-4 text-teal-400"}),e.jsx("span",{className:"text-[11px] font-bold uppercase tracking-wider text-foreground",children:"chat"}),e.jsx("span",{className:"text-[9px] text-muted-foreground/60 font-mono",children:"(= auto)"})]}),gt.map(s=>e.jsx(A,{k:s},s))]}),e.jsxs("div",{className:"rounded-xl border border-border/40 bg-background/25 p-4 space-y-3",children:[e.jsxs("div",{className:"flex items-center gap-2 border-b border-border/30 pb-2",children:[e.jsx(Ye,{className:"h-4 w-4 text-indigo-400"}),e.jsx("span",{className:"text-[11px] font-bold uppercase tracking-wider text-foreground",children:"coding"}),e.jsx("span",{className:"text-[9px] text-muted-foreground/60 font-mono",children:"(agentisch → immer Coder)"})]}),ft.map(s=>e.jsx(A,{k:s},s))]})]}),e.jsx("div",{className:"rounded-xl border border-border/40 bg-background/25 p-4",children:e.jsx("div",{className:"max-w-xs",children:e.jsx(A,{k:"fast_no_think"})})})]})}const fe=[{role:"hermes",label:"Lucys Hirn",short:"Hirn",icon:re,desc:"Lucys Alltags-Verstand — denkt und redet mit dir. Immer bereit.",tone:"bg-indigo-500/15 text-indigo-400 border-indigo-500/25",protected:!0},{role:"embed",label:"Lucys Gedächtnis",short:"Gedächtnis",icon:Ie,desc:"Merkt sich Wichtiges und findet es später wieder.",tone:"bg-emerald-500/15 text-emerald-400 border-emerald-500/25",protected:!0},{role:"reranker",label:"Gedächtnis-Sortierer",short:"Sortierer",icon:it,desc:"Ordnet gefundene Erinnerungen nach echter Relevanz — die Feinsortierung hinter dem Gedächtnis.",tone:"bg-lime-500/15 text-lime-400 border-lime-500/25"},{role:"vision",label:"Lucys Augen",short:"Augen",icon:ze,desc:"Sieht Bilder und Screenshots und beschreibt, was drauf ist.",tone:"bg-pink-500/15 text-pink-400 border-pink-500/25"},{role:"heavy",label:"Großes Hirn",short:"Groß",icon:at,desc:"Das schwere Geschütz — wird für besonders knifflige Fragen dazugeholt.",tone:"bg-amber-500/15 text-amber-400 border-amber-500/25"},{role:"coder-lite",label:"Programmierer (schnell)",short:"Code schnell",icon:ue,desc:"Schnelles Programmieren im Alltag.",tone:"bg-violet-500/15 text-violet-400 border-violet-500/25"},{role:"coder",label:"Programmierer",short:"Code",icon:ue,desc:"Baut und plant. Der Kopf der Coding-Mannschaft — er hält den Faden und verteilt Zuarbeit.",tone:"bg-fuchsia-500/15 text-fuchsia-400 border-fuchsia-500/25",protected:!0},{role:"scout",label:"Späher",short:"Späher",icon:ht,desc:"Schneller erster Blick und grobe Einschätzung.",tone:"bg-teal-500/15 text-teal-400 border-teal-500/25"},{role:"kritiker",label:"Kritiker",short:"Kritiker",icon:Ee,desc:"Liest dem Programmierer nach jeder Etappe gegen — bewusst aus einer FREMDEN Modellfamilie (Mistral statt Qwen), damit er andere blinde Flecken hat.",tone:"bg-cyan-500/15 text-cyan-400 border-cyan-500/25"}];fe.map(t=>t.role);const je=Object.fromEntries(fe.map(t=>[t.role,t])),ve=t=>({role:t||"?",label:t||"unbekannt",short:t||"?",icon:re,desc:"Rolle ohne hinterlegten Klartext-Namen.",tone:"bg-slate-500/15 text-slate-300 border-slate-500/25"}),jt={fast:"hermes",coder_lite:"coder-lite"};function F(t){return t&&(je[t]||je[jt[t]])||ve(t)}function pe({role:t,dense:r=!1,className:h}){const a=F(t),c=a.icon;return e.jsxs("span",{className:k("inline-flex items-center gap-1 rounded px-1.5 py-0.5 text-[10px] font-semibold border tracking-wide",a.tone,h),title:`${a.desc} (${a.role})`,children:[e.jsx(c,{className:"h-3 w-3 shrink-0","aria-hidden":"true"}),r?a.short:a.label]})}function vt({fit:t}){const r={perfect:"bg-emerald-500/15 text-emerald-400 border border-emerald-500/20",marginal:"bg-amber-500/15 text-amber-400 border border-amber-500/20",too_tight:"bg-red-500/15 text-red-400 border border-red-500/20"}[t.level];return e.jsxs("span",{className:k("rounded px-2 py-0.5 text-[10px] font-semibold uppercase tracking-wider font-mono",r),children:[t.text," • ",t.req_gb," GB RAM"]})}function Ke(t){const r=t.toLowerCase();return r.includes("qwen")?{name:"Qwen",color:"bg-purple-500/20 text-purple-300 border-purple-500/30",initial:"Q"}:r.includes("gemma")?{name:"Gemma",color:"bg-blue-500/20 text-blue-300 border-blue-500/30",initial:"G"}:r.includes("llama")?{name:"Llama",color:"bg-red-500/20 text-red-300 border-red-500/30",initial:"🦙"}:r.includes("mistral")||r.includes("mixtral")?{name:"Mistral",color:"bg-orange-500/20 text-orange-300 border-orange-500/30",initial:"M"}:r.includes("deepseek")?{name:"DeepSeek",color:"bg-cyan-500/20 text-cyan-300 border-cyan-500/30",initial:"D"}:r.includes("hermes")||r.includes("nous")?{name:"Hermes",color:"bg-amber-500/20 text-amber-300 border-amber-500/30",initial:"H"}:r.includes("phi")?{name:"Phi",color:"bg-emerald-500/20 text-emerald-300 border-emerald-500/30",initial:"Φ"}:{name:"Other",color:"bg-slate-500/20 text-slate-300 border-slate-500/30",initial:"AI"}}function Nt(){var te,T,D;const t=he(),{data:r}=le(),{data:h}=Be(),{data:a}=Ae(),{data:c}=Pe(),{showAlert:M,dialogElement:w}=Ge(),[N,S]=j.useState(!1),[b,z]=j.useState(!1),x=(r==null?void 0:r.models)??[],g=(r==null?void 0:r.running)??[],p=(te=h==null?void 0:h.groups)==null?void 0:te.brains,d=(p==null?void 0:p.members)??[],L=u=>x.find(_=>_.name===u),A=u=>{var _;return((_=u.split("/").pop())==null?void 0:_.replace(/\.gguf$/i,""))||u},s=d.map(L).filter(Boolean),o=1024**3,i=c==null?void 0:c.budget,G=s.reduce((u,_)=>u+(_.size_bytes||0),0)/o,B=((T=a==null?void 0:a.gpu)==null?void 0:T.gtt_total)||((D=a==null?void 0:a.gpu)==null?void 0:D.vram_total)||0,C=(i==null?void 0:i.gtt_gb)||(B?B/o:0),v=(i==null?void 0:i.warm_projected_gb)??G,R=C>0?Math.min(100,v/C*100):0,K=x.filter(u=>!d.includes(u.name)&&!u.incomplete);async function I(u){z(!0);try{await Oe("brains",u,(p==null?void 0:p.swap)??!1,(p==null?void 0:p.persist)??!0),t.invalidateQueries({queryKey:V.groups}),t.invalidateQueries({queryKey:V.models}),t.invalidateQueries({queryKey:V.hermesBrain})}catch(_){M("Fehler",`Immer-bereit-Set konnte nicht geändert werden: ${(_==null?void 0:_.message)||_}`)}finally{z(!1)}}function O(u){const _=L(u);if(_&&F(_.role).protected){M("Geschützt",`„${F(_.role).label}" ist lebenswichtig und bleibt immer bereit.`);return}I(d.filter(H=>H!==u))}function W(u){S(!1),I([...d,u])}return p?e.jsxs("div",{className:"mc-card p-5 space-y-4",children:[e.jsx(Ne,{}),e.jsxs("div",{className:"space-y-1.5",children:[s.length===0&&e.jsx("div",{className:"text-xs text-muted-foreground",children:"Noch keine Modelle im Set."}),s.map(u=>{const _=g.includes(u.name),H=F(u.role).protected;return e.jsxs("div",{className:"flex items-center justify-between gap-2 rounded-xl border border-border/30 bg-background/20 p-2.5",children:[e.jsxs("div",{className:"flex min-w-0 items-center gap-2.5",children:[e.jsx("span",{className:k("h-2 w-2 shrink-0 rounded-full ring-2 ring-black/40",_?"bg-emerald-500 animate-pulse":"bg-muted-foreground/40"),title:_?"Gerade warm (bereit)":"Reserviert — lädt bei Bedarf sofort"}),u.role&&e.jsx(pe,{role:u.role,dense:!0,className:"shrink-0"}),e.jsx("span",{className:"truncate font-mono text-xs font-semibold text-foreground",title:u.name,children:A(u.name)}),e.jsx("span",{className:"shrink-0 font-mono text-[10px] text-muted-foreground/70",children:ee(u.size_bytes)})]}),H?e.jsx("span",{className:"shrink-0 text-[10px] font-semibold text-muted-foreground",title:"Lebenswichtig — bleibt immer im Set.",children:"🔒"}):e.jsx("button",{onClick:()=>O(u.name),disabled:b,className:"flex h-7 w-7 shrink-0 items-center justify-center rounded-lg border border-border/40 text-muted-foreground transition-colors hover:bg-red-500/5 hover:text-red-400 cursor-pointer disabled:opacity-50",title:"Aus dem Immer-bereit-Set nehmen (lädt dann nur noch bei Bedarf)",children:e.jsx(me,{className:"h-3.5 w-3.5"})})]},u.name)})]}),e.jsxs("button",{onClick:()=>S(!0),disabled:b||K.length===0,className:"flex h-8 w-full items-center justify-center gap-1.5 rounded-lg border border-dashed border-border/50 text-[11px] font-semibold uppercase tracking-wide text-muted-foreground transition-colors hover:border-primary/40 hover:text-primary cursor-pointer disabled:opacity-50",children:[e.jsx(xt,{className:"h-3.5 w-3.5"})," Modell dauerhaft bereithalten"]}),e.jsxs("div",{className:"rounded-xl border border-border/30 bg-background/20 p-3",children:[e.jsxs("div",{className:"mb-1.5 flex items-center justify-between text-[11px]",children:[e.jsxs("span",{className:"flex items-center gap-1.5 font-semibold uppercase tracking-wider text-muted-foreground",title:"Modellgewichte + KV-Cache, berechnet aus den echten Architektur-Daten jedes Modells (Layer × KV-Köpfe × Kontext) und seiner KV-Quantisierung. So viel legt llama.cpp beim Laden wirklich für den eingestellten Kontext an — kein Aufschlag mehr.",children:[e.jsx(be,{className:"h-3.5 w-3.5"})," Reserviert fürs Set"]}),e.jsxs("span",{className:"font-mono font-bold text-foreground",children:[v.toFixed(1),C>0?` / ${C.toFixed(0)}`:""," GB"]})]}),e.jsx("div",{className:"h-2 w-full overflow-hidden rounded-full border border-border/30 bg-background/50",children:e.jsx("div",{className:k("h-full rounded-full transition-all duration-500",R>=85?"bg-red-500":R>=65?"bg-amber-500":"bg-teal-500"),style:{width:`${R}%`}})}),i&&!i.fits&&e.jsxs("p",{className:"mt-2 flex items-start gap-1.5 text-[11px] text-amber-400",children:[e.jsx(se,{className:"mt-0.5 h-3.5 w-3.5 shrink-0"}),e.jsxs("span",{children:["Zusammen mit dem größten Gelegenheits-Modell (~",i.largest_ondemand_gb," GB) wird der Speicher knapp. Das Set bleibt dabei immer geladen — wird es wirklich eng, schlägt das Laden des großen Modells fehl (es wartet dann, statt das Set zu verdrängen)."]})]}),i&&i.fits&&e.jsxs("p",{className:"mt-2 flex items-center gap-1.5 text-[11px] text-emerald-400",children:[e.jsx(Y,{className:"h-3.5 w-3.5 shrink-0"})," Passt auch neben dem größten Gelegenheits-Modell — nichts wird verdrängt."]})]}),N&&e.jsx("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black/60 p-4 backdrop-blur-sm",role:"dialog","aria-modal":"true","aria-label":"Modell zum Immer-bereit-Set hinzufügen",children:e.jsxs("div",{className:"w-full max-w-md space-y-3 rounded-2xl border border-border/80 bg-card p-6 shadow-2xl animate-in fade-in zoom-in-95 duration-200",children:[e.jsxs("div",{className:"flex items-center justify-between border-b border-border/20 pb-2",children:[e.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-primary",children:"Dauerhaft bereithalten"}),e.jsx("button",{onClick:()=>S(!1),className:"rounded p-1 text-muted-foreground hover:bg-accent hover:text-foreground cursor-pointer",children:e.jsx(me,{className:"h-4 w-4"})})]}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"Wähle ein Modell, das ohne Ladezeit bereitstehen soll:"}),e.jsx("div",{className:"max-h-60 space-y-1.5 overflow-y-auto pr-1",children:K.map(u=>e.jsxs("button",{onClick:()=>W(u.name),className:"flex w-full items-center justify-between gap-2 rounded-lg border border-border/30 bg-background/20 px-3 py-2.5 text-left transition-colors hover:bg-accent cursor-pointer",children:[e.jsxs("span",{className:"flex min-w-0 items-center gap-2",children:[u.role&&e.jsx(pe,{role:u.role,dense:!0,className:"shrink-0"}),e.jsx("span",{className:"truncate font-mono text-xs font-semibold text-foreground",children:A(u.name)})]}),e.jsx("span",{className:"shrink-0 font-mono text-[10px] text-muted-foreground/70",children:ee(u.size_bytes)})]},u.name))})]})}),w]}):e.jsxs("div",{className:"mc-card p-5",children:[e.jsx(Ne,{}),e.jsx("p",{className:"mt-3 text-xs text-muted-foreground",children:"Es gibt noch kein Immer-bereit-Set. Es entsteht automatisch, sobald Lucys Hirn zugewiesen ist."}),w]})}function Ne(){return e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(ie,{className:"h-4.5 w-4.5 text-primary"}),e.jsxs("div",{children:[e.jsx("h2",{className:"text-sm font-bold uppercase tracking-wide text-foreground",children:"Immer-bereit-Set"}),e.jsx("p",{className:"text-[11px] text-muted-foreground",children:"Diese Modelle hält Lucy immer bereit — sie antworten ohne Ladezeit."})]})]})}function J({children:t,tone:r="muted"}){const h={muted:"bg-muted text-muted-foreground",primary:"bg-primary/15 text-primary",warn:"bg-amber-500/15 text-amber-500"};return e.jsx("span",{className:`rounded px-1.5 py-0.5 text-[11px] font-medium ${h[r]}`,children:t})}function kt({caps:t}){return t?e.jsxs("span",{className:"inline-flex flex-wrap gap-1",children:[t.coder&&e.jsx(J,{children:"💻 Code"}),t.vision&&e.jsx(J,{children:"👁 Bild"}),t.reasoning&&e.jsx(J,{children:"🧠 Reason"}),t.moe&&e.jsxs(J,{tone:"primary",children:["🧩 MoE",t.active_b?`·${t.active_b}b`:""]}),t.tools==="yes"&&e.jsx(J,{tone:"primary",children:"🛠 Tools"}),t.tools==="likely"&&e.jsx(J,{tone:"warn",children:"🛠 Tools?"}),t.embedding&&e.jsx(J,{children:"🔢 Embed"})]}):null}function wt({model:t,onClose:r,onChanged:h}){var L,A;const{data:a,isLoading:c}=Te(t.gguf_path),[M,w]=j.useState(null),[N,S]=j.useState(""),b=a==null?void 0:a.target_vocab,z=(a==null?void 0:a.drafts)??[],x=z.filter(s=>s.compatible===!0),g=t.spec_draft_model;async function p(s){w(s??"__clear__"),S("");try{await q(`/api/models/${encodeURIComponent(t.name)}/draft`,{method:"POST",body:JSON.stringify({draft_path:s})}),h(),r()}catch(o){S(String((o==null?void 0:o.message)||o)),w(null)}}const d=s=>{var o;return s?`${s.pre??"?"} · ${((o=s.n_vocab)==null?void 0:o.toLocaleString())??"?"} Tokens`:"—"};return e.jsx("div",{className:"fixed inset-0 z-50 bg-black/60 backdrop-blur-sm flex items-center justify-center p-4",children:e.jsxs("div",{className:"w-full max-w-lg rounded-2xl border border-border/80 bg-card p-6 shadow-2xl space-y-4 animate-in fade-in zoom-in-95 duration-200",children:[e.jsxs("div",{className:"flex items-center justify-between border-b border-border/20 pb-2",children:[e.jsxs("h3",{className:"text-xs font-bold uppercase tracking-wider text-primary flex items-center gap-2",children:[e.jsx(ie,{className:"h-4 w-4"})," Speculative Draft"]}),e.jsx("button",{onClick:r,className:"p-1 rounded hover:bg-accent text-muted-foreground hover:text-foreground cursor-pointer",children:e.jsx(me,{className:"h-4 w-4"})})]}),e.jsxs("div",{className:"text-xs text-muted-foreground leading-relaxed",children:['Beschleunigt die Token-Generierung mit einem kleinen "Draft"-Modell. Voraussetzung: der Draft muss den ',e.jsx("strong",{className:"text-foreground",children:"exakt gleichen Tokenizer (Vocab)"})," haben wie das Modell — sonst lehnt llama.cpp es ab."]}),e.jsxs("div",{className:"rounded-lg border border-border/40 bg-background/30 px-3 py-2 text-[11px] font-mono flex items-center justify-between",children:[e.jsx("span",{className:"text-muted-foreground",children:(L=t.name.split("/").pop())==null?void 0:L.replace(/\.gguf$/i,"")}),e.jsxs("span",{className:"text-foreground",children:["Vocab: ",d(b)]})]}),t.spec_active&&g&&e.jsxs("div",{className:"rounded-lg border border-emerald-500/30 bg-emerald-500/5 px-3 py-2 flex items-center justify-between gap-2",children:[e.jsxs("span",{className:"text-[11px] text-emerald-400 font-mono flex items-center gap-1.5 truncate",children:[e.jsx(Y,{className:"h-3.5 w-3.5 shrink-0"})," Aktiv: ",g]}),e.jsx("button",{onClick:()=>p(null),disabled:M!==null,className:"h-6 px-2.5 rounded border border-amber-500/30 bg-amber-500/5 hover:bg-amber-500/10 text-amber-400 text-[9px] font-bold uppercase shrink-0 cursor-pointer disabled:opacity-50",children:"Deaktivieren"})]}),!(a!=null&&a.target_exists)&&e.jsxs("div",{className:"rounded-lg border border-amber-500/30 bg-amber-500/5 px-3 py-2 text-[11px] text-amber-400 flex items-center gap-2",children:[e.jsx(se,{className:"h-3.5 w-3.5 shrink-0"}),"Modell-GGUF noch nicht vorhanden — Spec-Draft ist nach dem Download konfigurierbar."]}),e.jsx("div",{className:"space-y-1.5 max-h-64 overflow-y-auto pr-1",children:c?e.jsx("div",{className:"text-xs text-muted-foreground py-6 text-center",children:"Prüfe Vocab-Kompatibilität…"}):z.length===0?e.jsxs("div",{className:"text-[11px] text-muted-foreground border border-dashed border-border/50 rounded-lg p-4 text-center",children:["Keine Draft-Modelle in ",e.jsx("code",{className:"font-mono",children:"/srv/models/drafts"}),". Lade ein kleines same-family-Modell (z.B. Qwen3-0.6B) und lege es dort ab."]}):z.map(s=>{var G,B;const o=s.filename===g,i=s.compatible===!0;return e.jsxs("div",{className:k("rounded-lg border px-3 py-2 flex items-center justify-between gap-2 text-left",i?"border-border/40 bg-background/20":"border-border/20 bg-background/10 opacity-60",o&&"border-primary/40 bg-primary/10"),children:[e.jsxs("div",{className:"min-w-0",children:[e.jsxs("div",{className:"text-[11px] font-mono font-semibold text-foreground truncate flex items-center gap-1.5",children:[s.filename,s.mtp&&e.jsx("span",{className:"shrink-0 rounded bg-indigo-500/15 px-1.5 py-0.5 text-[8px] font-bold uppercase tracking-wider text-indigo-400 border border-indigo-500/25",title:"MTP-Kopf (Multi-Token-Prediction) — by-construction vocab-identisch, höchste Akzeptanzrate",children:"MTP"})]}),e.jsxs("div",{className:"text-[9px] text-muted-foreground font-mono",children:[ee(s.size_bytes)," · Vocab: ",d(s.vocab)]})]}),i?o?e.jsxs("span",{className:"text-[9px] font-bold uppercase text-primary flex items-center gap-1 shrink-0",children:[e.jsx(Y,{className:"h-3.5 w-3.5"})," Aktiv"]}):e.jsx("button",{onClick:()=>p(s.path),disabled:M!==null,className:"h-7 px-3 rounded-lg border border-emerald-500/30 bg-emerald-500/5 hover:bg-emerald-500/15 text-emerald-400 text-[9px] font-bold uppercase shrink-0 cursor-pointer disabled:opacity-50",children:"Aktivieren"}):e.jsxs("span",{className:"text-[9px] font-bold uppercase text-amber-400/80 flex items-center gap-1 shrink-0",title:s.compatible===!1?`Inkompatibel: Tokenizer/Vocab weicht ab (Draft ${(G=s.vocab)==null?void 0:G.pre}/${(B=s.vocab)==null?void 0:B.n_vocab} ≠ Modell ${b==null?void 0:b.pre}/${b==null?void 0:b.n_vocab}).`:"Kompatibilität nicht prüfbar (Datei fehlt).",children:[e.jsx(se,{className:"h-3.5 w-3.5"})," ",s.compatible===!1?"Vocab ≠":"n/a"]})]},s.path)})}),!c&&(a==null?void 0:a.target_exists)&&z.length>0&&x.length===0&&e.jsxs("div",{className:"rounded-lg border border-amber-500/30 bg-amber-500/5 px-3 py-2 text-[11px] text-amber-400 leading-relaxed",children:["Kein vocab-kompatibler Draft verfügbar — Speculative Decoding ist für dieses Modell nicht möglich. Es braucht einen Draft mit identischem Tokenizer (pre=",e.jsx("span",{className:"font-mono",children:b==null?void 0:b.pre}),", n_vocab=",e.jsx("span",{className:"font-mono",children:(A=b==null?void 0:b.n_vocab)==null?void 0:A.toLocaleString()}),")."]}),N&&e.jsx("div",{className:"text-[10px] text-red-400 font-mono",children:N})]})})}const ke={hermes:{bar:"bg-indigo-500",dot:"bg-indigo-500",text:"text-indigo-400"},embed:{bar:"bg-emerald-500",dot:"bg-emerald-500",text:"text-emerald-400"},vision:{bar:"bg-pink-500",dot:"bg-pink-500",text:"text-pink-400"},heavy:{bar:"bg-amber-500",dot:"bg-amber-500",text:"text-amber-400"},"coder-lite":{bar:"bg-violet-500",dot:"bg-violet-500",text:"text-violet-400"},coder:{bar:"bg-fuchsia-500",dot:"bg-fuchsia-500",text:"text-fuchsia-400"},scout:{bar:"bg-teal-500",dot:"bg-teal-500",text:"text-teal-400"},kritiker:{bar:"bg-cyan-500",dot:"bg-cyan-500",text:"text-cyan-400"},reranker:{bar:"bg-lime-500",dot:"bg-lime-500",text:"text-lime-400"}},Mt={fast:"hermes",coder_lite:"coder-lite"},we={bar:"bg-slate-400",dot:"bg-slate-400",text:"text-slate-300"};function oe(t){return t&&(ke[t]||ke[Mt[t]])||we}const Me=1024**3,Se=t=>{var r;return((r=t.split("/").pop())==null?void 0:r.replace(/\.gguf$/i,""))??t};function St({running:t,capacityBytes:r,realUsedBytes:h,selected:a,onSelect:c}){const M=r>2*Me?r:124*Me,w=t.reduce((x,g)=>x+(g.size_bytes||0),0),N=Math.max(0,h-w),S=Math.max(0,M-Math.max(w,h)),b=S/M*100,z=N/M*100;return e.jsxs("div",{className:"mc-card p-5",children:[e.jsxs("div",{className:"mb-3 flex flex-wrap items-end justify-between gap-2",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(be,{className:"h-5 w-5 text-primary"}),e.jsxs("div",{children:[e.jsx("div",{className:"text-[11px] font-semibold uppercase tracking-wider text-muted-foreground",children:"Modell-Speicher (GPU-Pool)"}),e.jsxs("div",{className:"font-space text-xl font-bold tracking-tight text-foreground",children:[U(M)," GB ",e.jsx("span",{className:"text-sm font-medium text-muted-foreground",children:"gesamt"})]})]})]}),e.jsxs("div",{className:"text-right text-[11px] font-mono text-muted-foreground",children:[e.jsxs("div",{children:[e.jsxs("span",{className:"font-bold text-foreground",children:[U(w)," GB"]})," Modell-Gewichte"]}),N>0&&e.jsxs("div",{children:[U(N)," GB KV-Cache & Betrieb"]}),e.jsxs("div",{className:"text-emerald-400",children:[U(S)," GB frei"]})]})]}),e.jsx("div",{className:"flex h-12 w-full overflow-hidden rounded-xl border border-border/40 bg-background/50 p-1",children:t.length===0?e.jsx("div",{className:"flex w-full items-center justify-center text-[11px] italic text-muted-foreground/60",children:"Kein Modell geladen — Auto-Swap holt bei Anfrage automatisch das passende."}):e.jsxs(e.Fragment,{children:[t.map(x=>{const g=(x.size_bytes||0)/M*100,p=oe(x.role),d=a===x.name;return e.jsxs("button",{onClick:()=>c==null?void 0:c(x.name),style:{width:`${g}%`},title:`${F(x.role).label} · ${Se(x.name)} · ${ee(x.size_bytes)}`,className:k("group flex h-full min-w-[2.5rem] shrink-0 flex-col justify-center gap-0.5 rounded-lg px-2 text-left text-white transition-all",p.bar,d?"ring-2 ring-white/70":"opacity-90 hover:opacity-100"),children:[e.jsx("span",{className:"truncate font-space text-[10px] font-bold leading-tight tracking-wide",children:F(x.role).short}),e.jsx("span",{className:"truncate font-mono text-[9px] leading-tight opacity-85",children:ee(x.size_bytes)})]},x.name)}),z>1.5&&e.jsx("div",{style:{width:`${z}%`},className:"flex h-full min-w-[2rem] items-center justify-center rounded-lg border border-dashed border-border/60 bg-background/40 text-[9px] font-mono text-muted-foreground/70",title:`${U(N)} GB KV-Cache & Betrieb (reale Belegung über den Modell-Gewichten)`,children:"KV"}),b>1.5&&e.jsx("div",{style:{width:`${b}%`},className:"flex h-full min-w-[2rem] items-center justify-center rounded-lg text-[9px] font-mono text-muted-foreground/50",title:`${U(S)} GB frei`,children:"frei"})]})}),t.length>0&&e.jsxs("div",{className:"mt-3 flex flex-wrap gap-x-4 gap-y-1.5",children:[t.map(x=>{const g=oe(x.role);return e.jsxs("button",{onClick:()=>c==null?void 0:c(x.name),className:"flex items-center gap-1.5 text-[11px] text-muted-foreground transition-colors hover:text-foreground",children:[e.jsx("span",{className:k("h-2.5 w-2.5 rounded-sm",g.dot)}),e.jsx("span",{className:k("font-semibold",g.text),children:F(x.role).short}),e.jsx("span",{className:"font-mono text-muted-foreground/70",children:Se(x.name)})]},x.name)}),N>0&&e.jsxs("span",{className:"flex items-center gap-1.5 text-[11px] text-muted-foreground/60",title:"Reale Belegung über den Modell-Gewichten (Kontext-Speicher der laufenden Modelle)",children:[e.jsx("span",{className:"h-2.5 w-2.5 rounded-sm border border-dashed border-border/60 bg-background/40"})," KV-Cache & Betrieb · ",U(N)," GB"]}),e.jsxs("span",{className:"flex items-center gap-1.5 text-[11px] text-muted-foreground/60",children:[e.jsx("span",{className:"h-2.5 w-2.5 rounded-sm border border-border/50 bg-background/50"})," frei · ",U(S)," GB"]})]})]})}const Ce=1024**3,X=t=>{var r;return((r=t.split("/").pop())==null?void 0:r.replace(/\.gguf$/i,""))??t};function Ct(){var n,f,$,Q;const t=he(),{data:r,isLoading:h,error:a}=le(),{data:c}=Ae(),{data:M}=Be(),{showAlert:w,showConfirm:N,showPrompt:S,dialogElement:b}=Ge(),z=He(),x=(r==null?void 0:r.models)??[],g=(r==null?void 0:r.running)??[],p=l=>!!F(l).protected,d=(n=M==null?void 0:M.groups)==null?void 0:n.brains,L=(d==null?void 0:d.members)??[],A=l=>L.includes(l),[s,o]=j.useState(null),[i,G]=j.useState(""),[B,C]=j.useState("all"),[v,R]=j.useState(null),K=()=>{t.invalidateQueries({queryKey:V.models}),t.invalidateQueries({queryKey:V.routing}),t.invalidateQueries({queryKey:V.groups})},I=x.filter(l=>g.includes(l.name)),O=((f=c==null?void 0:c.gpu)==null?void 0:f.gtt_total)||(($=c==null?void 0:c.gpu)==null?void 0:$.vram_total)||0,W=((Q=c==null?void 0:c.gpu)==null?void 0:Q.gtt_used)||0,te=O>2*Ce?O:124*Ce,T=j.useMemo(()=>{const l=i.trim().toLowerCase();return x.filter(m=>B==="in_use"?!!m.role||g.includes(m.name):!0).filter(m=>l?m.name.toLowerCase().includes(l):!0).sort((m,y)=>{const P=g.includes(m.name)?0:1,Z=g.includes(y.name)?0:1;return P!==Z?P-Z:X(m.name).localeCompare(X(y.name))})},[x,g,B,i]),D=x.find(l=>l.name===s)??null;async function u(l){try{await q(`/api/models/${encodeURIComponent(l)}/load`,{method:"POST"}),K()}catch(m){w("Fehler",`Laden fehlgeschlagen: ${m.message||m}`)}}async function _(l){const m=L.some(y=>g.includes(y));if(d&&m&&!A(l)){const y=L.filter(P=>g.includes(P)).map(X).join(", ");N("Verdrängt das Hirn?",`„${X(l)}" ist nicht ko-resident. Beim Laden wirft es das warme Hirn (${y}) raus — Lucy verliert Hirn bzw. Augen. + */const bt=E("Trash2",[["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6",key:"4alrt4"}],["path",{d:"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2",key:"v07s0e"}],["line",{x1:"10",x2:"10",y1:"11",y2:"17",key:"1uufr5"}],["line",{x1:"14",x2:"14",y1:"11",y2:"17",key:"xtxkd"}]]),gt=["fast","heavy","heavy_chars"],ft=["coder_lite","coder","coding_escalate_chars"];function yt(){const t=he(),{data:r,isLoading:b}=qe(),[a,c]=j.useState(null),[M,w]=j.useState(!1),[N,S]=j.useState(""),[g,z]=j.useState(0);if(j.useEffect(()=>{r!=null&&r.policy&&!a&&c({...r.policy})},[r,a]),b||!r||!a)return e.jsx("div",{className:"mc-card p-5 text-xs text-muted-foreground",children:"Lade Routing-Policy…"});const m=s=>r.fields.find(o=>o.key===s),f=Object.keys(a).some(s=>a[s]!==r.policy[s]),p=(s,o)=>{c(i=>i&&{...i,[s]:o}),S("")},d=s=>p(s,r.defaults[s]);async function L(){if(!a)return;const s={};for(const o of Object.keys(a))a[o]!==r.policy[o]&&(s[o]=a[o]);if(Object.keys(s).length!==0){w(!0),S("");try{const{policy:o}=await Re(s);c({...o}),t.invalidateQueries({queryKey:V.routingPolicy}),t.invalidateQueries({queryKey:V.routing}),z(Date.now()),setTimeout(()=>z(0),2e3)}catch(o){S(o.message||String(o))}finally{w(!1)}}}function A({k:s}){const o=m(s),i=a[s],G=a[s]===r.defaults[s];return e.jsxs("div",{className:"space-y-1",children:[e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsx("label",{className:"text-[10px] font-semibold text-muted-foreground",children:o.label}),!G&&e.jsxs("button",{onClick:()=>d(s),className:"flex items-center gap-0.5 text-[9px] text-muted-foreground/60 hover:text-foreground transition-colors cursor-pointer",title:`Auf Default zurücksetzen (${String(r.defaults[s])||"leer"})`,children:[e.jsx(et,{className:"h-2.5 w-2.5"})," Default"]})]}),o.type==="bool"?e.jsxs("button",{onClick:()=>p(s,!i),className:k("flex h-8 w-full items-center justify-between rounded-lg border px-3 text-[11px] font-semibold transition-all cursor-pointer",i?"border-emerald-500/40 bg-emerald-500/10 text-emerald-300":"border-border/40 bg-background/40 text-muted-foreground"),children:[e.jsx("span",{children:i?"An":"Aus"}),e.jsx("span",{className:k("h-3.5 w-3.5 rounded-full transition-colors",i?"bg-emerald-400":"bg-muted-foreground/40")})]}):o.type==="int"?e.jsx("input",{type:"number",value:i,min:o.min,max:o.max,"aria-label":o.label,onChange:B=>p(s,Number(B.target.value)),className:"h-8 w-full rounded-lg border border-border/40 bg-background/40 px-3 font-mono text-[11px] text-foreground outline-none focus:border-primary/50"}):e.jsx("input",{type:"text",value:i,"aria-label":o.label,spellCheck:!1,placeholder:s==="coder_lite"?"(leer = aus)":"",onChange:B=>p(s,B.target.value),className:"h-8 w-full rounded-lg border border-border/40 bg-background/40 px-3 font-mono text-[11px] text-foreground outline-none focus:border-primary/50"})]})}return e.jsxs("div",{className:"mc-card p-5 space-y-4",children:[e.jsxs("div",{className:"flex items-center justify-between gap-3 flex-wrap",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(ut,{className:"h-4.5 w-4.5 text-primary"}),e.jsx("span",{className:"text-xs font-bold uppercase tracking-wider text-foreground",children:"Lane-Routing & Policy"}),e.jsx("span",{className:"text-[9px] font-mono px-1.5 py-0.5 rounded bg-emerald-500/10 text-emerald-300 border border-emerald-500/20",children:"hot-reload"})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[N&&e.jsx("span",{className:"text-[10px] text-red-400 max-w-[280px] truncate",title:N,children:N}),g>0&&e.jsxs("span",{className:"flex items-center gap-1 text-[10px] text-emerald-400",children:[e.jsx(Y,{className:"h-3.5 w-3.5"})," gespeichert"]}),e.jsxs("button",{onClick:L,disabled:!f||M,className:k("h-8 px-4 rounded-lg text-[10px] font-bold uppercase tracking-wide transition-all flex items-center gap-1.5",f&&!M?"bg-primary text-primary-foreground hover:opacity-90 cursor-pointer shadow-md shadow-primary/10":"bg-background/40 text-muted-foreground/50 border border-border/40 cursor-not-allowed"),children:[M?e.jsx(Fe,{className:"h-3.5 w-3.5 animate-spin"}):null,"Speichern"]})]})]}),e.jsxs("p",{className:"text-[10px] text-muted-foreground/70 leading-relaxed -mt-1",children:["Welches echte Modell hinter den virtuellen Lanes ",e.jsx("code",{className:"text-cyan-300",children:"chat"})," und"," ",e.jsx("code",{className:"text-cyan-300",children:"coding"})," steckt. Änderungen greifen sofort (kein Neustart). Die Keyword-Heuristiken bleiben im Code."]}),e.jsxs("div",{className:"grid gap-4 md:grid-cols-2",children:[e.jsxs("div",{className:"rounded-xl border border-border/40 bg-background/25 p-4 space-y-3",children:[e.jsxs("div",{className:"flex items-center gap-2 border-b border-border/30 pb-2",children:[e.jsx(dt,{className:"h-4 w-4 text-teal-400"}),e.jsx("span",{className:"text-[11px] font-bold uppercase tracking-wider text-foreground",children:"chat"}),e.jsx("span",{className:"text-[9px] text-muted-foreground/60 font-mono",children:"(= auto)"})]}),gt.map(s=>e.jsx(A,{k:s},s))]}),e.jsxs("div",{className:"rounded-xl border border-border/40 bg-background/25 p-4 space-y-3",children:[e.jsxs("div",{className:"flex items-center gap-2 border-b border-border/30 pb-2",children:[e.jsx(Ye,{className:"h-4 w-4 text-indigo-400"}),e.jsx("span",{className:"text-[11px] font-bold uppercase tracking-wider text-foreground",children:"coding"}),e.jsx("span",{className:"text-[9px] text-muted-foreground/60 font-mono",children:"(agentisch → immer Coder)"})]}),ft.map(s=>e.jsx(A,{k:s},s))]})]}),e.jsx("div",{className:"rounded-xl border border-border/40 bg-background/25 p-4",children:e.jsx("div",{className:"max-w-xs",children:e.jsx(A,{k:"fast_no_think"})})})]})}const fe=[{role:"hermes",label:"Lucys Hirn",short:"Hirn",icon:re,desc:"Lucys Alltags-Verstand — denkt und redet mit dir. Immer bereit.",tone:"bg-indigo-500/15 text-indigo-400 border-indigo-500/25",protected:!0},{role:"embed",label:"Lucys Gedächtnis",short:"Gedächtnis",icon:Ie,desc:"Merkt sich Wichtiges und findet es später wieder.",tone:"bg-emerald-500/15 text-emerald-400 border-emerald-500/25",protected:!0},{role:"reranker",label:"Gedächtnis-Sortierer",short:"Sortierer",icon:it,desc:"Ordnet gefundene Erinnerungen nach echter Relevanz — die Feinsortierung hinter dem Gedächtnis.",tone:"bg-lime-500/15 text-lime-400 border-lime-500/25"},{role:"vision",label:"Lucys Augen",short:"Augen",icon:ze,desc:"Sieht Bilder und Screenshots und beschreibt, was drauf ist.",tone:"bg-pink-500/15 text-pink-400 border-pink-500/25"},{role:"heavy",label:"Großes Hirn",short:"Groß",icon:at,desc:"Das schwere Geschütz — wird für besonders knifflige Fragen dazugeholt.",tone:"bg-amber-500/15 text-amber-400 border-amber-500/25"},{role:"coder-lite",label:"Programmierer (schnell)",short:"Code schnell",icon:ue,desc:"Schnelles Programmieren im Alltag.",tone:"bg-violet-500/15 text-violet-400 border-violet-500/25"},{role:"coder",label:"Programmierer",short:"Code",icon:ue,desc:"Baut und plant. Der Kopf der Coding-Mannschaft — er hält den Faden und verteilt Zuarbeit.",tone:"bg-fuchsia-500/15 text-fuchsia-400 border-fuchsia-500/25",protected:!0},{role:"scout",label:"Späher",short:"Späher",icon:ht,desc:"Schneller erster Blick und grobe Einschätzung.",tone:"bg-teal-500/15 text-teal-400 border-teal-500/25"},{role:"kritiker",label:"Kritiker",short:"Kritiker",icon:Ee,desc:"Liest dem Programmierer nach jeder Etappe gegen — bewusst aus einer FREMDEN Modellfamilie (Mistral statt Qwen), damit er andere blinde Flecken hat.",tone:"bg-cyan-500/15 text-cyan-400 border-cyan-500/25"}];fe.map(t=>t.role);const je=Object.fromEntries(fe.map(t=>[t.role,t])),ve=t=>({role:t||"?",label:t||"unbekannt",short:t||"?",icon:re,desc:"Rolle ohne hinterlegten Klartext-Namen.",tone:"bg-slate-500/15 text-slate-300 border-slate-500/25"}),jt={fast:"hermes",coder_lite:"coder-lite"};function F(t){return t&&(je[t]||je[jt[t]])||ve(t)}function pe({role:t,dense:r=!1,className:b}){const a=F(t),c=a.icon;return e.jsxs("span",{className:k("inline-flex items-center gap-1 rounded px-1.5 py-0.5 text-[10px] font-semibold border tracking-wide",a.tone,b),title:`${a.desc} (${a.role})`,children:[e.jsx(c,{className:"h-3 w-3 shrink-0","aria-hidden":"true"}),r?a.short:a.label]})}function vt({fit:t}){const r={perfect:"bg-emerald-500/15 text-emerald-400 border border-emerald-500/20",marginal:"bg-amber-500/15 text-amber-400 border border-amber-500/20",too_tight:"bg-red-500/15 text-red-400 border border-red-500/20"}[t.level];return e.jsxs("span",{className:k("rounded px-2 py-0.5 text-[10px] font-semibold uppercase tracking-wider font-mono",r),children:[t.text," • ",t.req_gb," GB RAM"]})}function Ke(t){const r=t.toLowerCase();return r.includes("qwen")?{name:"Qwen",color:"bg-purple-500/20 text-purple-300 border-purple-500/30",initial:"Q"}:r.includes("gemma")?{name:"Gemma",color:"bg-blue-500/20 text-blue-300 border-blue-500/30",initial:"G"}:r.includes("llama")?{name:"Llama",color:"bg-red-500/20 text-red-300 border-red-500/30",initial:"🦙"}:r.includes("mistral")||r.includes("mixtral")?{name:"Mistral",color:"bg-orange-500/20 text-orange-300 border-orange-500/30",initial:"M"}:r.includes("deepseek")?{name:"DeepSeek",color:"bg-cyan-500/20 text-cyan-300 border-cyan-500/30",initial:"D"}:r.includes("hermes")||r.includes("nous")?{name:"Hermes",color:"bg-amber-500/20 text-amber-300 border-amber-500/30",initial:"H"}:r.includes("phi")?{name:"Phi",color:"bg-emerald-500/20 text-emerald-300 border-emerald-500/30",initial:"Φ"}:{name:"Other",color:"bg-slate-500/20 text-slate-300 border-slate-500/30",initial:"AI"}}function Nt(){var te,T,$;const t=he(),{data:r}=le(),{data:b}=Be(),{data:a}=Ae(),{data:c}=Pe(),{showAlert:M,dialogElement:w}=Ge(),[N,S]=j.useState(!1),[g,z]=j.useState(!1),m=(r==null?void 0:r.models)??[],f=(r==null?void 0:r.running)??[],p=(te=b==null?void 0:b.groups)==null?void 0:te.brains,d=(p==null?void 0:p.members)??[],L=u=>m.find(_=>_.name===u),A=u=>{var _;return((_=u.split("/").pop())==null?void 0:_.replace(/\.gguf$/i,""))||u},s=d.map(L).filter(Boolean),o=1024**3,i=c==null?void 0:c.budget,G=s.reduce((u,_)=>u+(_.size_bytes||0),0)/o,B=((T=a==null?void 0:a.gpu)==null?void 0:T.gtt_total)||(($=a==null?void 0:a.gpu)==null?void 0:$.vram_total)||0,C=(i==null?void 0:i.gtt_gb)||(B?B/o:0),v=(i==null?void 0:i.warm_projected_gb)??G,R=C>0?Math.min(100,v/C*100):0,K=m.filter(u=>!d.includes(u.name)&&!u.incomplete);async function I(u){z(!0);try{await Oe("brains",u,(p==null?void 0:p.swap)??!1,(p==null?void 0:p.persist)??!0),t.invalidateQueries({queryKey:V.groups}),t.invalidateQueries({queryKey:V.models}),t.invalidateQueries({queryKey:V.hermesBrain})}catch(_){M("Fehler",`Immer-bereit-Set konnte nicht geändert werden: ${(_==null?void 0:_.message)||_}`)}finally{z(!1)}}function O(u){const _=L(u);if(_&&F(_.role).protected){M("Geschützt",`„${F(_.role).label}" ist lebenswichtig und bleibt immer bereit.`);return}I(d.filter(H=>H!==u))}function W(u){S(!1),I([...d,u])}return p?e.jsxs("div",{className:"mc-card p-5 space-y-4",children:[e.jsx(Ne,{}),e.jsxs("div",{className:"space-y-1.5",children:[s.length===0&&e.jsx("div",{className:"text-xs text-muted-foreground",children:"Noch keine Modelle im Set."}),s.map(u=>{const _=f.includes(u.name),H=F(u.role).protected;return e.jsxs("div",{className:"flex items-center justify-between gap-2 rounded-xl border border-border/30 bg-background/20 p-2.5",children:[e.jsxs("div",{className:"flex min-w-0 items-center gap-2.5",children:[e.jsx("span",{className:k("h-2 w-2 shrink-0 rounded-full ring-2 ring-black/40",_?"bg-emerald-500 animate-pulse":"bg-muted-foreground/40"),title:_?"Gerade warm (bereit)":"Reserviert — lädt bei Bedarf sofort"}),u.role&&e.jsx(pe,{role:u.role,dense:!0,className:"shrink-0"}),e.jsx("span",{className:"truncate font-mono text-xs font-semibold text-foreground",title:u.name,children:A(u.name)}),e.jsx("span",{className:"shrink-0 font-mono text-[10px] text-muted-foreground/70",children:ee(u.size_bytes)})]}),H?e.jsx("span",{className:"shrink-0 text-[10px] font-semibold text-muted-foreground",title:"Lebenswichtig — bleibt immer im Set.",children:"🔒"}):e.jsx("button",{onClick:()=>O(u.name),disabled:g,className:"flex h-7 w-7 shrink-0 items-center justify-center rounded-lg border border-border/40 text-muted-foreground transition-colors hover:bg-red-500/5 hover:text-red-400 cursor-pointer disabled:opacity-50",title:"Aus dem Immer-bereit-Set nehmen (lädt dann nur noch bei Bedarf)",children:e.jsx(xe,{className:"h-3.5 w-3.5"})})]},u.name)})]}),e.jsxs("button",{onClick:()=>S(!0),disabled:g||K.length===0,className:"flex h-8 w-full items-center justify-center gap-1.5 rounded-lg border border-dashed border-border/50 text-[11px] font-semibold uppercase tracking-wide text-muted-foreground transition-colors hover:border-primary/40 hover:text-primary cursor-pointer disabled:opacity-50",children:[e.jsx(mt,{className:"h-3.5 w-3.5"})," Modell dauerhaft bereithalten"]}),e.jsxs("div",{className:"rounded-xl border border-border/30 bg-background/20 p-3",children:[e.jsxs("div",{className:"mb-1.5 flex items-center justify-between text-[11px]",children:[e.jsxs("span",{className:"flex items-center gap-1.5 font-semibold uppercase tracking-wider text-muted-foreground",title:"Modellgewichte + KV-Cache, berechnet aus den echten Architektur-Daten jedes Modells (Layer × KV-Köpfe × Kontext) und seiner KV-Quantisierung. So viel legt llama.cpp beim Laden wirklich für den eingestellten Kontext an — kein Aufschlag mehr.",children:[e.jsx(be,{className:"h-3.5 w-3.5"})," Reserviert fürs Set"]}),e.jsxs("span",{className:"font-mono font-bold text-foreground",children:[v.toFixed(1),C>0?` / ${C.toFixed(0)}`:""," GB"]})]}),e.jsx("div",{className:"h-2 w-full overflow-hidden rounded-full border border-border/30 bg-background/50",children:e.jsx("div",{className:k("h-full rounded-full transition-all duration-500",R>=85?"bg-red-500":R>=65?"bg-amber-500":"bg-teal-500"),style:{width:`${R}%`}})}),i&&!i.fits&&e.jsxs("p",{className:"mt-2 flex items-start gap-1.5 text-[11px] text-amber-400",children:[e.jsx(se,{className:"mt-0.5 h-3.5 w-3.5 shrink-0"}),e.jsxs("span",{children:["Zusammen mit dem größten Gelegenheits-Modell (~",i.largest_ondemand_gb," GB) wird der Speicher knapp. Das Set bleibt dabei immer geladen — wird es wirklich eng, schlägt das Laden des großen Modells fehl (es wartet dann, statt das Set zu verdrängen)."]})]}),i&&i.fits&&e.jsxs("p",{className:"mt-2 flex items-center gap-1.5 text-[11px] text-emerald-400",children:[e.jsx(Y,{className:"h-3.5 w-3.5 shrink-0"})," Passt auch neben dem größten Gelegenheits-Modell — nichts wird verdrängt."]})]}),N&&e.jsx("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black/60 p-4 backdrop-blur-sm",role:"dialog","aria-modal":"true","aria-label":"Modell zum Immer-bereit-Set hinzufügen",children:e.jsxs("div",{className:"w-full max-w-md space-y-3 rounded-2xl border border-border/80 bg-card p-6 shadow-2xl animate-in fade-in zoom-in-95 duration-200",children:[e.jsxs("div",{className:"flex items-center justify-between border-b border-border/20 pb-2",children:[e.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-primary",children:"Dauerhaft bereithalten"}),e.jsx("button",{onClick:()=>S(!1),className:"rounded p-1 text-muted-foreground hover:bg-accent hover:text-foreground cursor-pointer",children:e.jsx(xe,{className:"h-4 w-4"})})]}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"Wähle ein Modell, das ohne Ladezeit bereitstehen soll:"}),e.jsx("div",{className:"max-h-60 space-y-1.5 overflow-y-auto pr-1",children:K.map(u=>e.jsxs("button",{onClick:()=>W(u.name),className:"flex w-full items-center justify-between gap-2 rounded-lg border border-border/30 bg-background/20 px-3 py-2.5 text-left transition-colors hover:bg-accent cursor-pointer",children:[e.jsxs("span",{className:"flex min-w-0 items-center gap-2",children:[u.role&&e.jsx(pe,{role:u.role,dense:!0,className:"shrink-0"}),e.jsx("span",{className:"truncate font-mono text-xs font-semibold text-foreground",children:A(u.name)})]}),e.jsx("span",{className:"shrink-0 font-mono text-[10px] text-muted-foreground/70",children:ee(u.size_bytes)})]},u.name))})]})}),w]}):e.jsxs("div",{className:"mc-card p-5",children:[e.jsx(Ne,{}),e.jsx("p",{className:"mt-3 text-xs text-muted-foreground",children:"Es gibt noch kein Immer-bereit-Set. Es entsteht automatisch, sobald Lucys Hirn zugewiesen ist."}),w]})}function Ne(){return e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(ie,{className:"h-4.5 w-4.5 text-primary"}),e.jsxs("div",{children:[e.jsx("h2",{className:"text-sm font-bold uppercase tracking-wide text-foreground",children:"Immer-bereit-Set"}),e.jsx("p",{className:"text-[11px] text-muted-foreground",children:"Diese Modelle hält Lucy immer bereit — sie antworten ohne Ladezeit."})]})]})}function J({children:t,tone:r="muted"}){const b={muted:"bg-muted text-muted-foreground",primary:"bg-primary/15 text-primary",warn:"bg-amber-500/15 text-amber-500"};return e.jsx("span",{className:`rounded px-1.5 py-0.5 text-[11px] font-medium ${b[r]}`,children:t})}function kt({caps:t}){return t?e.jsxs("span",{className:"inline-flex flex-wrap gap-1",children:[t.coder&&e.jsx(J,{children:"💻 Code"}),t.vision&&e.jsx(J,{children:"👁 Bild"}),t.reasoning&&e.jsx(J,{children:"🧠 Reason"}),t.moe&&e.jsxs(J,{tone:"primary",children:["🧩 MoE",t.active_b?`·${t.active_b}b`:""]}),t.tools==="yes"&&e.jsx(J,{tone:"primary",children:"🛠 Tools"}),t.tools==="likely"&&e.jsx(J,{tone:"warn",children:"🛠 Tools?"}),t.embedding&&e.jsx(J,{children:"🔢 Embed"})]}):null}function wt({model:t,onClose:r,onChanged:b}){var L,A;const{data:a,isLoading:c}=Te(t.gguf_path),[M,w]=j.useState(null),[N,S]=j.useState(""),g=a==null?void 0:a.target_vocab,z=(a==null?void 0:a.drafts)??[],m=z.filter(s=>s.compatible===!0),f=t.spec_draft_model;async function p(s){w(s??"__clear__"),S("");try{await q(`/api/models/${encodeURIComponent(t.name)}/draft`,{method:"POST",body:JSON.stringify({draft_path:s})}),b(),r()}catch(o){S(String((o==null?void 0:o.message)||o)),w(null)}}const d=s=>{var o;return s?`${s.pre??"?"} · ${((o=s.n_vocab)==null?void 0:o.toLocaleString())??"?"} Tokens`:"—"};return e.jsx("div",{className:"fixed inset-0 z-50 bg-black/60 backdrop-blur-sm flex items-center justify-center p-4",children:e.jsxs("div",{className:"w-full max-w-lg rounded-2xl border border-border/80 bg-card p-6 shadow-2xl space-y-4 animate-in fade-in zoom-in-95 duration-200",children:[e.jsxs("div",{className:"flex items-center justify-between border-b border-border/20 pb-2",children:[e.jsxs("h3",{className:"text-xs font-bold uppercase tracking-wider text-primary flex items-center gap-2",children:[e.jsx(ie,{className:"h-4 w-4"})," Speculative Draft"]}),e.jsx("button",{onClick:r,className:"p-1 rounded hover:bg-accent text-muted-foreground hover:text-foreground cursor-pointer",children:e.jsx(xe,{className:"h-4 w-4"})})]}),e.jsxs("div",{className:"text-xs text-muted-foreground leading-relaxed",children:['Beschleunigt die Token-Generierung mit einem kleinen "Draft"-Modell. Voraussetzung: der Draft muss den ',e.jsx("strong",{className:"text-foreground",children:"exakt gleichen Tokenizer (Vocab)"})," haben wie das Modell — sonst lehnt llama.cpp es ab."]}),e.jsxs("div",{className:"rounded-lg border border-border/40 bg-background/30 px-3 py-2 text-[11px] font-mono flex items-center justify-between",children:[e.jsx("span",{className:"text-muted-foreground",children:(L=t.name.split("/").pop())==null?void 0:L.replace(/\.gguf$/i,"")}),e.jsxs("span",{className:"text-foreground",children:["Vocab: ",d(g)]})]}),t.spec_active&&f&&e.jsxs("div",{className:"rounded-lg border border-emerald-500/30 bg-emerald-500/5 px-3 py-2 flex items-center justify-between gap-2",children:[e.jsxs("span",{className:"text-[11px] text-emerald-400 font-mono flex items-center gap-1.5 truncate",children:[e.jsx(Y,{className:"h-3.5 w-3.5 shrink-0"})," Aktiv: ",f]}),e.jsx("button",{onClick:()=>p(null),disabled:M!==null,className:"h-6 px-2.5 rounded border border-amber-500/30 bg-amber-500/5 hover:bg-amber-500/10 text-amber-400 text-[9px] font-bold uppercase shrink-0 cursor-pointer disabled:opacity-50",children:"Deaktivieren"})]}),!(a!=null&&a.target_exists)&&e.jsxs("div",{className:"rounded-lg border border-amber-500/30 bg-amber-500/5 px-3 py-2 text-[11px] text-amber-400 flex items-center gap-2",children:[e.jsx(se,{className:"h-3.5 w-3.5 shrink-0"}),"Modell-GGUF noch nicht vorhanden — Spec-Draft ist nach dem Download konfigurierbar."]}),e.jsx("div",{className:"space-y-1.5 max-h-64 overflow-y-auto pr-1",children:c?e.jsx("div",{className:"text-xs text-muted-foreground py-6 text-center",children:"Prüfe Vocab-Kompatibilität…"}):z.length===0?e.jsxs("div",{className:"text-[11px] text-muted-foreground border border-dashed border-border/50 rounded-lg p-4 text-center",children:["Keine Draft-Modelle in ",e.jsx("code",{className:"font-mono",children:"/srv/models/drafts"}),". Lade ein kleines same-family-Modell (z.B. Qwen3-0.6B) und lege es dort ab."]}):z.map(s=>{var G,B;const o=s.filename===f,i=s.compatible===!0;return e.jsxs("div",{className:k("rounded-lg border px-3 py-2 flex items-center justify-between gap-2 text-left",i?"border-border/40 bg-background/20":"border-border/20 bg-background/10 opacity-60",o&&"border-primary/40 bg-primary/10"),children:[e.jsxs("div",{className:"min-w-0",children:[e.jsxs("div",{className:"text-[11px] font-mono font-semibold text-foreground truncate flex items-center gap-1.5",children:[s.filename,s.mtp&&e.jsx("span",{className:"shrink-0 rounded bg-indigo-500/15 px-1.5 py-0.5 text-[8px] font-bold uppercase tracking-wider text-indigo-400 border border-indigo-500/25",title:"MTP-Kopf (Multi-Token-Prediction) — by-construction vocab-identisch, höchste Akzeptanzrate",children:"MTP"})]}),e.jsxs("div",{className:"text-[9px] text-muted-foreground font-mono",children:[ee(s.size_bytes)," · Vocab: ",d(s.vocab)]})]}),i?o?e.jsxs("span",{className:"text-[9px] font-bold uppercase text-primary flex items-center gap-1 shrink-0",children:[e.jsx(Y,{className:"h-3.5 w-3.5"})," Aktiv"]}):e.jsx("button",{onClick:()=>p(s.path),disabled:M!==null,className:"h-7 px-3 rounded-lg border border-emerald-500/30 bg-emerald-500/5 hover:bg-emerald-500/15 text-emerald-400 text-[9px] font-bold uppercase shrink-0 cursor-pointer disabled:opacity-50",children:"Aktivieren"}):e.jsxs("span",{className:"text-[9px] font-bold uppercase text-amber-400/80 flex items-center gap-1 shrink-0",title:s.compatible===!1?`Inkompatibel: Tokenizer/Vocab weicht ab (Draft ${(G=s.vocab)==null?void 0:G.pre}/${(B=s.vocab)==null?void 0:B.n_vocab} ≠ Modell ${g==null?void 0:g.pre}/${g==null?void 0:g.n_vocab}).`:"Kompatibilität nicht prüfbar (Datei fehlt).",children:[e.jsx(se,{className:"h-3.5 w-3.5"})," ",s.compatible===!1?"Vocab ≠":"n/a"]})]},s.path)})}),!c&&(a==null?void 0:a.target_exists)&&z.length>0&&m.length===0&&e.jsxs("div",{className:"rounded-lg border border-amber-500/30 bg-amber-500/5 px-3 py-2 text-[11px] text-amber-400 leading-relaxed",children:["Kein vocab-kompatibler Draft verfügbar — Speculative Decoding ist für dieses Modell nicht möglich. Es braucht einen Draft mit identischem Tokenizer (pre=",e.jsx("span",{className:"font-mono",children:g==null?void 0:g.pre}),", n_vocab=",e.jsx("span",{className:"font-mono",children:(A=g==null?void 0:g.n_vocab)==null?void 0:A.toLocaleString()}),")."]}),N&&e.jsx("div",{className:"text-[10px] text-red-400 font-mono",children:N})]})})}const ke={hermes:{bar:"bg-indigo-500",dot:"bg-indigo-500",text:"text-indigo-400"},embed:{bar:"bg-emerald-500",dot:"bg-emerald-500",text:"text-emerald-400"},vision:{bar:"bg-pink-500",dot:"bg-pink-500",text:"text-pink-400"},heavy:{bar:"bg-amber-500",dot:"bg-amber-500",text:"text-amber-400"},"coder-lite":{bar:"bg-violet-500",dot:"bg-violet-500",text:"text-violet-400"},coder:{bar:"bg-fuchsia-500",dot:"bg-fuchsia-500",text:"text-fuchsia-400"},scout:{bar:"bg-teal-500",dot:"bg-teal-500",text:"text-teal-400"},kritiker:{bar:"bg-cyan-500",dot:"bg-cyan-500",text:"text-cyan-400"},reranker:{bar:"bg-lime-500",dot:"bg-lime-500",text:"text-lime-400"}},Mt={fast:"hermes",coder_lite:"coder-lite"},we={bar:"bg-slate-400",dot:"bg-slate-400",text:"text-slate-300"};function oe(t){return t&&(ke[t]||ke[Mt[t]])||we}const Me=1024**3,Se=t=>{var r;return((r=t.split("/").pop())==null?void 0:r.replace(/\.gguf$/i,""))??t};function St({running:t,capacityBytes:r,realUsedBytes:b,selected:a,onSelect:c}){const M=r>2*Me?r:124*Me,w=t.reduce((m,f)=>m+(f.size_bytes||0),0),N=Math.max(0,b-w),S=Math.max(0,M-Math.max(w,b)),g=S/M*100,z=N/M*100;return e.jsxs("div",{className:"mc-card p-5",children:[e.jsxs("div",{className:"mb-3 flex flex-wrap items-end justify-between gap-2",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(be,{className:"h-5 w-5 text-primary"}),e.jsxs("div",{children:[e.jsx("div",{className:"text-[11px] font-semibold uppercase tracking-wider text-muted-foreground",children:"Modell-Speicher (GPU-Pool)"}),e.jsxs("div",{className:"font-space text-xl font-bold tracking-tight text-foreground",children:[U(M)," GB ",e.jsx("span",{className:"text-sm font-medium text-muted-foreground",children:"gesamt"})]})]})]}),e.jsxs("div",{className:"text-right text-[11px] font-mono text-muted-foreground",children:[e.jsxs("div",{children:[e.jsxs("span",{className:"font-bold text-foreground",children:[U(w)," GB"]})," Modell-Gewichte"]}),N>0&&e.jsxs("div",{children:[U(N)," GB KV-Cache & Betrieb"]}),e.jsxs("div",{className:"text-emerald-400",children:[U(S)," GB frei"]})]})]}),e.jsx("div",{className:"flex h-12 w-full overflow-hidden rounded-xl border border-border/40 bg-background/50 p-1",children:t.length===0?e.jsx("div",{className:"flex w-full items-center justify-center text-[11px] italic text-muted-foreground/60",children:"Kein Modell geladen — Auto-Swap holt bei Anfrage automatisch das passende."}):e.jsxs(e.Fragment,{children:[t.map(m=>{const f=(m.size_bytes||0)/M*100,p=oe(m.role),d=a===m.name;return e.jsxs("button",{onClick:()=>c==null?void 0:c(m.name),style:{width:`${f}%`},title:`${F(m.role).label} · ${Se(m.name)} · ${ee(m.size_bytes)}`,className:k("group flex h-full min-w-[2.5rem] shrink-0 flex-col justify-center gap-0.5 rounded-lg px-2 text-left text-white transition-all",p.bar,d?"ring-2 ring-white/70":"opacity-90 hover:opacity-100"),children:[e.jsx("span",{className:"truncate font-space text-[10px] font-bold leading-tight tracking-wide",children:F(m.role).short}),e.jsx("span",{className:"truncate font-mono text-[9px] leading-tight opacity-85",children:ee(m.size_bytes)})]},m.name)}),z>1.5&&e.jsx("div",{style:{width:`${z}%`},className:"flex h-full min-w-[2rem] items-center justify-center rounded-lg border border-dashed border-border/60 bg-background/40 text-[9px] font-mono text-muted-foreground/70",title:`${U(N)} GB KV-Cache & Betrieb (reale Belegung über den Modell-Gewichten)`,children:"KV"}),g>1.5&&e.jsx("div",{style:{width:`${g}%`},className:"flex h-full min-w-[2rem] items-center justify-center rounded-lg text-[9px] font-mono text-muted-foreground/50",title:`${U(S)} GB frei`,children:"frei"})]})}),t.length>0&&e.jsxs("div",{className:"mt-3 flex flex-wrap gap-x-4 gap-y-1.5",children:[t.map(m=>{const f=oe(m.role);return e.jsxs("button",{onClick:()=>c==null?void 0:c(m.name),className:"flex items-center gap-1.5 text-[11px] text-muted-foreground transition-colors hover:text-foreground",children:[e.jsx("span",{className:k("h-2.5 w-2.5 rounded-sm",f.dot)}),e.jsx("span",{className:k("font-semibold",f.text),children:F(m.role).short}),e.jsx("span",{className:"font-mono text-muted-foreground/70",children:Se(m.name)})]},m.name)}),N>0&&e.jsxs("span",{className:"flex items-center gap-1.5 text-[11px] text-muted-foreground/60",title:"Reale Belegung über den Modell-Gewichten (Kontext-Speicher der laufenden Modelle)",children:[e.jsx("span",{className:"h-2.5 w-2.5 rounded-sm border border-dashed border-border/60 bg-background/40"})," KV-Cache & Betrieb · ",U(N)," GB"]}),e.jsxs("span",{className:"flex items-center gap-1.5 text-[11px] text-muted-foreground/60",children:[e.jsx("span",{className:"h-2.5 w-2.5 rounded-sm border border-border/50 bg-background/50"})," frei · ",U(S)," GB"]})]})]})}const Ce=1024**3,X=t=>{var r;return((r=t.split("/").pop())==null?void 0:r.replace(/\.gguf$/i,""))??t};function Ct(){var n,h,D,Q;const t=he(),{data:r,isLoading:b,error:a}=le(),{data:c}=Ae(),{data:M}=Be(),{showAlert:w,showConfirm:N,showPrompt:S,dialogElement:g}=Ge(),z=He(),m=(r==null?void 0:r.models)??[],f=(r==null?void 0:r.running)??[],p=l=>!!F(l).protected,d=(n=M==null?void 0:M.groups)==null?void 0:n.brains,L=(d==null?void 0:d.members)??[],A=l=>L.includes(l),[s,o]=j.useState(null),[i,G]=j.useState(""),[B,C]=j.useState("all"),[v,R]=j.useState(null),K=()=>{t.invalidateQueries({queryKey:V.models}),t.invalidateQueries({queryKey:V.routing}),t.invalidateQueries({queryKey:V.groups})},I=m.filter(l=>f.includes(l.name)),O=((h=c==null?void 0:c.gpu)==null?void 0:h.gtt_total)||((D=c==null?void 0:c.gpu)==null?void 0:D.vram_total)||0,W=((Q=c==null?void 0:c.gpu)==null?void 0:Q.gtt_used)||0,te=O>2*Ce?O:124*Ce,T=j.useMemo(()=>{const l=i.trim().toLowerCase();return m.filter(x=>B==="in_use"?!!x.role||f.includes(x.name):!0).filter(x=>l?x.name.toLowerCase().includes(l):!0).sort((x,y)=>{const P=f.includes(x.name)?0:1,Z=f.includes(y.name)?0:1;return P!==Z?P-Z:X(x.name).localeCompare(X(y.name))})},[m,f,B,i]),$=m.find(l=>l.name===s)??null;async function u(l){try{await q(`/api/models/${encodeURIComponent(l)}/load`,{method:"POST"}),K()}catch(x){w("Fehler",`Laden fehlgeschlagen: ${x.message||x}`)}}async function _(l){const x=L.some(y=>f.includes(y));if(d&&x&&!A(l)){const y=L.filter(P=>f.includes(P)).map(X).join(", ");N("Verdrängt das Hirn?",`„${X(l)}" ist nicht ko-resident. Beim Laden wirft es das warme Hirn (${y}) raus — Lucy verliert Hirn bzw. Augen. -Trotzdem exklusiv laden?`,()=>u(l));return}u(l)}async function H(l){const m=x.find(y=>y.name===l);if(m&&p(m.role)){w("Geschützt",`„${F(m.role).label}" ist lebenswichtig und bleibt geladen.`);return}try{await q(`/api/models/${encodeURIComponent(l)}/unload`,{method:"POST"}),K()}catch(y){w("Fehler",`Entladen fehlgeschlagen: ${y.message||y}`)}}async function de(l,m){try{const y=await q(`/api/models/${encodeURIComponent(m)}/role`,{method:"POST",body:JSON.stringify({role:l||null})});K(),y!=null&&y.warning&&w("Rolle gesetzt — Hinweis",y.warning)}catch(y){w("Fehler",`Rolle zuweisen fehlgeschlagen: ${y.message||y}`)}}async function ce(l,m){let y=null;try{y=await q(`/api/models/${encodeURIComponent(l)}/ctx/auto`)}catch{}const P=y?`Optimal für dein Setup: ${(y.ctx/1024).toFixed(0)}k (${y.ctx}). »Auto« trägt diesen Wert ein.`:"Gib die gewünschte Kontextlänge in Tokens an:";S("Kontextlänge anpassen",P,String(m||32768),async Z=>{if(Z)try{await q(`/api/models/${encodeURIComponent(l)}/ctx`,{method:"POST",body:JSON.stringify({ctx:parseInt(Z,10)})}),K()}catch(ye){w("Fehler",`Kontext setzen fehlgeschlagen: ${ye.message||ye}`)}},void 0,y?{autoValue:String(y.ctx),autoLabel:`Auto (${(y.ctx/1024).toFixed(0)}k)`}:void 0)}async function xe(l){const m=x.find(y=>y.name===l);if(m&&p(m.role)){w("Geschützt",`„${F(m.role).label}" kann nicht gelöscht werden. Weise die Rolle zuerst einem anderen Modell zu.`);return}N("Modell löschen?",`„${X(l)}" und alle GGUF-Dateien unwiderruflich von der Box löschen?`,async()=>{try{await q(`/api/models/${encodeURIComponent(l)}`,{method:"DELETE"}),s===l&&o(null),K()}catch(y){w("Fehler",`Löschen fehlgeschlagen: ${y.message||y}`)}})}return h?e.jsx("div",{className:"py-16 text-center text-xs text-muted-foreground",children:"Werkbank wird geladen …"}):a?e.jsxs("div",{className:"rounded-xl border border-red-500/20 bg-red-500/5 p-4 text-xs text-red-400",children:["Gateway oder Engine nicht erreichbar (",String(a),")."]}):e.jsxs("div",{className:"space-y-5",children:[e.jsx(St,{running:I,capacityBytes:te,realUsedBytes:W,selected:s,onSelect:o}),e.jsxs("div",{className:"grid gap-5 lg:grid-cols-[minmax(0,1fr)_minmax(0,1.3fr)]",children:[e.jsxs("div",{className:"mc-card p-4",children:[e.jsxs("div",{className:"mb-3 flex items-center gap-2",children:[e.jsxs("div",{className:"relative flex-1",children:[e.jsx(ge,{className:"pointer-events-none absolute left-2.5 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-muted-foreground/60"}),e.jsx("input",{value:i,onChange:l=>G(l.target.value),placeholder:"Modell suchen …",className:"h-8 w-full rounded-lg border border-border/40 bg-background/40 pl-8 pr-2 text-xs text-foreground placeholder:text-muted-foreground/50 focus:border-primary/50 focus:outline-none"})]}),e.jsx("div",{className:"flex rounded-lg border border-border/40 bg-background/30 p-0.5",children:["all","in_use"].map(l=>e.jsx("button",{onClick:()=>C(l),className:k("rounded-md px-2 py-1 text-[9px] font-bold uppercase transition-all cursor-pointer",B===l?"bg-primary text-primary-foreground":"text-muted-foreground hover:text-foreground"),children:l==="all"?"Alle":"In Benutzung"},l))})]}),e.jsx("div",{className:"max-h-[60vh] space-y-1.5 overflow-y-auto scrollbar-thin pr-1",children:T.length===0?e.jsx("div",{className:"rounded-xl border border-dashed border-border/50 p-8 text-center text-xs text-muted-foreground",children:"Keine Modelle."}):T.map(l=>{const m=g.includes(l.name),y=s===l.name,P=Ke(l.name),Z=oe(l.role);return e.jsxs("button",{onClick:()=>o(l.name),className:k("flex w-full items-center gap-2.5 rounded-xl border p-2.5 text-left transition-all cursor-pointer",y?"border-primary/60 bg-primary/10":"border-border/40 bg-background/20 hover:border-primary/30 hover:bg-background/40"),children:[e.jsx("span",{className:k("flex h-7 w-7 shrink-0 items-center justify-center rounded-lg border text-[10px] font-bold",P.color),children:P.initial}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("div",{className:"truncate font-mono text-xs font-semibold text-foreground",children:X(l.name)}),e.jsxs("div",{className:"mt-0.5 flex items-center gap-1.5",children:[l.role&&e.jsx("span",{className:k("h-2 w-2 rounded-sm",Z.dot)}),e.jsx("span",{className:"text-[10px] text-muted-foreground",children:l.role?F(l.role).short:"keine Rolle"}),e.jsxs("span",{className:"text-[10px] text-muted-foreground/50",children:["· ",ee(l.size_bytes)]})]})]}),m?e.jsxs("span",{className:"flex shrink-0 items-center gap-1 text-[9px] font-bold uppercase text-emerald-400",children:[e.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-emerald-500 animate-pulse"}),"warm"]}):l.incomplete?e.jsx("span",{className:"shrink-0 text-[9px] font-bold uppercase text-amber-400",children:"⚠ fehlt"}):e.jsx("span",{className:"shrink-0 text-[9px] font-semibold uppercase text-muted-foreground/50",children:"bereit"})]},l.name)})})]}),e.jsx("div",{className:"mc-card p-5",children:D?e.jsx(_t,{m:D,warm:g.includes(D.name),expert:z,protectedRole:p(D.role),coresident:A(D.name),onLoad:()=>_(D.name),onUnload:()=>H(D.name),onRole:l=>de(l,D.name),onCtx:()=>ce(D.name,D.ctx),onSpec:()=>R(D),onDelete:()=>xe(D.name)}):e.jsxs("div",{className:"flex h-full min-h-[16rem] flex-col items-center justify-center gap-2 text-center text-muted-foreground",children:[e.jsx(Qe,{className:"h-8 w-8 opacity-40"}),e.jsx("p",{className:"text-sm font-semibold",children:"Links ein Modell wählen"}),e.jsx("p",{className:"text-xs",children:"Dann verwaltest du es hier — laden, Rolle, Kontext, löschen."})]})})]}),v&&e.jsx(wt,{model:v,onClose:()=>R(null),onChanged:K}),b]})}function _t({m:t,warm:r,expert:h,protectedRole:a,coresident:c,onLoad:M,onUnload:w,onRole:N,onCtx:S,onSpec:b,onDelete:z}){const x=Ke(t.name),g=r&&a;return e.jsxs("div",{className:"flex h-full flex-col gap-4",children:[e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsx("span",{className:k("flex h-10 w-10 shrink-0 items-center justify-center rounded-xl border text-sm font-bold",x.color),children:x.initial}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("h2",{className:"break-all font-mono text-sm font-bold text-foreground",children:X(t.name)}),e.jsxs("div",{className:"mt-1.5 flex flex-wrap items-center gap-1.5",children:[t.role?e.jsx(pe,{role:t.role}):e.jsx("span",{className:"rounded border border-dashed border-border/50 px-1.5 py-0.5 text-[10px] text-muted-foreground",children:"keine Rolle"}),a&&e.jsxs("span",{className:"rounded bg-background/40 px-1.5 py-0.5 text-[10px] text-muted-foreground",title:"Lebenswichtig — geschützt",children:[e.jsx(tt,{className:"mr-0.5 inline h-3 w-3"}),"geschützt"]}),c&&e.jsxs("span",{className:"rounded border border-fuchsia-500/30 bg-fuchsia-500/10 px-1.5 py-0.5 text-[10px] font-bold uppercase text-fuchsia-300",children:[e.jsx(re,{className:"mr-0.5 inline h-3 w-3"}),"Ko-resident"]}),r&&e.jsxs("span",{className:"flex items-center gap-1 text-[10px] font-bold uppercase text-emerald-400",children:[e.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-emerald-500 animate-pulse"}),"warm"]})]})]})]}),e.jsxs("button",{onClick:r?w:M,disabled:t.incomplete&&!r||g,className:k("flex h-11 w-full items-center justify-center gap-2 rounded-xl border text-sm font-bold transition-all cursor-pointer disabled:cursor-not-allowed disabled:opacity-50",r?"border-amber-500/40 bg-amber-500/10 text-amber-300 hover:bg-amber-500/20":"border-primary/40 bg-primary/10 text-primary hover:bg-primary/20"),title:g?`„${F(t.role).label}" bleibt geladen (geschützt).`:void 0,children:[r?e.jsx(mt,{className:"h-4 w-4"}):e.jsx(Ue,{className:"h-4 w-4"}),g?"🔒 bleibt geladen":r?"Entladen":"Ins Warm-Set laden"]}),e.jsxs("div",{className:"rounded-xl border border-border/30 bg-background/20 p-3",children:[e.jsxs("div",{className:"mb-2 flex items-center justify-between text-[11px] font-semibold uppercase tracking-wider text-muted-foreground",children:[e.jsx("span",{children:"Rolle"}),a&&e.jsx("span",{className:"normal-case font-medium tracking-normal text-muted-foreground/70",children:"🔒 lebenswichtig — zum Tausch die Rolle woanders zuweisen"})]}),e.jsxs("div",{className:"flex flex-wrap gap-1.5",children:[e.jsx(_e,{active:!t.role,onClick:()=>N(""),dot:"bg-slate-400",label:"keine",disabled:a}),fe.map(p=>e.jsx(_e,{active:t.role===p.role,onClick:()=>N(p.role),dot:oe(p.role).dot,label:p.short,disabled:a&&t.role!==p.role},p.role))]})]}),e.jsxs("div",{className:"grid grid-cols-2 gap-2 text-xs",children:[e.jsx(Lt,{icon:be,label:"Größe",value:ee(t.size_bytes)}),e.jsxs("button",{onClick:S,className:"group flex items-center gap-2 rounded-lg border border-border/30 bg-background/20 p-2.5 text-left transition-colors hover:border-primary/40 cursor-pointer",children:[e.jsx(ct,{className:"h-4 w-4 text-primary/80"}),e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{className:"text-[9px] font-semibold uppercase tracking-wider text-muted-foreground/60",children:"Kontext · ändern"}),e.jsx("div",{className:"font-semibold text-foreground",children:Ve(t.ctx)})]})]})]}),e.jsxs("div",{className:"rounded-xl border border-border/30 bg-background/20 p-3",children:[e.jsxs("div",{className:"mb-2 flex items-center justify-between",children:[e.jsx("span",{className:"text-[11px] font-semibold uppercase tracking-wider text-muted-foreground",children:"Beschleuniger"}),h&&e.jsxs("button",{onClick:b,className:k("flex h-6 items-center gap-1 rounded-lg border px-2 text-[9px] font-bold uppercase transition-colors cursor-pointer",t.spec_active?"border-emerald-500/30 text-emerald-400 hover:bg-emerald-500/10":t.spec_draft_model?"border-amber-500/30 text-amber-400 hover:bg-amber-500/10":"border-border/40 text-muted-foreground hover:bg-accent"),children:[e.jsx(ie,{className:"h-3 w-3"})," Spec"]})]}),e.jsxs("div",{className:"flex flex-wrap items-center gap-1.5",children:[t.spec_active&&e.jsx(ne,{tone:"emerald",label:"Spec-Decoding aktiv"}),!t.spec_active&&t.spec_draft_model&&e.jsx(ne,{tone:"amber",label:"Spec inaktiv"}),t.prompt_cache&&e.jsx(ne,{tone:"cyan",label:"Prompt-Cache"}),t.parallel_slots>1&&e.jsx(ne,{tone:"violet",label:`${t.parallel_slots} Slots`}),!t.spec_active&&!t.spec_draft_model&&!t.prompt_cache&&t.parallel_slots<=1&&e.jsx("span",{className:"text-[11px] text-muted-foreground/60",children:"keine aktiv"})]})]}),e.jsx("div",{className:"flex flex-wrap gap-1",children:e.jsx(kt,{caps:t.capabilities})}),e.jsxs("button",{onClick:z,disabled:a,className:k("mt-auto flex h-9 items-center justify-center gap-1.5 rounded-lg border text-xs font-semibold transition-colors",a?"cursor-not-allowed border-border/30 text-muted-foreground/40":"border-red-500/30 text-red-400 hover:bg-red-500/10 cursor-pointer"),children:[e.jsx(bt,{className:"h-3.5 w-3.5"})," ",a?"geschützt — nicht löschbar":"Modell löschen"]})]})}function _e({active:t,onClick:r,dot:h,label:a,disabled:c}){return e.jsxs("button",{onClick:r,disabled:c,title:c?"Gesperrt: dieses Modell hält eine lebenswichtige Rolle.":void 0,className:k("flex items-center gap-1.5 rounded-lg border px-2 py-1 text-[10px] font-semibold transition-all",c?"cursor-not-allowed opacity-40 border-border/40 bg-background/20 text-muted-foreground":t?"cursor-pointer border-primary/60 bg-primary/15 text-foreground":"cursor-pointer border-border/40 bg-background/20 text-muted-foreground hover:border-primary/30"),children:[e.jsx("span",{className:k("h-2 w-2 rounded-sm",h)}),a,t&&e.jsx(Y,{className:"h-3 w-3 text-primary"})]})}function Lt({icon:t,label:r,value:h}){return e.jsxs("div",{className:"flex items-center gap-2 rounded-lg border border-border/30 bg-background/20 p-2.5",children:[e.jsx(t,{className:"h-4 w-4 text-primary/80"}),e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{className:"text-[9px] font-semibold uppercase tracking-wider text-muted-foreground/60",children:r}),e.jsx("div",{className:"font-semibold text-foreground",children:h})]})]})}function ne({tone:t,label:r}){const h={emerald:"bg-emerald-500/10 text-emerald-400 border-emerald-500/20",amber:"bg-amber-500/10 text-amber-400 border-amber-500/20",cyan:"bg-cyan-500/10 text-cyan-400 border-cyan-500/20",violet:"bg-violet-500/10 text-violet-400 border-violet-500/20"}[t];return e.jsx("span",{className:k("rounded border px-1.5 py-0.5 text-[10px] font-semibold",h),children:r})}const zt=[{key:"popular",label:"Beliebt",q:""},{key:"coder",label:"Coder",q:"coder"},{key:"vision",label:"Vision",q:"vision"},{key:"reasoning",label:"Reasoning",q:"reasoning"},{key:"small",label:"Klein (≤4B)",q:"3B"}],Bt=["fast","heavy","coder","vision","hermes","scout"],At=new Intl.NumberFormat(void 0,{notation:"compact",maximumFractionDigits:1});function Le(t){return At.format(t)}function Gt(){const{data:t}=le(),r=(t==null?void 0:t.models)??[],[h,a]=j.useState(""),[c,M]=j.useState([]),[w,N]=j.useState(!1),[S,b]=j.useState(""),[z,x]=j.useState("popular"),[g,p]=j.useState(""),[d,L]=j.useState(null),[A,s]=j.useState([]),[o,i]=j.useState("Q4_K_M"),[G,B]=j.useState(""),[C,v]=j.useState(null),[R,K]=j.useState(!1),[I,O]=j.useState({});async function W(n){N(!0),b("");try{const f=await q(`/api/hf/search?q=${encodeURIComponent(n)}`);M(f.results),f.results.length||b("Keine Ergebnisse.")}catch(f){b(`Suche fehlgeschlagen: ${f}`)}finally{N(!1)}}j.useEffect(()=>{W("")},[]);function te(n){x(n.key),a(""),W(n.q)}function T(){x(""),W(h)}async function D(n,f,$){K(!1);try{const Q=await q(`/api/fit?params_b=0&quant=${encodeURIComponent(f)}&ctx=8192&name=${encodeURIComponent(n)}&role=${encodeURIComponent($)}`);v(Q)}catch{v(null)}}async function u(n){if(d===n){L(null);return}L(n),s([]),v(null),B(""),K(!1),b("Analysiere Repository…");try{const f=await q(`/api/hf/quants?repo=${encodeURIComponent(n)}`);s(f.quants);const $=f.quants.includes("Q4_K_M")?"Q4_K_M":f.quants[0]||"Q4_K_M";i($),b(f.quants.length?"":"Keine GGUF-Dateien in diesem Repo gefunden."),f.quants.length&&D(f.repo,$,"")}catch(f){b(`Fehler: ${f}`)}}function _(){const n=g.trim();n&&(M(f=>f.some($=>$.repo===n)?f:[{repo:n,downloads:0,likes:0},...f]),p(""),u(n))}const H=G?r.find(n=>(n.role||"").toLowerCase()===G):void 0;async function de(n){if((C==null?void 0:C.fit.level)==="too_tight"&&!R){K(!0);return}O(f=>({...f,[n]:"Starte…"}));try{await q("/api/models/install",{method:"POST",body:JSON.stringify({repo:n,quant:o,role:G||void 0,jinja:!0})}),O(f=>({...f,[n]:"Download läuft"})),K(!1)}catch{O($=>({...$,[n]:"Fehler"}))}}const ce=n=>{var $;const f=(($=n.split("/").pop())==null?void 0:$.toLowerCase().replace(/-gguf$/i,""))||"";return f.length>3&&r.some(Q=>Q.name.toLowerCase().includes(f))},xe=n=>n==="perfect"?"text-emerald-400 border-emerald-500/40 bg-emerald-500/10":n==="marginal"?"text-amber-400 border-amber-500/40 bg-amber-500/10":"text-red-400 border-red-500/40 bg-red-500/10";return e.jsxs("div",{className:"space-y-5",children:[e.jsxs("div",{className:"flex gap-2",children:[e.jsxs("div",{className:"relative flex-1",children:[e.jsx(ge,{className:"absolute left-3 top-2.5 h-4 w-4 text-muted-foreground"}),e.jsx("input",{value:h,onChange:n=>a(n.target.value),onKeyDown:n=>n.key==="Enter"&&T(),"aria-label":"HuggingFace durchsuchen",type:"search",spellCheck:!1,placeholder:"HuggingFace durchsuchen (z.B. Qwen Coder, Llama-3.1, gemma)…",className:"w-full h-10 pl-9 pr-3 rounded-xl border border-border/60 bg-background/40 text-xs outline-none focus:ring-1 focus:ring-primary/50 text-foreground"})]}),e.jsx("button",{onClick:T,className:"h-10 px-5 rounded-xl bg-primary text-primary-foreground text-xs font-semibold hover:opacity-90 transition-all cursor-pointer",children:"Suchen"})]}),e.jsx("div",{className:"flex items-center gap-2 flex-wrap",children:zt.map(n=>e.jsxs("button",{onClick:()=>te(n),className:k("flex items-center gap-1.5 rounded-full px-3 py-1.5 text-[11px] font-semibold transition-all cursor-pointer border",z===n.key?"bg-primary/15 text-primary border-primary/30":"border-border/50 text-muted-foreground hover:text-foreground hover:border-border"),children:[n.key==="popular"&&e.jsx(ot,{className:"h-3 w-3"}),n.label]},n.key))}),w?e.jsx("div",{className:"text-xs text-muted-foreground py-10 text-center",children:"Lade GGUF-Modelle von HuggingFace…"}):e.jsxs("div",{className:"space-y-2",children:[c.map(n=>{const f=d===n.repo,$=ce(n.repo),Q=n.repo.includes("/")?n.repo.split("/")[0]:"—",l=n.repo.split("/").pop();return e.jsxs("div",{className:k("mc-card-sm",f?"border-primary/40 shadow-lg shadow-primary/5":"border-border/50 hover:border-primary/30"),children:[e.jsxs("button",{onClick:()=>u(n.repo),className:"w-full flex items-center gap-3 p-3.5 text-left cursor-pointer",children:[e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[e.jsx("span",{className:"text-xs font-bold font-mono text-foreground truncate max-w-[280px]",title:n.repo,children:l}),$&&e.jsxs("span",{className:"flex items-center gap-1 text-[8px] font-bold text-emerald-400 uppercase tracking-wider bg-emerald-500/10 border border-emerald-500/20 px-1.5 py-0.5 rounded",children:[e.jsx(Y,{className:"h-2.5 w-2.5"})," installiert"]})]}),e.jsxs("div",{className:"text-[10px] text-muted-foreground/80 flex items-center gap-3 mt-0.5 font-mono",children:[e.jsx("span",{children:Q}),e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(ae,{className:"h-3 w-3"})," ",Le(n.downloads)]}),n.likes>0&&e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(lt,{className:"h-3 w-3"})," ",Le(n.likes)]})]})]}),f?e.jsx($e,{className:"h-4 w-4 text-muted-foreground shrink-0"}):e.jsx(De,{className:"h-4 w-4 text-muted-foreground shrink-0"})]}),f&&e.jsx("div",{className:"border-t border-border/30 p-3.5 space-y-3",children:A.length===0?e.jsx("div",{className:"text-[11px] text-muted-foreground font-mono",children:S||"Lade Quants…"}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx("label",{className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground",children:"Quant"}),e.jsx("select",{value:o,onChange:m=>{i(m.target.value),D(n.repo,m.target.value,G)},"aria-label":"Quantisierung",className:"h-8 rounded-lg border border-border/60 bg-background/40 px-2 text-xs text-foreground font-semibold outline-none",children:A.map(m=>e.jsx("option",{value:m,className:"bg-popover text-foreground",children:m},m))}),e.jsx("label",{className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground ml-1",children:"Rolle"}),e.jsxs("select",{value:G,onChange:m=>{B(m.target.value),D(n.repo,o,m.target.value)},"aria-label":"Rolle",title:"Optional — bestimmt Auto-Konfiguration + setup-bewussten Kontext",className:"h-8 rounded-lg border border-border/60 bg-background/40 px-2 text-xs text-foreground font-semibold outline-none",children:[e.jsx("option",{value:"",className:"bg-popover text-foreground",children:"keine"}),Bt.map(m=>e.jsx("option",{value:m,className:"bg-popover text-foreground",children:m},m))]}),e.jsx("button",{onClick:()=>de(n.repo),disabled:!!I[n.repo]&&I[n.repo]==="Download läuft",className:k("h-8 px-3.5 ml-auto rounded-lg text-xs font-semibold transition-all cursor-pointer flex items-center gap-1.5",R?"bg-red-500 text-white hover:opacity-90":"bg-primary text-primary-foreground hover:opacity-90"),children:I[n.repo]?I[n.repo]:R?e.jsxs(e.Fragment,{children:[e.jsx(se,{className:"h-3.5 w-3.5"})," OOM — trotzdem laden"]}):e.jsxs(e.Fragment,{children:[e.jsx(ae,{className:"h-3.5 w-3.5"})," Herunterladen"]})})]}),C&&e.jsxs("div",{className:k("flex flex-wrap items-center gap-x-3 gap-y-1 rounded-lg border px-3 py-2 text-[11px] font-medium",xe(C.fit.level)),children:[e.jsx("span",{className:"font-bold uppercase tracking-wide",children:C.fit.text}),e.jsxs("span",{className:"font-mono opacity-90",children:["~",C.params_b,"B · ~",C.fit.req_gb," GB / ",C.sys_ram_gb," GB · ~",C.fit.tps," t/s"]}),C.fit.level!=="too_tight"?e.jsxs("span",{className:"font-mono opacity-80",children:["ctx → ",(C.assigned_ctx/1024).toFixed(0),"k"]}):e.jsx("span",{className:"opacity-90",children:"— passt nicht, würde beim Laden abstürzen (OOM)."})]}),H&&e.jsxs("div",{className:"flex items-start gap-2 rounded-lg border border-amber-500/40 bg-amber-500/10 px-3 py-2 text-[11px] text-amber-400",children:[e.jsx(se,{className:"h-3.5 w-3.5 mt-0.5 shrink-0"}),e.jsxs("span",{children:["Rolle ",e.jsxs("strong",{children:["„",G,'"']})," hält aktuell ",e.jsx("strong",{children:H.name.split("/").pop()})," — wird beim Download übernommen."]})]})]})})]},n.repo)}),!c.length&&!w&&e.jsx("div",{className:"text-xs text-muted-foreground py-10 text-center",children:S||"Keine Ergebnisse."})]}),e.jsxs("div",{className:"border-t border-border/30 pt-4 flex flex-col sm:flex-row gap-2 items-stretch sm:items-center",children:[e.jsx("span",{className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground shrink-0",children:"Direkt:"}),e.jsx("input",{value:g,onChange:n=>p(n.target.value),onKeyDown:n=>n.key==="Enter"&&_(),"aria-label":"Repository oder URL direkt eingeben",spellCheck:!1,placeholder:"org/repo oder HF-URL (z.B. unsloth/Qwen2.5-Coder-7B-Instruct-GGUF)",className:"flex-1 h-9 rounded-lg border border-border/60 bg-background/40 px-3 text-xs outline-none focus:ring-1 focus:ring-primary/50 text-foreground font-mono"}),e.jsx("button",{onClick:_,className:"h-9 px-4 rounded-lg border border-border/60 bg-background/20 text-xs font-semibold hover:border-primary/50 hover:bg-background/40 transition-all cursor-pointer whitespace-nowrap",children:"Laden"})]})]})}const Dt={fast:{title:"Schnelles Alltags-Hirn",desc:"Schnelle MoE-Antworten für Chat, Zusammenfassungen und alltägliche Aufgaben.",icon:ie},heavy:{title:"Schweres Reasoning",desc:"Große Modelle für komplexe Logik, Mathematik und tiefgründiges Planen.",icon:re},coder:{title:"Coden & Entwicklung",desc:"Autovervollständigung, Refactoring und Codegenerierung direkt in deiner IDE.",icon:ue},vision:{title:"Bilder & Vision",desc:"Verarbeitet Bilder, Screenshots und visuelle Diagramme in multimodalen Chats.",icon:ze},hermes:{title:"Lucys Hirn (Agent)",desc:"Lucys dauer-warmes Agent-Hirn mit Tool-Calling — bleibt ko-resident, lädt nie kalt nach.",icon:nt},scout:{title:"Multimodal-Allrounder",desc:"Multimodaler Allrounder für schnelle Antworten, Übersetzungen und Alltag.",icon:rt},kritiker:{title:"Kritisches Prüf-Hirn",desc:"Schärfer Blick für Fehler, Schwachstellen und Sicherheitslücken — denkt skeptisch, bevor du deployst.",icon:Ee},reranker:{title:"Gedächtnis-Sortierer",desc:"Sortiert und gewichtet gespeicherte Fakten nach Relevanz — damit die richtige Info sofort da ist.",icon:ge},debugger:{title:"Debugger & Selbstheiler",desc:"Agentisches Debugging, multimodale Fehleranalyse und Selbstreparatur (z.B. Muse-Glimmer).",icon:re}};function $t(){const{data:t,isLoading:r,error:h}=We(),{data:a}=le(),{data:c}=Ze(),M=(a==null?void 0:a.models)??[],w=h?String(h):"",[N,S]=j.useState({}),[b,z]=j.useState({}),[x,g]=j.useState("recommended");async function p(d,L,A,s){S(o=>({...o,[d]:"Starte..."}));try{await q("/api/models/install",{method:"POST",body:JSON.stringify({repo:d,role:L,quant:A,jinja:s})}),S(o=>({...o,[d]:"Download läuft"}))}catch{S(i=>({...i,[d]:"Fehler"}))}}return e.jsxs("div",{className:"space-y-6",children:[e.jsx("div",{className:"flex mc-card-sm p-1 w-fit",children:[["recommended","Empfohlen"],["browse","Stöbern & Suchen"]].map(([d,L])=>e.jsx("button",{onClick:()=>g(d),className:k("rounded-lg px-4 py-1.5 text-xs font-semibold tracking-wide transition-all cursor-pointer",x===d?"bg-primary text-primary-foreground shadow-md shadow-primary/10":"text-muted-foreground hover:text-foreground"),children:L},d))}),x==="browse"?e.jsx(Gt,{}):r?e.jsx("div",{className:"text-xs text-muted-foreground py-12 text-center",children:"Analysiere Hardware und suche passende GGUF-Empfehlungen…"}):w||!t?e.jsxs("div",{className:"rounded-xl border border-red-500/20 bg-red-500/5 p-4 text-xs text-red-400",children:["Empfehlungsdienst temporär nicht erreichbar (",w,")."]}):e.jsxs("div",{className:"space-y-8",children:[e.jsxs("div",{className:"text-[10px] font-mono text-muted-foreground bg-background/25 border border-border/40 p-4 rounded-xl flex flex-col sm:flex-row sm:items-center justify-between gap-3 shadow-sm",children:[e.jsxs("div",{children:["Modell-Registry geladen für ",e.jsxs("span",{className:"text-foreground font-bold",children:[t.sys_ram_gb," GB"]})," System-RAM."]}),e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx(pt,{className:"h-3.5 w-3.5 text-primary fill-primary/20"}),e.jsx("span",{children:"Empfehlungen sind automatisch auf deine Box-Hardware optimiert."})]})]}),e.jsx("div",{className:"grid gap-6 md:grid-cols-2",children:t.categories.map(d=>{const L=Dt[d.role]||{title:d.title||d.role,desc:"Spezifisches Modell für diese Systemrolle.",icon:st},A=L.icon,s=M.find(v=>v.role===d.role||(v.aliases||[]).includes(d.role)),o=c==null?void 0:c.model_list.find(v=>v.role===d.role),i=d.models.find(v=>v.repo===d.recommended)||d.models[0];if(!i)return null;const G=N[i.repo],B=d.models.filter(v=>v.repo!==d.recommended),C=!!b[d.role];return e.jsxs("div",{className:k("mc-card p-5 flex flex-col justify-between gap-5",s?"border-border/60":"border-primary/20 shadow-primary/5"),children:[e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-start justify-between gap-3",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:"w-10 h-10 rounded-xl bg-primary/10 border border-primary/20 flex items-center justify-center text-primary shadow-sm shrink-0",children:e.jsx(A,{className:"h-5.5 w-5.5"})}),e.jsxs("div",{children:[e.jsx("h3",{className:"text-sm font-bold tracking-tight text-foreground",children:L.title}),e.jsxs("span",{className:"text-[9px] font-mono text-muted-foreground uppercase bg-background/50 px-1.5 py-0.5 rounded border border-border/30 inline-block mt-0.5",children:["Rolle: ",d.role]})]})]}),s?e.jsxs("span",{className:"flex items-center gap-1.5 text-[9px] font-bold text-emerald-400 uppercase tracking-wider bg-emerald-500/10 border border-emerald-500/20 px-2.5 py-1 rounded-lg",children:[e.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-emerald-500 animate-pulse"}),"Aktiviert"]}):e.jsx("span",{className:"text-[9px] font-bold text-primary/70 uppercase tracking-wider bg-primary/10 border border-primary/20 px-2.5 py-1 rounded-lg",children:"Frei"})]}),e.jsx("p",{className:"text-xs text-muted-foreground leading-relaxed",children:L.desc}),e.jsx("div",{className:"p-3.5 rounded-xl bg-background/35 border border-border/30 space-y-2.5",children:s?e.jsxs("div",{className:"space-y-1.5",children:[e.jsx("div",{className:"text-[9px] font-bold uppercase tracking-wider text-muted-foreground/60",children:"Aktive GGUF-Belegung"}),e.jsx("div",{className:"text-xs font-mono font-bold text-foreground truncate",title:s.name,children:s.name.split("/").pop()}),e.jsxs("div",{className:"text-[10px] text-muted-foreground/80 flex items-center gap-2",children:[e.jsxs("span",{children:["Größe: ",Je(s.size_bytes||0)]}),e.jsx("span",{children:"•"}),e.jsxs("span",{children:["Quant: ",s.quant||"GGUF"]})]})]}):e.jsxs("div",{className:"space-y-1.5",children:[e.jsx("div",{className:"text-[9px] font-bold uppercase tracking-wider text-primary/80",children:"Empfohlenes Modell"}),e.jsx("div",{className:"text-xs font-mono font-bold text-foreground truncate",title:i.name,children:i.name}),e.jsxs("div",{className:"text-[10px] text-muted-foreground/80 flex items-center gap-2 flex-wrap",children:[e.jsxs("span",{children:["Ersteller: ",i.author]}),e.jsx("span",{children:"•"}),e.jsxs("span",{children:["Quant: ",i.quant]})]}),e.jsx("div",{className:"flex items-center gap-1.5 pt-0.5",children:e.jsx(vt,{fit:i.fit})})]})}),e.jsx("div",{className:"pt-1",children:s?o?e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"text-[9px] font-semibold text-amber-400 flex items-center gap-1.5",children:[e.jsx("span",{className:"w-1.5 h-1.5 rounded-full bg-amber-400 animate-ping shrink-0"}),e.jsxs("span",{children:["Bessere Version in der Registry: ",o.repo.split("/").pop()]})]}),e.jsxs("button",{onClick:()=>p(o.repo,d.role,o.repo===i.repo&&i.quant||"Q4_K_M",i.caps.tools!=="no"),disabled:!!N[o.repo],className:"h-8 w-full flex items-center justify-center gap-1.5 rounded-lg bg-amber-500 text-black text-xs font-bold hover:bg-amber-400 disabled:opacity-50 transition-all cursor-pointer shadow-md shadow-amber-500/10",children:[e.jsx(ae,{className:"h-3.5 w-3.5"}),N[o.repo]||"Auf neue Version aktualisieren"]})]}):e.jsxs("div",{className:"h-8 flex items-center justify-center gap-1.5 text-[10px] font-bold text-emerald-400 uppercase tracking-wide bg-emerald-500/5 border border-emerald-500/10 rounded-lg select-none",children:[e.jsx(Y,{className:"h-4 w-4"})," Auf neuestem Stand"]}):e.jsxs("button",{onClick:()=>p(i.repo,d.role,i.quant||"Q4_K_M",i.caps.tools!=="no"),disabled:!!G,className:k("h-8 w-full flex items-center justify-center gap-1.5 rounded-lg text-xs font-bold transition-all cursor-pointer border",G?"border-primary/40 bg-primary/5 text-primary":"bg-primary text-primary-foreground hover:opacity-90 shadow-md shadow-primary/10"),children:[e.jsx(ae,{className:"h-3.5 w-3.5"}),G||"Optimales Modell einsetzen"]})})]}),B.length>0&&e.jsxs("div",{className:"border-t border-border/20 pt-3",children:[e.jsxs("button",{onClick:()=>z(v=>({...v,[d.role]:!C})),className:"flex items-center gap-1.5 text-[10px] text-muted-foreground/80 hover:text-foreground transition-colors cursor-pointer",children:[C?e.jsx($e,{className:"h-3 w-3"}):e.jsx(De,{className:"h-3 w-3"}),e.jsxs("span",{children:["Alternative Empfehlungen anzeigen (",B.length,")"]})]}),C&&e.jsx("div",{className:"mt-2.5 space-y-2 max-h-36 overflow-y-auto pr-1 scrollbar-thin",children:B.map(v=>e.jsxs("div",{className:"p-2 rounded-lg bg-background/25 border border-border/20 flex items-center justify-between gap-3",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{className:"text-[10px] font-mono font-bold text-foreground truncate",title:v.name,children:v.name}),e.jsxs("div",{className:"text-[9px] text-muted-foreground flex items-center gap-1.5 mt-0.5",children:[e.jsxs("span",{children:["Quant: ",v.quant]}),e.jsx("span",{children:"•"}),e.jsx("span",{children:v.fit.text})]})]}),e.jsx("button",{onClick:()=>p(v.repo,d.role,v.quant||"Q4_K_M",v.caps.tools!=="no"),disabled:!!N[v.repo],className:"h-6 px-2.5 rounded bg-background/40 hover:bg-background/80 border border-border/40 text-[9px] font-bold text-foreground transition-all cursor-pointer shrink-0 disabled:opacity-50",children:N[v.repo]||"Installieren"})]},v.repo))})]})]},d.role)})})]})]})}const Et=[{id:"werkbank",label:"Werkbank"},{id:"routing",label:"Routing & Warm-Set"},{id:"discover",label:"Modelle finden"}];function Tt(){const[t,r]=j.useState("werkbank");return e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"flex flex-col sm:flex-row justify-between sm:items-center gap-4",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl font-space font-bold tracking-tight bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text text-transparent",children:"Modell-Manager"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Modelle verwalten, das Lane-Routing einstellen und Neues von HuggingFace holen."})]}),e.jsx("div",{className:"flex mc-card-sm p-1 self-start",children:Et.map(h=>e.jsx("button",{onClick:()=>r(h.id),className:k("rounded-lg px-4 py-1.5 text-xs font-semibold tracking-wide uppercase transition-all cursor-pointer",t===h.id?"bg-primary text-primary-foreground shadow-md shadow-primary/10":"text-muted-foreground hover:text-foreground"),children:h.label},h.id))})]}),e.jsx(Xe,{}),e.jsxs("div",{className:"transition-all duration-300",children:[t==="werkbank"&&e.jsx(Ct,{}),t==="routing"&&e.jsxs("div",{className:"space-y-5",children:[e.jsx(yt,{}),e.jsx(Nt,{})]}),t==="discover"&&e.jsx($t,{})]})]})}export{Tt as ModelsView}; +Trotzdem exklusiv laden?`,()=>u(l));return}u(l)}async function H(l){const x=m.find(y=>y.name===l);if(x&&p(x.role)){w("Geschützt",`„${F(x.role).label}" ist lebenswichtig und bleibt geladen.`);return}try{await q(`/api/models/${encodeURIComponent(l)}/unload`,{method:"POST"}),K()}catch(y){w("Fehler",`Entladen fehlgeschlagen: ${y.message||y}`)}}async function de(l,x){try{const y=await q(`/api/models/${encodeURIComponent(x)}/role`,{method:"POST",body:JSON.stringify({role:l||null})});K(),y!=null&&y.warning&&w("Rolle gesetzt — Hinweis",y.warning)}catch(y){w("Fehler",`Rolle zuweisen fehlgeschlagen: ${y.message||y}`)}}async function ce(l,x){let y=null;try{y=await q(`/api/models/${encodeURIComponent(l)}/ctx/auto`)}catch{}const P=y?`Optimal für dein Setup: ${(y.ctx/1024).toFixed(0)}k (${y.ctx}). »Auto« trägt diesen Wert ein.`:"Gib die gewünschte Kontextlänge in Tokens an:";S("Kontextlänge anpassen",P,String(x||32768),async Z=>{if(Z)try{await q(`/api/models/${encodeURIComponent(l)}/ctx`,{method:"POST",body:JSON.stringify({ctx:parseInt(Z,10)})}),K()}catch(ye){w("Fehler",`Kontext setzen fehlgeschlagen: ${ye.message||ye}`)}},void 0,y?{autoValue:String(y.ctx),autoLabel:`Auto (${(y.ctx/1024).toFixed(0)}k)`}:void 0)}async function me(l){const x=m.find(y=>y.name===l);if(x&&p(x.role)){w("Geschützt",`„${F(x.role).label}" kann nicht gelöscht werden. Weise die Rolle zuerst einem anderen Modell zu.`);return}N("Modell löschen?",`„${X(l)}" und alle GGUF-Dateien unwiderruflich von der Box löschen?`,async()=>{try{await q(`/api/models/${encodeURIComponent(l)}`,{method:"DELETE"}),s===l&&o(null),K()}catch(y){w("Fehler",`Löschen fehlgeschlagen: ${y.message||y}`)}})}return b?e.jsx("div",{className:"py-16 text-center text-xs text-muted-foreground",children:"Werkbank wird geladen …"}):a?e.jsxs("div",{className:"rounded-xl border border-red-500/20 bg-red-500/5 p-4 text-xs text-red-400",children:["Gateway oder Engine nicht erreichbar (",String(a),")."]}):e.jsxs("div",{className:"space-y-5",children:[e.jsx(St,{running:I,capacityBytes:te,realUsedBytes:W,selected:s,onSelect:o}),e.jsxs("div",{className:"grid gap-5 lg:grid-cols-[minmax(0,1fr)_minmax(0,1.3fr)]",children:[e.jsxs("div",{className:"mc-card p-4",children:[e.jsxs("div",{className:"mb-3 flex items-center gap-2",children:[e.jsxs("div",{className:"relative flex-1",children:[e.jsx(ge,{className:"pointer-events-none absolute left-2.5 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-muted-foreground/60"}),e.jsx("input",{value:i,onChange:l=>G(l.target.value),placeholder:"Modell suchen …",className:"h-8 w-full rounded-lg border border-border/40 bg-background/40 pl-8 pr-2 text-xs text-foreground placeholder:text-muted-foreground/50 focus:border-primary/50 focus:outline-none"})]}),e.jsx("div",{className:"flex rounded-lg border border-border/40 bg-background/30 p-0.5",children:["all","in_use"].map(l=>e.jsx("button",{onClick:()=>C(l),className:k("rounded-md px-2 py-1 text-[9px] font-bold uppercase transition-all cursor-pointer",B===l?"bg-primary text-primary-foreground":"text-muted-foreground hover:text-foreground"),children:l==="all"?"Alle":"In Benutzung"},l))})]}),e.jsx("div",{className:"max-h-[60vh] space-y-1.5 overflow-y-auto scrollbar-thin pr-1",children:T.length===0?e.jsx("div",{className:"rounded-xl border border-dashed border-border/50 p-8 text-center text-xs text-muted-foreground",children:"Keine Modelle."}):T.map(l=>{const x=f.includes(l.name),y=s===l.name,P=Ke(l.name),Z=oe(l.role);return e.jsxs("button",{onClick:()=>o(l.name),className:k("flex w-full items-center gap-2.5 rounded-xl border p-2.5 text-left transition-all cursor-pointer",y?"border-primary/60 bg-primary/10":"border-border/40 bg-background/20 hover:border-primary/30 hover:bg-background/40"),children:[e.jsx("span",{className:k("flex h-7 w-7 shrink-0 items-center justify-center rounded-lg border text-[10px] font-bold",P.color),children:P.initial}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("div",{className:"truncate font-mono text-xs font-semibold text-foreground",children:X(l.name)}),e.jsxs("div",{className:"mt-0.5 flex items-center gap-1.5",children:[l.role&&e.jsx("span",{className:k("h-2 w-2 rounded-sm",Z.dot)}),e.jsx("span",{className:"text-[10px] text-muted-foreground",children:l.role?F(l.role).short:"keine Rolle"}),e.jsxs("span",{className:"text-[10px] text-muted-foreground/50",children:["· ",ee(l.size_bytes)]})]})]}),x?e.jsxs("span",{className:"flex shrink-0 items-center gap-1 text-[9px] font-bold uppercase text-emerald-400",children:[e.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-emerald-500 animate-pulse"}),"warm"]}):l.incomplete?e.jsx("span",{className:"shrink-0 text-[9px] font-bold uppercase text-amber-400",children:"⚠ fehlt"}):e.jsx("span",{className:"shrink-0 text-[9px] font-semibold uppercase text-muted-foreground/50",children:"bereit"})]},l.name)})})]}),e.jsx("div",{className:"mc-card p-5",children:$?e.jsx(_t,{m:$,warm:f.includes($.name),expert:z,protectedRole:p($.role),coresident:A($.name),onLoad:()=>_($.name),onUnload:()=>H($.name),onRole:l=>de(l,$.name),onCtx:()=>ce($.name,$.ctx),onSpec:()=>R($),onDelete:()=>me($.name)}):e.jsxs("div",{className:"flex h-full min-h-[16rem] flex-col items-center justify-center gap-2 text-center text-muted-foreground",children:[e.jsx(Qe,{className:"h-8 w-8 opacity-40"}),e.jsx("p",{className:"text-sm font-semibold",children:"Links ein Modell wählen"}),e.jsx("p",{className:"text-xs",children:"Dann verwaltest du es hier — laden, Rolle, Kontext, löschen."})]})})]}),v&&e.jsx(wt,{model:v,onClose:()=>R(null),onChanged:K}),g]})}function _t({m:t,warm:r,expert:b,protectedRole:a,coresident:c,onLoad:M,onUnload:w,onRole:N,onCtx:S,onSpec:g,onDelete:z}){const m=Ke(t.name),f=r&&a;return e.jsxs("div",{className:"flex h-full flex-col gap-4",children:[e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsx("span",{className:k("flex h-10 w-10 shrink-0 items-center justify-center rounded-xl border text-sm font-bold",m.color),children:m.initial}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("h2",{className:"break-all font-mono text-sm font-bold text-foreground",children:X(t.name)}),e.jsxs("div",{className:"mt-1.5 flex flex-wrap items-center gap-1.5",children:[t.role?e.jsx(pe,{role:t.role}):e.jsx("span",{className:"rounded border border-dashed border-border/50 px-1.5 py-0.5 text-[10px] text-muted-foreground",children:"keine Rolle"}),a&&e.jsxs("span",{className:"rounded bg-background/40 px-1.5 py-0.5 text-[10px] text-muted-foreground",title:"Lebenswichtig — geschützt",children:[e.jsx(tt,{className:"mr-0.5 inline h-3 w-3"}),"geschützt"]}),c&&e.jsxs("span",{className:"rounded border border-fuchsia-500/30 bg-fuchsia-500/10 px-1.5 py-0.5 text-[10px] font-bold uppercase text-fuchsia-300",children:[e.jsx(re,{className:"mr-0.5 inline h-3 w-3"}),"Ko-resident"]}),r&&e.jsxs("span",{className:"flex items-center gap-1 text-[10px] font-bold uppercase text-emerald-400",children:[e.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-emerald-500 animate-pulse"}),"warm"]})]})]})]}),e.jsxs("button",{onClick:r?w:M,disabled:t.incomplete&&!r||f,className:k("flex h-11 w-full items-center justify-center gap-2 rounded-xl border text-sm font-bold transition-all cursor-pointer disabled:cursor-not-allowed disabled:opacity-50",r?"border-amber-500/40 bg-amber-500/10 text-amber-300 hover:bg-amber-500/20":"border-primary/40 bg-primary/10 text-primary hover:bg-primary/20"),title:f?`„${F(t.role).label}" bleibt geladen (geschützt).`:void 0,children:[r?e.jsx(xt,{className:"h-4 w-4"}):e.jsx(Ue,{className:"h-4 w-4"}),f?"🔒 bleibt geladen":r?"Entladen":"Ins Warm-Set laden"]}),e.jsxs("div",{className:"rounded-xl border border-border/30 bg-background/20 p-3",children:[e.jsxs("div",{className:"mb-2 flex items-center justify-between text-[11px] font-semibold uppercase tracking-wider text-muted-foreground",children:[e.jsx("span",{children:"Rolle"}),a&&e.jsx("span",{className:"normal-case font-medium tracking-normal text-muted-foreground/70",children:"🔒 lebenswichtig — zum Tausch die Rolle woanders zuweisen"})]}),e.jsxs("div",{className:"flex flex-wrap gap-1.5",children:[e.jsx(_e,{active:!t.role,onClick:()=>N(""),dot:"bg-slate-400",label:"keine",disabled:a}),fe.map(p=>e.jsx(_e,{active:t.role===p.role,onClick:()=>N(p.role),dot:oe(p.role).dot,label:p.short,disabled:a&&t.role!==p.role},p.role))]})]}),e.jsxs("div",{className:"grid grid-cols-2 gap-2 text-xs",children:[e.jsx(Lt,{icon:be,label:"Größe",value:ee(t.size_bytes)}),e.jsxs("button",{onClick:S,className:"group flex items-center gap-2 rounded-lg border border-border/30 bg-background/20 p-2.5 text-left transition-colors hover:border-primary/40 cursor-pointer",children:[e.jsx(ct,{className:"h-4 w-4 text-primary/80"}),e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{className:"text-[9px] font-semibold uppercase tracking-wider text-muted-foreground/60",children:"Kontext · ändern"}),e.jsx("div",{className:"font-semibold text-foreground",children:Ve(t.ctx)})]})]})]}),e.jsxs("div",{className:"rounded-xl border border-border/30 bg-background/20 p-3",children:[e.jsxs("div",{className:"mb-2 flex items-center justify-between",children:[e.jsx("span",{className:"text-[11px] font-semibold uppercase tracking-wider text-muted-foreground",children:"Beschleuniger"}),b&&e.jsxs("button",{onClick:g,className:k("flex h-6 items-center gap-1 rounded-lg border px-2 text-[9px] font-bold uppercase transition-colors cursor-pointer",t.spec_active?"border-emerald-500/30 text-emerald-400 hover:bg-emerald-500/10":t.spec_draft_model?"border-amber-500/30 text-amber-400 hover:bg-amber-500/10":"border-border/40 text-muted-foreground hover:bg-accent"),children:[e.jsx(ie,{className:"h-3 w-3"})," Spec"]})]}),e.jsxs("div",{className:"flex flex-wrap items-center gap-1.5",children:[t.spec_active&&e.jsx(ne,{tone:"emerald",label:"Spec-Decoding aktiv"}),!t.spec_active&&t.spec_draft_model&&e.jsx(ne,{tone:"amber",label:"Spec inaktiv"}),t.prompt_cache&&e.jsx(ne,{tone:"cyan",label:"Prompt-Cache"}),t.parallel_slots>1&&e.jsx(ne,{tone:"violet",label:`${t.parallel_slots} Slots`}),!t.spec_active&&!t.spec_draft_model&&!t.prompt_cache&&t.parallel_slots<=1&&e.jsx("span",{className:"text-[11px] text-muted-foreground/60",children:"keine aktiv"})]})]}),e.jsx("div",{className:"flex flex-wrap gap-1",children:e.jsx(kt,{caps:t.capabilities})}),e.jsxs("button",{onClick:z,disabled:a,className:k("mt-auto flex h-9 items-center justify-center gap-1.5 rounded-lg border text-xs font-semibold transition-colors",a?"cursor-not-allowed border-border/30 text-muted-foreground/40":"border-red-500/30 text-red-400 hover:bg-red-500/10 cursor-pointer"),children:[e.jsx(bt,{className:"h-3.5 w-3.5"})," ",a?"geschützt — nicht löschbar":"Modell löschen"]})]})}function _e({active:t,onClick:r,dot:b,label:a,disabled:c}){return e.jsxs("button",{onClick:r,disabled:c,title:c?"Gesperrt: dieses Modell hält eine lebenswichtige Rolle.":void 0,className:k("flex items-center gap-1.5 rounded-lg border px-2 py-1 text-[10px] font-semibold transition-all",c?"cursor-not-allowed opacity-40 border-border/40 bg-background/20 text-muted-foreground":t?"cursor-pointer border-primary/60 bg-primary/15 text-foreground":"cursor-pointer border-border/40 bg-background/20 text-muted-foreground hover:border-primary/30"),children:[e.jsx("span",{className:k("h-2 w-2 rounded-sm",b)}),a,t&&e.jsx(Y,{className:"h-3 w-3 text-primary"})]})}function Lt({icon:t,label:r,value:b}){return e.jsxs("div",{className:"flex items-center gap-2 rounded-lg border border-border/30 bg-background/20 p-2.5",children:[e.jsx(t,{className:"h-4 w-4 text-primary/80"}),e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{className:"text-[9px] font-semibold uppercase tracking-wider text-muted-foreground/60",children:r}),e.jsx("div",{className:"font-semibold text-foreground",children:b})]})]})}function ne({tone:t,label:r}){const b={emerald:"bg-emerald-500/10 text-emerald-400 border-emerald-500/20",amber:"bg-amber-500/10 text-amber-400 border-amber-500/20",cyan:"bg-cyan-500/10 text-cyan-400 border-cyan-500/20",violet:"bg-violet-500/10 text-violet-400 border-violet-500/20"}[t];return e.jsx("span",{className:k("rounded border px-1.5 py-0.5 text-[10px] font-semibold",b),children:r})}const zt=[{key:"popular",label:"Beliebt",q:""},{key:"coder",label:"Coder",q:"coder"},{key:"vision",label:"Vision",q:"vision"},{key:"reasoning",label:"Reasoning",q:"reasoning"},{key:"small",label:"Klein (≤4B)",q:"3B"}],Bt=["fast","heavy","coder","vision","hermes","scout"],At=new Intl.NumberFormat(void 0,{notation:"compact",maximumFractionDigits:1});function Le(t){return At.format(t)}function Gt(){const{data:t}=le(),r=(t==null?void 0:t.models)??[],[b,a]=j.useState(""),[c,M]=j.useState([]),[w,N]=j.useState(!1),[S,g]=j.useState(""),[z,m]=j.useState("popular"),[f,p]=j.useState(""),[d,L]=j.useState(null),[A,s]=j.useState([]),[o,i]=j.useState("Q4_K_M"),[G,B]=j.useState(""),[C,v]=j.useState(null),[R,K]=j.useState(!1),[I,O]=j.useState({});async function W(n){N(!0),g("");try{const h=await q(`/api/hf/search?q=${encodeURIComponent(n)}`);M(h.results),h.results.length||g("Keine Ergebnisse.")}catch(h){g(`Suche fehlgeschlagen: ${h}`)}finally{N(!1)}}j.useEffect(()=>{W("")},[]);function te(n){m(n.key),a(""),W(n.q)}function T(){m(""),W(b)}async function $(n,h,D){K(!1);try{const Q=await q(`/api/fit?params_b=0&quant=${encodeURIComponent(h)}&ctx=8192&name=${encodeURIComponent(n)}&role=${encodeURIComponent(D)}`);v(Q)}catch{v(null)}}async function u(n){if(d===n){L(null);return}L(n),s([]),v(null),B(""),K(!1),g("Analysiere Repository…");try{const h=await q(`/api/hf/quants?repo=${encodeURIComponent(n)}`);s(h.quants);const D=h.quants.includes("Q4_K_M")?"Q4_K_M":h.quants[0]||"Q4_K_M";i(D),g(h.quants.length?"":"Keine GGUF-Dateien in diesem Repo gefunden."),h.quants.length&&$(h.repo,D,"")}catch(h){g(`Fehler: ${h}`)}}function _(){const n=f.trim();n&&(M(h=>h.some(D=>D.repo===n)?h:[{repo:n,downloads:0,likes:0},...h]),p(""),u(n))}const H=G?r.find(n=>(n.role||"").toLowerCase()===G):void 0;async function de(n){if((C==null?void 0:C.fit.level)==="too_tight"&&!R){K(!0);return}O(h=>({...h,[n]:"Starte…"}));try{await q("/api/models/install",{method:"POST",body:JSON.stringify({repo:n,quant:o,role:G||void 0,jinja:!0})}),O(h=>({...h,[n]:"Download läuft"})),K(!1)}catch(h){O(D=>({...D,[n]:`Fehler: ${h instanceof Error?h.message:String(h)}`}))}}const ce=n=>{var D;const h=((D=n.split("/").pop())==null?void 0:D.toLowerCase().replace(/-gguf$/i,""))||"";return h.length>3&&r.some(Q=>Q.name.toLowerCase().includes(h))},me=n=>n==="perfect"?"text-emerald-400 border-emerald-500/40 bg-emerald-500/10":n==="marginal"?"text-amber-400 border-amber-500/40 bg-amber-500/10":"text-red-400 border-red-500/40 bg-red-500/10";return e.jsxs("div",{className:"space-y-5",children:[e.jsxs("div",{className:"flex gap-2",children:[e.jsxs("div",{className:"relative flex-1",children:[e.jsx(ge,{className:"absolute left-3 top-2.5 h-4 w-4 text-muted-foreground"}),e.jsx("input",{value:b,onChange:n=>a(n.target.value),onKeyDown:n=>n.key==="Enter"&&T(),"aria-label":"HuggingFace durchsuchen",type:"search",spellCheck:!1,placeholder:"HuggingFace durchsuchen (z.B. Qwen Coder, Llama-3.1, gemma)…",className:"w-full h-10 pl-9 pr-3 rounded-xl border border-border/60 bg-background/40 text-xs outline-none focus:ring-1 focus:ring-primary/50 text-foreground"})]}),e.jsx("button",{onClick:T,className:"h-10 px-5 rounded-xl bg-primary text-primary-foreground text-xs font-semibold hover:opacity-90 transition-all cursor-pointer",children:"Suchen"})]}),e.jsx("div",{className:"flex items-center gap-2 flex-wrap",children:zt.map(n=>e.jsxs("button",{onClick:()=>te(n),className:k("flex items-center gap-1.5 rounded-full px-3 py-1.5 text-[11px] font-semibold transition-all cursor-pointer border",z===n.key?"bg-primary/15 text-primary border-primary/30":"border-border/50 text-muted-foreground hover:text-foreground hover:border-border"),children:[n.key==="popular"&&e.jsx(ot,{className:"h-3 w-3"}),n.label]},n.key))}),w?e.jsx("div",{className:"text-xs text-muted-foreground py-10 text-center",children:"Lade GGUF-Modelle von HuggingFace…"}):e.jsxs("div",{className:"space-y-2",children:[c.map(n=>{const h=d===n.repo,D=ce(n.repo),Q=n.repo.includes("/")?n.repo.split("/")[0]:"—",l=n.repo.split("/").pop();return e.jsxs("div",{className:k("mc-card-sm",h?"border-primary/40 shadow-lg shadow-primary/5":"border-border/50 hover:border-primary/30"),children:[e.jsxs("button",{onClick:()=>u(n.repo),className:"w-full flex items-center gap-3 p-3.5 text-left cursor-pointer",children:[e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[e.jsx("span",{className:"text-xs font-bold font-mono text-foreground truncate max-w-[280px]",title:n.repo,children:l}),D&&e.jsxs("span",{className:"flex items-center gap-1 text-[8px] font-bold text-emerald-400 uppercase tracking-wider bg-emerald-500/10 border border-emerald-500/20 px-1.5 py-0.5 rounded",children:[e.jsx(Y,{className:"h-2.5 w-2.5"})," installiert"]})]}),e.jsxs("div",{className:"text-[10px] text-muted-foreground/80 flex items-center gap-3 mt-0.5 font-mono",children:[e.jsx("span",{children:Q}),e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(ae,{className:"h-3 w-3"})," ",Le(n.downloads)]}),n.likes>0&&e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(lt,{className:"h-3 w-3"})," ",Le(n.likes)]})]})]}),h?e.jsx(De,{className:"h-4 w-4 text-muted-foreground shrink-0"}):e.jsx($e,{className:"h-4 w-4 text-muted-foreground shrink-0"})]}),h&&e.jsx("div",{className:"border-t border-border/30 p-3.5 space-y-3",children:A.length===0?e.jsx("div",{className:"text-[11px] text-muted-foreground font-mono",children:S||"Lade Quants…"}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx("label",{className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground",children:"Quant"}),e.jsx("select",{value:o,onChange:x=>{i(x.target.value),$(n.repo,x.target.value,G)},"aria-label":"Quantisierung",className:"h-8 rounded-lg border border-border/60 bg-background/40 px-2 text-xs text-foreground font-semibold outline-none",children:A.map(x=>e.jsx("option",{value:x,className:"bg-popover text-foreground",children:x},x))}),e.jsx("label",{className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground ml-1",children:"Rolle"}),e.jsxs("select",{value:G,onChange:x=>{B(x.target.value),$(n.repo,o,x.target.value)},"aria-label":"Rolle",title:"Optional — bestimmt Auto-Konfiguration + setup-bewussten Kontext",className:"h-8 rounded-lg border border-border/60 bg-background/40 px-2 text-xs text-foreground font-semibold outline-none",children:[e.jsx("option",{value:"",className:"bg-popover text-foreground",children:"keine"}),Bt.map(x=>e.jsx("option",{value:x,className:"bg-popover text-foreground",children:x},x))]}),e.jsx("button",{onClick:()=>de(n.repo),disabled:!!I[n.repo]&&I[n.repo]==="Download läuft",className:k("h-8 px-3.5 ml-auto rounded-lg text-xs font-semibold transition-all cursor-pointer flex items-center gap-1.5",R?"bg-red-500 text-white hover:opacity-90":"bg-primary text-primary-foreground hover:opacity-90"),children:I[n.repo]?I[n.repo]:R?e.jsxs(e.Fragment,{children:[e.jsx(se,{className:"h-3.5 w-3.5"})," OOM — trotzdem laden"]}):e.jsxs(e.Fragment,{children:[e.jsx(ae,{className:"h-3.5 w-3.5"})," Herunterladen"]})})]}),C&&e.jsxs("div",{className:k("flex flex-wrap items-center gap-x-3 gap-y-1 rounded-lg border px-3 py-2 text-[11px] font-medium",me(C.fit.level)),children:[e.jsx("span",{className:"font-bold uppercase tracking-wide",children:C.fit.text}),e.jsxs("span",{className:"font-mono opacity-90",children:["~",C.params_b,"B · ~",C.fit.req_gb," GB / ",C.sys_ram_gb," GB · ~",C.fit.tps," t/s"]}),C.fit.level!=="too_tight"?e.jsxs("span",{className:"font-mono opacity-80",children:["ctx → ",(C.assigned_ctx/1024).toFixed(0),"k"]}):e.jsx("span",{className:"opacity-90",children:"— passt nicht, würde beim Laden abstürzen (OOM)."})]}),H&&e.jsxs("div",{className:"flex items-start gap-2 rounded-lg border border-amber-500/40 bg-amber-500/10 px-3 py-2 text-[11px] text-amber-400",children:[e.jsx(se,{className:"h-3.5 w-3.5 mt-0.5 shrink-0"}),e.jsxs("span",{children:["Rolle ",e.jsxs("strong",{children:["„",G,'"']})," hält aktuell ",e.jsx("strong",{children:H.name.split("/").pop()})," — wird beim Download übernommen."]})]})]})})]},n.repo)}),!c.length&&!w&&e.jsx("div",{className:"text-xs text-muted-foreground py-10 text-center",children:S||"Keine Ergebnisse."})]}),e.jsxs("div",{className:"border-t border-border/30 pt-4 flex flex-col sm:flex-row gap-2 items-stretch sm:items-center",children:[e.jsx("span",{className:"text-[10px] font-bold uppercase tracking-wider text-muted-foreground shrink-0",children:"Direkt:"}),e.jsx("input",{value:f,onChange:n=>p(n.target.value),onKeyDown:n=>n.key==="Enter"&&_(),"aria-label":"Repository oder URL direkt eingeben",spellCheck:!1,placeholder:"org/repo oder HF-URL (z.B. unsloth/Qwen2.5-Coder-7B-Instruct-GGUF)",className:"flex-1 h-9 rounded-lg border border-border/60 bg-background/40 px-3 text-xs outline-none focus:ring-1 focus:ring-primary/50 text-foreground font-mono"}),e.jsx("button",{onClick:_,className:"h-9 px-4 rounded-lg border border-border/60 bg-background/20 text-xs font-semibold hover:border-primary/50 hover:bg-background/40 transition-all cursor-pointer whitespace-nowrap",children:"Laden"})]})]})}const $t={fast:{title:"Schnelles Alltags-Hirn",desc:"Schnelle MoE-Antworten für Chat, Zusammenfassungen und alltägliche Aufgaben.",icon:ie},heavy:{title:"Schweres Reasoning",desc:"Große Modelle für komplexe Logik, Mathematik und tiefgründiges Planen.",icon:re},coder:{title:"Coden & Entwicklung",desc:"Autovervollständigung, Refactoring und Codegenerierung direkt in deiner IDE.",icon:ue},vision:{title:"Bilder & Vision",desc:"Verarbeitet Bilder, Screenshots und visuelle Diagramme in multimodalen Chats.",icon:ze},hermes:{title:"Lucys Hirn (Agent)",desc:"Lucys dauer-warmes Agent-Hirn mit Tool-Calling — bleibt ko-resident, lädt nie kalt nach.",icon:nt},scout:{title:"Multimodal-Allrounder",desc:"Multimodaler Allrounder für schnelle Antworten, Übersetzungen und Alltag.",icon:rt},kritiker:{title:"Kritisches Prüf-Hirn",desc:"Schärfer Blick für Fehler, Schwachstellen und Sicherheitslücken — denkt skeptisch, bevor du deployst.",icon:Ee},reranker:{title:"Gedächtnis-Sortierer",desc:"Sortiert und gewichtet gespeicherte Fakten nach Relevanz — damit die richtige Info sofort da ist.",icon:ge},debugger:{title:"Debugger & Selbstheiler",desc:"Agentisches Debugging, multimodale Fehleranalyse und Selbstreparatur (z.B. Muse-Glimmer).",icon:re}};function Dt(){const{data:t,isLoading:r,error:b}=We(),{data:a}=le(),{data:c}=Ze(),M=(a==null?void 0:a.models)??[],w=b?String(b):"",[N,S]=j.useState({}),[g,z]=j.useState({}),[m,f]=j.useState("recommended");async function p(d,L,A,s){S(o=>({...o,[d]:"Starte..."}));try{await q("/api/models/install",{method:"POST",body:JSON.stringify({repo:d,role:L,quant:A,jinja:s})}),S(o=>({...o,[d]:"Download läuft"}))}catch(o){S(i=>({...i,[d]:`Fehler: ${o instanceof Error?o.message:String(o)}`}))}}return e.jsxs("div",{className:"space-y-6",children:[e.jsx("div",{className:"flex mc-card-sm p-1 w-fit",children:[["recommended","Empfohlen"],["browse","Stöbern & Suchen"]].map(([d,L])=>e.jsx("button",{onClick:()=>f(d),className:k("rounded-lg px-4 py-1.5 text-xs font-semibold tracking-wide transition-all cursor-pointer",m===d?"bg-primary text-primary-foreground shadow-md shadow-primary/10":"text-muted-foreground hover:text-foreground"),children:L},d))}),m==="browse"?e.jsx(Gt,{}):r?e.jsx("div",{className:"text-xs text-muted-foreground py-12 text-center",children:"Analysiere Hardware und suche passende GGUF-Empfehlungen…"}):w||!t?e.jsxs("div",{className:"rounded-xl border border-red-500/20 bg-red-500/5 p-4 text-xs text-red-400",children:["Empfehlungsdienst temporär nicht erreichbar (",w,")."]}):e.jsxs("div",{className:"space-y-8",children:[e.jsxs("div",{className:"text-[10px] font-mono text-muted-foreground bg-background/25 border border-border/40 p-4 rounded-xl flex flex-col sm:flex-row sm:items-center justify-between gap-3 shadow-sm",children:[e.jsxs("div",{children:["Modell-Registry geladen für ",e.jsxs("span",{className:"text-foreground font-bold",children:[t.sys_ram_gb," GB"]})," System-RAM."]}),e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx(pt,{className:"h-3.5 w-3.5 text-primary fill-primary/20"}),e.jsx("span",{children:"Empfehlungen sind automatisch auf deine Box-Hardware optimiert."})]})]}),e.jsx("div",{className:"grid gap-6 md:grid-cols-2",children:t.categories.map(d=>{const L=$t[d.role]||{title:d.title||d.role,desc:"Spezifisches Modell für diese Systemrolle.",icon:st},A=L.icon,s=M.find(v=>v.role===d.role||(v.aliases||[]).includes(d.role)),o=c==null?void 0:c.model_list.find(v=>v.role===d.role),i=d.models.find(v=>v.repo===d.recommended)||d.models[0];if(!i)return null;const G=N[i.repo],B=d.models.filter(v=>v.repo!==d.recommended),C=!!g[d.role];return e.jsxs("div",{className:k("mc-card p-5 flex flex-col justify-between gap-5",s?"border-border/60":"border-primary/20 shadow-primary/5"),children:[e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-start justify-between gap-3",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:"w-10 h-10 rounded-xl bg-primary/10 border border-primary/20 flex items-center justify-center text-primary shadow-sm shrink-0",children:e.jsx(A,{className:"h-5.5 w-5.5"})}),e.jsxs("div",{children:[e.jsx("h3",{className:"text-sm font-bold tracking-tight text-foreground",children:L.title}),e.jsxs("span",{className:"text-[9px] font-mono text-muted-foreground uppercase bg-background/50 px-1.5 py-0.5 rounded border border-border/30 inline-block mt-0.5",children:["Rolle: ",d.role]})]})]}),s?e.jsxs("span",{className:"flex items-center gap-1.5 text-[9px] font-bold text-emerald-400 uppercase tracking-wider bg-emerald-500/10 border border-emerald-500/20 px-2.5 py-1 rounded-lg",children:[e.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-emerald-500 animate-pulse"}),"Aktiviert"]}):e.jsx("span",{className:"text-[9px] font-bold text-primary/70 uppercase tracking-wider bg-primary/10 border border-primary/20 px-2.5 py-1 rounded-lg",children:"Frei"})]}),e.jsx("p",{className:"text-xs text-muted-foreground leading-relaxed",children:L.desc}),e.jsx("div",{className:"p-3.5 rounded-xl bg-background/35 border border-border/30 space-y-2.5",children:s?e.jsxs("div",{className:"space-y-1.5",children:[e.jsx("div",{className:"text-[9px] font-bold uppercase tracking-wider text-muted-foreground/60",children:"Aktive GGUF-Belegung"}),e.jsx("div",{className:"text-xs font-mono font-bold text-foreground truncate",title:s.name,children:s.name.split("/").pop()}),e.jsxs("div",{className:"text-[10px] text-muted-foreground/80 flex items-center gap-2",children:[e.jsxs("span",{children:["Größe: ",Je(s.size_bytes||0)]}),e.jsx("span",{children:"•"}),e.jsxs("span",{children:["Quant: ",s.quant||"GGUF"]})]})]}):e.jsxs("div",{className:"space-y-1.5",children:[e.jsx("div",{className:"text-[9px] font-bold uppercase tracking-wider text-primary/80",children:"Empfohlenes Modell"}),e.jsx("div",{className:"text-xs font-mono font-bold text-foreground truncate",title:i.name,children:i.name}),e.jsxs("div",{className:"text-[10px] text-muted-foreground/80 flex items-center gap-2 flex-wrap",children:[e.jsxs("span",{children:["Ersteller: ",i.author]}),e.jsx("span",{children:"•"}),e.jsxs("span",{children:["Quant: ",i.quant]})]}),e.jsx("div",{className:"flex items-center gap-1.5 pt-0.5",children:e.jsx(vt,{fit:i.fit})})]})}),e.jsx("div",{className:"pt-1",children:s?o?e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"text-[9px] font-semibold text-amber-400 flex items-center gap-1.5",children:[e.jsx("span",{className:"w-1.5 h-1.5 rounded-full bg-amber-400 animate-ping shrink-0"}),e.jsxs("span",{children:["Bessere Version in der Registry: ",o.repo.split("/").pop()]})]}),e.jsxs("button",{onClick:()=>p(o.repo,d.role,o.repo===i.repo&&i.quant||"Q4_K_M",i.caps.tools!=="no"),disabled:!!N[o.repo],className:"h-8 w-full flex items-center justify-center gap-1.5 rounded-lg bg-amber-500 text-black text-xs font-bold hover:bg-amber-400 disabled:opacity-50 transition-all cursor-pointer shadow-md shadow-amber-500/10",children:[e.jsx(ae,{className:"h-3.5 w-3.5"}),N[o.repo]||"Auf neue Version aktualisieren"]})]}):e.jsxs("div",{className:"h-8 flex items-center justify-center gap-1.5 text-[10px] font-bold text-emerald-400 uppercase tracking-wide bg-emerald-500/5 border border-emerald-500/10 rounded-lg select-none",children:[e.jsx(Y,{className:"h-4 w-4"})," Auf neuestem Stand"]}):e.jsxs("button",{onClick:()=>p(i.repo,d.role,i.quant||"Q4_K_M",i.caps.tools!=="no"),disabled:!!G,className:k("h-8 w-full flex items-center justify-center gap-1.5 rounded-lg text-xs font-bold transition-all cursor-pointer border",G?"border-primary/40 bg-primary/5 text-primary":"bg-primary text-primary-foreground hover:opacity-90 shadow-md shadow-primary/10"),children:[e.jsx(ae,{className:"h-3.5 w-3.5"}),G||"Optimales Modell einsetzen"]})})]}),B.length>0&&e.jsxs("div",{className:"border-t border-border/20 pt-3",children:[e.jsxs("button",{onClick:()=>z(v=>({...v,[d.role]:!C})),className:"flex items-center gap-1.5 text-[10px] text-muted-foreground/80 hover:text-foreground transition-colors cursor-pointer",children:[C?e.jsx(De,{className:"h-3 w-3"}):e.jsx($e,{className:"h-3 w-3"}),e.jsxs("span",{children:["Alternative Empfehlungen anzeigen (",B.length,")"]})]}),C&&e.jsx("div",{className:"mt-2.5 space-y-2 max-h-36 overflow-y-auto pr-1 scrollbar-thin",children:B.map(v=>e.jsxs("div",{className:"p-2 rounded-lg bg-background/25 border border-border/20 flex items-center justify-between gap-3",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{className:"text-[10px] font-mono font-bold text-foreground truncate",title:v.name,children:v.name}),e.jsxs("div",{className:"text-[9px] text-muted-foreground flex items-center gap-1.5 mt-0.5",children:[e.jsxs("span",{children:["Quant: ",v.quant]}),e.jsx("span",{children:"•"}),e.jsx("span",{children:v.fit.text})]})]}),e.jsx("button",{onClick:()=>p(v.repo,d.role,v.quant||"Q4_K_M",v.caps.tools!=="no"),disabled:!!N[v.repo],className:"h-6 px-2.5 rounded bg-background/40 hover:bg-background/80 border border-border/40 text-[9px] font-bold text-foreground transition-all cursor-pointer shrink-0 disabled:opacity-50",children:N[v.repo]||"Installieren"})]},v.repo))})]})]},d.role)})})]})]})}const Et=[{id:"werkbank",label:"Werkbank"},{id:"routing",label:"Routing & Warm-Set"},{id:"discover",label:"Modelle finden"}];function Tt(){const[t,r]=j.useState("werkbank");return e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"flex flex-col sm:flex-row justify-between sm:items-center gap-4",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl font-space font-bold tracking-tight bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text text-transparent",children:"Modell-Manager"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Modelle verwalten, das Lane-Routing einstellen und Neues von HuggingFace holen."})]}),e.jsx("div",{className:"flex mc-card-sm p-1 self-start",children:Et.map(b=>e.jsx("button",{onClick:()=>r(b.id),className:k("rounded-lg px-4 py-1.5 text-xs font-semibold tracking-wide uppercase transition-all cursor-pointer",t===b.id?"bg-primary text-primary-foreground shadow-md shadow-primary/10":"text-muted-foreground hover:text-foreground"),children:b.label},b.id))})]}),e.jsx(Xe,{}),e.jsxs("div",{className:"transition-all duration-300",children:[t==="werkbank"&&e.jsx(Ct,{}),t==="routing"&&e.jsxs("div",{className:"space-y-5",children:[e.jsx(yt,{}),e.jsx(Nt,{})]}),t==="discover"&&e.jsx(Dt,{})]})]})}export{Tt as ModelsView}; diff --git a/frontend/dist/assets/SectionLabel-C_SwIL8k.js b/frontend/dist/assets/SectionLabel-R1yae0WQ.js similarity index 93% rename from frontend/dist/assets/SectionLabel-C_SwIL8k.js rename to frontend/dist/assets/SectionLabel-R1yae0WQ.js index f65d5b7..9855bfa 100644 --- a/frontend/dist/assets/SectionLabel-C_SwIL8k.js +++ b/frontend/dist/assets/SectionLabel-R1yae0WQ.js @@ -1,4 +1,4 @@ -import{c as s,j as e}from"./index-B57enqf6.js";/** +import{c as s,j as e}from"./index-BYlMs6Dj.js";/** * @license lucide-react v0.460.0 - ISC * * This source code is licensed under the ISC license. diff --git a/frontend/dist/assets/SkillsView-DIrPeuP2.js b/frontend/dist/assets/SkillsView-C5MWeKc5.js similarity index 98% rename from frontend/dist/assets/SkillsView-DIrPeuP2.js rename to frontend/dist/assets/SkillsView-C5MWeKc5.js index d52e0b4..5df105e 100644 --- a/frontend/dist/assets/SkillsView-DIrPeuP2.js +++ b/frontend/dist/assets/SkillsView-C5MWeKc5.js @@ -1,4 +1,4 @@ -var M=r=>{throw TypeError(r)};var O=(r,e,t)=>e.has(r)||M("Cannot "+t);var a=(r,e,t)=>(O(r,e,"read from private field"),t?t.call(r):e.get(r)),y=(r,e,t)=>e.has(r)?M("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(r):e.set(r,t),v=(r,e,t,n)=>(O(r,e,"write to private field"),n?n.call(r,t):e.set(r,t),t),j=(r,e,t)=>(O(r,e,"access private method"),t);import{a9 as B,aa as F,ab as E,ac as I,ad as P,u as A,r as f,ae as J,af as Q,c as T,ag as U,j as s,G as D,T as H,b as K,L,M as G,q as V,n as R}from"./index-B57enqf6.js";import{J as _}from"./JobsBar-D8URwRCr.js";var c,g,o,h,m,w,C,q,z=(q=class extends B{constructor(e,t){super();y(this,m);y(this,c);y(this,g);y(this,o);y(this,h);v(this,c,e),this.setOptions(t),this.bindMethods(),j(this,m,w).call(this)}bindMethods(){this.mutate=this.mutate.bind(this),this.reset=this.reset.bind(this)}setOptions(e){var n;const t=this.options;this.options=a(this,c).defaultMutationOptions(e),F(this.options,t)||a(this,c).getMutationCache().notify({type:"observerOptionsUpdated",mutation:a(this,o),observer:this}),t!=null&&t.mutationKey&&this.options.mutationKey&&E(t.mutationKey)!==E(this.options.mutationKey)?this.reset():((n=a(this,o))==null?void 0:n.state.status)==="pending"&&a(this,o).setOptions(this.options)}onUnsubscribe(){var e;this.hasListeners()||(e=a(this,o))==null||e.removeObserver(this)}onMutationUpdate(e){j(this,m,w).call(this),j(this,m,C).call(this,e)}getCurrentResult(){return a(this,g)}reset(){var e;(e=a(this,o))==null||e.removeObserver(this),v(this,o,void 0),j(this,m,w).call(this),j(this,m,C).call(this)}mutate(e,t){var n;return v(this,h,t),(n=a(this,o))==null||n.removeObserver(this),v(this,o,a(this,c).getMutationCache().build(a(this,c),this.options)),a(this,o).addObserver(this),a(this,o).execute(e)}},c=new WeakMap,g=new WeakMap,o=new WeakMap,h=new WeakMap,m=new WeakSet,w=function(){var t;const e=((t=a(this,o))==null?void 0:t.state)??I();v(this,g,{...e,isPending:e.status==="pending",isSuccess:e.status==="success",isError:e.status==="error",isIdle:e.status==="idle",mutate:this.mutate,reset:this.reset})},C=function(e){P.batch(()=>{var t,n,l,x,d,p,k,i;if(a(this,h)&&this.hasListeners()){const u=a(this,g).variables,N=a(this,g).context,S={client:a(this,c),meta:this.options.meta,mutationKey:this.options.mutationKey};if((e==null?void 0:e.type)==="success"){try{(n=(t=a(this,h)).onSuccess)==null||n.call(t,e.data,u,N,S)}catch(b){Promise.reject(b)}try{(x=(l=a(this,h)).onSettled)==null||x.call(l,e.data,null,u,N,S)}catch(b){Promise.reject(b)}}else if((e==null?void 0:e.type)==="error"){try{(p=(d=a(this,h)).onError)==null||p.call(d,e.error,u,N,S)}catch(b){Promise.reject(b)}try{(i=(k=a(this,h)).onSettled)==null||i.call(k,void 0,e.error,u,N,S)}catch(b){Promise.reject(b)}}}this.listeners.forEach(u=>{u(a(this,g))})})},q);function W(r,e){const t=A(),[n]=f.useState(()=>new z(t,r));f.useEffect(()=>{n.setOptions(r)},[n,r]);const l=f.useSyncExternalStore(f.useCallback(d=>n.subscribe(P.batchCalls(d)),[n]),()=>n.getCurrentResult(),()=>n.getCurrentResult()),x=f.useCallback((d,p)=>{n.mutate(d,p).catch(J)},[n]);if(l.error&&Q(n.options.throwOnError,[l.error]))throw l.error;return{...l,mutate:x,mutateAsync:l.mutate}}/** +var M=r=>{throw TypeError(r)};var O=(r,e,t)=>e.has(r)||M("Cannot "+t);var a=(r,e,t)=>(O(r,e,"read from private field"),t?t.call(r):e.get(r)),y=(r,e,t)=>e.has(r)?M("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(r):e.set(r,t),v=(r,e,t,n)=>(O(r,e,"write to private field"),n?n.call(r,t):e.set(r,t),t),j=(r,e,t)=>(O(r,e,"access private method"),t);import{a9 as B,aa as F,ab as E,ac as I,ad as P,u as A,r as f,ae as J,af as Q,c as T,ag as U,j as s,G as D,T as H,b as K,L,M as G,q as V,n as R}from"./index-BYlMs6Dj.js";import{J as _}from"./JobsBar-B1nmMx5i.js";var c,g,o,h,m,w,C,q,z=(q=class extends B{constructor(e,t){super();y(this,m);y(this,c);y(this,g);y(this,o);y(this,h);v(this,c,e),this.setOptions(t),this.bindMethods(),j(this,m,w).call(this)}bindMethods(){this.mutate=this.mutate.bind(this),this.reset=this.reset.bind(this)}setOptions(e){var n;const t=this.options;this.options=a(this,c).defaultMutationOptions(e),F(this.options,t)||a(this,c).getMutationCache().notify({type:"observerOptionsUpdated",mutation:a(this,o),observer:this}),t!=null&&t.mutationKey&&this.options.mutationKey&&E(t.mutationKey)!==E(this.options.mutationKey)?this.reset():((n=a(this,o))==null?void 0:n.state.status)==="pending"&&a(this,o).setOptions(this.options)}onUnsubscribe(){var e;this.hasListeners()||(e=a(this,o))==null||e.removeObserver(this)}onMutationUpdate(e){j(this,m,w).call(this),j(this,m,C).call(this,e)}getCurrentResult(){return a(this,g)}reset(){var e;(e=a(this,o))==null||e.removeObserver(this),v(this,o,void 0),j(this,m,w).call(this),j(this,m,C).call(this)}mutate(e,t){var n;return v(this,h,t),(n=a(this,o))==null||n.removeObserver(this),v(this,o,a(this,c).getMutationCache().build(a(this,c),this.options)),a(this,o).addObserver(this),a(this,o).execute(e)}},c=new WeakMap,g=new WeakMap,o=new WeakMap,h=new WeakMap,m=new WeakSet,w=function(){var t;const e=((t=a(this,o))==null?void 0:t.state)??I();v(this,g,{...e,isPending:e.status==="pending",isSuccess:e.status==="success",isError:e.status==="error",isIdle:e.status==="idle",mutate:this.mutate,reset:this.reset})},C=function(e){P.batch(()=>{var t,n,l,x,d,p,k,i;if(a(this,h)&&this.hasListeners()){const u=a(this,g).variables,N=a(this,g).context,S={client:a(this,c),meta:this.options.meta,mutationKey:this.options.mutationKey};if((e==null?void 0:e.type)==="success"){try{(n=(t=a(this,h)).onSuccess)==null||n.call(t,e.data,u,N,S)}catch(b){Promise.reject(b)}try{(x=(l=a(this,h)).onSettled)==null||x.call(l,e.data,null,u,N,S)}catch(b){Promise.reject(b)}}else if((e==null?void 0:e.type)==="error"){try{(p=(d=a(this,h)).onError)==null||p.call(d,e.error,u,N,S)}catch(b){Promise.reject(b)}try{(i=(k=a(this,h)).onSettled)==null||i.call(k,void 0,e.error,u,N,S)}catch(b){Promise.reject(b)}}}this.listeners.forEach(u=>{u(a(this,g))})})},q);function W(r,e){const t=A(),[n]=f.useState(()=>new z(t,r));f.useEffect(()=>{n.setOptions(r)},[n,r]);const l=f.useSyncExternalStore(f.useCallback(d=>n.subscribe(P.batchCalls(d)),[n]),()=>n.getCurrentResult(),()=>n.getCurrentResult()),x=f.useCallback((d,p)=>{n.mutate(d,p).catch(J)},[n]);if(l.error&&Q(n.options.throwOnError,[l.error]))throw l.error;return{...l,mutate:x,mutateAsync:l.mutate}}/** * @license lucide-react v0.460.0 - ISC * * This source code is licensed under the ISC license. diff --git a/frontend/dist/assets/WissenView-DOBd5fRz.js b/frontend/dist/assets/WissenView-DOJLqZxA.js similarity index 92% rename from frontend/dist/assets/WissenView-DOBd5fRz.js rename to frontend/dist/assets/WissenView-DOJLqZxA.js index 00ae8f1..595e816 100644 --- a/frontend/dist/assets/WissenView-DOBd5fRz.js +++ b/frontend/dist/assets/WissenView-DOJLqZxA.js @@ -1,4 +1,4 @@ -var to=Object.defineProperty;var eo=(e,n,r)=>n in e?to(e,n,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[n]=r;var Bn=(e,n,r)=>eo(e,typeof n!="symbol"?n+"":n,r);import{c as no,r as W,ao as ro,ap as io,j as $,R as oo,aq as ao,ar as so,n as uo,b as Ae,L as Ke,S as lo,a8 as co,a0 as fo,as as ho}from"./index-B57enqf6.js";import{i as Ft,c as Xn,a as Yn,b as po,o as go,m as Zn,d as Kn}from"./string-DoZi9Vij.js";/** +var to=Object.defineProperty;var eo=(e,n,r)=>n in e?to(e,n,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[n]=r;var Bn=(e,n,r)=>eo(e,typeof n!="symbol"?n+"":n,r);import{c as no,r as W,ao as ro,ap as io,j as $,R as oo,aq as ao,ar as so,n as uo,b as Ae,L as Ke,S as lo,a8 as co,a0 as fo,as as ho}from"./index-BYlMs6Dj.js";import{i as Ft,c as Xn,a as Yn,b as po,o as go,m as Zn,d as Kn}from"./string-DoZi9Vij.js";/** * @license lucide-react v0.460.0 - ISC * * This source code is licensed under the ISC license. @@ -46,7 +46,7 @@ In order to be iterable, non-array objects must have a [Symbol.iterator]() metho } `;ch(fh);function Sn(e,n){(n==null||n>e.length)&&(n=e.length);for(var r=0,i=Array(n);r2&&arguments[2]!==void 0?arguments[2]:{},a=o.nodeFilter,s=a===void 0?function(){return!0}:a,u=o.onLoopError,c=u===void 0?function(p){throw"Invalid DAG structure! Found cycle in node path: ".concat(p.join(" -> "),".")}:u,l={};r.forEach(function(p){return l[n(p)]={data:p,out:[],depth:-1,skip:!s(p)}}),i.forEach(function(p){var y=p.source,x=p.target,m=_(y),g=_(x);if(!l.hasOwnProperty(m))throw"Missing source node with id: ".concat(m);if(!l.hasOwnProperty(g))throw"Missing target node with id: ".concat(g);var k=l[m],w=l[g];k.out.push(w);function _(v){return Mn(v)==="object"?n(v):v}});var f=[];d(Object.values(l));var h=Object.assign.apply(Object,[{}].concat(gt(Object.entries(l).filter(function(p){var y=de(p,2),x=y[1];return!x.skip}).map(function(p){var y=de(p,2),x=y[0],m=y[1];return ye({},x,m.depth)}))));return h;function d(p){for(var y=arguments.length>1&&arguments[1]!==void 0?arguments[1]:[],x=arguments.length>2&&arguments[2]!==void 0?arguments[2]:0,m=function(){var _=p[g];if(y.indexOf(_)!==-1){var v=[].concat(gt(y.slice(y.indexOf(_))),[_]).map(function(A){return n(A.data)});return f.some(function(A){return A.length===v.length&&A.every(function(M,T){return M===v[T]})})||(f.push(v),c(v)),1}x>_.depth&&(_.depth=x,d(_.out,[].concat(gt(y),[_]),x+(_.skip?0:1)))},g=0,k=p.length;gn.cooldownTicks||new Date-n.startTickTime>n.cooldownTime||n.d3AlphaMin>0&&n.forceLayout.alpha()0){var D=Math.atan2(P.y-R.y,P.x-R.x),U=N*T,S={x:(R.x+P.x)/2+U*Math.cos(D-Math.PI/2),y:(R.y+P.y)/2+U*Math.sin(D-Math.PI/2)};M.__controlPoints=[S.x,S.y]}else{var j=T*70;M.__controlPoints=[P.x,P.y-j,P.x+j,P.y]}}}}function a(){var u=1.6,c=.2,l=B(n.linkDirectionalArrowLength),f=B(n.linkDirectionalArrowRelPos),h=B(n.linkVisibility),d=B(n.linkDirectionalArrowColor||n.linkColor),p=B(n.nodeVal),y=n.ctx;y.save(),n.graphData.links.filter(h).forEach(function(x){var m=l(x);if(!(!m||m<0)){var g=x.source,k=x.target;if(!(!g||!k||!g.hasOwnProperty("x")||!k.hasOwnProperty("x"))){var w=Math.sqrt(Math.max(0,p(g)||1))*n.nodeRelSize,_=Math.sqrt(Math.max(0,p(k)||1))*n.nodeRelSize,v=Math.min(1,Math.max(0,f(x))),A=d(x)||"rgba(0,0,0,0.28)",M=m/u/2,T=x.__controlPoints&&$r(K,[g.x,g.y].concat(gt(x.__controlPoints),[k.x,k.y])),R=T?function(E){return T.get(E)}:function(E){return{x:g.x+(k.x-g.x)*E||0,y:g.y+(k.y-g.y)*E||0}},P=T?T.length():Math.sqrt(Math.pow(k.x-g.x,2)+Math.pow(k.y-g.y,2)),N=w+m+(P-w-_-m)*v,D=R(N/P),U=R((N-m)/P),S=R((N-m*(1-c))/P),j=Math.atan2(D.y-U.y,D.x-U.x)-Math.PI/2;y.beginPath(),y.moveTo(D.x,D.y),y.lineTo(U.x+M*Math.cos(j),U.y+M*Math.sin(j)),y.lineTo(S.x,S.y),y.lineTo(U.x-M*Math.cos(j),U.y-M*Math.sin(j)),y.fillStyle=A,y.fill()}}}),y.restore()}function s(){var u=B(n.linkDirectionalParticles),c=B(n.linkDirectionalParticleSpeed),l=B(n.linkDirectionalParticleOffset),f=B(n.linkDirectionalParticleWidth),h=B(n.linkVisibility),d=B(n.linkDirectionalParticleColor||n.linkColor),p=n.ctx;p.save(),n.graphData.links.filter(h).forEach(function(y){var x=u(y);if(!(!y.hasOwnProperty("__photons")||!y.__photons.length)){var m=y.source,g=y.target;if(!(!m||!g||!m.hasOwnProperty("x")||!g.hasOwnProperty("x"))){var k=c(y),w=Math.abs(l(y)),_=y.__photons||[],v=Math.max(0,f(y)/2)/Math.sqrt(n.globalScale),A=d(y)||"rgba(0,0,0,0.28)";p.fillStyle=A;var M=y.__controlPoints?$r(K,[m.x,m.y].concat(gt(y.__controlPoints),[g.x,g.y])):null,T=0,R=!1;_.forEach(function(P){var N=!!P.__singleHop;if(P.hasOwnProperty("__progressRatio")||(P.__progressRatio=N?k<0?1:0:(T+w)/x),!N&&T++,P.__progressRatio+=k,P.__progressRatio>=1||P.__progressRatio<0)if(!N)P.__progressRatio=P.__progressRatio%1,P.__progressRatio<0&&P.__progressRatio++;else{R=!0;return}var D=P.__progressRatio,U=M?M.get(D):{x:m.x+(g.x-m.x)*D||0,y:m.y+(g.y-m.y)*D||0};n.linkDirectionalParticleCanvasObject?n.linkDirectionalParticleCanvasObject(U.x,U.y,y,p,n.globalScale):(p.beginPath(),p.arc(U.x,U.y,v,0,2*Math.PI,!1),p.fill())}),R&&(y.__photons=y.__photons.filter(function(P){return!P.__singleHop||P.__progressRatio<=1&&P.__progressRatio>=0}))}}}),p.restore()}},emitParticle:function(n,r){return r&&(!r.__photons&&(r.__photons=[]),r.__photons.push({__singleHop:!0})),this}},stateInit:function(){return{forceLayout:Lf().force("link",Ef()).force("charge",Ff()).force("center",zc()).force("dagRadial",null).stop(),engineRunning:!1}},init:function(n,r){r.ctx=n},update:function(n,r){n.engineRunning=!1,n.onUpdate(),n.nodeAutoColorBy!==null&&Fr(n.graphData.nodes,B(n.nodeAutoColorBy),n.nodeColor),n.linkAutoColorBy!==null&&Fr(n.graphData.links,B(n.linkAutoColorBy),n.linkColor),n.graphData.links.forEach(function(d){d.source=d[n.linkSource],d.target=d[n.linkTarget]}),n.forceLayout.stop().alpha(1).nodes(n.graphData.nodes);var i=n.forceLayout.force("link");i&&i.id(function(d){return d[n.nodeId]}).links(n.graphData.links);var o=n.dagMode&&bh(n.graphData,function(d){return d[n.nodeId]},{nodeFilter:n.dagNodeFilter,onLoopError:n.onDagError||void 0}),a=Math.max.apply(Math,gt(Object.values(o||[]))),s=n.dagLevelDistance||n.graphData.nodes.length/(a||1)*wh*(["radialin","radialout"].indexOf(n.dagMode)!==-1?.7:1);if(["lr","rl","td","bu"].includes(r.dagMode)){var u=["lr","rl"].includes(r.dagMode)?"fx":"fy";n.graphData.nodes.filter(n.dagNodeFilter).forEach(function(d){return delete d[u]})}if(["lr","rl","td","bu"].includes(n.dagMode)){var c=["rl","bu"].includes(n.dagMode),l=function(p){return(o[p[n.nodeId]]-a/2)*s*(c?-1:1)},f=["lr","rl"].includes(n.dagMode)?"fx":"fy";n.graphData.nodes.filter(n.dagNodeFilter).forEach(function(d){return d[f]=l(d)})}n.forceLayout.force("dagRadial",["radialin","radialout"].indexOf(n.dagMode)!==-1?Uf(function(d){var p=o[d[n.nodeId]]||-1;return(n.dagMode==="radialin"?a-p:p)*s}).strength(function(d){return n.dagNodeFilter(d)?1:0}):null);for(var h=0;h0&&n.forceLayout.alpha()1?u-1:0),l=1;l1&&arguments[1]!==void 0?arguments[1]:0,i=arguments.length>2&&arguments[2]!==void 0?arguments[2]:10,o=arguments.length,a=new Array(o>3?o-3:0),s=3;s1&&arguments[1]!==void 0?arguments[1]:function(){return!0},i=B(n.nodeVal),o=function(u){return Math.sqrt(Math.max(0,i(u)||1))*n.nodeRelSize},a=n.graphData.nodes.filter(r).map(function(s){return{x:s.x,y:s.y,r:o(s)}});return a.length?{x:[Zn(a,function(s){return s.x-s.r}),Kn(a,function(s){return s.x+s.r})],y:[Zn(a,function(s){return s.y-s.r}),Kn(a,function(s){return s.y+s.r})]}:null},pauseAnimation:function(n){return n.animationFrameRequestId&&(cancelAnimationFrame(n.animationFrameRequestId),n.animationFrameRequestId=null),this},resumeAnimation:function(n){return n.animationFrameRequestId||this._animationCycle(),this},_destructor:function(){this.pauseAnimation(),this.graphData({nodes:[],links:[]})}},Th),stateInit:function(){return{lastSetZoom:1,zoom:qu(),forceGraph:new qe,shadowGraph:new qe().cooldownTicks(0).nodeColor("__indexColor").linkColor("__indexColor").isShadow(!0),colorTracker:new lc,tweenGroup:new bi}},init:function(n,r){var i=this;n.innerHTML="";var o=document.createElement("div");o.classList.add("force-graph-container"),o.style.position="relative",n.appendChild(o),r.canvas=document.createElement("canvas"),r.backgroundColor&&(r.canvas.style.background=r.backgroundColor),o.appendChild(r.canvas),r.shadowCanvas=document.createElement("canvas");var a=r.canvas.getContext("2d"),s=r.shadowCanvas.getContext("2d",{willReadFrequently:!0}),u={x:-1e12,y:-1e12},c=function(){var h=null,d=window.devicePixelRatio,p=u.x>0&&u.y>0?s.getImageData(u.x*d,u.y*d,1,1):null;return p&&(h=r.colorTracker.lookup(p.data)),h};pt(r.canvas).call(As().subject(function(){if(!r.enableNodeDrag)return null;var f=c();return f&&f.type==="Node"?f.d:null}).on("start",function(f){var h=f.subject;h.__initialDragPos={x:h.x,y:h.y,fx:h.fx,fy:h.fy},f.active||(h.fx=h.x,h.fy=h.y),r.canvas.classList.add("grabbable")}).on("drag",function(f){var h=f.subject,d=h.__initialDragPos,p=f,y=mt(r.canvas).k,x={x:d.x+(p.x-d.x)/y-h.x,y:d.y+(p.y-d.y)/y-h.y};["x","y"].forEach(function(m){return h["f".concat(m)]=h[m]=d[m]+(p[m]-d[m])/y}),!(!h.__dragged&&Ah>=Math.sqrt(_o(["x","y"].map(function(m){return Math.pow(f[m]-d[m],2)}))))&&(r.forceGraph.d3AlphaTarget(.3).resetCountdown(),r.isPointerDragging=!0,h.__dragged=!0,r.onNodeDrag(h,x))}).on("end",function(f){var h=f.subject,d=h.__initialDragPos,p={x:h.x-d.x,y:h.y-d.y};d.fx===void 0&&(h.fx=void 0),d.fy===void 0&&(h.fy=void 0),delete h.__initialDragPos,r.forceGraph.d3AlphaTarget()&&r.forceGraph.d3AlphaTarget(0).resetCountdown(),r.canvas.classList.remove("grabbable"),r.isPointerDragging=!1,h.__dragged&&(delete h.__dragged,r.onNodeDragEnd(h,p))})),r.zoom(r.zoom.__baseElem=pt(r.canvas)),r.zoom.__baseElem.on("dblclick.zoom",null),r.zoom.filter(function(f){return!f.button&&r.enableZoomPanInteraction&&(f.type!=="wheel"||B(r.enableZoomInteraction)(f))&&(f.type==="wheel"||B(r.enablePanInteraction)(f))}).on("zoom",function(f){var h=f.transform;[a,s].forEach(function(d){Ki(d),d.translate(h.x,h.y),d.scale(h.k,h.k)}),r.isPointerDragging=!0,r.onZoom&&r.onZoom(Gt(Gt({},h),i.centerAt())),r.needsRedraw=!0}).on("end",function(f){r.isPointerDragging=!1,r.onZoomEnd&&r.onZoomEnd(Gt(Gt({},f.transform),i.centerAt()))}),an(r),r.forceGraph.onNeedsRedraw(function(){return r.needsRedraw=!0}).onFinishUpdate(function(){mt(r.canvas).k===r.lastSetZoom&&r.graphData.nodes.length&&(r.zoom.scaleTo(r.zoom.__baseElem,r.lastSetZoom=Ch/Math.cbrt(r.graphData.nodes.length)),r.needsRedraw=!0)}),r.tooltip=new Ec(o),["pointermove","pointerdown"].forEach(function(f){return o.addEventListener(f,function(h){f==="pointerdown"&&(r.isPointerPressed=!0,r.pointerDownEvent=h),!r.isPointerDragging&&h.type==="pointermove"&&r.onBackgroundClick&&(h.pressure>0||r.isPointerPressed)&&(h.pointerType==="mouse"||h.movementX===void 0||[h.movementX,h.movementY].some(function(y){return Math.abs(y)>1}))&&(r.isPointerDragging=!0);var d=p(o);u.x=h.pageX-d.left,u.y=h.pageY-d.top;function p(y){var x=y.getBoundingClientRect(),m=window.pageXOffset||document.documentElement.scrollLeft,g=window.pageYOffset||document.documentElement.scrollTop;return{top:x.top+g,left:x.left+m}}},{passive:!0})}),o.addEventListener("pointerup",function(f){if(r.isPointerPressed){if(r.isPointerPressed=!1,r.isPointerDragging){r.isPointerDragging=!1;return}var h=[f,r.pointerDownEvent];requestAnimationFrame(function(){if(f.button===0)if(r.hoverObj){var d=r["on".concat(r.hoverObj.type,"Click")];d&&d.apply(void 0,[r.hoverObj.d].concat(h))}else r.onBackgroundClick&&r.onBackgroundClick.apply(r,h);if(f.button===2)if(r.hoverObj){var p=r["on".concat(r.hoverObj.type,"RightClick")];p&&p.apply(void 0,[r.hoverObj.d].concat(h))}else r.onBackgroundRightClick&&r.onBackgroundRightClick.apply(r,h)})}},{passive:!0}),o.addEventListener("contextmenu",function(f){return!r.onBackgroundRightClick&&!r.onNodeRightClick&&!r.onLinkRightClick?!0:(f.preventDefault(),!1)}),r.forceGraph(a),r.shadowGraph(s);var l=yl(function(){Hr(s,r.width,r.height),r.shadowGraph.linkWidth(function(h){return B(r.linkWidth)(h)+r.linkHoverPrecision});var f=mt(r.canvas);r.shadowGraph.globalScale(f.k).tickFrame()},kh);r.flushShadowCanvas=l.flush,(this._animationCycle=function f(){var h=!r.autoPauseRedraw||!!r.needsRedraw||r.forceGraph.isEngineRunning()||r.graphData.links.some(function(w){return w.__photons&&w.__photons.length});if(r.needsRedraw=!1,r.enablePointerInteraction){var d=r.isPointerDragging?null:c();if(d!==r.hoverObj){var p=r.hoverObj,y=p?p.type:null,x=d?d.type:null;if(y&&y!==x){var m=r["on".concat(y,"Hover")];m&&m(null,p.d)}if(x){var g=r["on".concat(x,"Hover")];g&&g(d.d,y===x?p.d:null)}r.tooltip.content(d&&B(r["".concat(d.type.toLowerCase(),"Label")])(d.d)||null),r.canvas.classList[(d&&r["on".concat(x,"Click")]||!d&&r.onBackgroundClick)&&B(r.showPointerCursor)(d==null?void 0:d.d)?"add":"remove"]("clickable"),r.hoverObj=d}h&&l()}if(h){Hr(a,r.width,r.height);var k=mt(r.canvas).k;r.onRenderFramePre&&r.onRenderFramePre(a,k),r.forceGraph.globalScale(k).tickFrame(),r.onRenderFramePost&&r.onRenderFramePost(a,k)}r.tweenGroup.update(),r.animationFrameRequestId=requestAnimationFrame(f)})()},update:function(n){}}),sn={exports:{}},un,qr;function Oh(){if(qr)return un;qr=1;var e="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED";return un=e,un}var ln,Wr;function Eh(){if(Wr)return ln;Wr=1;var e=Oh();function n(){}function r(){}return r.resetWarningCache=n,ln=function(){function i(s,u,c,l,f,h){if(h!==e){var d=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw d.name="Invariant Violation",d}}i.isRequired=i;function o(){return i}var a={array:i,bigint:i,bool:i,func:i,number:i,object:i,string:i,symbol:i,any:i,arrayOf:o,element:i,elementType:i,instanceOf:o,node:i,objectOf:o,oneOf:o,oneOfType:o,shape:o,exact:o,checkPropTypes:r,resetWarningCache:n};return a.PropTypes=a,a},ln}var Gr;function zh(){return Gr||(Gr=1,sn.exports=Eh()()),sn.exports}var Nh=zh();const b=io(Nh),Ze={width:b.number,height:b.number,graphData:b.shape({nodes:b.arrayOf(b.object).isRequired,links:b.arrayOf(b.object).isRequired}),backgroundColor:b.string,nodeRelSize:b.number,nodeId:b.string,nodeLabel:b.oneOfType([b.string,b.func]),nodeVal:b.oneOfType([b.number,b.string,b.func]),nodeVisibility:b.oneOfType([b.bool,b.string,b.func]),nodeColor:b.oneOfType([b.string,b.func]),nodeAutoColorBy:b.oneOfType([b.string,b.func]),onNodeHover:b.func,onNodeClick:b.func,linkSource:b.string,linkTarget:b.string,linkLabel:b.oneOfType([b.string,b.func]),linkVisibility:b.oneOfType([b.bool,b.string,b.func]),linkColor:b.oneOfType([b.string,b.func]),linkAutoColorBy:b.oneOfType([b.string,b.func]),linkWidth:b.oneOfType([b.number,b.string,b.func]),linkCurvature:b.oneOfType([b.number,b.string,b.func]),linkDirectionalArrowLength:b.oneOfType([b.number,b.string,b.func]),linkDirectionalArrowColor:b.oneOfType([b.string,b.func]),linkDirectionalArrowRelPos:b.oneOfType([b.number,b.string,b.func]),linkDirectionalParticles:b.oneOfType([b.number,b.string,b.func]),linkDirectionalParticleSpeed:b.oneOfType([b.number,b.string,b.func]),linkDirectionalParticleOffset:b.oneOfType([b.number,b.string,b.func]),linkDirectionalParticleWidth:b.oneOfType([b.number,b.string,b.func]),linkDirectionalParticleColor:b.oneOfType([b.string,b.func]),onLinkHover:b.func,onLinkClick:b.func,dagMode:b.oneOf(["td","bu","lr","rl","zin","zout","radialin","radialout"]),dagLevelDistance:b.number,dagNodeFilter:b.func,onDagError:b.func,d3AlphaMin:b.number,d3AlphaDecay:b.number,d3VelocityDecay:b.number,warmupTicks:b.number,cooldownTicks:b.number,cooldownTime:b.number,onEngineTick:b.func,onEngineStop:b.func,getGraphBbox:b.func},Qi={zoomToFit:b.func,onNodeRightClick:b.func,onNodeDrag:b.func,onNodeDragEnd:b.func,onLinkRightClick:b.func,linkHoverPrecision:b.number,onBackgroundClick:b.func,onBackgroundRightClick:b.func,showPointerCursor:b.oneOfType([b.bool,b.func]),enablePointerInteraction:b.bool,enableNodeDrag:b.bool},Wn={showNavInfo:b.bool,nodeOpacity:b.number,nodeResolution:b.number,nodeThreeObject:b.oneOfType([b.object,b.string,b.func]),nodeThreeObjectExtend:b.oneOfType([b.bool,b.string,b.func]),nodePositionUpdate:b.func,linkOpacity:b.number,linkResolution:b.number,linkCurveRotation:b.oneOfType([b.number,b.string,b.func]),linkMaterial:b.oneOfType([b.object,b.string,b.func]),linkThreeObject:b.oneOfType([b.object,b.string,b.func]),linkThreeObjectExtend:b.oneOfType([b.bool,b.string,b.func]),linkPositionUpdate:b.func,linkDirectionalArrowResolution:b.number,linkDirectionalParticleResolution:b.number,linkDirectionalParticleThreeObject:b.oneOfType([b.object,b.string,b.func]),forceEngine:b.oneOf(["d3","ngraph"]),ngraphPhysics:b.object,numDimensions:b.oneOf([1,2,3])},Rh=Object.assign({},Ze,Qi,{linkLineDash:b.oneOfType([b.arrayOf(b.number),b.string,b.func]),nodeCanvasObjectMode:b.oneOfType([b.string,b.func]),nodeCanvasObject:b.func,nodePointerAreaPaint:b.func,linkCanvasObjectMode:b.oneOfType([b.string,b.func]),linkCanvasObject:b.func,linkPointerAreaPaint:b.func,linkDirectionalParticleCanvasObject:b.func,autoPauseRedraw:b.bool,minZoom:b.number,maxZoom:b.number,enableZoomInteraction:b.oneOfType([b.bool,b.func]),enablePanInteraction:b.oneOfType([b.bool,b.func]),onZoom:b.func,onZoomEnd:b.func,onRenderFramePre:b.func,onRenderFramePost:b.func});Object.assign({},Ze,Qi,Wn,{enableNavigationControls:b.bool,controlType:b.oneOf(["trackball","orbit","fly"]),rendererConfig:b.object,extraRenderers:b.arrayOf(b.shape({render:b.func.isRequired}))});Object.assign({},Ze,Wn,{nodeDesc:b.oneOfType([b.string,b.func]),linkDesc:b.oneOfType([b.string,b.func])});Object.assign({},Ze,Wn,{markerAttrs:b.object,yOffset:b.number,glScale:b.number});const Gn=Io(Ph,{methodNames:["emitParticle","d3Force","d3ReheatSimulation","stopAnimation","pauseAnimation","resumeAnimation","centerAt","zoom","zoomToFit","getGraphBbox","screen2GraphCoords","graph2ScreenCoords"]});Gn.displayName="ForceGraph2D";Gn.propTypes=Rh;function wt(e){return function(){return e}}function Vr(e){return(e()-.5)*1e-6}function jh(e){return e.x+e.vx}function Dh(e){return e.y+e.vy}function Ih(e){var n,r,i,o=1,a=1;typeof e!="function"&&(e=wt(e==null?1:+e));function s(){for(var l,f=n.length,h,d,p,y,x,m,g=0;gd.index){var N=p-T.x-T.vx,D=y-T.y-T.vy,U=N*N+D*D;Up+P||Ay+P||Ml.r&&(l.r=l[f].r)}function c(){if(n){var l,f=n.length,h;for(r=new Array(f),l=0;la[0]-s[0]||a[1]-s[1]),r=(a,s,u)=>(s[0]-a[0])*(u[1]-a[1])-(s[1]-a[1])*(u[0]-a[0]),i=[];for(const a of n){for(;i.length>=2&&r(i[i.length-2],i[i.length-1],a)<=0;)i.pop();i.push(a)}const o=[];for(let a=n.length-1;a>=0;a--){const s=n[a];for(;o.length>=2&&r(o[o.length-2],o[o.length-1],s)<=0;)o.pop();o.push(s)}return i.pop(),o.pop(),i.concat(o)}function Xh({data:e,selectedNodeId:n,onNodeSelect:r}){const[i,o]=W.useState(null),[a,s]=W.useState(.75),u=W.useRef(null),c=W.useRef(null),[l,f]=W.useState({width:500,height:560});W.useEffect(()=>{if(!u.current)return;const C=new ResizeObserver(O=>{for(let I of O)I.contentRect.width>0&&I.contentRect.height>0&&f({width:Math.floor(I.contentRect.width),height:Math.floor(I.contentRect.height)})});return C.observe(u.current),()=>C.disconnect()},[]);const h=W.useRef(new Map),d=W.useMemo(()=>{const C=h.current,O=new Set,I=e.nodes.map(F=>{O.add(F.id);let G=C.get(F.id);return G?(G.content!==F.content||G.category!==F.category)&&(G.content=F.content,G.category=F.category,G.__baseTextWidth=void 0):(G={...F},C.set(F.id,G)),G});for(const F of Array.from(C.keys()))O.has(F)||C.delete(F);const L=new Map(e.nodes.map(F=>[F.id,F.category])),H=e.edges.map(F=>({source:F.source,target:F.target,weight:F.weight||0,__sid:F.source,__tid:F.target,__sameCat:L.get(F.source)===L.get(F.target),__restColor:Hh[L.get(F.source)??""]??Uh}));return{nodes:I,links:H}},[e]),p=W.useMemo(()=>{const C={};return e.edges.forEach(O=>{C[O.source]=(C[O.source]||0)+1,C[O.target]=(C[O.target]||0)+1}),C},[e]),y=C=>({identity:-240,knowledge:240,rules:-240,events:240})[C]||0,x=C=>({identity:-240,knowledge:-240,rules:240,events:240})[C]||0,m=W.useMemo(()=>`${e.nodes.map(C=>C.id).sort().join(",")}#${e.edges.length}`,[e]);W.useEffect(()=>{const C=c.current;if(!C)return;C.d3Force("center",null),C.d3Force("x",$h().x(L=>y(L.category)).strength(.1)),C.d3Force("y",Lh().y(L=>x(L.category)).strength(.1));const O=C.d3Force("charge");O&&O.strength(-380),C.d3Force("collide",Ih().radius(28).iterations(2));const I=C.d3Force("link");I&&I.distance(L=>L.__sameCat?70:200).strength(L=>L.__sameCat?.3*(L.weight||.6):.01),C.d3ReheatSimulation()},[m]);const g=i||n,k=W.useMemo(()=>d.links.filter(C=>C.__sameCat&&(C.weight||0)>=a).length,[d,a]),w=()=>{c.current&&c.current.zoomToFit(400,40)},_=W.useMemo(()=>{if(!g)return new Set;const C=new Set;return e.edges.forEach(O=>{O.source===g&&C.add(O.target),O.target===g&&C.add(O.source)}),C},[g,e]),v=W.useCallback(C=>g?C.__sid===g||C.__tid===g:C.__sameCat&&(C.weight||0)>=a,[g,a]),A=W.useCallback(C=>g&&(C.__sid===g||C.__tid===g)?Fh:C.__restColor,[g]),M=W.useCallback(C=>g&&(C.__sid===g||C.__tid===g)?2.5:1.4,[g]),T=W.useCallback(C=>g&&(C.__sid===g||C.__tid===g)?4:0,[g]),R=W.useCallback((C,O)=>{const I=c.current,L=u.current;if(!I||!L)return null;const H=L.getBoundingClientRect(),{x:F,y:G}=I.screen2GraphCoords(C-H.left,O-H.top),V=Math.max(I.zoom()||1,.01);let X=null,tt=1/0;for(const Z of d.nodes){if(Z.x==null||Z.y==null)continue;const st=6+Math.min(p[Z.id]||0,15)*.8,et=Math.max(st+3,16/V),qt=Z.x-F,At=Z.y-G,nt=qt*qt+At*At;nt<=et*et&&nt{const O=C.target instanceof HTMLCanvasElement?R(C.clientX,C.clientY):null;o(O?O.id:null),u.current&&(u.current.style.cursor=O?"pointer":"default")},[R]),N=W.useCallback(()=>{o(null),u.current&&(u.current.style.cursor="default")},[]),D=W.useRef(null),U=W.useCallback(C=>{D.current={x:C.clientX,y:C.clientY}},[]),S=W.useCallback(C=>{if(!(C.target instanceof HTMLCanvasElement))return;const O=D.current;if(O&&Math.hypot(C.clientX-O.x,C.clientY-O.y)>6)return;const I=R(C.clientX,C.clientY);r(I?I.id:null)},[R,r]),j=W.useCallback((C,O)=>{var L;const I={};for(const H of d.nodes)H.x==null||H.y==null||(I[L=H.category]??(I[L]=[])).push([H.x,H.y]);for(const[H,F]of Object.entries(I)){const G=Wh[H];if(!G||F.length===0)continue;const V=Bh(F);let X=0,tt=0;V.forEach(et=>{X+=et[0],tt+=et[1]}),X/=V.length,tt/=V.length;const Z=34;if(C.beginPath(),V.length<3)C.arc(X,tt,Z+16,0,2*Math.PI);else{const et=V.map(([nt,lt])=>{const jt=nt-X,Zt=lt-tt,Kt=Math.hypot(jt,Zt)||1;return[nt+jt/Kt*Z,lt+Zt/Kt*Z]}),qt=(nt,lt)=>[(nt[0]+lt[0])/2,(nt[1]+lt[1])/2],At=qt(et[et.length-1],et[0]);C.moveTo(At[0],At[1]);for(let nt=0;ntet[1]));C.font='600 26px "Space Grotesk", sans-serif',C.textAlign="center",C.textBaseline="bottom",C.fillStyle=Vh[H],C.fillText(Xr[H]||H,X,st-Z-8)}},[d]),E=W.useCallback((C,O,I)=>{const L=C.x??0,H=C.y??0,F=6+Math.min(p[C.id]||0,15)*.8,G=Br[C.category]||"#64748b",V=C.id===i,X=C.id===n,tt=g&&C.id!==g&&!_.has(C.id),Z=tt?"#1e293b":G;if(tt||(O.beginPath(),O.arc(L,H,F*1.9,0,2*Math.PI,!1),O.fillStyle=qh[C.category]||"rgba(100, 116, 139, 0.14)",O.fill()),(V||X)&&(O.shadowColor=G,O.shadowBlur=15),O.beginPath(),O.arc(L,H,F,0,2*Math.PI,!1),O.fillStyle=Z,O.fill(),O.shadowBlur=0,(V||X)&&(O.beginPath(),O.arc(L,H,F+2.5,0,2*Math.PI,!1),O.strokeStyle=X?"#ffffff":"rgba(255, 255, 255, 0.7)",O.lineWidth=1.5,O.stroke()),V||X||g&&_.has(C.id)){const et=C.content.length>35?C.content.slice(0,34)+"…":C.content;if(C.__baseTextWidth===void 0){const Ji=O.font;O.font='500 10px "Space Grotesk", sans-serif',C.__baseTextWidth=O.measureText(et).width,O.font=Ji}const At=(V||X?10.5:9.5)/Math.max(.5,I);O.font=`${V||X?"bold":"500"} ${At}px "Space Grotesk", sans-serif`;const nt=C.__baseTextWidth*(At/10),lt=4.5/Math.max(.5,I),jt=L-nt/2-lt,Zt=H+F+6/Math.max(.5,I),Kt=nt+lt*2,Vn=At+lt*1.6;O.fillStyle=tt?"rgba(10, 15, 25, 0.45)":"rgba(8, 12, 20, 0.88)",O.fillRect(jt,Zt,Kt,Vn),O.strokeStyle=V||X?"rgba(255, 255, 255, 0.2)":"rgba(255, 255, 255, 0.08)",O.lineWidth=.6/Math.max(.5,I),O.strokeRect(jt,Zt,Kt,Vn),O.textAlign="center",O.textBaseline="top",O.fillStyle=tt?"#475569":V||X?"#ffffff":"#cbd5e1",O.fillText(et,L,H+F+7/Math.max(.5,I))}},[p,i,n,g,_]);return $.jsxs("div",{className:"absolute inset-0",ref:u,onPointerMove:P,onPointerLeave:N,onPointerDown:U,onClick:S,style:{background:"radial-gradient(circle at center, rgba(59, 130, 246, 0.08) 0%, #030712 100%)"},children:[$.jsx(Gn,{ref:c,width:l.width,height:l.height,graphData:d,backgroundColor:"rgba(0,0,0,0)",cooldownTicks:120,enablePointerInteraction:!1,enableNodeDrag:!1,onRenderFramePre:j,linkVisibility:v,linkColor:A,linkWidth:M,linkDirectionalParticles:T,linkDirectionalParticleWidth:2.2,linkDirectionalParticleSpeed:.006,nodeCanvasObject:E}),$.jsxs("button",{onClick:w,title:"Zentrieren",className:"absolute right-3 top-3 z-10 flex items-center gap-1.5 rounded-lg border border-border/60 bg-background/50 px-2.5 py-1.5 text-[11px] text-muted-foreground hover:text-foreground backdrop-blur-sm transition-colors cursor-pointer",children:[$.jsx(oo,{className:"h-3.5 w-3.5"})," Zentrieren"]}),$.jsxs("div",{className:"absolute left-3 bottom-3 flex flex-wrap items-center gap-x-3 gap-y-1.5 rounded-lg bg-background/40 px-2.5 py-1.5 backdrop-blur-sm",children:[Object.entries(Xr).map(([C,O])=>$.jsxs("span",{className:"flex items-center gap-1 text-[10px] text-muted-foreground",children:[$.jsx("span",{className:"h-2 w-2 rounded-full",style:{background:Br[C]}}),O]},C)),$.jsxs("label",{className:"flex items-center gap-1.5 text-[10px] text-muted-foreground border-l border-border/40 pl-3",children:[$.jsx("span",{children:"Verbindungen"}),$.jsx("span",{className:"text-[9px] text-muted-foreground/60",children:"alle"}),$.jsx("input",{type:"range",min:.45,max:.95,step:.05,value:a,onChange:C=>s(Number(C.target.value)),className:"w-20 accent-primary cursor-pointer",title:"Nur Verbindungen ab dieser Stärke zeigen"}),$.jsx("span",{className:"text-[9px] text-muted-foreground/60",children:"stark"}),$.jsx("span",{className:"font-mono text-[9px] text-muted-foreground/80 min-w-[3ch] text-right",children:k})]})]})]})}class Yh extends W.Component{constructor(){super(...arguments);Bn(this,"state",{error:null})}static getDerivedStateFromError(r){return{error:r}}render(){return this.state.error?$.jsxs("div",{className:"h-[480px] rounded-2xl border border-red-500/20 bg-red-500/5 p-6 text-xs text-red-400 overflow-auto",children:[$.jsx("div",{className:"font-semibold mb-2",children:"Graph konnte nicht gerendert werden"}),$.jsx("pre",{className:"whitespace-pre-wrap break-words text-[11px] leading-relaxed",children:this.state.error.message})]}):this.props.children}}const Zh={"":"Allgemein",traeume:"Träume",muster:"Muster","skill-kandidaten":"Skill-Kandidaten","skill-kandidaten/beauftragt":"Skill-Kandidaten · beauftragt","skill-kandidaten/verworfen":"Skill-Kandidaten · verworfen"};function ed(){const{data:e,isLoading:n}=ao(),[r,i]=W.useState(null),[o,a]=W.useState(null),[s,u]=W.useState(!1),[c,l]=W.useState(""),[f,h]=W.useState(!1),{data:d,isLoading:p}=so(f),y=W.useMemo(()=>(e==null?void 0:e.files)??[],[e]),x=W.useMemo(()=>{const w=new Map;for(const _ of y)w.set(_.name.toLowerCase(),_.path);return w},[y]),m=W.useMemo(()=>{if(!c.trim())return y;const w=c.toLowerCase();return y.filter(_=>_.title.toLowerCase().includes(w)||_.path.toLowerCase().includes(w))},[y,c]),g=W.useMemo(()=>{const w=[];for(const _ of m){const v=w.find(A=>A.dir===_.dir);v?v.files.push(_):w.push({dir:_.dir,files:[_]})}return w.sort((_,v)=>_.dir===""?-1:v.dir===""?1:_.dir.localeCompare(v.dir))},[m]);W.useEffect(()=>{if(!r&&y.length){const w=y.find(_=>_.path.toLowerCase()==="index.md");i((w==null?void 0:w.path)??y[0].path)}},[y,r]),W.useEffect(()=>{r&&(u(!0),uo(`/api/wissen/datei?pfad=${encodeURIComponent(r)}`).then(a).catch(()=>a({path:r,content:"*(Notiz nicht ladbar)*",mtime:0})).finally(()=>u(!1)))},[r]);const k=w=>{const _=x.get(w.toLowerCase());_&&i(_)};return $.jsxs("div",{className:"space-y-5",children:[$.jsxs("div",{className:"flex items-center justify-between",children:[$.jsxs("div",{children:[$.jsx("h1",{className:"bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text font-space text-2xl font-bold tracking-tight text-transparent",children:"Wissen"}),$.jsx("p",{className:"text-sm text-muted-foreground",children:"Was sich die Box nachts erschließt — Traum-Notizen, Muster und Skill-Ideen aus dem Wissens-Vault, verlinkt wie ein Wiki."})]}),y.length>0&&$.jsxs("div",{className:"flex rounded-lg border border-border/60 bg-card p-1",children:[$.jsx("button",{onClick:()=>h(!1),className:Ae("rounded-md px-3 py-1.5 text-xs font-medium transition-colors",f?"text-muted-foreground hover:bg-muted":"bg-primary text-primary-foreground shadow"),children:"Liste"}),$.jsx("button",{onClick:()=>h(!0),className:Ae("rounded-md px-3 py-1.5 text-xs font-medium transition-colors",f?"bg-primary text-primary-foreground shadow":"text-muted-foreground hover:bg-muted"),children:"Graph"})]})]}),e&&!e.available&&$.jsx("div",{className:"rounded-2xl border border-amber-500/30 bg-amber-500/5 p-4 text-xs text-amber-300",children:"Der Wissens-Vault liegt auf der Box (~/wissens-vault) — im lokalen Dev-Modus nicht verfügbar."}),n&&$.jsxs("div",{className:"flex items-center gap-2 rounded-2xl border border-border/60 bg-card/30 p-6 text-xs text-muted-foreground",children:[$.jsx(Ke,{className:"h-4 w-4 animate-spin"})," Vault wird geladen …"]}),(e==null?void 0:e.available)&&y.length===0&&$.jsx("div",{className:"rounded-2xl border border-dashed border-border/60 bg-card/20 p-8 text-center text-xs text-muted-foreground",children:"Noch keine Notizen. Der nächtliche Traum (03:15) legt sie an — morgen früh steht hier die erste."}),f?$.jsxs("div",{className:"mc-card flex h-[70vh] flex-col overflow-hidden p-0 relative",children:[p&&$.jsx("div",{className:"absolute inset-0 flex items-center justify-center bg-background/50 z-10",children:$.jsxs("div",{className:"flex items-center gap-2 rounded-2xl border border-border/60 bg-card p-6 text-xs text-muted-foreground",children:[$.jsx(Ke,{className:"h-4 w-4 animate-spin"})," Graph wird berechnet …"]})}),$.jsx(Yh,{children:d&&$.jsx(Xh,{data:d,selectedNodeId:r,onNodeSelect:w=>{w&&(i(w),h(!1))}})})]}):y.length>0&&$.jsxs("div",{className:"flex flex-col gap-4 lg:flex-row",children:[$.jsxs("aside",{className:"w-full shrink-0 space-y-3 lg:w-72",children:[$.jsxs("div",{className:"relative",children:[$.jsx("input",{value:c,onChange:w=>l(w.target.value),type:"search",placeholder:"Notizen durchsuchen…","aria-label":"Notizen durchsuchen",className:"h-9 w-full rounded-lg border border-border/60 bg-card/45 pl-8 pr-3 text-xs text-foreground outline-none focus:ring-1 focus:ring-primary/50"}),$.jsx(lo,{className:"absolute left-2.5 top-2.5 h-3.5 w-3.5 text-muted-foreground"})]}),$.jsx("div",{className:"max-h-[70vh] space-y-3 overflow-y-auto pr-1 scrollbar-thin",children:g.map(({dir:w,files:_})=>$.jsxs("div",{children:[$.jsxs("p",{className:"mb-1 flex items-center gap-1 text-[10px] font-bold uppercase tracking-wider text-muted-foreground/60",children:[$.jsx(yo,{className:"h-3 w-3"})," ",Zh[w]??w]}),$.jsx("div",{className:"space-y-0.5",children:_.map(v=>$.jsxs("button",{onClick:()=>i(v.path),className:Ae("flex w-full items-center gap-1.5 rounded-lg px-2 py-1.5 text-left text-xs transition-all cursor-pointer",r===v.path?"bg-primary/15 text-primary":"text-muted-foreground hover:bg-accent hover:text-foreground"),children:[$.jsx(co,{className:"h-3.5 w-3.5 shrink-0"}),$.jsx("span",{className:"truncate",title:v.title,children:v.name}),v.neu&&$.jsxs("span",{className:"ml-auto flex items-center gap-0.5 rounded bg-violet-500/15 px-1 py-0.5 text-[8px] font-bold uppercase text-violet-300",children:[$.jsx(fo,{className:"h-2.5 w-2.5"}),"neu"]})]},v.path))})]},w||"__root"))})]}),$.jsx("div",{className:"min-w-0 flex-1 mc-card p-5",children:s?$.jsxs("div",{className:"flex items-center gap-2 text-xs text-muted-foreground",children:[$.jsx(Ke,{className:"h-4 w-4 animate-spin"})," Notiz wird geladen …"]}):o?$.jsxs($.Fragment,{children:[$.jsxs("div",{className:"mb-3 flex items-center justify-between border-b border-border/40 pb-2",children:[$.jsxs("span",{className:"flex items-center gap-1.5 font-mono text-[11px] text-muted-foreground",children:[$.jsx(ho,{className:"h-3.5 w-3.5"})," ",o.path]}),o.mtime>0&&$.jsxs("span",{className:"text-[10px] text-muted-foreground/60",children:["Stand ",new Date(o.mtime*1e3).toLocaleString("de-DE",{day:"2-digit",month:"2-digit",hour:"2-digit",minute:"2-digit"})]})]}),$.jsx(Kh,{text:o.content,onWikiLink:k,known:x})]}):null})]})]})}function Kh({text:e,onWikiLink:n,known:r}){const i=e.split(` +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function Lr(e,n){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);n&&(i=i.filter(function(o){return Object.getOwnPropertyDescriptor(e,o).enumerable})),r.push.apply(r,i)}return r}function Gt(e){for(var n=1;n2&&arguments[2]!==void 0?arguments[2]:{},a=o.nodeFilter,s=a===void 0?function(){return!0}:a,u=o.onLoopError,c=u===void 0?function(p){throw"Invalid DAG structure! Found cycle in node path: ".concat(p.join(" -> "),".")}:u,l={};r.forEach(function(p){return l[n(p)]={data:p,out:[],depth:-1,skip:!s(p)}}),i.forEach(function(p){var y=p.source,x=p.target,m=_(y),g=_(x);if(!l.hasOwnProperty(m))throw"Missing source node with id: ".concat(m);if(!l.hasOwnProperty(g))throw"Missing target node with id: ".concat(g);var k=l[m],w=l[g];k.out.push(w);function _(v){return Mn(v)==="object"?n(v):v}});var f=[];d(Object.values(l));var h=Object.assign.apply(Object,[{}].concat(gt(Object.entries(l).filter(function(p){var y=de(p,2),x=y[1];return!x.skip}).map(function(p){var y=de(p,2),x=y[0],m=y[1];return ye({},x,m.depth)}))));return h;function d(p){for(var y=arguments.length>1&&arguments[1]!==void 0?arguments[1]:[],x=arguments.length>2&&arguments[2]!==void 0?arguments[2]:0,m=function(){var _=p[g];if(y.indexOf(_)!==-1){var v=[].concat(gt(y.slice(y.indexOf(_))),[_]).map(function(A){return n(A.data)});return f.some(function(A){return A.length===v.length&&A.every(function(M,T){return M===v[T]})})||(f.push(v),c(v)),1}x>_.depth&&(_.depth=x,d(_.out,[].concat(gt(y),[_]),x+(_.skip?0:1)))},g=0,k=p.length;gn.cooldownTicks||new Date-n.startTickTime>n.cooldownTime||n.d3AlphaMin>0&&n.forceLayout.alpha()0){var D=Math.atan2(P.y-R.y,P.x-R.x),U=N*T,S={x:(R.x+P.x)/2+U*Math.cos(D-Math.PI/2),y:(R.y+P.y)/2+U*Math.sin(D-Math.PI/2)};M.__controlPoints=[S.x,S.y]}else{var j=T*70;M.__controlPoints=[P.x,P.y-j,P.x+j,P.y]}}}}function a(){var u=1.6,c=.2,l=B(n.linkDirectionalArrowLength),f=B(n.linkDirectionalArrowRelPos),h=B(n.linkVisibility),d=B(n.linkDirectionalArrowColor||n.linkColor),p=B(n.nodeVal),y=n.ctx;y.save(),n.graphData.links.filter(h).forEach(function(x){var m=l(x);if(!(!m||m<0)){var g=x.source,k=x.target;if(!(!g||!k||!g.hasOwnProperty("x")||!k.hasOwnProperty("x"))){var w=Math.sqrt(Math.max(0,p(g)||1))*n.nodeRelSize,_=Math.sqrt(Math.max(0,p(k)||1))*n.nodeRelSize,v=Math.min(1,Math.max(0,f(x))),A=d(x)||"rgba(0,0,0,0.28)",M=m/u/2,T=x.__controlPoints&&$r(K,[g.x,g.y].concat(gt(x.__controlPoints),[k.x,k.y])),R=T?function(E){return T.get(E)}:function(E){return{x:g.x+(k.x-g.x)*E||0,y:g.y+(k.y-g.y)*E||0}},P=T?T.length():Math.sqrt(Math.pow(k.x-g.x,2)+Math.pow(k.y-g.y,2)),N=w+m+(P-w-_-m)*v,D=R(N/P),U=R((N-m)/P),S=R((N-m*(1-c))/P),j=Math.atan2(D.y-U.y,D.x-U.x)-Math.PI/2;y.beginPath(),y.moveTo(D.x,D.y),y.lineTo(U.x+M*Math.cos(j),U.y+M*Math.sin(j)),y.lineTo(S.x,S.y),y.lineTo(U.x-M*Math.cos(j),U.y-M*Math.sin(j)),y.fillStyle=A,y.fill()}}}),y.restore()}function s(){var u=B(n.linkDirectionalParticles),c=B(n.linkDirectionalParticleSpeed),l=B(n.linkDirectionalParticleOffset),f=B(n.linkDirectionalParticleWidth),h=B(n.linkVisibility),d=B(n.linkDirectionalParticleColor||n.linkColor),p=n.ctx;p.save(),n.graphData.links.filter(h).forEach(function(y){var x=u(y);if(!(!y.hasOwnProperty("__photons")||!y.__photons.length)){var m=y.source,g=y.target;if(!(!m||!g||!m.hasOwnProperty("x")||!g.hasOwnProperty("x"))){var k=c(y),w=Math.abs(l(y)),_=y.__photons||[],v=Math.max(0,f(y)/2)/Math.sqrt(n.globalScale),A=d(y)||"rgba(0,0,0,0.28)";p.fillStyle=A;var M=y.__controlPoints?$r(K,[m.x,m.y].concat(gt(y.__controlPoints),[g.x,g.y])):null,T=0,R=!1;_.forEach(function(P){var N=!!P.__singleHop;if(P.hasOwnProperty("__progressRatio")||(P.__progressRatio=N?k<0?1:0:(T+w)/x),!N&&T++,P.__progressRatio+=k,P.__progressRatio>=1||P.__progressRatio<0)if(!N)P.__progressRatio=P.__progressRatio%1,P.__progressRatio<0&&P.__progressRatio++;else{R=!0;return}var D=P.__progressRatio,U=M?M.get(D):{x:m.x+(g.x-m.x)*D||0,y:m.y+(g.y-m.y)*D||0};n.linkDirectionalParticleCanvasObject?n.linkDirectionalParticleCanvasObject(U.x,U.y,y,p,n.globalScale):(p.beginPath(),p.arc(U.x,U.y,v,0,2*Math.PI,!1),p.fill())}),R&&(y.__photons=y.__photons.filter(function(P){return!P.__singleHop||P.__progressRatio<=1&&P.__progressRatio>=0}))}}}),p.restore()}},emitParticle:function(n,r){return r&&(!r.__photons&&(r.__photons=[]),r.__photons.push({__singleHop:!0})),this}},stateInit:function(){return{forceLayout:Lf().force("link",Ef()).force("charge",Ff()).force("center",zc()).force("dagRadial",null).stop(),engineRunning:!1}},init:function(n,r){r.ctx=n},update:function(n,r){n.engineRunning=!1,n.onUpdate(),n.nodeAutoColorBy!==null&&Fr(n.graphData.nodes,B(n.nodeAutoColorBy),n.nodeColor),n.linkAutoColorBy!==null&&Fr(n.graphData.links,B(n.linkAutoColorBy),n.linkColor),n.graphData.links.forEach(function(d){d.source=d[n.linkSource],d.target=d[n.linkTarget]}),n.forceLayout.stop().alpha(1).nodes(n.graphData.nodes);var i=n.forceLayout.force("link");i&&i.id(function(d){return d[n.nodeId]}).links(n.graphData.links);var o=n.dagMode&&bh(n.graphData,function(d){return d[n.nodeId]},{nodeFilter:n.dagNodeFilter,onLoopError:n.onDagError||void 0}),a=Math.max.apply(Math,gt(Object.values(o||[]))),s=n.dagLevelDistance||n.graphData.nodes.length/(a||1)*wh*(["radialin","radialout"].indexOf(n.dagMode)!==-1?.7:1);if(["lr","rl","td","bu"].includes(r.dagMode)){var u=["lr","rl"].includes(r.dagMode)?"fx":"fy";n.graphData.nodes.filter(n.dagNodeFilter).forEach(function(d){return delete d[u]})}if(["lr","rl","td","bu"].includes(n.dagMode)){var c=["rl","bu"].includes(n.dagMode),l=function(p){return(o[p[n.nodeId]]-a/2)*s*(c?-1:1)},f=["lr","rl"].includes(n.dagMode)?"fx":"fy";n.graphData.nodes.filter(n.dagNodeFilter).forEach(function(d){return d[f]=l(d)})}n.forceLayout.force("dagRadial",["radialin","radialout"].indexOf(n.dagMode)!==-1?Uf(function(d){var p=o[d[n.nodeId]]||-1;return(n.dagMode==="radialin"?a-p:p)*s}).strength(function(d){return n.dagNodeFilter(d)?1:0}):null);for(var h=0;h0&&n.forceLayout.alpha()1?u-1:0),l=1;l1&&arguments[1]!==void 0?arguments[1]:0,i=arguments.length>2&&arguments[2]!==void 0?arguments[2]:10,o=arguments.length,a=new Array(o>3?o-3:0),s=3;s1&&arguments[1]!==void 0?arguments[1]:function(){return!0},i=B(n.nodeVal),o=function(u){return Math.sqrt(Math.max(0,i(u)||1))*n.nodeRelSize},a=n.graphData.nodes.filter(r).map(function(s){return{x:s.x,y:s.y,r:o(s)}});return a.length?{x:[Zn(a,function(s){return s.x-s.r}),Kn(a,function(s){return s.x+s.r})],y:[Zn(a,function(s){return s.y-s.r}),Kn(a,function(s){return s.y+s.r})]}:null},pauseAnimation:function(n){return n.animationFrameRequestId&&(cancelAnimationFrame(n.animationFrameRequestId),n.animationFrameRequestId=null),this},resumeAnimation:function(n){return n.animationFrameRequestId||this._animationCycle(),this},_destructor:function(){this.pauseAnimation(),this.graphData({nodes:[],links:[]})}},Th),stateInit:function(){return{lastSetZoom:1,zoom:qu(),forceGraph:new qe,shadowGraph:new qe().cooldownTicks(0).nodeColor("__indexColor").linkColor("__indexColor").isShadow(!0),colorTracker:new lc,tweenGroup:new bi}},init:function(n,r){var i=this;n.innerHTML="";var o=document.createElement("div");o.classList.add("force-graph-container"),o.style.position="relative",n.appendChild(o),r.canvas=document.createElement("canvas"),r.backgroundColor&&(r.canvas.style.background=r.backgroundColor),o.appendChild(r.canvas),r.shadowCanvas=document.createElement("canvas");var a=r.canvas.getContext("2d"),s=r.shadowCanvas.getContext("2d",{willReadFrequently:!0}),u={x:-1e12,y:-1e12},c=function(){var h=null,d=window.devicePixelRatio,p=u.x>0&&u.y>0?s.getImageData(u.x*d,u.y*d,1,1):null;return p&&(h=r.colorTracker.lookup(p.data)),h};pt(r.canvas).call(As().subject(function(){if(!r.enableNodeDrag)return null;var f=c();return f&&f.type==="Node"?f.d:null}).on("start",function(f){var h=f.subject;h.__initialDragPos={x:h.x,y:h.y,fx:h.fx,fy:h.fy},f.active||(h.fx=h.x,h.fy=h.y),r.canvas.classList.add("grabbable")}).on("drag",function(f){var h=f.subject,d=h.__initialDragPos,p=f,y=mt(r.canvas).k,x={x:d.x+(p.x-d.x)/y-h.x,y:d.y+(p.y-d.y)/y-h.y};["x","y"].forEach(function(m){return h["f".concat(m)]=h[m]=d[m]+(p[m]-d[m])/y}),!(!h.__dragged&&Ah>=Math.sqrt(_o(["x","y"].map(function(m){return Math.pow(f[m]-d[m],2)}))))&&(r.forceGraph.d3AlphaTarget(.3).resetCountdown(),r.isPointerDragging=!0,h.__dragged=!0,r.onNodeDrag(h,x))}).on("end",function(f){var h=f.subject,d=h.__initialDragPos,p={x:h.x-d.x,y:h.y-d.y};d.fx===void 0&&(h.fx=void 0),d.fy===void 0&&(h.fy=void 0),delete h.__initialDragPos,r.forceGraph.d3AlphaTarget()&&r.forceGraph.d3AlphaTarget(0).resetCountdown(),r.canvas.classList.remove("grabbable"),r.isPointerDragging=!1,h.__dragged&&(delete h.__dragged,r.onNodeDragEnd(h,p))})),r.zoom(r.zoom.__baseElem=pt(r.canvas)),r.zoom.__baseElem.on("dblclick.zoom",null),r.zoom.filter(function(f){return!f.button&&r.enableZoomPanInteraction&&(f.type!=="wheel"||B(r.enableZoomInteraction)(f))&&(f.type==="wheel"||B(r.enablePanInteraction)(f))}).on("zoom",function(f){var h=f.transform;[a,s].forEach(function(d){Ki(d),d.translate(h.x,h.y),d.scale(h.k,h.k)}),r.isPointerDragging=!0,r.onZoom&&r.onZoom(Gt(Gt({},h),i.centerAt())),r.needsRedraw=!0}).on("end",function(f){r.isPointerDragging=!1,r.onZoomEnd&&r.onZoomEnd(Gt(Gt({},f.transform),i.centerAt()))}),an(r),r.forceGraph.onNeedsRedraw(function(){return r.needsRedraw=!0}).onFinishUpdate(function(){mt(r.canvas).k===r.lastSetZoom&&r.graphData.nodes.length&&(r.zoom.scaleTo(r.zoom.__baseElem,r.lastSetZoom=Ch/Math.cbrt(r.graphData.nodes.length)),r.needsRedraw=!0)}),r.tooltip=new Ec(o),["pointermove","pointerdown"].forEach(function(f){return o.addEventListener(f,function(h){f==="pointerdown"&&(r.isPointerPressed=!0,r.pointerDownEvent=h),!r.isPointerDragging&&h.type==="pointermove"&&r.onBackgroundClick&&(h.pressure>0||r.isPointerPressed)&&(h.pointerType==="mouse"||h.movementX===void 0||[h.movementX,h.movementY].some(function(y){return Math.abs(y)>1}))&&(r.isPointerDragging=!0);var d=p(o);u.x=h.pageX-d.left,u.y=h.pageY-d.top;function p(y){var x=y.getBoundingClientRect(),m=window.pageXOffset||document.documentElement.scrollLeft,g=window.pageYOffset||document.documentElement.scrollTop;return{top:x.top+g,left:x.left+m}}},{passive:!0})}),o.addEventListener("pointerup",function(f){if(r.isPointerPressed){if(r.isPointerPressed=!1,r.isPointerDragging){r.isPointerDragging=!1;return}var h=[f,r.pointerDownEvent];requestAnimationFrame(function(){if(f.button===0)if(r.hoverObj){var d=r["on".concat(r.hoverObj.type,"Click")];d&&d.apply(void 0,[r.hoverObj.d].concat(h))}else r.onBackgroundClick&&r.onBackgroundClick.apply(r,h);if(f.button===2)if(r.hoverObj){var p=r["on".concat(r.hoverObj.type,"RightClick")];p&&p.apply(void 0,[r.hoverObj.d].concat(h))}else r.onBackgroundRightClick&&r.onBackgroundRightClick.apply(r,h)})}},{passive:!0}),o.addEventListener("contextmenu",function(f){return!r.onBackgroundRightClick&&!r.onNodeRightClick&&!r.onLinkRightClick?!0:(f.preventDefault(),!1)}),r.forceGraph(a),r.shadowGraph(s);var l=yl(function(){Hr(s,r.width,r.height),r.shadowGraph.linkWidth(function(h){return B(r.linkWidth)(h)+r.linkHoverPrecision});var f=mt(r.canvas);r.shadowGraph.globalScale(f.k).tickFrame()},kh);r.flushShadowCanvas=l.flush,(this._animationCycle=function f(){var h=!r.autoPauseRedraw||!!r.needsRedraw||r.forceGraph.isEngineRunning()||r.graphData.links.some(function(w){return w.__photons&&w.__photons.length});if(r.needsRedraw=!1,r.enablePointerInteraction){var d=r.isPointerDragging?null:c();if(d!==r.hoverObj){var p=r.hoverObj,y=p?p.type:null,x=d?d.type:null;if(y&&y!==x){var m=r["on".concat(y,"Hover")];m&&m(null,p.d)}if(x){var g=r["on".concat(x,"Hover")];g&&g(d.d,y===x?p.d:null)}r.tooltip.content(d&&B(r["".concat(d.type.toLowerCase(),"Label")])(d.d)||null),r.canvas.classList[(d&&r["on".concat(x,"Click")]||!d&&r.onBackgroundClick)&&B(r.showPointerCursor)(d==null?void 0:d.d)?"add":"remove"]("clickable"),r.hoverObj=d}h&&l()}if(h){Hr(a,r.width,r.height);var k=mt(r.canvas).k;r.onRenderFramePre&&r.onRenderFramePre(a,k),r.forceGraph.globalScale(k).tickFrame(),r.onRenderFramePost&&r.onRenderFramePost(a,k)}r.tweenGroup.update(),r.animationFrameRequestId=requestAnimationFrame(f)})()},update:function(n){}}),sn={exports:{}},un,qr;function Oh(){if(qr)return un;qr=1;var e="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED";return un=e,un}var ln,Wr;function Eh(){if(Wr)return ln;Wr=1;var e=Oh();function n(){}function r(){}return r.resetWarningCache=n,ln=function(){function i(s,u,c,l,f,h){if(h!==e){var d=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw d.name="Invariant Violation",d}}i.isRequired=i;function o(){return i}var a={array:i,bigint:i,bool:i,func:i,number:i,object:i,string:i,symbol:i,any:i,arrayOf:o,element:i,elementType:i,instanceOf:o,node:i,objectOf:o,oneOf:o,oneOfType:o,shape:o,exact:o,checkPropTypes:r,resetWarningCache:n};return a.PropTypes=a,a},ln}var Gr;function zh(){return Gr||(Gr=1,sn.exports=Eh()()),sn.exports}var Nh=zh();const b=io(Nh),Ze={width:b.number,height:b.number,graphData:b.shape({nodes:b.arrayOf(b.object).isRequired,links:b.arrayOf(b.object).isRequired}),backgroundColor:b.string,nodeRelSize:b.number,nodeId:b.string,nodeLabel:b.oneOfType([b.string,b.func]),nodeVal:b.oneOfType([b.number,b.string,b.func]),nodeVisibility:b.oneOfType([b.bool,b.string,b.func]),nodeColor:b.oneOfType([b.string,b.func]),nodeAutoColorBy:b.oneOfType([b.string,b.func]),onNodeHover:b.func,onNodeClick:b.func,linkSource:b.string,linkTarget:b.string,linkLabel:b.oneOfType([b.string,b.func]),linkVisibility:b.oneOfType([b.bool,b.string,b.func]),linkColor:b.oneOfType([b.string,b.func]),linkAutoColorBy:b.oneOfType([b.string,b.func]),linkWidth:b.oneOfType([b.number,b.string,b.func]),linkCurvature:b.oneOfType([b.number,b.string,b.func]),linkDirectionalArrowLength:b.oneOfType([b.number,b.string,b.func]),linkDirectionalArrowColor:b.oneOfType([b.string,b.func]),linkDirectionalArrowRelPos:b.oneOfType([b.number,b.string,b.func]),linkDirectionalParticles:b.oneOfType([b.number,b.string,b.func]),linkDirectionalParticleSpeed:b.oneOfType([b.number,b.string,b.func]),linkDirectionalParticleOffset:b.oneOfType([b.number,b.string,b.func]),linkDirectionalParticleWidth:b.oneOfType([b.number,b.string,b.func]),linkDirectionalParticleColor:b.oneOfType([b.string,b.func]),onLinkHover:b.func,onLinkClick:b.func,dagMode:b.oneOf(["td","bu","lr","rl","zin","zout","radialin","radialout"]),dagLevelDistance:b.number,dagNodeFilter:b.func,onDagError:b.func,d3AlphaMin:b.number,d3AlphaDecay:b.number,d3VelocityDecay:b.number,warmupTicks:b.number,cooldownTicks:b.number,cooldownTime:b.number,onEngineTick:b.func,onEngineStop:b.func,getGraphBbox:b.func},Qi={zoomToFit:b.func,onNodeRightClick:b.func,onNodeDrag:b.func,onNodeDragEnd:b.func,onLinkRightClick:b.func,linkHoverPrecision:b.number,onBackgroundClick:b.func,onBackgroundRightClick:b.func,showPointerCursor:b.oneOfType([b.bool,b.func]),enablePointerInteraction:b.bool,enableNodeDrag:b.bool},Wn={showNavInfo:b.bool,nodeOpacity:b.number,nodeResolution:b.number,nodeThreeObject:b.oneOfType([b.object,b.string,b.func]),nodeThreeObjectExtend:b.oneOfType([b.bool,b.string,b.func]),nodePositionUpdate:b.func,linkOpacity:b.number,linkResolution:b.number,linkCurveRotation:b.oneOfType([b.number,b.string,b.func]),linkMaterial:b.oneOfType([b.object,b.string,b.func]),linkThreeObject:b.oneOfType([b.object,b.string,b.func]),linkThreeObjectExtend:b.oneOfType([b.bool,b.string,b.func]),linkPositionUpdate:b.func,linkDirectionalArrowResolution:b.number,linkDirectionalParticleResolution:b.number,linkDirectionalParticleThreeObject:b.oneOfType([b.object,b.string,b.func]),forceEngine:b.oneOf(["d3","ngraph"]),ngraphPhysics:b.object,numDimensions:b.oneOf([1,2,3])},Rh=Object.assign({},Ze,Qi,{linkLineDash:b.oneOfType([b.arrayOf(b.number),b.string,b.func]),nodeCanvasObjectMode:b.oneOfType([b.string,b.func]),nodeCanvasObject:b.func,nodePointerAreaPaint:b.func,linkCanvasObjectMode:b.oneOfType([b.string,b.func]),linkCanvasObject:b.func,linkPointerAreaPaint:b.func,linkDirectionalParticleCanvasObject:b.func,autoPauseRedraw:b.bool,minZoom:b.number,maxZoom:b.number,enableZoomInteraction:b.oneOfType([b.bool,b.func]),enablePanInteraction:b.oneOfType([b.bool,b.func]),onZoom:b.func,onZoomEnd:b.func,onRenderFramePre:b.func,onRenderFramePost:b.func});Object.assign({},Ze,Qi,Wn,{enableNavigationControls:b.bool,controlType:b.oneOf(["trackball","orbit","fly"]),rendererConfig:b.object,extraRenderers:b.arrayOf(b.shape({render:b.func.isRequired}))});Object.assign({},Ze,Wn,{nodeDesc:b.oneOfType([b.string,b.func]),linkDesc:b.oneOfType([b.string,b.func])});Object.assign({},Ze,Wn,{markerAttrs:b.object,yOffset:b.number,glScale:b.number});const Gn=Io(Ph,{methodNames:["emitParticle","d3Force","d3ReheatSimulation","stopAnimation","pauseAnimation","resumeAnimation","centerAt","zoom","zoomToFit","getGraphBbox","screen2GraphCoords","graph2ScreenCoords"]});Gn.displayName="ForceGraph2D";Gn.propTypes=Rh;function wt(e){return function(){return e}}function Vr(e){return(e()-.5)*1e-6}function jh(e){return e.x+e.vx}function Dh(e){return e.y+e.vy}function Ih(e){var n,r,i,o=1,a=1;typeof e!="function"&&(e=wt(e==null?1:+e));function s(){for(var l,f=n.length,h,d,p,y,x,m,g=0;gd.index){var N=p-T.x-T.vx,D=y-T.y-T.vy,U=N*N+D*D;Up+P||Ay+P||Ml.r&&(l.r=l[f].r)}function c(){if(n){var l,f=n.length,h;for(r=new Array(f),l=0;la[0]-s[0]||a[1]-s[1]),r=(a,s,u)=>(s[0]-a[0])*(u[1]-a[1])-(s[1]-a[1])*(u[0]-a[0]),i=[];for(const a of n){for(;i.length>=2&&r(i[i.length-2],i[i.length-1],a)<=0;)i.pop();i.push(a)}const o=[];for(let a=n.length-1;a>=0;a--){const s=n[a];for(;o.length>=2&&r(o[o.length-2],o[o.length-1],s)<=0;)o.pop();o.push(s)}return i.pop(),o.pop(),i.concat(o)}function Xh({data:e,selectedNodeId:n,onNodeSelect:r}){const[i,o]=W.useState(null),[a,s]=W.useState(.75),u=W.useRef(null),c=W.useRef(null),[l,f]=W.useState({width:500,height:560});W.useEffect(()=>{if(!u.current)return;const C=new ResizeObserver(O=>{for(const I of O)I.contentRect.width>0&&I.contentRect.height>0&&f({width:Math.floor(I.contentRect.width),height:Math.floor(I.contentRect.height)})});return C.observe(u.current),()=>C.disconnect()},[]);const h=W.useRef(new Map),d=W.useMemo(()=>{const C=h.current,O=new Set,I=e.nodes.map(F=>{O.add(F.id);let G=C.get(F.id);return G?(G.content!==F.content||G.category!==F.category)&&(G.content=F.content,G.category=F.category,G.__baseTextWidth=void 0):(G={...F},C.set(F.id,G)),G});for(const F of Array.from(C.keys()))O.has(F)||C.delete(F);const L=new Map(e.nodes.map(F=>[F.id,F.category])),H=e.edges.map(F=>({source:F.source,target:F.target,weight:F.weight||0,__sid:F.source,__tid:F.target,__sameCat:L.get(F.source)===L.get(F.target),__restColor:Hh[L.get(F.source)??""]??Uh}));return{nodes:I,links:H}},[e]),p=W.useMemo(()=>{const C={};return e.edges.forEach(O=>{C[O.source]=(C[O.source]||0)+1,C[O.target]=(C[O.target]||0)+1}),C},[e]),y=C=>({identity:-240,knowledge:240,rules:-240,events:240})[C]||0,x=C=>({identity:-240,knowledge:-240,rules:240,events:240})[C]||0,m=W.useMemo(()=>`${e.nodes.map(C=>C.id).sort().join(",")}#${e.edges.length}`,[e]);W.useEffect(()=>{const C=c.current;if(!C)return;C.d3Force("center",null),C.d3Force("x",$h().x(L=>y(L.category)).strength(.1)),C.d3Force("y",Lh().y(L=>x(L.category)).strength(.1));const O=C.d3Force("charge");O&&O.strength(-380),C.d3Force("collide",Ih().radius(28).iterations(2));const I=C.d3Force("link");I&&I.distance(L=>L.__sameCat?70:200).strength(L=>L.__sameCat?.3*(L.weight||.6):.01),C.d3ReheatSimulation()},[m]);const g=i||n,k=W.useMemo(()=>d.links.filter(C=>C.__sameCat&&(C.weight||0)>=a).length,[d,a]),w=()=>{c.current&&c.current.zoomToFit(400,40)},_=W.useMemo(()=>{if(!g)return new Set;const C=new Set;return e.edges.forEach(O=>{O.source===g&&C.add(O.target),O.target===g&&C.add(O.source)}),C},[g,e]),v=W.useCallback(C=>g?C.__sid===g||C.__tid===g:C.__sameCat&&(C.weight||0)>=a,[g,a]),A=W.useCallback(C=>g&&(C.__sid===g||C.__tid===g)?Fh:C.__restColor,[g]),M=W.useCallback(C=>g&&(C.__sid===g||C.__tid===g)?2.5:1.4,[g]),T=W.useCallback(C=>g&&(C.__sid===g||C.__tid===g)?4:0,[g]),R=W.useCallback((C,O)=>{const I=c.current,L=u.current;if(!I||!L)return null;const H=L.getBoundingClientRect(),{x:F,y:G}=I.screen2GraphCoords(C-H.left,O-H.top),V=Math.max(I.zoom()||1,.01);let X=null,tt=1/0;for(const Z of d.nodes){if(Z.x==null||Z.y==null)continue;const st=6+Math.min(p[Z.id]||0,15)*.8,et=Math.max(st+3,16/V),qt=Z.x-F,At=Z.y-G,nt=qt*qt+At*At;nt<=et*et&&nt{const O=C.target instanceof HTMLCanvasElement?R(C.clientX,C.clientY):null;o(O?O.id:null),u.current&&(u.current.style.cursor=O?"pointer":"default")},[R]),N=W.useCallback(()=>{o(null),u.current&&(u.current.style.cursor="default")},[]),D=W.useRef(null),U=W.useCallback(C=>{D.current={x:C.clientX,y:C.clientY}},[]),S=W.useCallback(C=>{if(!(C.target instanceof HTMLCanvasElement))return;const O=D.current;if(O&&Math.hypot(C.clientX-O.x,C.clientY-O.y)>6)return;const I=R(C.clientX,C.clientY);r(I?I.id:null)},[R,r]),j=W.useCallback((C,O)=>{var L;const I={};for(const H of d.nodes)H.x==null||H.y==null||(I[L=H.category]??(I[L]=[])).push([H.x,H.y]);for(const[H,F]of Object.entries(I)){const G=Wh[H];if(!G||F.length===0)continue;const V=Bh(F);let X=0,tt=0;V.forEach(et=>{X+=et[0],tt+=et[1]}),X/=V.length,tt/=V.length;const Z=34;if(C.beginPath(),V.length<3)C.arc(X,tt,Z+16,0,2*Math.PI);else{const et=V.map(([nt,lt])=>{const jt=nt-X,Zt=lt-tt,Kt=Math.hypot(jt,Zt)||1;return[nt+jt/Kt*Z,lt+Zt/Kt*Z]}),qt=(nt,lt)=>[(nt[0]+lt[0])/2,(nt[1]+lt[1])/2],At=qt(et[et.length-1],et[0]);C.moveTo(At[0],At[1]);for(let nt=0;ntet[1]));C.font='600 26px "Space Grotesk", sans-serif',C.textAlign="center",C.textBaseline="bottom",C.fillStyle=Vh[H],C.fillText(Xr[H]||H,X,st-Z-8)}},[d]),E=W.useCallback((C,O,I)=>{const L=C.x??0,H=C.y??0,F=6+Math.min(p[C.id]||0,15)*.8,G=Br[C.category]||"#64748b",V=C.id===i,X=C.id===n,tt=g&&C.id!==g&&!_.has(C.id),Z=tt?"#1e293b":G;if(tt||(O.beginPath(),O.arc(L,H,F*1.9,0,2*Math.PI,!1),O.fillStyle=qh[C.category]||"rgba(100, 116, 139, 0.14)",O.fill()),(V||X)&&(O.shadowColor=G,O.shadowBlur=15),O.beginPath(),O.arc(L,H,F,0,2*Math.PI,!1),O.fillStyle=Z,O.fill(),O.shadowBlur=0,(V||X)&&(O.beginPath(),O.arc(L,H,F+2.5,0,2*Math.PI,!1),O.strokeStyle=X?"#ffffff":"rgba(255, 255, 255, 0.7)",O.lineWidth=1.5,O.stroke()),V||X||g&&_.has(C.id)){const et=C.content.length>35?C.content.slice(0,34)+"…":C.content;if(C.__baseTextWidth===void 0){const Ji=O.font;O.font='500 10px "Space Grotesk", sans-serif',C.__baseTextWidth=O.measureText(et).width,O.font=Ji}const At=(V||X?10.5:9.5)/Math.max(.5,I);O.font=`${V||X?"bold":"500"} ${At}px "Space Grotesk", sans-serif`;const nt=C.__baseTextWidth*(At/10),lt=4.5/Math.max(.5,I),jt=L-nt/2-lt,Zt=H+F+6/Math.max(.5,I),Kt=nt+lt*2,Vn=At+lt*1.6;O.fillStyle=tt?"rgba(10, 15, 25, 0.45)":"rgba(8, 12, 20, 0.88)",O.fillRect(jt,Zt,Kt,Vn),O.strokeStyle=V||X?"rgba(255, 255, 255, 0.2)":"rgba(255, 255, 255, 0.08)",O.lineWidth=.6/Math.max(.5,I),O.strokeRect(jt,Zt,Kt,Vn),O.textAlign="center",O.textBaseline="top",O.fillStyle=tt?"#475569":V||X?"#ffffff":"#cbd5e1",O.fillText(et,L,H+F+7/Math.max(.5,I))}},[p,i,n,g,_]);return $.jsxs("div",{className:"absolute inset-0",ref:u,onPointerMove:P,onPointerLeave:N,onPointerDown:U,onClick:S,style:{background:"radial-gradient(circle at center, rgba(59, 130, 246, 0.08) 0%, #030712 100%)"},children:[$.jsx(Gn,{ref:c,width:l.width,height:l.height,graphData:d,backgroundColor:"rgba(0,0,0,0)",cooldownTicks:120,enablePointerInteraction:!1,enableNodeDrag:!1,onRenderFramePre:j,linkVisibility:v,linkColor:A,linkWidth:M,linkDirectionalParticles:T,linkDirectionalParticleWidth:2.2,linkDirectionalParticleSpeed:.006,nodeCanvasObject:E}),$.jsxs("button",{onClick:w,title:"Zentrieren",className:"absolute right-3 top-3 z-10 flex items-center gap-1.5 rounded-lg border border-border/60 bg-background/50 px-2.5 py-1.5 text-[11px] text-muted-foreground hover:text-foreground backdrop-blur-sm transition-colors cursor-pointer",children:[$.jsx(oo,{className:"h-3.5 w-3.5"})," Zentrieren"]}),$.jsxs("div",{className:"absolute left-3 bottom-3 flex flex-wrap items-center gap-x-3 gap-y-1.5 rounded-lg bg-background/40 px-2.5 py-1.5 backdrop-blur-sm",children:[Object.entries(Xr).map(([C,O])=>$.jsxs("span",{className:"flex items-center gap-1 text-[10px] text-muted-foreground",children:[$.jsx("span",{className:"h-2 w-2 rounded-full",style:{background:Br[C]}}),O]},C)),$.jsxs("label",{className:"flex items-center gap-1.5 text-[10px] text-muted-foreground border-l border-border/40 pl-3",children:[$.jsx("span",{children:"Verbindungen"}),$.jsx("span",{className:"text-[9px] text-muted-foreground/60",children:"alle"}),$.jsx("input",{type:"range",min:.45,max:.95,step:.05,value:a,onChange:C=>s(Number(C.target.value)),className:"w-20 accent-primary cursor-pointer",title:"Nur Verbindungen ab dieser Stärke zeigen"}),$.jsx("span",{className:"text-[9px] text-muted-foreground/60",children:"stark"}),$.jsx("span",{className:"font-mono text-[9px] text-muted-foreground/80 min-w-[3ch] text-right",children:k})]})]})]})}class Yh extends W.Component{constructor(){super(...arguments);Bn(this,"state",{error:null})}static getDerivedStateFromError(r){return{error:r}}render(){return this.state.error?$.jsxs("div",{className:"h-[480px] rounded-2xl border border-red-500/20 bg-red-500/5 p-6 text-xs text-red-400 overflow-auto",children:[$.jsx("div",{className:"font-semibold mb-2",children:"Graph konnte nicht gerendert werden"}),$.jsx("pre",{className:"whitespace-pre-wrap break-words text-[11px] leading-relaxed",children:this.state.error.message})]}):this.props.children}}const Zh={"":"Allgemein",traeume:"Träume",muster:"Muster","skill-kandidaten":"Skill-Kandidaten","skill-kandidaten/beauftragt":"Skill-Kandidaten · beauftragt","skill-kandidaten/verworfen":"Skill-Kandidaten · verworfen"};function ed(){const{data:e,isLoading:n}=ao(),[r,i]=W.useState(null),[o,a]=W.useState(null),[s,u]=W.useState(!1),[c,l]=W.useState(""),[f,h]=W.useState(!1),{data:d,isLoading:p}=so(f),y=W.useMemo(()=>(e==null?void 0:e.files)??[],[e]),x=W.useMemo(()=>{const w=new Map;for(const _ of y)w.set(_.name.toLowerCase(),_.path);return w},[y]),m=W.useMemo(()=>{if(!c.trim())return y;const w=c.toLowerCase();return y.filter(_=>_.title.toLowerCase().includes(w)||_.path.toLowerCase().includes(w))},[y,c]),g=W.useMemo(()=>{const w=[];for(const _ of m){const v=w.find(A=>A.dir===_.dir);v?v.files.push(_):w.push({dir:_.dir,files:[_]})}return w.sort((_,v)=>_.dir===""?-1:v.dir===""?1:_.dir.localeCompare(v.dir))},[m]);W.useEffect(()=>{if(!r&&y.length){const w=y.find(_=>_.path.toLowerCase()==="index.md");i((w==null?void 0:w.path)??y[0].path)}},[y,r]),W.useEffect(()=>{r&&(u(!0),uo(`/api/wissen/datei?pfad=${encodeURIComponent(r)}`).then(a).catch(()=>a({path:r,content:"*(Notiz nicht ladbar)*",mtime:0})).finally(()=>u(!1)))},[r]);const k=w=>{const _=x.get(w.toLowerCase());_&&i(_)};return $.jsxs("div",{className:"space-y-5",children:[$.jsxs("div",{className:"flex items-center justify-between",children:[$.jsxs("div",{children:[$.jsx("h1",{className:"bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text font-space text-2xl font-bold tracking-tight text-transparent",children:"Wissen"}),$.jsx("p",{className:"text-sm text-muted-foreground",children:"Was sich die Box nachts erschließt — Traum-Notizen, Muster und Skill-Ideen aus dem Wissens-Vault, verlinkt wie ein Wiki."})]}),y.length>0&&$.jsxs("div",{className:"flex rounded-lg border border-border/60 bg-card p-1",children:[$.jsx("button",{onClick:()=>h(!1),className:Ae("rounded-md px-3 py-1.5 text-xs font-medium transition-colors",f?"text-muted-foreground hover:bg-muted":"bg-primary text-primary-foreground shadow"),children:"Liste"}),$.jsx("button",{onClick:()=>h(!0),className:Ae("rounded-md px-3 py-1.5 text-xs font-medium transition-colors",f?"bg-primary text-primary-foreground shadow":"text-muted-foreground hover:bg-muted"),children:"Graph"})]})]}),e&&!e.available&&$.jsx("div",{className:"rounded-2xl border border-amber-500/30 bg-amber-500/5 p-4 text-xs text-amber-300",children:"Der Wissens-Vault liegt auf der Box (~/wissens-vault) — im lokalen Dev-Modus nicht verfügbar."}),n&&$.jsxs("div",{className:"flex items-center gap-2 rounded-2xl border border-border/60 bg-card/30 p-6 text-xs text-muted-foreground",children:[$.jsx(Ke,{className:"h-4 w-4 animate-spin"})," Vault wird geladen …"]}),(e==null?void 0:e.available)&&y.length===0&&$.jsx("div",{className:"rounded-2xl border border-dashed border-border/60 bg-card/20 p-8 text-center text-xs text-muted-foreground",children:"Noch keine Notizen. Der nächtliche Traum (03:15) legt sie an — morgen früh steht hier die erste."}),f?$.jsxs("div",{className:"mc-card flex h-[70vh] flex-col overflow-hidden p-0 relative",children:[p&&$.jsx("div",{className:"absolute inset-0 flex items-center justify-center bg-background/50 z-10",children:$.jsxs("div",{className:"flex items-center gap-2 rounded-2xl border border-border/60 bg-card p-6 text-xs text-muted-foreground",children:[$.jsx(Ke,{className:"h-4 w-4 animate-spin"})," Graph wird berechnet …"]})}),$.jsx(Yh,{children:d&&$.jsx(Xh,{data:d,selectedNodeId:r,onNodeSelect:w=>{w&&(i(w),h(!1))}})})]}):y.length>0&&$.jsxs("div",{className:"flex flex-col gap-4 lg:flex-row",children:[$.jsxs("aside",{className:"w-full shrink-0 space-y-3 lg:w-72",children:[$.jsxs("div",{className:"relative",children:[$.jsx("input",{value:c,onChange:w=>l(w.target.value),type:"search",placeholder:"Notizen durchsuchen…","aria-label":"Notizen durchsuchen",className:"h-9 w-full rounded-lg border border-border/60 bg-card/45 pl-8 pr-3 text-xs text-foreground outline-none focus:ring-1 focus:ring-primary/50"}),$.jsx(lo,{className:"absolute left-2.5 top-2.5 h-3.5 w-3.5 text-muted-foreground"})]}),$.jsx("div",{className:"max-h-[70vh] space-y-3 overflow-y-auto pr-1 scrollbar-thin",children:g.map(({dir:w,files:_})=>$.jsxs("div",{children:[$.jsxs("p",{className:"mb-1 flex items-center gap-1 text-[10px] font-bold uppercase tracking-wider text-muted-foreground/60",children:[$.jsx(yo,{className:"h-3 w-3"})," ",Zh[w]??w]}),$.jsx("div",{className:"space-y-0.5",children:_.map(v=>$.jsxs("button",{onClick:()=>i(v.path),className:Ae("flex w-full items-center gap-1.5 rounded-lg px-2 py-1.5 text-left text-xs transition-all cursor-pointer",r===v.path?"bg-primary/15 text-primary":"text-muted-foreground hover:bg-accent hover:text-foreground"),children:[$.jsx(co,{className:"h-3.5 w-3.5 shrink-0"}),$.jsx("span",{className:"truncate",title:v.title,children:v.name}),v.neu&&$.jsxs("span",{className:"ml-auto flex items-center gap-0.5 rounded bg-violet-500/15 px-1 py-0.5 text-[8px] font-bold uppercase text-violet-300",children:[$.jsx(fo,{className:"h-2.5 w-2.5"}),"neu"]})]},v.path))})]},w||"__root"))})]}),$.jsx("div",{className:"min-w-0 flex-1 mc-card p-5",children:s?$.jsxs("div",{className:"flex items-center gap-2 text-xs text-muted-foreground",children:[$.jsx(Ke,{className:"h-4 w-4 animate-spin"})," Notiz wird geladen …"]}):o?$.jsxs($.Fragment,{children:[$.jsxs("div",{className:"mb-3 flex items-center justify-between border-b border-border/40 pb-2",children:[$.jsxs("span",{className:"flex items-center gap-1.5 font-mono text-[11px] text-muted-foreground",children:[$.jsx(ho,{className:"h-3.5 w-3.5"})," ",o.path]}),o.mtime>0&&$.jsxs("span",{className:"text-[10px] text-muted-foreground/60",children:["Stand ",new Date(o.mtime*1e3).toLocaleString("de-DE",{day:"2-digit",month:"2-digit",hour:"2-digit",minute:"2-digit"})]})]}),$.jsx(Kh,{text:o.content,onWikiLink:k,known:x})]}):null})]})]})}function Kh({text:e,onWikiLink:n,known:r}){const i=e.split(` `),o=[];let a=[],s=null;const u=c=>{a.length&&(o.push($.jsx("ul",{className:"mb-3 ml-4 list-disc space-y-1",children:a},c)),a=[])};return i.forEach((c,l)=>{const f=`l${l}`;if(s!==null){c.trimEnd()==="```"?(o.push($.jsx("pre",{className:"mb-3 overflow-x-auto rounded-xl border border-border/50 bg-background/50 p-3 font-mono text-[11px] leading-relaxed text-foreground/85",children:s.join(` `)},f)),s=null):s.push(c);return}if(c.trimStart().startsWith("```")){u(f),s=[];return}const h=c.trimEnd();if(!h.trim()){u(f);return}const d=h.match(/^(#{1,4})\s+(.*)$/);if(d){u(f);const y=d[1].length,x=y===1?"text-lg font-bold mt-1 mb-3":y===2?"text-base font-bold mt-4 mb-2":"text-sm font-bold mt-3 mb-1.5";o.push($.jsx("p",{className:Ae(x,"font-space text-foreground"),children:cn(d[2],n,r,f)},f));return}const p=h.match(/^\s*[-*•]\s+(.*)$/);if(p){a.push($.jsx("li",{className:"text-xs leading-relaxed text-foreground/85",children:cn(p[1],n,r,f)},f));return}u(f),o.push($.jsx("p",{className:"mb-2 text-xs leading-relaxed text-foreground/85",children:cn(h,n,r,f)},f))}),u("end"),s!==null&&o.push($.jsx("pre",{className:"mb-3 overflow-x-auto rounded-xl border border-border/50 bg-background/50 p-3 font-mono text-[11px]",children:s.join(` `)},"code-end")),$.jsx("div",{className:"max-w-3xl",children:o})}function cn(e,n,r,i){return e.split(/(\[\[[^\]]+\]\]|\*\*[^*]+\*\*|\*[^*]+\*|`[^`]+`)/g).map((a,s)=>{const u=`${i}-${s}`,c=a.match(/^\[\[([^\]|]+)(?:\|([^\]]+))?\]\]$/);if(c){const l=c[1].trim(),f=(c[2]??c[1]).trim();return r.has(l.toLowerCase())?$.jsx("button",{onClick:()=>n(l),className:"rounded bg-primary/10 px-1 text-primary underline decoration-primary/40 underline-offset-2 hover:bg-primary/20 cursor-pointer",children:f},u):$.jsx("span",{className:"rounded bg-background/40 px-1 text-muted-foreground",title:"Notiz existiert (noch) nicht",children:f},u)}return a.startsWith("**")&&a.endsWith("**")?$.jsx("b",{className:"font-semibold text-foreground",children:a.slice(2,-2)},u):a.startsWith("*")&&a.endsWith("*")&&a.length>2?$.jsx("i",{children:a.slice(1,-1)},u):a.startsWith("`")&&a.endsWith("`")?$.jsx("code",{className:"rounded bg-background/50 px-1 font-mono text-[11px] text-teal-300",children:a.slice(1,-1)},u):$.jsx("span",{children:a},u)})}export{ed as WissenView}; diff --git a/frontend/dist/assets/chevron-down-C-RXUrpR.js b/frontend/dist/assets/chevron-down-D5zhK_UQ.js similarity index 85% rename from frontend/dist/assets/chevron-down-C-RXUrpR.js rename to frontend/dist/assets/chevron-down-D5zhK_UQ.js index 7081b56..29006c3 100644 --- a/frontend/dist/assets/chevron-down-C-RXUrpR.js +++ b/frontend/dist/assets/chevron-down-D5zhK_UQ.js @@ -1,4 +1,4 @@ -import{c as o}from"./index-B57enqf6.js";/** +import{c as o}from"./index-BYlMs6Dj.js";/** * @license lucide-react v0.460.0 - ISC * * This source code is licensed under the ISC license. diff --git a/frontend/dist/assets/code-xml-ID_kOxxM.js b/frontend/dist/assets/code-xml-DZ6lLr-w.js similarity index 88% rename from frontend/dist/assets/code-xml-ID_kOxxM.js rename to frontend/dist/assets/code-xml-DZ6lLr-w.js index 3d26e1f..473b24e 100644 --- a/frontend/dist/assets/code-xml-ID_kOxxM.js +++ b/frontend/dist/assets/code-xml-DZ6lLr-w.js @@ -1,4 +1,4 @@ -import{c as e}from"./index-B57enqf6.js";/** +import{c as e}from"./index-BYlMs6Dj.js";/** * @license lucide-react v0.460.0 - ISC * * This source code is licensed under the ISC license. diff --git a/frontend/dist/assets/index-8N0vA58P.css b/frontend/dist/assets/index-8N0vA58P.css new file mode 100644 index 0000000..53a7e0a --- /dev/null +++ b/frontend/dist/assets/index-8N0vA58P.css @@ -0,0 +1 @@ +/*! tailwindcss v4.3.1 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-pan-x:initial;--tw-pan-y:initial;--tw-pinch-zoom:initial;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-divide-x-reverse:0;--tw-border-style:solid;--tw-divide-y-reverse:0;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial}}}@layer theme{:root,:host{--font-sans:"Inter", ui-sans-serif, system-ui, -apple-system, sans-serif;--color-red-200:oklch(88.5% .062 18.334);--color-red-300:oklch(80.8% .114 19.571);--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-orange-300:oklch(83.7% .128 66.29);--color-orange-500:oklch(70.5% .213 47.604);--color-amber-200:oklch(92.4% .12 95.746);--color-amber-300:oklch(87.9% .169 91.605);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-500:oklch(76.9% .188 70.08);--color-lime-400:oklch(84.1% .238 128.85);--color-lime-500:oklch(76.8% .233 130.85);--color-emerald-300:oklch(84.5% .143 164.978);--color-emerald-400:oklch(76.5% .177 163.223);--color-emerald-500:oklch(69.6% .17 162.48);--color-emerald-600:oklch(59.6% .145 163.225);--color-teal-300:oklch(85.5% .138 181.071);--color-teal-400:oklch(77.7% .152 181.912);--color-teal-500:oklch(70.4% .14 182.503);--color-cyan-200:oklch(91.7% .08 205.041);--color-cyan-300:oklch(86.5% .127 207.078);--color-cyan-400:oklch(78.9% .154 211.53);--color-cyan-500:oklch(71.5% .143 215.221);--color-sky-200:oklch(90.1% .058 230.902);--color-sky-300:oklch(82.8% .111 230.318);--color-sky-400:oklch(74.6% .16 232.661);--color-sky-500:oklch(68.5% .169 237.323);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-500:oklch(62.3% .214 259.815);--color-indigo-300:oklch(78.5% .115 274.713);--color-indigo-400:oklch(67.3% .182 276.935);--color-indigo-500:oklch(58.5% .233 277.117);--color-violet-200:oklch(89.4% .057 293.283);--color-violet-300:oklch(81.1% .111 293.571);--color-violet-400:oklch(70.2% .183 293.541);--color-violet-500:oklch(60.6% .25 292.717);--color-purple-300:oklch(82.7% .119 306.383);--color-purple-500:oklch(62.7% .265 303.9);--color-fuchsia-300:oklch(83.3% .145 321.434);--color-fuchsia-400:oklch(74% .238 322.16);--color-fuchsia-500:oklch(66.7% .295 322.15);--color-pink-300:oklch(82.3% .12 346.018);--color-pink-400:oklch(71.8% .202 349.761);--color-pink-500:oklch(65.6% .241 354.308);--color-rose-300:oklch(81% .117 11.638);--color-rose-400:oklch(71.2% .194 13.428);--color-rose-500:oklch(64.5% .246 16.439);--color-slate-300:oklch(86.9% .022 252.894);--color-slate-400:oklch(70.4% .04 256.788);--color-slate-500:oklch(55.4% .046 257.417);--color-neutral-200:oklch(92.2% 0 0);--color-neutral-400:oklch(70.8% 0 0);--color-neutral-700:oklch(37.1% 0 0);--color-neutral-800:oklch(26.9% 0 0);--color-neutral-950:oklch(14.5% 0 0);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-2xl:42rem;--container-3xl:48rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height: 1.2 ;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-normal:0em;--tracking-wide:.025em;--tracking-wider:.05em;--tracking-widest:.1em;--leading-tight:1.25;--leading-normal:1.5;--leading-relaxed:1.625;--radius-xl:.75rem;--radius-2xl:1rem;--ease-in:cubic-bezier(.4, 0, 1, 1);--ease-out:cubic-bezier(0, 0, .2, 1);--ease-in-out:cubic-bezier(.4, 0, .2, 1);--animate-spin:spin 1s linear infinite;--animate-ping:ping 1s cubic-bezier(0, 0, .2, 1) infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--blur-sm:8px;--blur-md:12px;--blur-xl:24px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:"Inter", ui-sans-serif, system-ui, -apple-system, sans-serif;--default-mono-font-family:"JetBrains Mono", ui-monospace, SFMono-Regular, monospace}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.not-sr-only{clip-path:none;white-space:normal;width:auto;height:auto;margin:0;padding:0;position:static;overflow:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.inset-y-0{inset-block:0}.top-0{top:0}.top-1\/2{top:50%}.top-2\.5{top:calc(var(--spacing) * 2.5)}.top-3{top:calc(var(--spacing) * 3)}.top-4{top:calc(var(--spacing) * 4)}.right-0{right:0}.right-3{right:calc(var(--spacing) * 3)}.bottom-3{bottom:calc(var(--spacing) * 3)}.-left-\[23px\]{left:-23px}.left-0{left:0}.left-2{left:calc(var(--spacing) * 2)}.left-2\.5{left:calc(var(--spacing) * 2.5)}.left-3{left:calc(var(--spacing) * 3)}.isolate{isolation:isolate}.isolation-auto{isolation:auto}.-z-50{z-index:-50}.z-10{z-index:10}.z-50{z-index:50}.z-\[60\]{z-index:60}.z-\[99\]{z-index:99}.col-span-full{grid-column:1/-1}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.-mx-1{margin-inline:calc(var(--spacing) * -1)}.mx-auto{margin-inline:auto}.my-3{margin-block:calc(var(--spacing) * 3)}.-mt-1{margin-top:calc(var(--spacing) * -1)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-2\.5{margin-top:calc(var(--spacing) * 2.5)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-3\.5{margin-top:calc(var(--spacing) * 3.5)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-5{margin-top:calc(var(--spacing) * 5)}.mt-auto{margin-top:auto}.mt-px{margin-top:1px}.mr-0\.5{margin-right:calc(var(--spacing) * .5)}.mr-2{margin-right:calc(var(--spacing) * 2)}.mb-1{margin-bottom:var(--spacing)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.-ml-1{margin-left:calc(var(--spacing) * -1)}.ml-0\.5{margin-left:calc(var(--spacing) * .5)}.ml-1{margin-left:var(--spacing)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-4{margin-left:calc(var(--spacing) * 4)}.ml-auto{margin-left:auto}.line-clamp-6{-webkit-line-clamp:6;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.contents{display:contents}.flex{display:flex}.flow-root{display:flow-root}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.inline-grid{display:inline-grid}.inline-table{display:inline-table}.list-item{display:list-item}.table{display:table}.table-caption{display:table-caption}.table-cell{display:table-cell}.table-column{display:table-column}.table-column-group{display:table-column-group}.table-footer-group{display:table-footer-group}.table-header-group{display:table-header-group}.table-row{display:table-row}.table-row-group{display:table-row-group}.h-1{height:var(--spacing)}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.h-3{height:calc(var(--spacing) * 3)}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-4\.5{height:calc(var(--spacing) * 4.5)}.h-5{height:calc(var(--spacing) * 5)}.h-5\.5{height:calc(var(--spacing) * 5.5)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-11{height:calc(var(--spacing) * 11)}.h-12{height:calc(var(--spacing) * 12)}.h-14{height:calc(var(--spacing) * 14)}.h-16{height:calc(var(--spacing) * 16)}.h-24{height:calc(var(--spacing) * 24)}.h-32{height:calc(var(--spacing) * 32)}.h-44{height:calc(var(--spacing) * 44)}.h-64{height:calc(var(--spacing) * 64)}.h-\[70vh\]{height:70vh}.h-\[120px\]{height:120px}.h-\[150px\]{height:150px}.h-\[480px\]{height:480px}.h-full{height:100%}.h-px{height:1px}.max-h-36{max-height:calc(var(--spacing) * 36)}.max-h-56{max-height:calc(var(--spacing) * 56)}.max-h-60{max-height:calc(var(--spacing) * 60)}.max-h-64{max-height:calc(var(--spacing) * 64)}.max-h-72{max-height:calc(var(--spacing) * 72)}.max-h-80{max-height:calc(var(--spacing) * 80)}.max-h-96{max-height:calc(var(--spacing) * 96)}.max-h-\[28rem\]{max-height:28rem}.max-h-\[60vh\]{max-height:60vh}.max-h-\[70vh\]{max-height:70vh}.max-h-\[80vh\]{max-height:80vh}.min-h-\[16rem\]{min-height:16rem}.min-h-\[58vh\]{min-height:58vh}.min-h-\[300px\]{min-height:300px}.min-h-screen{min-height:100vh}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-2{width:calc(var(--spacing) * 2)}.w-2\.5{width:calc(var(--spacing) * 2.5)}.w-3{width:calc(var(--spacing) * 3)}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-4{width:calc(var(--spacing) * 4)}.w-4\.5{width:calc(var(--spacing) * 4.5)}.w-5{width:calc(var(--spacing) * 5)}.w-5\.5{width:calc(var(--spacing) * 5.5)}.w-6{width:calc(var(--spacing) * 6)}.w-7{width:calc(var(--spacing) * 7)}.w-8{width:calc(var(--spacing) * 8)}.w-9{width:calc(var(--spacing) * 9)}.w-10{width:calc(var(--spacing) * 10)}.w-11{width:calc(var(--spacing) * 11)}.w-12{width:calc(var(--spacing) * 12)}.w-14{width:calc(var(--spacing) * 14)}.w-16{width:calc(var(--spacing) * 16)}.w-20{width:calc(var(--spacing) * 20)}.w-24{width:calc(var(--spacing) * 24)}.w-60{width:calc(var(--spacing) * 60)}.w-72{width:calc(var(--spacing) * 72)}.w-fit{width:fit-content}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-3xl{max-width:var(--container-3xl)}.max-w-\[16rem\]{max-width:16rem}.max-w-\[85vw\]{max-width:85vw}.max-w-\[250px\]{max-width:250px}.max-w-\[280px\]{max-width:280px}.max-w-lg{max-width:var(--container-lg)}.max-w-md{max-width:var(--container-md)}.max-w-sm{max-width:var(--container-sm)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:0}.min-w-\[2\.5rem\]{min-width:2.5rem}.min-w-\[2rem\]{min-width:2rem}.min-w-\[3ch\]{min-width:3ch}.min-w-\[680px\]{min-width:680px}.flex-1{flex:1}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.border-collapse{border-collapse:collapse}.-translate-x-full{--tw-translate-x:-100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-0{--tw-translate-x:0;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-full{--tw-translate-x:100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-ping{animation:var(--animate-ping)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.touch-pinch-zoom{--tw-pinch-zoom:pinch-zoom;touch-action:var(--tw-pan-x,) var(--tw-pan-y,) var(--tw-pinch-zoom,)}.resize{resize:both}.scroll-mt-20{scroll-margin-top:calc(var(--spacing) * 20)}.scrollbar-thin{scrollbar-width:thin}.list-disc{list-style-type:disc}.list-none{list-style-type:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-6{gap:calc(var(--spacing) * 6)}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-7>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 7) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 7) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 8) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 8) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-reverse>:not(:last-child)){--tw-space-y-reverse:1}.gap-x-2{column-gap:calc(var(--spacing) * 2)}.gap-x-3{column-gap:calc(var(--spacing) * 3)}.gap-x-4{column-gap:calc(var(--spacing) * 4)}:where(.space-x-reverse>:not(:last-child)){--tw-space-x-reverse:1}.gap-y-1{row-gap:var(--spacing)}.gap-y-1\.5{row-gap:calc(var(--spacing) * 1.5)}.gap-y-2{row-gap:calc(var(--spacing) * 2)}:where(.divide-x>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px * var(--tw-divide-x-reverse));border-inline-end-width:calc(1px * calc(1 - var(--tw-divide-x-reverse)))}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-y-reverse>:not(:last-child)){--tw-divide-y-reverse:1}:where(.divide-border\/20>:not(:last-child)){border-color:hsl(var(--border))}@supports (color:color-mix(in lab,red,red)){:where(.divide-border\/20>:not(:last-child)){border-color:color-mix(in oklab,hsl(var(--border)) 20%,transparent)}}.self-start{align-self:flex-start}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overscroll-contain{overscroll-behavior:contain}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-sm{border-radius:calc(var(--radius) - 4px)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-s{border-start-start-radius:.25rem;border-end-start-radius:.25rem}.rounded-ss{border-start-start-radius:.25rem}.rounded-e{border-start-end-radius:.25rem;border-end-end-radius:.25rem}.rounded-se{border-start-end-radius:.25rem}.rounded-ee{border-end-end-radius:.25rem}.rounded-es{border-end-start-radius:.25rem}.rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.rounded-l{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.rounded-tl{border-top-left-radius:.25rem}.rounded-r{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.rounded-tr{border-top-right-radius:.25rem}.rounded-b{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.rounded-br{border-bottom-right-radius:.25rem}.rounded-bl{border-bottom-left-radius:.25rem}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-x{border-inline-style:var(--tw-border-style);border-inline-width:1px}.border-y{border-block-style:var(--tw-border-style);border-block-width:1px}.border-s{border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.border-e{border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-t-2{border-top-style:var(--tw-border-style);border-top-width:2px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-amber-500\/20{border-color:#f99c0033}@supports (color:color-mix(in lab,red,red)){.border-amber-500\/20{border-color:color-mix(in oklab,var(--color-amber-500) 20%,transparent)}}.border-amber-500\/25{border-color:#f99c0040}@supports (color:color-mix(in lab,red,red)){.border-amber-500\/25{border-color:color-mix(in oklab,var(--color-amber-500) 25%,transparent)}}.border-amber-500\/30{border-color:#f99c004d}@supports (color:color-mix(in lab,red,red)){.border-amber-500\/30{border-color:color-mix(in oklab,var(--color-amber-500) 30%,transparent)}}.border-amber-500\/40{border-color:#f99c0066}@supports (color:color-mix(in lab,red,red)){.border-amber-500\/40{border-color:color-mix(in oklab,var(--color-amber-500) 40%,transparent)}}.border-amber-500\/50{border-color:#f99c0080}@supports (color:color-mix(in lab,red,red)){.border-amber-500\/50{border-color:color-mix(in oklab,var(--color-amber-500) 50%,transparent)}}.border-blue-500\/30{border-color:#3080ff4d}@supports (color:color-mix(in lab,red,red)){.border-blue-500\/30{border-color:color-mix(in oklab,var(--color-blue-500) 30%,transparent)}}.border-border,.border-border\/20{border-color:hsl(var(--border))}@supports (color:color-mix(in lab,red,red)){.border-border\/20{border-color:color-mix(in oklab,hsl(var(--border)) 20%,transparent)}}.border-border\/30{border-color:hsl(var(--border))}@supports (color:color-mix(in lab,red,red)){.border-border\/30{border-color:color-mix(in oklab,hsl(var(--border)) 30%,transparent)}}.border-border\/40{border-color:hsl(var(--border))}@supports (color:color-mix(in lab,red,red)){.border-border\/40{border-color:color-mix(in oklab,hsl(var(--border)) 40%,transparent)}}.border-border\/50{border-color:hsl(var(--border))}@supports (color:color-mix(in lab,red,red)){.border-border\/50{border-color:color-mix(in oklab,hsl(var(--border)) 50%,transparent)}}.border-border\/60{border-color:hsl(var(--border))}@supports (color:color-mix(in lab,red,red)){.border-border\/60{border-color:color-mix(in oklab,hsl(var(--border)) 60%,transparent)}}.border-border\/70{border-color:hsl(var(--border))}@supports (color:color-mix(in lab,red,red)){.border-border\/70{border-color:color-mix(in oklab,hsl(var(--border)) 70%,transparent)}}.border-border\/80{border-color:hsl(var(--border))}@supports (color:color-mix(in lab,red,red)){.border-border\/80{border-color:color-mix(in oklab,hsl(var(--border)) 80%,transparent)}}.border-cyan-500\/20{border-color:#00b7d733}@supports (color:color-mix(in lab,red,red)){.border-cyan-500\/20{border-color:color-mix(in oklab,var(--color-cyan-500) 20%,transparent)}}.border-cyan-500\/25{border-color:#00b7d740}@supports (color:color-mix(in lab,red,red)){.border-cyan-500\/25{border-color:color-mix(in oklab,var(--color-cyan-500) 25%,transparent)}}.border-cyan-500\/30{border-color:#00b7d74d}@supports (color:color-mix(in lab,red,red)){.border-cyan-500\/30{border-color:color-mix(in oklab,var(--color-cyan-500) 30%,transparent)}}.border-emerald-500\/10{border-color:#00bb7f1a}@supports (color:color-mix(in lab,red,red)){.border-emerald-500\/10{border-color:color-mix(in oklab,var(--color-emerald-500) 10%,transparent)}}.border-emerald-500\/20{border-color:#00bb7f33}@supports (color:color-mix(in lab,red,red)){.border-emerald-500\/20{border-color:color-mix(in oklab,var(--color-emerald-500) 20%,transparent)}}.border-emerald-500\/25{border-color:#00bb7f40}@supports (color:color-mix(in lab,red,red)){.border-emerald-500\/25{border-color:color-mix(in oklab,var(--color-emerald-500) 25%,transparent)}}.border-emerald-500\/30{border-color:#00bb7f4d}@supports (color:color-mix(in lab,red,red)){.border-emerald-500\/30{border-color:color-mix(in oklab,var(--color-emerald-500) 30%,transparent)}}.border-emerald-500\/40{border-color:#00bb7f66}@supports (color:color-mix(in lab,red,red)){.border-emerald-500\/40{border-color:color-mix(in oklab,var(--color-emerald-500) 40%,transparent)}}.border-fuchsia-500\/25{border-color:#e12afb40}@supports (color:color-mix(in lab,red,red)){.border-fuchsia-500\/25{border-color:color-mix(in oklab,var(--color-fuchsia-500) 25%,transparent)}}.border-fuchsia-500\/30{border-color:#e12afb4d}@supports (color:color-mix(in lab,red,red)){.border-fuchsia-500\/30{border-color:color-mix(in oklab,var(--color-fuchsia-500) 30%,transparent)}}.border-indigo-500\/25{border-color:#625fff40}@supports (color:color-mix(in lab,red,red)){.border-indigo-500\/25{border-color:color-mix(in oklab,var(--color-indigo-500) 25%,transparent)}}.border-indigo-500\/40{border-color:#625fff66}@supports (color:color-mix(in lab,red,red)){.border-indigo-500\/40{border-color:color-mix(in oklab,var(--color-indigo-500) 40%,transparent)}}.border-lime-500\/25{border-color:#80cd0040}@supports (color:color-mix(in lab,red,red)){.border-lime-500\/25{border-color:color-mix(in oklab,var(--color-lime-500) 25%,transparent)}}.border-neutral-700{border-color:var(--color-neutral-700)}.border-orange-500\/30{border-color:#fe6e004d}@supports (color:color-mix(in lab,red,red)){.border-orange-500\/30{border-color:color-mix(in oklab,var(--color-orange-500) 30%,transparent)}}.border-pink-500\/25{border-color:#f6339a40}@supports (color:color-mix(in lab,red,red)){.border-pink-500\/25{border-color:color-mix(in oklab,var(--color-pink-500) 25%,transparent)}}.border-pink-500\/40{border-color:#f6339a66}@supports (color:color-mix(in lab,red,red)){.border-pink-500\/40{border-color:color-mix(in oklab,var(--color-pink-500) 40%,transparent)}}.border-primary,.border-primary\/20{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.border-primary\/20{border-color:color-mix(in oklab,hsl(var(--primary)) 20%,transparent)}}.border-primary\/25{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.border-primary\/25{border-color:color-mix(in oklab,hsl(var(--primary)) 25%,transparent)}}.border-primary\/30{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.border-primary\/30{border-color:color-mix(in oklab,hsl(var(--primary)) 30%,transparent)}}.border-primary\/40{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.border-primary\/40{border-color:color-mix(in oklab,hsl(var(--primary)) 40%,transparent)}}.border-primary\/50{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.border-primary\/50{border-color:color-mix(in oklab,hsl(var(--primary)) 50%,transparent)}}.border-primary\/60{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.border-primary\/60{border-color:color-mix(in oklab,hsl(var(--primary)) 60%,transparent)}}.border-purple-500\/30{border-color:#ac4bff4d}@supports (color:color-mix(in lab,red,red)){.border-purple-500\/30{border-color:color-mix(in oklab,var(--color-purple-500) 30%,transparent)}}.border-red-500\/20{border-color:#fb2c3633}@supports (color:color-mix(in lab,red,red)){.border-red-500\/20{border-color:color-mix(in oklab,var(--color-red-500) 20%,transparent)}}.border-red-500\/25{border-color:#fb2c3640}@supports (color:color-mix(in lab,red,red)){.border-red-500\/25{border-color:color-mix(in oklab,var(--color-red-500) 25%,transparent)}}.border-red-500\/30{border-color:#fb2c364d}@supports (color:color-mix(in lab,red,red)){.border-red-500\/30{border-color:color-mix(in oklab,var(--color-red-500) 30%,transparent)}}.border-red-500\/40{border-color:#fb2c3666}@supports (color:color-mix(in lab,red,red)){.border-red-500\/40{border-color:color-mix(in oklab,var(--color-red-500) 40%,transparent)}}.border-red-500\/50{border-color:#fb2c3680}@supports (color:color-mix(in lab,red,red)){.border-red-500\/50{border-color:color-mix(in oklab,var(--color-red-500) 50%,transparent)}}.border-red-500\/60{border-color:#fb2c3699}@supports (color:color-mix(in lab,red,red)){.border-red-500\/60{border-color:color-mix(in oklab,var(--color-red-500) 60%,transparent)}}.border-sky-500\/25{border-color:#00a5ef40}@supports (color:color-mix(in lab,red,red)){.border-sky-500\/25{border-color:color-mix(in oklab,var(--color-sky-500) 25%,transparent)}}.border-sky-500\/30{border-color:#00a5ef4d}@supports (color:color-mix(in lab,red,red)){.border-sky-500\/30{border-color:color-mix(in oklab,var(--color-sky-500) 30%,transparent)}}.border-sky-500\/40{border-color:#00a5ef66}@supports (color:color-mix(in lab,red,red)){.border-sky-500\/40{border-color:color-mix(in oklab,var(--color-sky-500) 40%,transparent)}}.border-slate-500\/25{border-color:#62748e40}@supports (color:color-mix(in lab,red,red)){.border-slate-500\/25{border-color:color-mix(in oklab,var(--color-slate-500) 25%,transparent)}}.border-slate-500\/30{border-color:#62748e4d}@supports (color:color-mix(in lab,red,red)){.border-slate-500\/30{border-color:color-mix(in oklab,var(--color-slate-500) 30%,transparent)}}.border-teal-500\/25{border-color:#00baa740}@supports (color:color-mix(in lab,red,red)){.border-teal-500\/25{border-color:color-mix(in oklab,var(--color-teal-500) 25%,transparent)}}.border-transparent{border-color:#0000}.border-violet-500\/20{border-color:#8d54ff33}@supports (color:color-mix(in lab,red,red)){.border-violet-500\/20{border-color:color-mix(in oklab,var(--color-violet-500) 20%,transparent)}}.border-violet-500\/25{border-color:#8d54ff40}@supports (color:color-mix(in lab,red,red)){.border-violet-500\/25{border-color:color-mix(in oklab,var(--color-violet-500) 25%,transparent)}}.border-violet-500\/30{border-color:#8d54ff4d}@supports (color:color-mix(in lab,red,red)){.border-violet-500\/30{border-color:color-mix(in oklab,var(--color-violet-500) 30%,transparent)}}.border-violet-500\/40{border-color:#8d54ff66}@supports (color:color-mix(in lab,red,red)){.border-violet-500\/40{border-color:color-mix(in oklab,var(--color-violet-500) 40%,transparent)}}.border-t-emerald-500\/70{border-top-color:#00bb7fb3}@supports (color:color-mix(in lab,red,red)){.border-t-emerald-500\/70{border-top-color:color-mix(in oklab,var(--color-emerald-500) 70%,transparent)}}.border-t-primary\/70{border-top-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.border-t-primary\/70{border-top-color:color-mix(in oklab,hsl(var(--primary)) 70%,transparent)}}.bg-\[hsl\(224\,28\%\,8\%\)\]{background-color:#0f121a}.bg-amber-400{background-color:var(--color-amber-400)}.bg-amber-500{background-color:var(--color-amber-500)}.bg-amber-500\/5{background-color:#f99c000d}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/5{background-color:color-mix(in oklab,var(--color-amber-500) 5%,transparent)}}.bg-amber-500\/10{background-color:#f99c001a}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/10{background-color:color-mix(in oklab,var(--color-amber-500) 10%,transparent)}}.bg-amber-500\/15{background-color:#f99c0026}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/15{background-color:color-mix(in oklab,var(--color-amber-500) 15%,transparent)}}.bg-amber-500\/20{background-color:#f99c0033}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/20{background-color:color-mix(in oklab,var(--color-amber-500) 20%,transparent)}}.bg-amber-500\/80{background-color:#f99c00cc}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/80{background-color:color-mix(in oklab,var(--color-amber-500) 80%,transparent)}}.bg-amber-500\/\[0\.06\]{background-color:#f99c000f}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/\[0\.06\]{background-color:color-mix(in oklab,var(--color-amber-500) 6%,transparent)}}.bg-background\/10{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.bg-background\/10{background-color:color-mix(in oklab,hsl(var(--background)) 10%,transparent)}}.bg-background\/20{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.bg-background\/20{background-color:color-mix(in oklab,hsl(var(--background)) 20%,transparent)}}.bg-background\/25{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.bg-background\/25{background-color:color-mix(in oklab,hsl(var(--background)) 25%,transparent)}}.bg-background\/30{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.bg-background\/30{background-color:color-mix(in oklab,hsl(var(--background)) 30%,transparent)}}.bg-background\/35{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.bg-background\/35{background-color:color-mix(in oklab,hsl(var(--background)) 35%,transparent)}}.bg-background\/40{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.bg-background\/40{background-color:color-mix(in oklab,hsl(var(--background)) 40%,transparent)}}.bg-background\/50{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.bg-background\/50{background-color:color-mix(in oklab,hsl(var(--background)) 50%,transparent)}}.bg-background\/60{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.bg-background\/60{background-color:color-mix(in oklab,hsl(var(--background)) 60%,transparent)}}.bg-black\/10{background-color:#0000001a}@supports (color:color-mix(in lab,red,red)){.bg-black\/10{background-color:color-mix(in oklab,var(--color-black) 10%,transparent)}}.bg-black\/30{background-color:#0000004d}@supports (color:color-mix(in lab,red,red)){.bg-black\/30{background-color:color-mix(in oklab,var(--color-black) 30%,transparent)}}.bg-black\/40{background-color:#0006}@supports (color:color-mix(in lab,red,red)){.bg-black\/40{background-color:color-mix(in oklab,var(--color-black) 40%,transparent)}}.bg-black\/50{background-color:#00000080}@supports (color:color-mix(in lab,red,red)){.bg-black\/50{background-color:color-mix(in oklab,var(--color-black) 50%,transparent)}}.bg-black\/60{background-color:#0009}@supports (color:color-mix(in lab,red,red)){.bg-black\/60{background-color:color-mix(in oklab,var(--color-black) 60%,transparent)}}.bg-black\/70{background-color:#000000b3}@supports (color:color-mix(in lab,red,red)){.bg-black\/70{background-color:color-mix(in oklab,var(--color-black) 70%,transparent)}}.bg-blue-500\/20{background-color:#3080ff33}@supports (color:color-mix(in lab,red,red)){.bg-blue-500\/20{background-color:color-mix(in oklab,var(--color-blue-500) 20%,transparent)}}.bg-border,.bg-border\/40{background-color:hsl(var(--border))}@supports (color:color-mix(in lab,red,red)){.bg-border\/40{background-color:color-mix(in oklab,hsl(var(--border)) 40%,transparent)}}.bg-card,.bg-card\/20{background-color:hsl(var(--card))}@supports (color:color-mix(in lab,red,red)){.bg-card\/20{background-color:color-mix(in oklab,hsl(var(--card)) 20%,transparent)}}.bg-card\/30{background-color:hsl(var(--card))}@supports (color:color-mix(in lab,red,red)){.bg-card\/30{background-color:color-mix(in oklab,hsl(var(--card)) 30%,transparent)}}.bg-card\/40{background-color:hsl(var(--card))}@supports (color:color-mix(in lab,red,red)){.bg-card\/40{background-color:color-mix(in oklab,hsl(var(--card)) 40%,transparent)}}.bg-card\/45{background-color:hsl(var(--card))}@supports (color:color-mix(in lab,red,red)){.bg-card\/45{background-color:color-mix(in oklab,hsl(var(--card)) 45%,transparent)}}.bg-card\/70{background-color:hsl(var(--card))}@supports (color:color-mix(in lab,red,red)){.bg-card\/70{background-color:color-mix(in oklab,hsl(var(--card)) 70%,transparent)}}.bg-card\/85{background-color:hsl(var(--card))}@supports (color:color-mix(in lab,red,red)){.bg-card\/85{background-color:color-mix(in oklab,hsl(var(--card)) 85%,transparent)}}.bg-cyan-500{background-color:var(--color-cyan-500)}.bg-cyan-500\/10{background-color:#00b7d71a}@supports (color:color-mix(in lab,red,red)){.bg-cyan-500\/10{background-color:color-mix(in oklab,var(--color-cyan-500) 10%,transparent)}}.bg-cyan-500\/15{background-color:#00b7d726}@supports (color:color-mix(in lab,red,red)){.bg-cyan-500\/15{background-color:color-mix(in oklab,var(--color-cyan-500) 15%,transparent)}}.bg-cyan-500\/20{background-color:#00b7d733}@supports (color:color-mix(in lab,red,red)){.bg-cyan-500\/20{background-color:color-mix(in oklab,var(--color-cyan-500) 20%,transparent)}}.bg-emerald-400{background-color:var(--color-emerald-400)}.bg-emerald-500{background-color:var(--color-emerald-500)}.bg-emerald-500\/5{background-color:#00bb7f0d}@supports (color:color-mix(in lab,red,red)){.bg-emerald-500\/5{background-color:color-mix(in oklab,var(--color-emerald-500) 5%,transparent)}}.bg-emerald-500\/10{background-color:#00bb7f1a}@supports (color:color-mix(in lab,red,red)){.bg-emerald-500\/10{background-color:color-mix(in oklab,var(--color-emerald-500) 10%,transparent)}}.bg-emerald-500\/15{background-color:#00bb7f26}@supports (color:color-mix(in lab,red,red)){.bg-emerald-500\/15{background-color:color-mix(in oklab,var(--color-emerald-500) 15%,transparent)}}.bg-emerald-500\/20{background-color:#00bb7f33}@supports (color:color-mix(in lab,red,red)){.bg-emerald-500\/20{background-color:color-mix(in oklab,var(--color-emerald-500) 20%,transparent)}}.bg-emerald-500\/80{background-color:#00bb7fcc}@supports (color:color-mix(in lab,red,red)){.bg-emerald-500\/80{background-color:color-mix(in oklab,var(--color-emerald-500) 80%,transparent)}}.bg-foreground\/10{background-color:hsl(var(--foreground))}@supports (color:color-mix(in lab,red,red)){.bg-foreground\/10{background-color:color-mix(in oklab,hsl(var(--foreground)) 10%,transparent)}}.bg-fuchsia-500{background-color:var(--color-fuchsia-500)}.bg-fuchsia-500\/10{background-color:#e12afb1a}@supports (color:color-mix(in lab,red,red)){.bg-fuchsia-500\/10{background-color:color-mix(in oklab,var(--color-fuchsia-500) 10%,transparent)}}.bg-fuchsia-500\/15{background-color:#e12afb26}@supports (color:color-mix(in lab,red,red)){.bg-fuchsia-500\/15{background-color:color-mix(in oklab,var(--color-fuchsia-500) 15%,transparent)}}.bg-indigo-500{background-color:var(--color-indigo-500)}.bg-indigo-500\/10{background-color:#625fff1a}@supports (color:color-mix(in lab,red,red)){.bg-indigo-500\/10{background-color:color-mix(in oklab,var(--color-indigo-500) 10%,transparent)}}.bg-indigo-500\/15{background-color:#625fff26}@supports (color:color-mix(in lab,red,red)){.bg-indigo-500\/15{background-color:color-mix(in oklab,var(--color-indigo-500) 15%,transparent)}}.bg-lime-500{background-color:var(--color-lime-500)}.bg-lime-500\/15{background-color:#80cd0026}@supports (color:color-mix(in lab,red,red)){.bg-lime-500\/15{background-color:color-mix(in oklab,var(--color-lime-500) 15%,transparent)}}.bg-muted{background-color:hsl(var(--muted))}.bg-muted-foreground\/30{background-color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.bg-muted-foreground\/30{background-color:color-mix(in oklab,hsl(var(--muted-foreground)) 30%,transparent)}}.bg-muted-foreground\/40{background-color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.bg-muted-foreground\/40{background-color:color-mix(in oklab,hsl(var(--muted-foreground)) 40%,transparent)}}.bg-muted-foreground\/45{background-color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.bg-muted-foreground\/45{background-color:color-mix(in oklab,hsl(var(--muted-foreground)) 45%,transparent)}}.bg-muted-foreground\/50{background-color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.bg-muted-foreground\/50{background-color:color-mix(in oklab,hsl(var(--muted-foreground)) 50%,transparent)}}.bg-muted\/25{background-color:hsl(var(--muted))}@supports (color:color-mix(in lab,red,red)){.bg-muted\/25{background-color:color-mix(in oklab,hsl(var(--muted)) 25%,transparent)}}.bg-muted\/40{background-color:hsl(var(--muted))}@supports (color:color-mix(in lab,red,red)){.bg-muted\/40{background-color:color-mix(in oklab,hsl(var(--muted)) 40%,transparent)}}.bg-neutral-800{background-color:var(--color-neutral-800)}.bg-neutral-950{background-color:var(--color-neutral-950)}.bg-orange-500\/20{background-color:#fe6e0033}@supports (color:color-mix(in lab,red,red)){.bg-orange-500\/20{background-color:color-mix(in oklab,var(--color-orange-500) 20%,transparent)}}.bg-pink-500{background-color:var(--color-pink-500)}.bg-pink-500\/10{background-color:#f6339a1a}@supports (color:color-mix(in lab,red,red)){.bg-pink-500\/10{background-color:color-mix(in oklab,var(--color-pink-500) 10%,transparent)}}.bg-pink-500\/15{background-color:#f6339a26}@supports (color:color-mix(in lab,red,red)){.bg-pink-500\/15{background-color:color-mix(in oklab,var(--color-pink-500) 15%,transparent)}}.bg-popover,.bg-popover\/95{background-color:hsl(var(--popover))}@supports (color:color-mix(in lab,red,red)){.bg-popover\/95{background-color:color-mix(in oklab,hsl(var(--popover)) 95%,transparent)}}.bg-primary,.bg-primary\/5{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.bg-primary\/5{background-color:color-mix(in oklab,hsl(var(--primary)) 5%,transparent)}}.bg-primary\/10{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.bg-primary\/10{background-color:color-mix(in oklab,hsl(var(--primary)) 10%,transparent)}}.bg-primary\/15{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.bg-primary\/15{background-color:color-mix(in oklab,hsl(var(--primary)) 15%,transparent)}}.bg-primary\/70{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.bg-primary\/70{background-color:color-mix(in oklab,hsl(var(--primary)) 70%,transparent)}}.bg-primary\/\[0\.06\]{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.bg-primary\/\[0\.06\]{background-color:color-mix(in oklab,hsl(var(--primary)) 6%,transparent)}}.bg-purple-500\/20{background-color:#ac4bff33}@supports (color:color-mix(in lab,red,red)){.bg-purple-500\/20{background-color:color-mix(in oklab,var(--color-purple-500) 20%,transparent)}}.bg-red-500{background-color:var(--color-red-500)}.bg-red-500\/5{background-color:#fb2c360d}@supports (color:color-mix(in lab,red,red)){.bg-red-500\/5{background-color:color-mix(in oklab,var(--color-red-500) 5%,transparent)}}.bg-red-500\/10{background-color:#fb2c361a}@supports (color:color-mix(in lab,red,red)){.bg-red-500\/10{background-color:color-mix(in oklab,var(--color-red-500) 10%,transparent)}}.bg-red-500\/15{background-color:#fb2c3626}@supports (color:color-mix(in lab,red,red)){.bg-red-500\/15{background-color:color-mix(in oklab,var(--color-red-500) 15%,transparent)}}.bg-red-500\/20{background-color:#fb2c3633}@supports (color:color-mix(in lab,red,red)){.bg-red-500\/20{background-color:color-mix(in oklab,var(--color-red-500) 20%,transparent)}}.bg-red-500\/80{background-color:#fb2c36cc}@supports (color:color-mix(in lab,red,red)){.bg-red-500\/80{background-color:color-mix(in oklab,var(--color-red-500) 80%,transparent)}}.bg-rose-500\/15{background-color:#ff235726}@supports (color:color-mix(in lab,red,red)){.bg-rose-500\/15{background-color:color-mix(in oklab,var(--color-rose-500) 15%,transparent)}}.bg-sky-500\/5{background-color:#00a5ef0d}@supports (color:color-mix(in lab,red,red)){.bg-sky-500\/5{background-color:color-mix(in oklab,var(--color-sky-500) 5%,transparent)}}.bg-sky-500\/10{background-color:#00a5ef1a}@supports (color:color-mix(in lab,red,red)){.bg-sky-500\/10{background-color:color-mix(in oklab,var(--color-sky-500) 10%,transparent)}}.bg-slate-400{background-color:var(--color-slate-400)}.bg-slate-500\/15{background-color:#62748e26}@supports (color:color-mix(in lab,red,red)){.bg-slate-500\/15{background-color:color-mix(in oklab,var(--color-slate-500) 15%,transparent)}}.bg-slate-500\/20{background-color:#62748e33}@supports (color:color-mix(in lab,red,red)){.bg-slate-500\/20{background-color:color-mix(in oklab,var(--color-slate-500) 20%,transparent)}}.bg-teal-500{background-color:var(--color-teal-500)}.bg-teal-500\/10{background-color:#00baa71a}@supports (color:color-mix(in lab,red,red)){.bg-teal-500\/10{background-color:color-mix(in oklab,var(--color-teal-500) 10%,transparent)}}.bg-teal-500\/15{background-color:#00baa726}@supports (color:color-mix(in lab,red,red)){.bg-teal-500\/15{background-color:color-mix(in oklab,var(--color-teal-500) 15%,transparent)}}.bg-transparent{background-color:#0000}.bg-violet-500{background-color:var(--color-violet-500)}.bg-violet-500\/5{background-color:#8d54ff0d}@supports (color:color-mix(in lab,red,red)){.bg-violet-500\/5{background-color:color-mix(in oklab,var(--color-violet-500) 5%,transparent)}}.bg-violet-500\/10{background-color:#8d54ff1a}@supports (color:color-mix(in lab,red,red)){.bg-violet-500\/10{background-color:color-mix(in oklab,var(--color-violet-500) 10%,transparent)}}.bg-violet-500\/15{background-color:#8d54ff26}@supports (color:color-mix(in lab,red,red)){.bg-violet-500\/15{background-color:color-mix(in oklab,var(--color-violet-500) 15%,transparent)}}.bg-violet-500\/\[0\.04\]{background-color:#8d54ff0a}@supports (color:color-mix(in lab,red,red)){.bg-violet-500\/\[0\.04\]{background-color:color-mix(in oklab,var(--color-violet-500) 4%,transparent)}}.bg-gradient-to-r{--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-foreground{--tw-gradient-from:hsl(var(--foreground));--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.via-foreground{--tw-gradient-via:hsl(var(--foreground));--tw-gradient-via-stops:var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.to-primary{--tw-gradient-to:hsl(var(--primary));--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.bg-clip-text{-webkit-background-clip:text;background-clip:text}.bg-repeat{background-repeat:repeat}.fill-primary\/20{fill:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.fill-primary\/20{fill:color-mix(in oklab,hsl(var(--primary)) 20%,transparent)}}.p-0{padding:0}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:var(--spacing)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-2\.5{padding:calc(var(--spacing) * 2.5)}.p-3{padding:calc(var(--spacing) * 3)}.p-3\.5{padding:calc(var(--spacing) * 3.5)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.p-8{padding:calc(var(--spacing) * 8)}.px-1{padding-inline:var(--spacing)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-3\.5{padding-inline:calc(var(--spacing) * 3.5)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-10{padding-block:calc(var(--spacing) * 10)}.py-12{padding-block:calc(var(--spacing) * 12)}.py-16{padding-block:calc(var(--spacing) * 16)}.pt-0{padding-top:0}.pt-0\.5{padding-top:calc(var(--spacing) * .5)}.pt-1{padding-top:var(--spacing)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-2\.5{padding-top:calc(var(--spacing) * 2.5)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-\[12vh\]{padding-top:12vh}.pr-1{padding-right:var(--spacing)}.pr-2{padding-right:calc(var(--spacing) * 2)}.pr-3{padding-right:calc(var(--spacing) * 3)}.pr-10{padding-right:calc(var(--spacing) * 10)}.pb-1{padding-bottom:var(--spacing)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pl-3{padding-left:calc(var(--spacing) * 3)}.pl-4{padding-left:calc(var(--spacing) * 4)}.pl-6{padding-left:calc(var(--spacing) * 6)}.pl-8{padding-left:calc(var(--spacing) * 8)}.pl-9{padding-left:calc(var(--spacing) * 9)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-mono{font-family:JetBrains Mono,ui-monospace,SFMono-Regular,monospace}.font-sans{font-family:Inter,ui-sans-serif,system-ui,-apple-system,sans-serif}.font-space{font-family:Space Grotesk,sans-serif}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[8px\]{font-size:8px}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.leading-normal{--tw-leading:var(--leading-normal);line-height:var(--leading-normal)}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-normal{--tw-tracking:var(--tracking-normal);letter-spacing:var(--tracking-normal)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.text-wrap{text-wrap:wrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.text-clip{text-overflow:clip}.text-ellipsis{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.whitespace-pre-line{white-space:pre-line}.whitespace-pre-wrap{white-space:pre-wrap}.text-amber-300{color:var(--color-amber-300)}.text-amber-300\/70{color:#ffd236b3}@supports (color:color-mix(in lab,red,red)){.text-amber-300\/70{color:color-mix(in oklab,var(--color-amber-300) 70%,transparent)}}.text-amber-400{color:var(--color-amber-400)}.text-amber-400\/80{color:#fcbb00cc}@supports (color:color-mix(in lab,red,red)){.text-amber-400\/80{color:color-mix(in oklab,var(--color-amber-400) 80%,transparent)}}.text-amber-400\/90{color:#fcbb00e6}@supports (color:color-mix(in lab,red,red)){.text-amber-400\/90{color:color-mix(in oklab,var(--color-amber-400) 90%,transparent)}}.text-amber-500{color:var(--color-amber-500)}.text-black{color:var(--color-black)}.text-blue-300{color:var(--color-blue-300)}.text-cyan-200\/90{color:#a2f4fde6}@supports (color:color-mix(in lab,red,red)){.text-cyan-200\/90{color:color-mix(in oklab,var(--color-cyan-200) 90%,transparent)}}.text-cyan-300{color:var(--color-cyan-300)}.text-cyan-300\/80{color:#53eafdcc}@supports (color:color-mix(in lab,red,red)){.text-cyan-300\/80{color:color-mix(in oklab,var(--color-cyan-300) 80%,transparent)}}.text-cyan-400{color:var(--color-cyan-400)}.text-emerald-300{color:var(--color-emerald-300)}.text-emerald-300\/70{color:#5ee9b5b3}@supports (color:color-mix(in lab,red,red)){.text-emerald-300\/70{color:color-mix(in oklab,var(--color-emerald-300) 70%,transparent)}}.text-emerald-300\/80{color:#5ee9b5cc}@supports (color:color-mix(in lab,red,red)){.text-emerald-300\/80{color:color-mix(in oklab,var(--color-emerald-300) 80%,transparent)}}.text-emerald-300\/90{color:#5ee9b5e6}@supports (color:color-mix(in lab,red,red)){.text-emerald-300\/90{color:color-mix(in oklab,var(--color-emerald-300) 90%,transparent)}}.text-emerald-400{color:var(--color-emerald-400)}.text-emerald-400\/70{color:#00d294b3}@supports (color:color-mix(in lab,red,red)){.text-emerald-400\/70{color:color-mix(in oklab,var(--color-emerald-400) 70%,transparent)}}.text-emerald-400\/90{color:#00d294e6}@supports (color:color-mix(in lab,red,red)){.text-emerald-400\/90{color:color-mix(in oklab,var(--color-emerald-400) 90%,transparent)}}.text-emerald-600{color:var(--color-emerald-600)}.text-foreground,.text-foreground\/70{color:hsl(var(--foreground))}@supports (color:color-mix(in lab,red,red)){.text-foreground\/70{color:color-mix(in oklab,hsl(var(--foreground)) 70%,transparent)}}.text-foreground\/80{color:hsl(var(--foreground))}@supports (color:color-mix(in lab,red,red)){.text-foreground\/80{color:color-mix(in oklab,hsl(var(--foreground)) 80%,transparent)}}.text-foreground\/85{color:hsl(var(--foreground))}@supports (color:color-mix(in lab,red,red)){.text-foreground\/85{color:color-mix(in oklab,hsl(var(--foreground)) 85%,transparent)}}.text-foreground\/90{color:hsl(var(--foreground))}@supports (color:color-mix(in lab,red,red)){.text-foreground\/90{color:color-mix(in oklab,hsl(var(--foreground)) 90%,transparent)}}.text-fuchsia-300{color:var(--color-fuchsia-300)}.text-fuchsia-400{color:var(--color-fuchsia-400)}.text-indigo-300{color:var(--color-indigo-300)}.text-indigo-400{color:var(--color-indigo-400)}.text-lime-400{color:var(--color-lime-400)}.text-muted-foreground,.text-muted-foreground\/40{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/40{color:color-mix(in oklab,hsl(var(--muted-foreground)) 40%,transparent)}}.text-muted-foreground\/50{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/50{color:color-mix(in oklab,hsl(var(--muted-foreground)) 50%,transparent)}}.text-muted-foreground\/55{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/55{color:color-mix(in oklab,hsl(var(--muted-foreground)) 55%,transparent)}}.text-muted-foreground\/60{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/60{color:color-mix(in oklab,hsl(var(--muted-foreground)) 60%,transparent)}}.text-muted-foreground\/70{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/70{color:color-mix(in oklab,hsl(var(--muted-foreground)) 70%,transparent)}}.text-muted-foreground\/75{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/75{color:color-mix(in oklab,hsl(var(--muted-foreground)) 75%,transparent)}}.text-muted-foreground\/80{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/80{color:color-mix(in oklab,hsl(var(--muted-foreground)) 80%,transparent)}}.text-neutral-200{color:var(--color-neutral-200)}.text-neutral-400{color:var(--color-neutral-400)}.text-orange-300{color:var(--color-orange-300)}.text-pink-300{color:var(--color-pink-300)}.text-pink-400{color:var(--color-pink-400)}.text-popover-foreground{color:hsl(var(--popover-foreground))}.text-primary{color:hsl(var(--primary))}.text-primary-foreground{color:hsl(var(--primary-foreground))}.text-primary\/70{color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.text-primary\/70{color:color-mix(in oklab,hsl(var(--primary)) 70%,transparent)}}.text-primary\/80{color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.text-primary\/80{color:color-mix(in oklab,hsl(var(--primary)) 80%,transparent)}}.text-purple-300{color:var(--color-purple-300)}.text-red-200{color:var(--color-red-200)}.text-red-200\/90{color:#ffcacae6}@supports (color:color-mix(in lab,red,red)){.text-red-200\/90{color:color-mix(in oklab,var(--color-red-200) 90%,transparent)}}.text-red-300{color:var(--color-red-300)}.text-red-300\/70{color:#ffa3a3b3}@supports (color:color-mix(in lab,red,red)){.text-red-300\/70{color:color-mix(in oklab,var(--color-red-300) 70%,transparent)}}.text-red-300\/90{color:#ffa3a3e6}@supports (color:color-mix(in lab,red,red)){.text-red-300\/90{color:color-mix(in oklab,var(--color-red-300) 90%,transparent)}}.text-red-400{color:var(--color-red-400)}.text-red-400\/80{color:#ff6568cc}@supports (color:color-mix(in lab,red,red)){.text-red-400\/80{color:color-mix(in oklab,var(--color-red-400) 80%,transparent)}}.text-red-500{color:var(--color-red-500)}.text-red-600{color:var(--color-red-600)}.text-rose-300{color:var(--color-rose-300)}.text-rose-400{color:var(--color-rose-400)}.text-sky-200\/80{color:#b8e6fecc}@supports (color:color-mix(in lab,red,red)){.text-sky-200\/80{color:color-mix(in oklab,var(--color-sky-200) 80%,transparent)}}.text-sky-300{color:var(--color-sky-300)}.text-sky-300\/80{color:#77d4ffcc}@supports (color:color-mix(in lab,red,red)){.text-sky-300\/80{color:color-mix(in oklab,var(--color-sky-300) 80%,transparent)}}.text-sky-300\/90{color:#77d4ffe6}@supports (color:color-mix(in lab,red,red)){.text-sky-300\/90{color:color-mix(in oklab,var(--color-sky-300) 90%,transparent)}}.text-sky-400{color:var(--color-sky-400)}.text-slate-300{color:var(--color-slate-300)}.text-teal-300{color:var(--color-teal-300)}.text-teal-400{color:var(--color-teal-400)}.text-transparent{color:#0000}.text-violet-200\/90{color:#ddd6ffe6}@supports (color:color-mix(in lab,red,red)){.text-violet-200\/90{color:color-mix(in oklab,var(--color-violet-200) 90%,transparent)}}.text-violet-300{color:var(--color-violet-300)}.text-violet-300\/70{color:#c4b4ffb3}@supports (color:color-mix(in lab,red,red)){.text-violet-300\/70{color:color-mix(in oklab,var(--color-violet-300) 70%,transparent)}}.text-violet-300\/80{color:#c4b4ffcc}@supports (color:color-mix(in lab,red,red)){.text-violet-300\/80{color:color-mix(in oklab,var(--color-violet-300) 80%,transparent)}}.text-violet-300\/90{color:#c4b4ffe6}@supports (color:color-mix(in lab,red,red)){.text-violet-300\/90{color:color-mix(in oklab,var(--color-violet-300) 90%,transparent)}}.text-violet-400{color:var(--color-violet-400)}.text-white{color:var(--color-white)}.capitalize{text-transform:capitalize}.lowercase{text-transform:lowercase}.normal-case{text-transform:none}.uppercase{text-transform:uppercase}.italic{font-style:italic}.not-italic{font-style:normal}.diagonal-fractions{--tw-numeric-fraction:diagonal-fractions;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.lining-nums{--tw-numeric-figure:lining-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.oldstyle-nums{--tw-numeric-figure:oldstyle-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.ordinal{--tw-ordinal:ordinal;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.proportional-nums{--tw-numeric-spacing:proportional-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.slashed-zero{--tw-slashed-zero:slashed-zero;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.stacked-fractions{--tw-numeric-fraction:stacked-fractions;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.normal-nums{font-variant-numeric:normal}.line-through{text-decoration-line:line-through}.no-underline{text-decoration-line:none}.overline{text-decoration-line:overline}.underline{text-decoration-line:underline}.decoration-primary\/40{-webkit-text-decoration-color:hsl(var(--primary));text-decoration-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.decoration-primary\/40{-webkit-text-decoration-color:color-mix(in oklab,hsl(var(--primary)) 40%,transparent);text-decoration-color:color-mix(in oklab,hsl(var(--primary)) 40%,transparent)}}.decoration-dotted{text-decoration-style:dotted}.underline-offset-2{text-underline-offset:2px}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.subpixel-antialiased{-webkit-font-smoothing:auto;-moz-osx-font-smoothing:auto}.accent-primary{accent-color:hsl(var(--primary))}.opacity-0{opacity:0}.opacity-40{opacity:.4}.opacity-60{opacity:.6}.opacity-75{opacity:.75}.opacity-80{opacity:.8}.opacity-85{opacity:.85}.opacity-90{opacity:.9}.opacity-100{opacity:1}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_0_8px_rgba\(16\,185\,129\,0\.4\)\]{--tw-shadow:0 0 8px var(--tw-shadow-color,#10b98166);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_0_8px_rgba\(239\,68\,68\,0\.4\)\]{--tw-shadow:0 0 8px var(--tw-shadow-color,#ef444466);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_0_8px_rgba\(245\,158\,11\,0\.4\)\]{--tw-shadow:0 0 8px var(--tw-shadow-color,#f59e0b66);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-inner{--tw-shadow:inset 0 2px 4px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-4{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-amber-500\/10{--tw-shadow-color:#f99c001a}@supports (color:color-mix(in lab,red,red)){.shadow-amber-500\/10{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-amber-500) 10%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-black\/15{--tw-shadow-color:#00000026}@supports (color:color-mix(in lab,red,red)){.shadow-black\/15{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-black) 15%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-black\/20{--tw-shadow-color:#0003}@supports (color:color-mix(in lab,red,red)){.shadow-black\/20{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-black) 20%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-black\/25{--tw-shadow-color:#00000040}@supports (color:color-mix(in lab,red,red)){.shadow-black\/25{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-black) 25%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-primary\/5{--tw-shadow-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.shadow-primary\/5{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, hsl(var(--primary)) 5%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-primary\/10{--tw-shadow-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.shadow-primary\/10{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, hsl(var(--primary)) 10%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-primary\/20{--tw-shadow-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.shadow-primary\/20{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, hsl(var(--primary)) 20%, transparent) var(--tw-shadow-alpha), transparent)}}.ring-background\/60{--tw-ring-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.ring-background\/60{--tw-ring-color:color-mix(in oklab, hsl(var(--background)) 60%, transparent)}}.ring-black\/40{--tw-ring-color:#0006}@supports (color:color-mix(in lab,red,red)){.ring-black\/40{--tw-ring-color:color-mix(in oklab, var(--color-black) 40%, transparent)}}.ring-white\/70{--tw-ring-color:#ffffffb3}@supports (color:color-mix(in lab,red,red)){.ring-white\/70{--tw-ring-color:color-mix(in oklab, var(--color-white) 70%, transparent)}}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.drop-shadow{--tw-drop-shadow-size:drop-shadow(0 1px 2px var(--tw-drop-shadow-color,#0000001a)) drop-shadow(0 1px 1px var(--tw-drop-shadow-color,#0000000f));--tw-drop-shadow:drop-shadow(0 1px 2px #0000001a) drop-shadow(0 1px 1px #0000000f);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.grayscale{--tw-grayscale:grayscale(100%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.invert{--tw-invert:invert(100%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.sepia{--tw-sepia:sepia(100%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur{--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-blur-md{--tw-backdrop-blur:blur(var(--blur-md));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-blur-xl{--tw-backdrop-blur:blur(var(--blur-xl));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-grayscale{--tw-backdrop-grayscale:grayscale(100%);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-invert{--tw-backdrop-invert:invert(100%);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-sepia{--tw-backdrop-sepia:sepia(100%);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition\!{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events!important;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))!important;transition-duration:var(--tw-duration,var(--default-transition-duration))!important}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.duration-500{--tw-duration:.5s;transition-duration:.5s}.ease-in{--tw-ease:var(--ease-in);transition-timing-function:var(--ease-in)}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.select-text{-webkit-user-select:text;user-select:text}:where(.divide-x-reverse>:not(:last-child)){--tw-divide-x-reverse:1}.ring-inset{--tw-ring-inset:inset}.group-open\:rotate-90:is(:where(.group):is([open],:popover-open,:open) *){rotate:90deg}@media(hover:hover){.group-hover\:translate-x-0\.5:is(:where(.group):hover *){--tw-translate-x:calc(var(--spacing) * .5);translate:var(--tw-translate-x) var(--tw-translate-y)}.group-hover\:text-foreground:is(:where(.group):hover *){color:hsl(var(--foreground))}.group-hover\:text-primary:is(:where(.group):hover *){color:hsl(var(--primary))}.group-hover\:shadow-md:is(:where(.group):hover *){--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.group-hover\:shadow-primary\/20:is(:where(.group):hover *){--tw-shadow-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.group-hover\:shadow-primary\/20:is(:where(.group):hover *){--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, hsl(var(--primary)) 20%, transparent) var(--tw-shadow-alpha), transparent)}}}.placeholder\:text-muted-foreground::placeholder,.placeholder\:text-muted-foreground\/50::placeholder{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.placeholder\:text-muted-foreground\/50::placeholder{color:color-mix(in oklab,hsl(var(--muted-foreground)) 50%,transparent)}}.first\:mt-0:first-child{margin-top:0}.first\:rounded-l-sm:first-child{border-top-left-radius:calc(var(--radius) - 4px);border-bottom-left-radius:calc(var(--radius) - 4px)}@media(hover:hover){.hover\:border-amber-500\/50:hover{border-color:#f99c0080}@supports (color:color-mix(in lab,red,red)){.hover\:border-amber-500\/50:hover{border-color:color-mix(in oklab,var(--color-amber-500) 50%,transparent)}}.hover\:border-border:hover,.hover\:border-border\/60:hover{border-color:hsl(var(--border))}@supports (color:color-mix(in lab,red,red)){.hover\:border-border\/60:hover{border-color:color-mix(in oklab,hsl(var(--border)) 60%,transparent)}}.hover\:border-emerald-500\/40:hover{border-color:#00bb7f66}@supports (color:color-mix(in lab,red,red)){.hover\:border-emerald-500\/40:hover{border-color:color-mix(in oklab,var(--color-emerald-500) 40%,transparent)}}.hover\:border-primary\/30:hover{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:border-primary\/30:hover{border-color:color-mix(in oklab,hsl(var(--primary)) 30%,transparent)}}.hover\:border-primary\/40:hover{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:border-primary\/40:hover{border-color:color-mix(in oklab,hsl(var(--primary)) 40%,transparent)}}.hover\:border-primary\/45:hover{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:border-primary\/45:hover{border-color:color-mix(in oklab,hsl(var(--primary)) 45%,transparent)}}.hover\:border-primary\/50:hover{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:border-primary\/50:hover{border-color:color-mix(in oklab,hsl(var(--primary)) 50%,transparent)}}.hover\:border-red-500\/50:hover{border-color:#fb2c3680}@supports (color:color-mix(in lab,red,red)){.hover\:border-red-500\/50:hover{border-color:color-mix(in oklab,var(--color-red-500) 50%,transparent)}}.hover\:bg-accent:hover{background-color:hsl(var(--accent))}.hover\:bg-amber-400:hover{background-color:var(--color-amber-400)}.hover\:bg-amber-500\/10:hover{background-color:#f99c001a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-amber-500\/10:hover{background-color:color-mix(in oklab,var(--color-amber-500) 10%,transparent)}}.hover\:bg-amber-500\/20:hover{background-color:#f99c0033}@supports (color:color-mix(in lab,red,red)){.hover\:bg-amber-500\/20:hover{background-color:color-mix(in oklab,var(--color-amber-500) 20%,transparent)}}.hover\:bg-background\/40:hover{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-background\/40:hover{background-color:color-mix(in oklab,hsl(var(--background)) 40%,transparent)}}.hover\:bg-background\/60:hover{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-background\/60:hover{background-color:color-mix(in oklab,hsl(var(--background)) 60%,transparent)}}.hover\:bg-background\/80:hover{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-background\/80:hover{background-color:color-mix(in oklab,hsl(var(--background)) 80%,transparent)}}.hover\:bg-card\/45:hover{background-color:hsl(var(--card))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-card\/45:hover{background-color:color-mix(in oklab,hsl(var(--card)) 45%,transparent)}}.hover\:bg-emerald-500\/10:hover{background-color:#00bb7f1a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-emerald-500\/10:hover{background-color:color-mix(in oklab,var(--color-emerald-500) 10%,transparent)}}.hover\:bg-emerald-500\/15:hover{background-color:#00bb7f26}@supports (color:color-mix(in lab,red,red)){.hover\:bg-emerald-500\/15:hover{background-color:color-mix(in oklab,var(--color-emerald-500) 15%,transparent)}}.hover\:bg-emerald-500\/20:hover{background-color:#00bb7f33}@supports (color:color-mix(in lab,red,red)){.hover\:bg-emerald-500\/20:hover{background-color:color-mix(in oklab,var(--color-emerald-500) 20%,transparent)}}.hover\:bg-muted:hover{background-color:hsl(var(--muted))}.hover\:bg-neutral-700:hover{background-color:var(--color-neutral-700)}.hover\:bg-primary:hover,.hover\:bg-primary\/10:hover{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/10:hover{background-color:color-mix(in oklab,hsl(var(--primary)) 10%,transparent)}}.hover\:bg-primary\/20:hover{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/20:hover{background-color:color-mix(in oklab,hsl(var(--primary)) 20%,transparent)}}.hover\:bg-primary\/90:hover{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab,hsl(var(--primary)) 90%,transparent)}}.hover\:bg-primary\/95:hover{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/95:hover{background-color:color-mix(in oklab,hsl(var(--primary)) 95%,transparent)}}.hover\:bg-red-500\/5:hover{background-color:#fb2c360d}@supports (color:color-mix(in lab,red,red)){.hover\:bg-red-500\/5:hover{background-color:color-mix(in oklab,var(--color-red-500) 5%,transparent)}}.hover\:bg-red-500\/10:hover{background-color:#fb2c361a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-red-500\/10:hover{background-color:color-mix(in oklab,var(--color-red-500) 10%,transparent)}}.hover\:bg-red-500\/15:hover{background-color:#fb2c3626}@supports (color:color-mix(in lab,red,red)){.hover\:bg-red-500\/15:hover{background-color:color-mix(in oklab,var(--color-red-500) 15%,transparent)}}.hover\:bg-red-500\/20:hover{background-color:#fb2c3633}@supports (color:color-mix(in lab,red,red)){.hover\:bg-red-500\/20:hover{background-color:color-mix(in oklab,var(--color-red-500) 20%,transparent)}}.hover\:bg-sky-500\/20:hover{background-color:#00a5ef33}@supports (color:color-mix(in lab,red,red)){.hover\:bg-sky-500\/20:hover{background-color:color-mix(in oklab,var(--color-sky-500) 20%,transparent)}}.hover\:bg-violet-500\/20:hover{background-color:#8d54ff33}@supports (color:color-mix(in lab,red,red)){.hover\:bg-violet-500\/20:hover{background-color:color-mix(in oklab,var(--color-violet-500) 20%,transparent)}}.hover\:text-accent-foreground:hover{color:hsl(var(--accent-foreground))}.hover\:text-amber-200:hover{color:var(--color-amber-200)}.hover\:text-emerald-300:hover{color:var(--color-emerald-300)}.hover\:text-foreground:hover,.hover\:text-foreground\/80:hover{color:hsl(var(--foreground))}@supports (color:color-mix(in lab,red,red)){.hover\:text-foreground\/80:hover{color:color-mix(in oklab,hsl(var(--foreground)) 80%,transparent)}}.hover\:text-primary:hover{color:hsl(var(--primary))}.hover\:text-primary-foreground:hover{color:hsl(var(--primary-foreground))}.hover\:text-primary\/80:hover{color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:text-primary\/80:hover{color:color-mix(in oklab,hsl(var(--primary)) 80%,transparent)}}.hover\:text-red-300:hover{color:var(--color-red-300)}.hover\:text-red-400:hover{color:var(--color-red-400)}.hover\:text-violet-200:hover{color:var(--color-violet-200)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-90:hover{opacity:.9}.hover\:opacity-100:hover{opacity:1}}.focus\:border-primary:focus,.focus\:border-primary\/50:focus{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.focus\:border-primary\/50:focus{border-color:color-mix(in oklab,hsl(var(--primary)) 50%,transparent)}}.focus\:border-red-400\/50:focus{border-color:#ff656880}@supports (color:color-mix(in lab,red,red)){.focus\:border-red-400\/50:focus{border-color:color-mix(in oklab,var(--color-red-400) 50%,transparent)}}.focus\:border-sky-400\/50:focus{border-color:#00bcfe80}@supports (color:color-mix(in lab,red,red)){.focus\:border-sky-400\/50:focus{border-color:color-mix(in oklab,var(--color-sky-400) 50%,transparent)}}.focus\:ring-1:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-primary\/50:focus{--tw-ring-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.focus\:ring-primary\/50:focus{--tw-ring-color:color-mix(in oklab, hsl(var(--primary)) 50%, transparent)}}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-ring:focus-visible{--tw-ring-color:hsl(var(--ring))}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.disabled\:cursor-default:disabled{cursor:default}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-60:disabled{opacity:.6}.aria-selected\:bg-accent[aria-selected=true]{background-color:hsl(var(--accent))}.aria-selected\:text-accent-foreground[aria-selected=true]{color:hsl(var(--accent-foreground))}@media(min-width:40rem){.sm\:flex{display:flex}.sm\:inline{display:inline}.sm\:w-36{width:calc(var(--spacing) * 36)}.sm\:w-\[640px\]{width:640px}.sm\:w-auto{width:auto}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:justify-between{justify-content:space-between}}@media(min-width:48rem){.md\:col-span-2{grid-column:span 2/span 2}.md\:flex{display:flex}.md\:hidden{display:none}.md\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-\[170px_1fr\]{grid-template-columns:170px 1fr}.md\:p-6{padding:calc(var(--spacing) * 6)}.md\:px-6{padding-inline:calc(var(--spacing) * 6)}}@media(min-width:64rem){.lg\:col-span-2{grid-column:span 2/span 2}.lg\:flex{display:flex}.lg\:w-40{width:calc(var(--spacing) * 40)}.lg\:w-72{width:calc(var(--spacing) * 72)}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-\[minmax\(0\,1fr\)_minmax\(0\,1\.3fr\)\]{grid-template-columns:minmax(0,1fr) minmax(0,1.3fr)}.lg\:flex-row{flex-direction:row}.lg\:items-stretch{align-items:stretch}}@media(min-width:80rem){.xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}@media(prefers-color-scheme:dark){.dark\:text-emerald-400{color:var(--color-emerald-400)}.dark\:text-red-400{color:var(--color-red-400)}}}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/inter-latin-400-normal-C38fXH4l.woff2)format("woff2")}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/inter-latin-500-normal-Cerq10X2.woff2)format("woff2")}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:600;src:url(/assets/inter-latin-600-normal-LgqL8muc.woff2)format("woff2")}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:700;src:url(/assets/inter-latin-700-normal-Yt3aPRUw.woff2)format("woff2")}@font-face{font-family:Space Grotesk;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/space-grotesk-latin-400-normal-CJ-V5oYT.woff2)format("woff2")}@font-face{font-family:Space Grotesk;font-style:normal;font-display:swap;font-weight:600;src:url(/assets/space-grotesk-latin-600-normal-DjKNqYRj.woff2)format("woff2")}@font-face{font-family:Space Grotesk;font-style:normal;font-display:swap;font-weight:700;src:url(/assets/space-grotesk-latin-700-normal-RjhwGPKo.woff2)format("woff2")}@font-face{font-family:JetBrains Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/jetbrains-mono-latin-400-normal-V6pRDFza.woff2)format("woff2")}@font-face{font-family:JetBrains Mono;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/jetbrains-mono-latin-500-normal-BWZEU5yA.woff2)format("woff2")}@font-face{font-family:JetBrains Mono;font-style:normal;font-display:swap;font-weight:600;src:url(/assets/jetbrains-mono-latin-600-normal-C8RAYTDA.woff2)format("woff2")}@font-face{font-family:JetBrains Mono;font-style:normal;font-display:swap;font-weight:700;src:url(/assets/jetbrains-mono-latin-700-normal-BYuf6tUa.woff2)format("woff2")}:root{--background:224 30% 6%;--foreground:210 20% 92%;--card:224 25% 10%;--card-foreground:210 20% 94%;--popover:224 28% 9%;--popover-foreground:210 20% 94%;--primary:172 72% 50%;--primary-foreground:224 47% 8%;--muted:220 16% 14%;--muted-foreground:215 14% 64%;--accent:220 16% 16%;--accent-foreground:210 20% 94%;--border:222 18% 23%;--input:222 18% 23%;--ring:172 72% 50%;--radius:.75rem;color-scheme:dark}html,body,#root{height:100dvh;overflow:hidden}body{background-color:hsl(var(--background));color:hsl(var(--foreground));font-family:var(--font-sans);-webkit-font-smoothing:antialiased;margin:0}*{border-color:hsl(var(--border) / .85);outline-color:hsl(var(--primary) / .5)}:focus-visible{outline:2px solid hsl(var(--primary) / .7);outline-offset:2px}input:focus,textarea:focus,select:focus{border-color:hsl(var(--primary));box-shadow:0 0 0 2px hsl(var(--primary) / .15);outline:none}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:hsl(var(--primary) / .25);border-radius:9999px}::-webkit-scrollbar-thumb:hover{background:hsl(var(--primary) / .5)}.mc-card{border:1px solid hsl(var(--border) / .95);background-color:hsl(var(--card) / .85);border-radius:1rem;transition:transform .3s cubic-bezier(.4,0,.2,1),background-color .3s cubic-bezier(.4,0,.2,1),border-color .3s cubic-bezier(.4,0,.2,1),box-shadow .3s cubic-bezier(.4,0,.2,1);position:relative;overflow:hidden;box-shadow:0 10px 30px -15px #00000073,inset 0 1px #ffffff0d}.mc-card:before{content:"";background:linear-gradient(90deg,hsl(var(--primary)),#6366f1,#a855f7);opacity:.75;height:3.5px;transition:opacity .3s;position:absolute;top:0;left:0;right:0}.mc-card:hover{background-color:hsl(var(--card) / .92);border-color:hsl(var(--primary) / .35);box-shadow:0 20px 40px -20px #000000a6,0 0 18px 2px hsl(var(--primary) / .05);transform:translateY(-3px)}.mc-card:hover:before{opacity:1}.mc-card-sm{border:1px solid hsl(var(--border) / .9);background-color:hsl(var(--card) / .88);border-radius:.75rem;transition:background-color .2s,border-color .2s}.mc-card-sm:hover{background-color:hsl(var(--card) / .95);border-color:hsl(var(--primary) / .3)}.nav-active{background:linear-gradient(90deg,hsl(var(--primary) / .18),#6366f11f);color:hsl(var(--primary));border-left:3.5px solid hsl(var(--primary));border-radius:0 var(--radius) var(--radius) 0;padding-left:calc(.75rem - 3.5px);box-shadow:inset 0 1px #ffffff05}.nav-active-collapsed{background:hsl(var(--primary) / .18);color:hsl(var(--primary));box-shadow:0 0 12px 1px hsl(var(--primary) / .1);border:1px solid hsl(var(--primary) / .3)}@keyframes flow-cyan{0%{stroke-dasharray:6 3;stroke-dashoffset:18px}to{stroke-dasharray:6 3;stroke-dashoffset:0}}.animate-flow-cyan{animation:1.2s linear infinite flow-cyan}@media(prefers-reduced-motion:reduce){*,:before,:after{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}}@media(min-width:1440px){html{font-size:16.5px}}@media(min-width:1920px){html{font-size:17.5px}}@media(min-width:2560px){html{font-size:19px}}@media(min-width:3440px){html{font-size:20px}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-pan-x{syntax:"*";inherits:false}@property --tw-pan-y{syntax:"*";inherits:false}@property --tw-pinch-zoom{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes ping{75%,to{opacity:0;transform:scale(2)}}@keyframes pulse{50%{opacity:.5}} diff --git a/frontend/dist/assets/index-B57enqf6.js b/frontend/dist/assets/index-B57enqf6.js deleted file mode 100644 index 0f00267..0000000 --- a/frontend/dist/assets/index-B57enqf6.js +++ /dev/null @@ -1,359 +0,0 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/LiveAreaChartImpl-BkyPZEnE.js","assets/string-DoZi9Vij.js","assets/ModelsView-Ck3R7mcg.js","assets/JobsBar-D8URwRCr.js","assets/code-xml-ID_kOxxM.js","assets/rotate-ccw-Bz6oQ3_7.js","assets/zap-0IkDqAhv.js","assets/chevron-down-C-RXUrpR.js","assets/layers-BVbGNbDq.js","assets/ConnectView-CxDIL-EH.js","assets/GuideView-FadZtBSQ.js","assets/AuftragsbuchView-Cr_8mzDy.js","assets/SectionLabel-C_SwIL8k.js","assets/IdeenView-CZhoWV4q.js","assets/SkillsView-DIrPeuP2.js","assets/ChronikView-xh-P-c-1.js","assets/WissenView-DOBd5fRz.js"])))=>i.map(i=>d[i]); -var Ev=Object.defineProperty;var oh=r=>{throw TypeError(r)};var Nv=(r,s,i)=>s in r?Ev(r,s,{enumerable:!0,configurable:!0,writable:!0,value:i}):r[s]=i;var ih=(r,s,i)=>Nv(r,typeof s!="symbol"?s+"":s,i),iu=(r,s,i)=>s.has(r)||oh("Cannot "+i);var E=(r,s,i)=>(iu(r,s,"read from private field"),i?i.call(r):s.get(r)),pe=(r,s,i)=>s.has(r)?oh("Cannot add the same private member more than once"):s instanceof WeakSet?s.add(r):s.set(r,i),J=(r,s,i,a)=>(iu(r,s,"write to private field"),a?a.call(r,i):s.set(r,i),i),_e=(r,s,i)=>(iu(r,s,"access private method"),i);var Wi=(r,s,i,a)=>({set _(u){J(r,s,u,i)},get _(){return E(r,s,a)}});function jv(r,s){for(var i=0;ia[u]})}}}return Object.freeze(Object.defineProperty(r,Symbol.toStringTag,{value:"Module"}))}(function(){const s=document.createElement("link").relList;if(s&&s.supports&&s.supports("modulepreload"))return;for(const u of document.querySelectorAll('link[rel="modulepreload"]'))a(u);new MutationObserver(u=>{for(const f of u)if(f.type==="childList")for(const m of f.addedNodes)m.tagName==="LINK"&&m.rel==="modulepreload"&&a(m)}).observe(document,{childList:!0,subtree:!0});function i(u){const f={};return u.integrity&&(f.integrity=u.integrity),u.referrerPolicy&&(f.referrerPolicy=u.referrerPolicy),u.crossOrigin==="use-credentials"?f.credentials="include":u.crossOrigin==="anonymous"?f.credentials="omit":f.credentials="same-origin",f}function a(u){if(u.ep)return;u.ep=!0;const f=i(u);fetch(u.href,f)}})();function cp(r){return r&&r.__esModule&&Object.prototype.hasOwnProperty.call(r,"default")?r.default:r}var lu={exports:{}},ho={},au={exports:{}},je={};/** - * @license React - * react.production.min.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. - */var lh;function Cv(){if(lh)return je;lh=1;var r=Symbol.for("react.element"),s=Symbol.for("react.portal"),i=Symbol.for("react.fragment"),a=Symbol.for("react.strict_mode"),u=Symbol.for("react.profiler"),f=Symbol.for("react.provider"),m=Symbol.for("react.context"),h=Symbol.for("react.forward_ref"),y=Symbol.for("react.suspense"),k=Symbol.for("react.memo"),w=Symbol.for("react.lazy"),x=Symbol.iterator;function R(C){return C===null||typeof C!="object"?null:(C=x&&C[x]||C["@@iterator"],typeof C=="function"?C:null)}var _={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},D=Object.assign,S={};function P(C,N,q){this.props=C,this.context=N,this.refs=S,this.updater=q||_}P.prototype.isReactComponent={},P.prototype.setState=function(C,N){if(typeof C!="object"&&typeof C!="function"&&C!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,C,N,"setState")},P.prototype.forceUpdate=function(C){this.updater.enqueueForceUpdate(this,C,"forceUpdate")};function A(){}A.prototype=P.prototype;function F(C,N,q){this.props=C,this.context=N,this.refs=S,this.updater=q||_}var V=F.prototype=new A;V.constructor=F,D(V,P.prototype),V.isPureReactComponent=!0;var I=Array.isArray,K=Object.prototype.hasOwnProperty,G={current:null},ue={key:!0,ref:!0,__self:!0,__source:!0};function ie(C,N,q){var Y,W={},se=null,de=null;if(N!=null)for(Y in N.ref!==void 0&&(de=N.ref),N.key!==void 0&&(se=""+N.key),N)K.call(N,Y)&&!ue.hasOwnProperty(Y)&&(W[Y]=N[Y]);var ye=arguments.length-2;if(ye===1)W.children=q;else if(1>>1,N=z[C];if(0>>1;Cu(W,Q))seu(de,W)?(z[C]=de,z[se]=Q,C=se):(z[C]=W,z[Y]=Q,C=Y);else if(seu(de,Q))z[C]=de,z[se]=Q,C=se;else break e}}return ne}function u(z,ne){var Q=z.sortIndex-ne.sortIndex;return Q!==0?Q:z.id-ne.id}if(typeof performance=="object"&&typeof performance.now=="function"){var f=performance;r.unstable_now=function(){return f.now()}}else{var m=Date,h=m.now();r.unstable_now=function(){return m.now()-h}}var y=[],k=[],w=1,x=null,R=3,_=!1,D=!1,S=!1,P=typeof setTimeout=="function"?setTimeout:null,A=typeof clearTimeout=="function"?clearTimeout:null,F=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function V(z){for(var ne=i(k);ne!==null;){if(ne.callback===null)a(k);else if(ne.startTime<=z)a(k),ne.sortIndex=ne.expirationTime,s(y,ne);else break;ne=i(k)}}function I(z){if(S=!1,V(z),!D)if(i(y)!==null)D=!0,Ce(K);else{var ne=i(k);ne!==null&&Ne(I,ne.startTime-z)}}function K(z,ne){D=!1,S&&(S=!1,A(ie),ie=-1),_=!0;var Q=R;try{for(V(ne),x=i(y);x!==null&&(!(x.expirationTime>ne)||z&&!ke());){var C=x.callback;if(typeof C=="function"){x.callback=null,R=x.priorityLevel;var N=C(x.expirationTime<=ne);ne=r.unstable_now(),typeof N=="function"?x.callback=N:x===i(y)&&a(y),V(ne)}else a(y);x=i(y)}if(x!==null)var q=!0;else{var Y=i(k);Y!==null&&Ne(I,Y.startTime-ne),q=!1}return q}finally{x=null,R=Q,_=!1}}var G=!1,ue=null,ie=-1,ee=5,me=-1;function ke(){return!(r.unstable_now()-mez||125C?(z.sortIndex=Q,s(k,z),i(y)===null&&z===i(k)&&(S?(A(ie),ie=-1):S=!0,Ne(I,Q-C))):(z.sortIndex=N,s(y,z),D||_||(D=!0,Ce(K))),z},r.unstable_shouldYield=ke,r.unstable_wrapCallback=function(z){var ne=R;return function(){var Q=R;R=ne;try{return z.apply(this,arguments)}finally{R=Q}}}})(du)),du}var fh;function Mv(){return fh||(fh=1,cu.exports=Rv()),cu.exports}/** - * @license React - * react-dom.production.min.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. - */var hh;function Ov(){if(hh)return wt;hh=1;var r=Zu(),s=Mv();function i(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),y=Object.prototype.hasOwnProperty,k=/^[: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][: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\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,w={},x={};function R(e){return y.call(x,e)?!0:y.call(w,e)?!1:k.test(e)?x[e]=!0:(w[e]=!0,!1)}function _(e,t,n,o){if(n!==null&&n.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return o?!1:n!==null?!n.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function D(e,t,n,o){if(t===null||typeof t>"u"||_(e,t,n,o))return!0;if(o)return!1;if(n!==null)switch(n.type){case 3:return!t;case 4:return t===!1;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function S(e,t,n,o,l,c,p){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=o,this.attributeNamespace=l,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=c,this.removeEmptyString=p}var P={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){P[e]=new S(e,0,!1,e,null,!1,!1)}),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];P[t]=new S(t,1,!1,e[1],null,!1,!1)}),["contentEditable","draggable","spellCheck","value"].forEach(function(e){P[e]=new S(e,2,!1,e.toLowerCase(),null,!1,!1)}),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){P[e]=new S(e,2,!1,e,null,!1,!1)}),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){P[e]=new S(e,3,!1,e.toLowerCase(),null,!1,!1)}),["checked","multiple","muted","selected"].forEach(function(e){P[e]=new S(e,3,!0,e,null,!1,!1)}),["capture","download"].forEach(function(e){P[e]=new S(e,4,!1,e,null,!1,!1)}),["cols","rows","size","span"].forEach(function(e){P[e]=new S(e,6,!1,e,null,!1,!1)}),["rowSpan","start"].forEach(function(e){P[e]=new S(e,5,!1,e.toLowerCase(),null,!1,!1)});var A=/[\-:]([a-z])/g;function F(e){return e[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".split(" ").forEach(function(e){var t=e.replace(A,F);P[t]=new S(t,1,!1,e,null,!1,!1)}),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(A,F);P[t]=new S(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)}),["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(A,F);P[t]=new S(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)}),["tabIndex","crossOrigin"].forEach(function(e){P[e]=new S(e,1,!1,e.toLowerCase(),null,!1,!1)}),P.xlinkHref=new S("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach(function(e){P[e]=new S(e,1,!1,e.toLowerCase(),null,!0,!0)});function V(e,t,n,o){var l=P.hasOwnProperty(t)?P[t]:null;(l!==null?l.type!==0:o||!(2v||l[p]!==c[v]){var b=` -`+l[p].replace(" at new "," at ");return e.displayName&&b.includes("")&&(b=b.replace("",e.displayName)),b}while(1<=p&&0<=v);break}}}finally{q=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?N(e):""}function W(e){switch(e.tag){case 5:return N(e.type);case 16:return N("Lazy");case 13:return N("Suspense");case 19:return N("SuspenseList");case 0:case 2:case 15:return e=Y(e.type,!1),e;case 11:return e=Y(e.type.render,!1),e;case 1:return e=Y(e.type,!0),e;default:return""}}function se(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case ue:return"Fragment";case G:return"Portal";case ee:return"Profiler";case ie:return"StrictMode";case Le:return"Suspense";case Z:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case ke:return(e.displayName||"Context")+".Consumer";case me:return(e._context.displayName||"Context")+".Provider";case le:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case ce:return t=e.displayName||null,t!==null?t:se(e.type)||"Memo";case Ce:t=e._payload,e=e._init;try{return se(e(t))}catch{}}return null}function de(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return se(t);case 8:return t===ie?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function ye(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function we(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function Ge(e){var t=we(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),o=""+e[t];if(!e.hasOwnProperty(t)&&typeof n<"u"&&typeof n.get=="function"&&typeof n.set=="function"){var l=n.get,c=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return l.call(this)},set:function(p){o=""+p,c.call(this,p)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return o},setValue:function(p){o=""+p},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function Sr(e){e._valueTracker||(e._valueTracker=Ge(e))}function Ns(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),o="";return e&&(o=we(e)?e.checked?"true":"false":e.value),e=o,e!==n?(t.setValue(e),!0):!1}function Er(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function rn(e,t){var n=t.checked;return Q({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:n??e._wrapperState.initialChecked})}function js(e,t){var n=t.defaultValue==null?"":t.defaultValue,o=t.checked!=null?t.checked:t.defaultChecked;n=ye(t.value!=null?t.value:n),e._wrapperState={initialChecked:o,initialValue:n,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function Nr(e,t){t=t.checked,t!=null&&V(e,"checked",t,!1)}function jr(e,t){Nr(e,t);var n=ye(t.value),o=t.type;if(n!=null)o==="number"?(n===0&&e.value===""||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if(o==="submit"||o==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?L(e,t.type,n):t.hasOwnProperty("defaultValue")&&L(e,t.type,ye(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function Cs(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var o=t.type;if(!(o!=="submit"&&o!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}n=e.name,n!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,n!==""&&(e.name=n)}function L(e,t,n){(t!=="number"||Er(e.ownerDocument)!==e)&&(n==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}var xe=Array.isArray;function Ie(e,t,n,o){if(e=e.options,t){t={};for(var l=0;l"+t.valueOf().toString()+"",t=Io.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function _s(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&n.nodeType===3){n.nodeValue=t;return}}e.textContent=t}var Ps={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},_m=["Webkit","ms","Moz","O"];Object.keys(Ps).forEach(function(e){_m.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),Ps[t]=Ps[e]})});function xc(e,t,n){return t==null||typeof t=="boolean"||t===""?"":n||typeof t!="number"||t===0||Ps.hasOwnProperty(e)&&Ps[e]?(""+t).trim():t+"px"}function wc(e,t){e=e.style;for(var n in t)if(t.hasOwnProperty(n)){var o=n.indexOf("--")===0,l=xc(n,t[n],o);n==="float"&&(n="cssFloat"),o?e.setProperty(n,l):e[n]=l}}var Pm=Q({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function yl(e,t){if(t){if(Pm[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(i(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(i(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(i(61))}if(t.style!=null&&typeof t.style!="object")throw Error(i(62))}}function xl(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var wl=null;function kl(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var bl=null,Cr=null,_r=null;function kc(e){if(e=Ys(e)){if(typeof bl!="function")throw Error(i(280));var t=e.stateNode;t&&(t=ii(t),bl(e.stateNode,e.type,t))}}function bc(e){Cr?_r?_r.push(e):_r=[e]:Cr=e}function Sc(){if(Cr){var e=Cr,t=_r;if(_r=Cr=null,kc(e),t)for(e=0;e>>=0,e===0?32:31-(Um(e)/$m|0)|0}var Bo=64,Vo=4194304;function Ts(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function Ho(e,t){var n=e.pendingLanes;if(n===0)return 0;var o=0,l=e.suspendedLanes,c=e.pingedLanes,p=n&268435455;if(p!==0){var v=p&~l;v!==0?o=Ts(v):(c&=p,c!==0&&(o=Ts(c)))}else p=n&~l,p!==0?o=Ts(p):c!==0&&(o=Ts(c));if(o===0)return 0;if(t!==0&&t!==o&&(t&l)===0&&(l=o&-o,c=t&-t,l>=c||l===16&&(c&4194240)!==0))return t;if((o&4)!==0&&(o|=n&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=o;0n;n++)t.push(e);return t}function Ls(e,t,n){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-It(t),e[t]=n}function Wm(e,t){var n=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var o=e.eventTimes;for(e=e.expirationTimes;0=Bs),Yc=" ",Xc=!1;function Jc(e,t){switch(e){case"keyup":return xg.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function ed(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var Mr=!1;function kg(e,t){switch(e){case"compositionend":return ed(t);case"keypress":return t.which!==32?null:(Xc=!0,Yc);case"textInput":return e=t.data,e===Yc&&Xc?null:e;default:return null}}function bg(e,t){if(Mr)return e==="compositionend"||!Ul&&Jc(e,t)?(e=Wc(),Go=Ll=bn=null,Mr=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=o}e:{for(;n;){if(n.nextSibling){n=n.nextSibling;break e}n=n.parentNode}n=void 0}n=ld(n)}}function ud(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?ud(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function cd(){for(var e=window,t=Er();t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href=="string"}catch{n=!1}if(n)e=t.contentWindow;else break;t=Er(e.document)}return t}function Vl(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function Mg(e){var t=cd(),n=e.focusedElem,o=e.selectionRange;if(t!==n&&n&&n.ownerDocument&&ud(n.ownerDocument.documentElement,n)){if(o!==null&&Vl(n)){if(t=o.start,e=o.end,e===void 0&&(e=t),"selectionStart"in n)n.selectionStart=t,n.selectionEnd=Math.min(e,n.value.length);else if(e=(t=n.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var l=n.textContent.length,c=Math.min(o.start,l);o=o.end===void 0?c:Math.min(o.end,l),!e.extend&&c>o&&(l=o,o=c,c=l),l=ad(n,c);var p=ad(n,o);l&&p&&(e.rangeCount!==1||e.anchorNode!==l.node||e.anchorOffset!==l.offset||e.focusNode!==p.node||e.focusOffset!==p.offset)&&(t=t.createRange(),t.setStart(l.node,l.offset),e.removeAllRanges(),c>o?(e.addRange(t),e.extend(p.node,p.offset)):(t.setEnd(p.node,p.offset),e.addRange(t)))}}for(t=[],e=n;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof n.focus=="function"&&n.focus(),n=0;n=document.documentMode,Or=null,Hl=null,Qs=null,Wl=!1;function dd(e,t,n){var o=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;Wl||Or==null||Or!==Er(o)||(o=Or,"selectionStart"in o&&Vl(o)?o={start:o.selectionStart,end:o.selectionEnd}:(o=(o.ownerDocument&&o.ownerDocument.defaultView||window).getSelection(),o={anchorNode:o.anchorNode,anchorOffset:o.anchorOffset,focusNode:o.focusNode,focusOffset:o.focusOffset}),Qs&&Ws(Qs,o)||(Qs=o,o=ri(Hl,"onSelect"),0Ir||(e.current=ra[Ir],ra[Ir]=null,Ir--)}function Ae(e,t){Ir++,ra[Ir]=e.current,e.current=t}var jn={},lt=Nn(jn),mt=Nn(!1),er=jn;function zr(e,t){var n=e.type.contextTypes;if(!n)return jn;var o=e.stateNode;if(o&&o.__reactInternalMemoizedUnmaskedChildContext===t)return o.__reactInternalMemoizedMaskedChildContext;var l={},c;for(c in n)l[c]=t[c];return o&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=l),l}function gt(e){return e=e.childContextTypes,e!=null}function li(){Fe(mt),Fe(lt)}function jd(e,t,n){if(lt.current!==jn)throw Error(i(168));Ae(lt,t),Ae(mt,n)}function Cd(e,t,n){var o=e.stateNode;if(t=t.childContextTypes,typeof o.getChildContext!="function")return n;o=o.getChildContext();for(var l in o)if(!(l in t))throw Error(i(108,de(e)||"Unknown",l));return Q({},n,o)}function ai(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||jn,er=lt.current,Ae(lt,e),Ae(mt,mt.current),!0}function _d(e,t,n){var o=e.stateNode;if(!o)throw Error(i(169));n?(e=Cd(e,t,er),o.__reactInternalMemoizedMergedChildContext=e,Fe(mt),Fe(lt),Ae(lt,e)):Fe(mt),Ae(mt,n)}var on=null,ui=!1,sa=!1;function Pd(e){on===null?on=[e]:on.push(e)}function Vg(e){ui=!0,Pd(e)}function Cn(){if(!sa&&on!==null){sa=!0;var e=0,t=De;try{var n=on;for(De=1;e>=p,l-=p,ln=1<<32-It(t)+l|n<ve?(tt=he,he=null):tt=he.sibling;var Oe=U(M,he,O[ve],H);if(Oe===null){he===null&&(he=tt);break}e&&he&&Oe.alternate===null&&t(M,he),j=c(Oe,j,ve),fe===null?ae=Oe:fe.sibling=Oe,fe=Oe,he=tt}if(ve===O.length)return n(M,he),$e&&nr(M,ve),ae;if(he===null){for(;veve?(tt=he,he=null):tt=he.sibling;var An=U(M,he,Oe.value,H);if(An===null){he===null&&(he=tt);break}e&&he&&An.alternate===null&&t(M,he),j=c(An,j,ve),fe===null?ae=An:fe.sibling=An,fe=An,he=tt}if(Oe.done)return n(M,he),$e&&nr(M,ve),ae;if(he===null){for(;!Oe.done;ve++,Oe=O.next())Oe=B(M,Oe.value,H),Oe!==null&&(j=c(Oe,j,ve),fe===null?ae=Oe:fe.sibling=Oe,fe=Oe);return $e&&nr(M,ve),ae}for(he=o(M,he);!Oe.done;ve++,Oe=O.next())Oe=X(he,M,ve,Oe.value,H),Oe!==null&&(e&&Oe.alternate!==null&&he.delete(Oe.key===null?ve:Oe.key),j=c(Oe,j,ve),fe===null?ae=Oe:fe.sibling=Oe,fe=Oe);return e&&he.forEach(function(Sv){return t(M,Sv)}),$e&&nr(M,ve),ae}function qe(M,j,O,H){if(typeof O=="object"&&O!==null&&O.type===ue&&O.key===null&&(O=O.props.children),typeof O=="object"&&O!==null){switch(O.$$typeof){case K:e:{for(var ae=O.key,fe=j;fe!==null;){if(fe.key===ae){if(ae=O.type,ae===ue){if(fe.tag===7){n(M,fe.sibling),j=l(fe,O.props.children),j.return=M,M=j;break e}}else if(fe.elementType===ae||typeof ae=="object"&&ae!==null&&ae.$$typeof===Ce&&Dd(ae)===fe.type){n(M,fe.sibling),j=l(fe,O.props),j.ref=Xs(M,fe,O),j.return=M,M=j;break e}n(M,fe);break}else t(M,fe);fe=fe.sibling}O.type===ue?(j=cr(O.props.children,M.mode,H,O.key),j.return=M,M=j):(H=Ii(O.type,O.key,O.props,null,M.mode,H),H.ref=Xs(M,j,O),H.return=M,M=H)}return p(M);case G:e:{for(fe=O.key;j!==null;){if(j.key===fe)if(j.tag===4&&j.stateNode.containerInfo===O.containerInfo&&j.stateNode.implementation===O.implementation){n(M,j.sibling),j=l(j,O.children||[]),j.return=M,M=j;break e}else{n(M,j);break}else t(M,j);j=j.sibling}j=tu(O,M.mode,H),j.return=M,M=j}return p(M);case Ce:return fe=O._init,qe(M,j,fe(O._payload),H)}if(xe(O))return re(M,j,O,H);if(ne(O))return oe(M,j,O,H);hi(M,O)}return typeof O=="string"&&O!==""||typeof O=="number"?(O=""+O,j!==null&&j.tag===6?(n(M,j.sibling),j=l(j,O),j.return=M,M=j):(n(M,j),j=eu(O,M.mode,H),j.return=M,M=j),p(M)):n(M,j)}return qe}var Br=Ad(!0),Id=Ad(!1),pi=Nn(null),mi=null,Vr=null,ca=null;function da(){ca=Vr=mi=null}function fa(e){var t=pi.current;Fe(pi),e._currentValue=t}function ha(e,t,n){for(;e!==null;){var o=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,o!==null&&(o.childLanes|=t)):o!==null&&(o.childLanes&t)!==t&&(o.childLanes|=t),e===n)break;e=e.return}}function Hr(e,t){mi=e,ca=Vr=null,e=e.dependencies,e!==null&&e.firstContext!==null&&((e.lanes&t)!==0&&(vt=!0),e.firstContext=null)}function Ot(e){var t=e._currentValue;if(ca!==e)if(e={context:e,memoizedValue:t,next:null},Vr===null){if(mi===null)throw Error(i(308));Vr=e,mi.dependencies={lanes:0,firstContext:e}}else Vr=Vr.next=e;return t}var rr=null;function pa(e){rr===null?rr=[e]:rr.push(e)}function zd(e,t,n,o){var l=t.interleaved;return l===null?(n.next=n,pa(t)):(n.next=l.next,l.next=n),t.interleaved=n,un(e,o)}function un(e,t){e.lanes|=t;var n=e.alternate;for(n!==null&&(n.lanes|=t),n=e,e=e.return;e!==null;)e.childLanes|=t,n=e.alternate,n!==null&&(n.childLanes|=t),n=e,e=e.return;return n.tag===3?n.stateNode:null}var _n=!1;function ma(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function Fd(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function cn(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function Pn(e,t,n){var o=e.updateQueue;if(o===null)return null;if(o=o.shared,(Me&2)!==0){var l=o.pending;return l===null?t.next=t:(t.next=l.next,l.next=t),o.pending=t,un(e,n)}return l=o.interleaved,l===null?(t.next=t,pa(o)):(t.next=l.next,l.next=t),o.interleaved=t,un(e,n)}function gi(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,(n&4194240)!==0)){var o=t.lanes;o&=e.pendingLanes,n|=o,t.lanes=n,Pl(e,n)}}function Ud(e,t){var n=e.updateQueue,o=e.alternate;if(o!==null&&(o=o.updateQueue,n===o)){var l=null,c=null;if(n=n.firstBaseUpdate,n!==null){do{var p={eventTime:n.eventTime,lane:n.lane,tag:n.tag,payload:n.payload,callback:n.callback,next:null};c===null?l=c=p:c=c.next=p,n=n.next}while(n!==null);c===null?l=c=t:c=c.next=t}else l=c=t;n={baseState:o.baseState,firstBaseUpdate:l,lastBaseUpdate:c,shared:o.shared,effects:o.effects},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}function vi(e,t,n,o){var l=e.updateQueue;_n=!1;var c=l.firstBaseUpdate,p=l.lastBaseUpdate,v=l.shared.pending;if(v!==null){l.shared.pending=null;var b=v,T=b.next;b.next=null,p===null?c=T:p.next=T,p=b;var $=e.alternate;$!==null&&($=$.updateQueue,v=$.lastBaseUpdate,v!==p&&(v===null?$.firstBaseUpdate=T:v.next=T,$.lastBaseUpdate=b))}if(c!==null){var B=l.baseState;p=0,$=T=b=null,v=c;do{var U=v.lane,X=v.eventTime;if((o&U)===U){$!==null&&($=$.next={eventTime:X,lane:0,tag:v.tag,payload:v.payload,callback:v.callback,next:null});e:{var re=e,oe=v;switch(U=t,X=n,oe.tag){case 1:if(re=oe.payload,typeof re=="function"){B=re.call(X,B,U);break e}B=re;break e;case 3:re.flags=re.flags&-65537|128;case 0:if(re=oe.payload,U=typeof re=="function"?re.call(X,B,U):re,U==null)break e;B=Q({},B,U);break e;case 2:_n=!0}}v.callback!==null&&v.lane!==0&&(e.flags|=64,U=l.effects,U===null?l.effects=[v]:U.push(v))}else X={eventTime:X,lane:U,tag:v.tag,payload:v.payload,callback:v.callback,next:null},$===null?(T=$=X,b=B):$=$.next=X,p|=U;if(v=v.next,v===null){if(v=l.shared.pending,v===null)break;U=v,v=U.next,U.next=null,l.lastBaseUpdate=U,l.shared.pending=null}}while(!0);if($===null&&(b=B),l.baseState=b,l.firstBaseUpdate=T,l.lastBaseUpdate=$,t=l.shared.interleaved,t!==null){l=t;do p|=l.lane,l=l.next;while(l!==t)}else c===null&&(l.shared.lanes=0);ir|=p,e.lanes=p,e.memoizedState=B}}function $d(e,t,n){if(e=t.effects,t.effects=null,e!==null)for(t=0;tn?n:4,e(!0);var o=wa.transition;wa.transition={};try{e(!1),t()}finally{De=n,wa.transition=o}}function lf(){return Tt().memoizedState}function Kg(e,t,n){var o=Tn(e);if(n={lane:o,action:n,hasEagerState:!1,eagerState:null,next:null},af(e))uf(t,n);else if(n=zd(e,t,n,o),n!==null){var l=ht();Vt(n,e,o,l),cf(n,t,o)}}function qg(e,t,n){var o=Tn(e),l={lane:o,action:n,hasEagerState:!1,eagerState:null,next:null};if(af(e))uf(t,l);else{var c=e.alternate;if(e.lanes===0&&(c===null||c.lanes===0)&&(c=t.lastRenderedReducer,c!==null))try{var p=t.lastRenderedState,v=c(p,n);if(l.hasEagerState=!0,l.eagerState=v,zt(v,p)){var b=t.interleaved;b===null?(l.next=l,pa(t)):(l.next=b.next,b.next=l),t.interleaved=l;return}}catch{}finally{}n=zd(e,t,l,o),n!==null&&(l=ht(),Vt(n,e,o,l),cf(n,t,o))}}function af(e){var t=e.alternate;return e===He||t!==null&&t===He}function uf(e,t){no=wi=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function cf(e,t,n){if((n&4194240)!==0){var o=t.lanes;o&=e.pendingLanes,n|=o,t.lanes=n,Pl(e,n)}}var Si={readContext:Ot,useCallback:at,useContext:at,useEffect:at,useImperativeHandle:at,useInsertionEffect:at,useLayoutEffect:at,useMemo:at,useReducer:at,useRef:at,useState:at,useDebugValue:at,useDeferredValue:at,useTransition:at,useMutableSource:at,useSyncExternalStore:at,useId:at,unstable_isNewReconciler:!1},Gg={readContext:Ot,useCallback:function(e,t){return Zt().memoizedState=[e,t===void 0?null:t],e},useContext:Ot,useEffect:Xd,useImperativeHandle:function(e,t,n){return n=n!=null?n.concat([e]):null,ki(4194308,4,tf.bind(null,t,e),n)},useLayoutEffect:function(e,t){return ki(4194308,4,e,t)},useInsertionEffect:function(e,t){return ki(4,2,e,t)},useMemo:function(e,t){var n=Zt();return t=t===void 0?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var o=Zt();return t=n!==void 0?n(t):t,o.memoizedState=o.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},o.queue=e,e=e.dispatch=Kg.bind(null,He,e),[o.memoizedState,e]},useRef:function(e){var t=Zt();return e={current:e},t.memoizedState=e},useState:Zd,useDebugValue:Ca,useDeferredValue:function(e){return Zt().memoizedState=e},useTransition:function(){var e=Zd(!1),t=e[0];return e=Qg.bind(null,e[1]),Zt().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,n){var o=He,l=Zt();if($e){if(n===void 0)throw Error(i(407));n=n()}else{if(n=t(),et===null)throw Error(i(349));(or&30)!==0||Wd(o,t,n)}l.memoizedState=n;var c={value:n,getSnapshot:t};return l.queue=c,Xd(Kd.bind(null,o,c,e),[e]),o.flags|=2048,oo(9,Qd.bind(null,o,c,n,t),void 0,null),n},useId:function(){var e=Zt(),t=et.identifierPrefix;if($e){var n=an,o=ln;n=(o&~(1<<32-It(o)-1)).toString(32)+n,t=":"+t+"R"+n,n=ro++,0<\/script>",e=e.removeChild(e.firstChild)):typeof o.is=="string"?e=p.createElement(n,{is:o.is}):(e=p.createElement(n),n==="select"&&(p=e,o.multiple?p.multiple=!0:o.size&&(p.size=o.size))):e=p.createElementNS(e,n),e[qt]=t,e[Zs]=o,Rf(e,t,!1,!1),t.stateNode=e;e:{switch(p=xl(n,o),n){case"dialog":ze("cancel",e),ze("close",e),l=o;break;case"iframe":case"object":case"embed":ze("load",e),l=o;break;case"video":case"audio":for(l=0;lGr&&(t.flags|=128,o=!0,io(c,!1),t.lanes=4194304)}else{if(!o)if(e=yi(p),e!==null){if(t.flags|=128,o=!0,n=e.updateQueue,n!==null&&(t.updateQueue=n,t.flags|=4),io(c,!0),c.tail===null&&c.tailMode==="hidden"&&!p.alternate&&!$e)return ut(t),null}else 2*Ke()-c.renderingStartTime>Gr&&n!==1073741824&&(t.flags|=128,o=!0,io(c,!1),t.lanes=4194304);c.isBackwards?(p.sibling=t.child,t.child=p):(n=c.last,n!==null?n.sibling=p:t.child=p,c.last=p)}return c.tail!==null?(t=c.tail,c.rendering=t,c.tail=t.sibling,c.renderingStartTime=Ke(),t.sibling=null,n=Ve.current,Ae(Ve,o?n&1|2:n&1),t):(ut(t),null);case 22:case 23:return Ya(),o=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==o&&(t.flags|=8192),o&&(t.mode&1)!==0?(Ct&1073741824)!==0&&(ut(t),t.subtreeFlags&6&&(t.flags|=8192)):ut(t),null;case 24:return null;case 25:return null}throw Error(i(156,t.tag))}function rv(e,t){switch(ia(t),t.tag){case 1:return gt(t.type)&&li(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return Wr(),Fe(mt),Fe(lt),xa(),e=t.flags,(e&65536)!==0&&(e&128)===0?(t.flags=e&-65537|128,t):null;case 5:return va(t),null;case 13:if(Fe(Ve),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(i(340));$r()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return Fe(Ve),null;case 4:return Wr(),null;case 10:return fa(t.type._context),null;case 22:case 23:return Ya(),null;case 24:return null;default:return null}}var Ci=!1,ct=!1,sv=typeof WeakSet=="function"?WeakSet:Set,te=null;function Kr(e,t){var n=e.ref;if(n!==null)if(typeof n=="function")try{n(null)}catch(o){We(e,t,o)}else n.current=null}function Fa(e,t,n){try{n()}catch(o){We(e,t,o)}}var Tf=!1;function ov(e,t){if(Yl=Ko,e=cd(),Vl(e)){if("selectionStart"in e)var n={start:e.selectionStart,end:e.selectionEnd};else e:{n=(n=e.ownerDocument)&&n.defaultView||window;var o=n.getSelection&&n.getSelection();if(o&&o.rangeCount!==0){n=o.anchorNode;var l=o.anchorOffset,c=o.focusNode;o=o.focusOffset;try{n.nodeType,c.nodeType}catch{n=null;break e}var p=0,v=-1,b=-1,T=0,$=0,B=e,U=null;t:for(;;){for(var X;B!==n||l!==0&&B.nodeType!==3||(v=p+l),B!==c||o!==0&&B.nodeType!==3||(b=p+o),B.nodeType===3&&(p+=B.nodeValue.length),(X=B.firstChild)!==null;)U=B,B=X;for(;;){if(B===e)break t;if(U===n&&++T===l&&(v=p),U===c&&++$===o&&(b=p),(X=B.nextSibling)!==null)break;B=U,U=B.parentNode}B=X}n=v===-1||b===-1?null:{start:v,end:b}}else n=null}n=n||{start:0,end:0}}else n=null;for(Xl={focusedElem:e,selectionRange:n},Ko=!1,te=t;te!==null;)if(t=te,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,te=e;else for(;te!==null;){t=te;try{var re=t.alternate;if((t.flags&1024)!==0)switch(t.tag){case 0:case 11:case 15:break;case 1:if(re!==null){var oe=re.memoizedProps,qe=re.memoizedState,M=t.stateNode,j=M.getSnapshotBeforeUpdate(t.elementType===t.type?oe:Ut(t.type,oe),qe);M.__reactInternalSnapshotBeforeUpdate=j}break;case 3:var O=t.stateNode.containerInfo;O.nodeType===1?O.textContent="":O.nodeType===9&&O.documentElement&&O.removeChild(O.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(i(163))}}catch(H){We(t,t.return,H)}if(e=t.sibling,e!==null){e.return=t.return,te=e;break}te=t.return}return re=Tf,Tf=!1,re}function lo(e,t,n){var o=t.updateQueue;if(o=o!==null?o.lastEffect:null,o!==null){var l=o=o.next;do{if((l.tag&e)===e){var c=l.destroy;l.destroy=void 0,c!==void 0&&Fa(t,n,c)}l=l.next}while(l!==o)}}function _i(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var n=t=t.next;do{if((n.tag&e)===e){var o=n.create;n.destroy=o()}n=n.next}while(n!==t)}}function Ua(e){var t=e.ref;if(t!==null){var n=e.stateNode;switch(e.tag){case 5:e=n;break;default:e=n}typeof t=="function"?t(e):t.current=e}}function Lf(e){var t=e.alternate;t!==null&&(e.alternate=null,Lf(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[qt],delete t[Zs],delete t[na],delete t[$g],delete t[Bg])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function Df(e){return e.tag===5||e.tag===3||e.tag===4}function Af(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||Df(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function $a(e,t,n){var o=e.tag;if(o===5||o===6)e=e.stateNode,t?n.nodeType===8?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(n.nodeType===8?(t=n.parentNode,t.insertBefore(e,n)):(t=n,t.appendChild(e)),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=oi));else if(o!==4&&(e=e.child,e!==null))for($a(e,t,n),e=e.sibling;e!==null;)$a(e,t,n),e=e.sibling}function Ba(e,t,n){var o=e.tag;if(o===5||o===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(o!==4&&(e=e.child,e!==null))for(Ba(e,t,n),e=e.sibling;e!==null;)Ba(e,t,n),e=e.sibling}var rt=null,$t=!1;function Rn(e,t,n){for(n=n.child;n!==null;)If(e,t,n),n=n.sibling}function If(e,t,n){if(Kt&&typeof Kt.onCommitFiberUnmount=="function")try{Kt.onCommitFiberUnmount($o,n)}catch{}switch(n.tag){case 5:ct||Kr(n,t);case 6:var o=rt,l=$t;rt=null,Rn(e,t,n),rt=o,$t=l,rt!==null&&($t?(e=rt,n=n.stateNode,e.nodeType===8?e.parentNode.removeChild(n):e.removeChild(n)):rt.removeChild(n.stateNode));break;case 18:rt!==null&&($t?(e=rt,n=n.stateNode,e.nodeType===8?ta(e.parentNode,n):e.nodeType===1&&ta(e,n),Fs(e)):ta(rt,n.stateNode));break;case 4:o=rt,l=$t,rt=n.stateNode.containerInfo,$t=!0,Rn(e,t,n),rt=o,$t=l;break;case 0:case 11:case 14:case 15:if(!ct&&(o=n.updateQueue,o!==null&&(o=o.lastEffect,o!==null))){l=o=o.next;do{var c=l,p=c.destroy;c=c.tag,p!==void 0&&((c&2)!==0||(c&4)!==0)&&Fa(n,t,p),l=l.next}while(l!==o)}Rn(e,t,n);break;case 1:if(!ct&&(Kr(n,t),o=n.stateNode,typeof o.componentWillUnmount=="function"))try{o.props=n.memoizedProps,o.state=n.memoizedState,o.componentWillUnmount()}catch(v){We(n,t,v)}Rn(e,t,n);break;case 21:Rn(e,t,n);break;case 22:n.mode&1?(ct=(o=ct)||n.memoizedState!==null,Rn(e,t,n),ct=o):Rn(e,t,n);break;default:Rn(e,t,n)}}function zf(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var n=e.stateNode;n===null&&(n=e.stateNode=new sv),t.forEach(function(o){var l=pv.bind(null,e,o);n.has(o)||(n.add(o),o.then(l,l))})}}function Bt(e,t){var n=t.deletions;if(n!==null)for(var o=0;ol&&(l=p),o&=~c}if(o=l,o=Ke()-o,o=(120>o?120:480>o?480:1080>o?1080:1920>o?1920:3e3>o?3e3:4320>o?4320:1960*lv(o/1960))-o,10e?16:e,On===null)var o=!1;else{if(e=On,On=null,Ti=0,(Me&6)!==0)throw Error(i(331));var l=Me;for(Me|=4,te=e.current;te!==null;){var c=te,p=c.child;if((te.flags&16)!==0){var v=c.deletions;if(v!==null){for(var b=0;bKe()-Wa?ar(e,0):Ha|=n),xt(e,t)}function Yf(e,t){t===0&&((e.mode&1)===0?t=1:(t=Vo,Vo<<=1,(Vo&130023424)===0&&(Vo=4194304)));var n=ht();e=un(e,t),e!==null&&(Ls(e,t,n),xt(e,n))}function hv(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),Yf(e,n)}function pv(e,t){var n=0;switch(e.tag){case 13:var o=e.stateNode,l=e.memoizedState;l!==null&&(n=l.retryLane);break;case 19:o=e.stateNode;break;default:throw Error(i(314))}o!==null&&o.delete(t),Yf(e,n)}var Xf;Xf=function(e,t,n){if(e!==null)if(e.memoizedProps!==t.pendingProps||mt.current)vt=!0;else{if((e.lanes&n)===0&&(t.flags&128)===0)return vt=!1,tv(e,t,n);vt=(e.flags&131072)!==0}else vt=!1,$e&&(t.flags&1048576)!==0&&Rd(t,di,t.index);switch(t.lanes=0,t.tag){case 2:var o=t.type;ji(e,t),e=t.pendingProps;var l=zr(t,lt.current);Hr(t,n),l=ba(null,t,o,e,l,n);var c=Sa();return t.flags|=1,typeof l=="object"&&l!==null&&typeof l.render=="function"&&l.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,gt(o)?(c=!0,ai(t)):c=!1,t.memoizedState=l.state!==null&&l.state!==void 0?l.state:null,ma(t),l.updater=Ei,t.stateNode=l,l._reactInternals=t,Pa(t,o,e,n),t=Ta(null,t,o,!0,c,n)):(t.tag=0,$e&&c&&oa(t),ft(null,t,l,n),t=t.child),t;case 16:o=t.elementType;e:{switch(ji(e,t),e=t.pendingProps,l=o._init,o=l(o._payload),t.type=o,l=t.tag=gv(o),e=Ut(o,e),l){case 0:t=Oa(null,t,o,e,n);break e;case 1:t=Ef(null,t,o,e,n);break e;case 11:t=xf(null,t,o,e,n);break e;case 14:t=wf(null,t,o,Ut(o.type,e),n);break e}throw Error(i(306,o,""))}return t;case 0:return o=t.type,l=t.pendingProps,l=t.elementType===o?l:Ut(o,l),Oa(e,t,o,l,n);case 1:return o=t.type,l=t.pendingProps,l=t.elementType===o?l:Ut(o,l),Ef(e,t,o,l,n);case 3:e:{if(Nf(t),e===null)throw Error(i(387));o=t.pendingProps,c=t.memoizedState,l=c.element,Fd(e,t),vi(t,o,null,n);var p=t.memoizedState;if(o=p.element,c.isDehydrated)if(c={element:o,isDehydrated:!1,cache:p.cache,pendingSuspenseBoundaries:p.pendingSuspenseBoundaries,transitions:p.transitions},t.updateQueue.baseState=c,t.memoizedState=c,t.flags&256){l=Qr(Error(i(423)),t),t=jf(e,t,o,n,l);break e}else if(o!==l){l=Qr(Error(i(424)),t),t=jf(e,t,o,n,l);break e}else for(jt=En(t.stateNode.containerInfo.firstChild),Nt=t,$e=!0,Ft=null,n=Id(t,null,o,n),t.child=n;n;)n.flags=n.flags&-3|4096,n=n.sibling;else{if($r(),o===l){t=dn(e,t,n);break e}ft(e,t,o,n)}t=t.child}return t;case 5:return Bd(t),e===null&&aa(t),o=t.type,l=t.pendingProps,c=e!==null?e.memoizedProps:null,p=l.children,Jl(o,l)?p=null:c!==null&&Jl(o,c)&&(t.flags|=32),Sf(e,t),ft(e,t,p,n),t.child;case 6:return e===null&&aa(t),null;case 13:return Cf(e,t,n);case 4:return ga(t,t.stateNode.containerInfo),o=t.pendingProps,e===null?t.child=Br(t,null,o,n):ft(e,t,o,n),t.child;case 11:return o=t.type,l=t.pendingProps,l=t.elementType===o?l:Ut(o,l),xf(e,t,o,l,n);case 7:return ft(e,t,t.pendingProps,n),t.child;case 8:return ft(e,t,t.pendingProps.children,n),t.child;case 12:return ft(e,t,t.pendingProps.children,n),t.child;case 10:e:{if(o=t.type._context,l=t.pendingProps,c=t.memoizedProps,p=l.value,Ae(pi,o._currentValue),o._currentValue=p,c!==null)if(zt(c.value,p)){if(c.children===l.children&&!mt.current){t=dn(e,t,n);break e}}else for(c=t.child,c!==null&&(c.return=t);c!==null;){var v=c.dependencies;if(v!==null){p=c.child;for(var b=v.firstContext;b!==null;){if(b.context===o){if(c.tag===1){b=cn(-1,n&-n),b.tag=2;var T=c.updateQueue;if(T!==null){T=T.shared;var $=T.pending;$===null?b.next=b:(b.next=$.next,$.next=b),T.pending=b}}c.lanes|=n,b=c.alternate,b!==null&&(b.lanes|=n),ha(c.return,n,t),v.lanes|=n;break}b=b.next}}else if(c.tag===10)p=c.type===t.type?null:c.child;else if(c.tag===18){if(p=c.return,p===null)throw Error(i(341));p.lanes|=n,v=p.alternate,v!==null&&(v.lanes|=n),ha(p,n,t),p=c.sibling}else p=c.child;if(p!==null)p.return=c;else for(p=c;p!==null;){if(p===t){p=null;break}if(c=p.sibling,c!==null){c.return=p.return,p=c;break}p=p.return}c=p}ft(e,t,l.children,n),t=t.child}return t;case 9:return l=t.type,o=t.pendingProps.children,Hr(t,n),l=Ot(l),o=o(l),t.flags|=1,ft(e,t,o,n),t.child;case 14:return o=t.type,l=Ut(o,t.pendingProps),l=Ut(o.type,l),wf(e,t,o,l,n);case 15:return kf(e,t,t.type,t.pendingProps,n);case 17:return o=t.type,l=t.pendingProps,l=t.elementType===o?l:Ut(o,l),ji(e,t),t.tag=1,gt(o)?(e=!0,ai(t)):e=!1,Hr(t,n),ff(t,o,l),Pa(t,o,l,n),Ta(null,t,o,!0,e,n);case 19:return Pf(e,t,n);case 22:return bf(e,t,n)}throw Error(i(156,t.tag))};function Jf(e,t){return Mc(e,t)}function mv(e,t,n,o){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=o,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Dt(e,t,n,o){return new mv(e,t,n,o)}function Ja(e){return e=e.prototype,!(!e||!e.isReactComponent)}function gv(e){if(typeof e=="function")return Ja(e)?1:0;if(e!=null){if(e=e.$$typeof,e===le)return 11;if(e===ce)return 14}return 2}function Dn(e,t){var n=e.alternate;return n===null?(n=Dt(e.tag,t,e.key,e.mode),n.elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=e.flags&14680064,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function Ii(e,t,n,o,l,c){var p=2;if(o=e,typeof e=="function")Ja(e)&&(p=1);else if(typeof e=="string")p=5;else e:switch(e){case ue:return cr(n.children,l,c,t);case ie:p=8,l|=8;break;case ee:return e=Dt(12,n,t,l|2),e.elementType=ee,e.lanes=c,e;case Le:return e=Dt(13,n,t,l),e.elementType=Le,e.lanes=c,e;case Z:return e=Dt(19,n,t,l),e.elementType=Z,e.lanes=c,e;case Ne:return zi(n,l,c,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case me:p=10;break e;case ke:p=9;break e;case le:p=11;break e;case ce:p=14;break e;case Ce:p=16,o=null;break e}throw Error(i(130,e==null?e:typeof e,""))}return t=Dt(p,n,t,l),t.elementType=e,t.type=o,t.lanes=c,t}function cr(e,t,n,o){return e=Dt(7,e,o,t),e.lanes=n,e}function zi(e,t,n,o){return e=Dt(22,e,o,t),e.elementType=Ne,e.lanes=n,e.stateNode={isHidden:!1},e}function eu(e,t,n){return e=Dt(6,e,null,t),e.lanes=n,e}function tu(e,t,n){return t=Dt(4,e.children!==null?e.children:[],e.key,t),t.lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function vv(e,t,n,o,l){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=_l(0),this.expirationTimes=_l(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=_l(0),this.identifierPrefix=o,this.onRecoverableError=l,this.mutableSourceEagerHydrationData=null}function nu(e,t,n,o,l,c,p,v,b){return e=new vv(e,t,n,v,b),t===1?(t=1,c===!0&&(t|=8)):t=0,c=Dt(3,null,null,t),e.current=c,c.stateNode=e,c.memoizedState={element:o,isDehydrated:n,cache:null,transitions:null,pendingSuspenseBoundaries:null},ma(c),e}function yv(e,t,n){var o=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(r)}catch(s){console.error(s)}}return r(),uu.exports=Ov(),uu.exports}var mh;function Tv(){if(mh)return Qi;mh=1;var r=dp();return Qi.createRoot=r.createRoot,Qi.hydrateRoot=r.hydrateRoot,Qi}var Lv=Tv();const Dv=cp(Lv);var Do=class{constructor(){this.listeners=new Set,this.subscribe=this.subscribe.bind(this)}subscribe(r){return this.listeners.add(r),this.onSubscribe(),()=>{this.listeners.delete(r),this.onUnsubscribe()}}hasListeners(){return this.listeners.size>0}onSubscribe(){}onUnsubscribe(){}},fr,$n,as,ep,Av=(ep=class extends Do{constructor(){super();pe(this,fr);pe(this,$n);pe(this,as);J(this,as,s=>{if(typeof window<"u"&&window.addEventListener){const i=()=>s();return window.addEventListener("visibilitychange",i,!1),()=>{window.removeEventListener("visibilitychange",i)}}})}onSubscribe(){E(this,$n)||this.setEventListener(E(this,as))}onUnsubscribe(){var s;this.hasListeners()||((s=E(this,$n))==null||s.call(this),J(this,$n,void 0))}setEventListener(s){var i;J(this,as,s),(i=E(this,$n))==null||i.call(this),J(this,$n,s(a=>{typeof a=="boolean"?this.setFocused(a):this.onFocus()}))}setFocused(s){E(this,fr)!==s&&(J(this,fr,s),this.onFocus())}onFocus(){const s=this.isFocused();this.listeners.forEach(i=>{i(s)})}isFocused(){var s;return typeof E(this,fr)=="boolean"?E(this,fr):((s=globalThis.document)==null?void 0:s.visibilityState)!=="hidden"}},fr=new WeakMap,$n=new WeakMap,as=new WeakMap,ep),Ju=new Av,Iv={setTimeout:(r,s)=>setTimeout(r,s),clearTimeout:r=>clearTimeout(r),setInterval:(r,s)=>setInterval(r,s),clearInterval:r=>clearInterval(r)},Bn,Gu,tp,zv=(tp=class{constructor(){pe(this,Bn,Iv);pe(this,Gu,!1)}setTimeoutProvider(r){J(this,Bn,r)}setTimeout(r,s){return E(this,Bn).setTimeout(r,s)}clearTimeout(r){E(this,Bn).clearTimeout(r)}setInterval(r,s){return E(this,Bn).setInterval(r,s)}clearInterval(r){E(this,Bn).clearInterval(r)}},Bn=new WeakMap,Gu=new WeakMap,tp),dr=new zv;function Fv(r){setTimeout(r,0)}var Uv=typeof window>"u"||"Deno"in globalThis;function bt(){}function $v(r,s){return typeof r=="function"?r(s):r}function Eu(r){return typeof r=="number"&&r>=0&&r!==1/0}function fp(r,s){return Math.max(r+(s||0)-Date.now(),0)}function Gn(r,s){return typeof r=="function"?r(s):r}function Pt(r,s){return typeof r=="function"?r(s):r}function gh(r,s){const{type:i="all",exact:a,fetchStatus:u,predicate:f,queryKey:m,stale:h}=r;if(m){if(a){if(s.queryHash!==ec(m,s.options))return!1}else if(!Eo(s.queryKey,m))return!1}if(i!=="all"){const y=s.isActive();if(i==="active"&&!y||i==="inactive"&&y)return!1}return!(typeof h=="boolean"&&s.isStale()!==h||u&&u!==s.state.fetchStatus||f&&!f(s))}function vh(r,s){const{exact:i,status:a,predicate:u,mutationKey:f}=r;if(f){if(!s.options.mutationKey)return!1;if(i){if(So(s.options.mutationKey)!==So(f))return!1}else if(!Eo(s.options.mutationKey,f))return!1}return!(a&&s.state.status!==a||u&&!u(s))}function ec(r,s){return((s==null?void 0:s.queryKeyHashFn)||So)(r)}function So(r){return JSON.stringify(r,(s,i)=>ju(i)?Object.keys(i).sort().reduce((a,u)=>(a[u]=i[u],a),{}):i)}function Eo(r,s){return r===s?!0:typeof r!=typeof s?!1:r&&s&&typeof r=="object"&&typeof s=="object"?Object.keys(s).every(i=>Eo(r[i],s[i])):!1}var Bv=Object.prototype.hasOwnProperty;function hp(r,s,i=0){if(r===s)return r;if(i>500)return s;const a=yh(r)&&yh(s);if(!a&&!(ju(r)&&ju(s)))return s;const f=(a?r:Object.keys(r)).length,m=a?s:Object.keys(s),h=m.length,y=a?new Array(h):{};let k=0;for(let w=0;w{dr.setTimeout(s,r)})}function Cu(r,s,i){return typeof i.structuralSharing=="function"?i.structuralSharing(r,s):i.structuralSharing!==!1?hp(r,s):s}function Hv(r,s,i=0){const a=[...r,s];return i&&a.length>i?a.slice(1):a}function Wv(r,s,i=0){const a=[s,...r];return i&&a.length>i?a.slice(0,-1):a}var tc=Symbol();function pp(r,s){return!r.queryFn&&(s!=null&&s.initialPromise)?()=>s.initialPromise:!r.queryFn||r.queryFn===tc?()=>Promise.reject(new Error(`Missing queryFn: '${r.queryHash}'`)):r.queryFn}function mp(r,s){return typeof r=="function"?r(...s):!!r}function Qv(r,s,i){let a=!1,u;return Object.defineProperty(r,"signal",{enumerable:!0,get:()=>(u??(u=s()),a||(a=!0,u.aborted?i():u.addEventListener("abort",i,{once:!0})),u)}),r}var No=(()=>{let r=()=>Uv;return{isServer(){return r()},setIsServer(s){r=s}}})();function _u(){let r,s;const i=new Promise((u,f)=>{r=u,s=f});i.status="pending",i.catch(()=>{});function a(u){Object.assign(i,u),delete i.resolve,delete i.reject}return i.resolve=u=>{a({status:"fulfilled",value:u}),r(u)},i.reject=u=>{a({status:"rejected",reason:u}),s(u)},i}var Kv=Fv;function qv(){let r=[],s=0,i=h=>{h()},a=h=>{h()},u=Kv;const f=h=>{s?r.push(h):u(()=>{i(h)})},m=()=>{const h=r;r=[],h.length&&u(()=>{a(()=>{h.forEach(y=>{i(y)})})})};return{batch:h=>{let y;s++;try{y=h()}finally{s--,s||m()}return y},batchCalls:h=>(...y)=>{f(()=>{h(...y)})},schedule:f,setNotifyFunction:h=>{i=h},setBatchNotifyFunction:h=>{a=h},setScheduler:h=>{u=h}}}var ot=qv(),us,Vn,cs,np,Gv=(np=class extends Do{constructor(){super();pe(this,us,!0);pe(this,Vn);pe(this,cs);J(this,cs,s=>{if(typeof window<"u"&&window.addEventListener){const i=()=>s(!0),a=()=>s(!1);return window.addEventListener("online",i,!1),window.addEventListener("offline",a,!1),()=>{window.removeEventListener("online",i),window.removeEventListener("offline",a)}}})}onSubscribe(){E(this,Vn)||this.setEventListener(E(this,cs))}onUnsubscribe(){var s;this.hasListeners()||((s=E(this,Vn))==null||s.call(this),J(this,Vn,void 0))}setEventListener(s){var i;J(this,cs,s),(i=E(this,Vn))==null||i.call(this),J(this,Vn,s(this.setOnline.bind(this)))}setOnline(s){E(this,us)!==s&&(J(this,us,s),this.listeners.forEach(a=>{a(s)}))}isOnline(){return E(this,us)}},us=new WeakMap,Vn=new WeakMap,cs=new WeakMap,np),sl=new Gv;function Zv(r){return Math.min(1e3*2**r,3e4)}function gp(r){return(r??"online")==="online"?sl.isOnline():!0}var Pu=class extends Error{constructor(r){super("CancelledError"),this.revert=r==null?void 0:r.revert,this.silent=r==null?void 0:r.silent}};function vp(r){let s=!1,i=0,a;const u=_u(),f=()=>u.status!=="pending",m=S=>{var P;if(!f()){const A=new Pu(S);R(A),(P=r.onCancel)==null||P.call(r,A)}},h=()=>{s=!0},y=()=>{s=!1},k=()=>Ju.isFocused()&&(r.networkMode==="always"||sl.isOnline())&&r.canRun(),w=()=>gp(r.networkMode)&&r.canRun(),x=S=>{f()||(a==null||a(),u.resolve(S))},R=S=>{f()||(a==null||a(),u.reject(S))},_=()=>new Promise(S=>{var P;a=A=>{(f()||k())&&S(A)},(P=r.onPause)==null||P.call(r)}).then(()=>{var S;a=void 0,f()||(S=r.onContinue)==null||S.call(r)}),D=()=>{if(f())return;let S;const P=i===0?r.initialPromise:void 0;try{S=P??r.fn()}catch(A){S=Promise.reject(A)}Promise.resolve(S).then(x).catch(A=>{var G;if(f())return;const F=r.retry??(No.isServer()?0:3),V=r.retryDelay??Zv,I=typeof V=="function"?V(i,A):V,K=F===!0||typeof F=="number"&&ik()?void 0:_()).then(()=>{s?R(A):D()})})};return{promise:u,status:()=>u.status,cancel:m,continue:()=>(a==null||a(),u),cancelRetry:h,continueRetry:y,canStart:w,start:()=>(w()?D():_().then(D),u)}}var hr,rp,yp=(rp=class{constructor(){pe(this,hr)}destroy(){this.clearGcTimeout()}scheduleGc(){this.clearGcTimeout(),Eu(this.gcTime)&&J(this,hr,dr.setTimeout(()=>{this.optionalRemove()},this.gcTime))}updateGcTime(r){this.gcTime=Math.max(this.gcTime||0,r??(No.isServer()?1/0:300*1e3))}clearGcTimeout(){E(this,hr)!==void 0&&(dr.clearTimeout(E(this,hr)),J(this,hr,void 0))}},hr=new WeakMap,rp);function Yv(r){return{onFetch:(s,i)=>{var w,x,R,_,D;const a=s.options,u=(R=(x=(w=s.fetchOptions)==null?void 0:w.meta)==null?void 0:x.fetchMore)==null?void 0:R.direction,f=((_=s.state.data)==null?void 0:_.pages)||[],m=((D=s.state.data)==null?void 0:D.pageParams)||[];let h={pages:[],pageParams:[]},y=0;const k=async()=>{let S=!1;const P=V=>{Qv(V,()=>s.signal,()=>S=!0)},A=pp(s.options,s.fetchOptions),F=async(V,I,K)=>{if(S)return Promise.reject(s.signal.reason);if(I==null&&V.pages.length)return Promise.resolve(V);const ue=(()=>{const ke={client:s.client,queryKey:s.queryKey,pageParam:I,direction:K?"backward":"forward",meta:s.options.meta};return P(ke),ke})(),ie=await A(ue),{maxPages:ee}=s.options,me=K?Wv:Hv;return{pages:me(V.pages,ie,ee),pageParams:me(V.pageParams,I,ee)}};if(u&&f.length){const V=u==="backward",I=V?Xv:wh,K={pages:f,pageParams:m},G=I(a,K);h=await F(K,G,V)}else{const V=r??f.length;do{const I=y===0?m[0]??a.initialPageParam:wh(a,h);if(y>0&&I==null)break;h=await F(h,I),y++}while(y{var S,P;return(P=(S=s.options).persister)==null?void 0:P.call(S,k,{client:s.client,queryKey:s.queryKey,meta:s.options.meta,signal:s.signal},i)}:s.fetchFn=k}}}function wh(r,{pages:s,pageParams:i}){const a=s.length-1;return s.length>0?r.getNextPageParam(s[a],s,i[a],i):void 0}function Xv(r,{pages:s,pageParams:i}){var a;return s.length>0?(a=r.getPreviousPageParam)==null?void 0:a.call(r,s[0],s,i[0],i):void 0}var ds,pr,fs,At,mr,nt,Ro,gr,_t,xp,pn,sp,Jv=(sp=class extends yp{constructor(s){super();pe(this,_t);pe(this,ds);pe(this,pr);pe(this,fs);pe(this,At);pe(this,mr);pe(this,nt);pe(this,Ro);pe(this,gr);J(this,gr,!1),J(this,Ro,s.defaultOptions),this.setOptions(s.options),this.observers=[],J(this,mr,s.client),J(this,At,E(this,mr).getQueryCache()),this.queryKey=s.queryKey,this.queryHash=s.queryHash,J(this,pr,bh(this.options)),this.state=s.state??E(this,pr),this.scheduleGc()}get meta(){return this.options.meta}get queryType(){return E(this,ds)}get promise(){var s;return(s=E(this,nt))==null?void 0:s.promise}setOptions(s){if(this.options={...E(this,Ro),...s},s!=null&&s._type&&J(this,ds,s._type),this.updateGcTime(this.options.gcTime),this.state&&this.state.data===void 0){const i=bh(this.options);i.data!==void 0&&(this.setState(kh(i.data,i.dataUpdatedAt)),J(this,pr,i))}}optionalRemove(){!this.observers.length&&this.state.fetchStatus==="idle"&&E(this,At).remove(this)}setData(s,i){const a=Cu(this.state.data,s,this.options);return _e(this,_t,pn).call(this,{data:a,type:"success",dataUpdatedAt:i==null?void 0:i.updatedAt,manual:i==null?void 0:i.manual}),a}setState(s){_e(this,_t,pn).call(this,{type:"setState",state:s})}cancel(s){var a,u;const i=(a=E(this,nt))==null?void 0:a.promise;return(u=E(this,nt))==null||u.cancel(s),i?i.then(bt).catch(bt):Promise.resolve()}destroy(){super.destroy(),this.cancel({silent:!0})}get resetState(){return E(this,pr)}reset(){this.destroy(),this.setState(this.resetState)}isActive(){return this.observers.some(s=>Pt(s.options.enabled,this)!==!1)}isDisabled(){return this.getObserversCount()>0?!this.isActive():this.options.queryFn===tc||!this.isFetched()}isFetched(){return this.state.dataUpdateCount+this.state.errorUpdateCount>0}isStatic(){return this.getObserversCount()>0?this.observers.some(s=>Gn(s.options.staleTime,this)==="static"):!1}isStale(){return this.getObserversCount()>0?this.observers.some(s=>s.getCurrentResult().isStale):this.state.data===void 0||this.state.isInvalidated}isStaleByTime(s=0){return this.state.data===void 0?!0:s==="static"?!1:this.state.isInvalidated?!0:!fp(this.state.dataUpdatedAt,s)}onFocus(){var i;const s=this.observers.find(a=>a.shouldFetchOnWindowFocus());s==null||s.refetch({cancelRefetch:!1}),(i=E(this,nt))==null||i.continue()}onOnline(){var i;const s=this.observers.find(a=>a.shouldFetchOnReconnect());s==null||s.refetch({cancelRefetch:!1}),(i=E(this,nt))==null||i.continue()}addObserver(s){this.observers.includes(s)||(this.observers.push(s),this.clearGcTimeout(),E(this,At).notify({type:"observerAdded",query:this,observer:s}))}removeObserver(s){this.observers.includes(s)&&(this.observers=this.observers.filter(i=>i!==s),this.observers.length||(E(this,nt)&&(E(this,gr)||_e(this,_t,xp).call(this)?E(this,nt).cancel({revert:!0}):E(this,nt).cancelRetry()),this.scheduleGc()),E(this,At).notify({type:"observerRemoved",query:this,observer:s}))}getObserversCount(){return this.observers.length}invalidate(){this.state.isInvalidated||_e(this,_t,pn).call(this,{type:"invalidate"})}async fetch(s,i){var k,w,x,R,_,D,S,P,A,F,V;if(this.state.fetchStatus!=="idle"&&((k=E(this,nt))==null?void 0:k.status())!=="rejected"){if(this.state.data!==void 0&&(i!=null&&i.cancelRefetch))this.cancel({silent:!0});else if(E(this,nt))return E(this,nt).continueRetry(),E(this,nt).promise}if(s&&this.setOptions(s),!this.options.queryFn){const I=this.observers.find(K=>K.options.queryFn);I&&this.setOptions(I.options)}const a=new AbortController,u=I=>{Object.defineProperty(I,"signal",{enumerable:!0,get:()=>(J(this,gr,!0),a.signal)})},f=()=>{const I=pp(this.options,i),G=(()=>{const ue={client:E(this,mr),queryKey:this.queryKey,meta:this.meta};return u(ue),ue})();return J(this,gr,!1),this.options.persister?this.options.persister(I,G,this):I(G)},h=(()=>{const I={fetchOptions:i,options:this.options,queryKey:this.queryKey,client:E(this,mr),state:this.state,fetchFn:f};return u(I),I})(),y=E(this,ds)==="infinite"?Yv(this.options.pages):this.options.behavior;y==null||y.onFetch(h,this),J(this,fs,this.state),(this.state.fetchStatus==="idle"||this.state.fetchMeta!==((w=h.fetchOptions)==null?void 0:w.meta))&&_e(this,_t,pn).call(this,{type:"fetch",meta:(x=h.fetchOptions)==null?void 0:x.meta}),J(this,nt,vp({initialPromise:i==null?void 0:i.initialPromise,fn:h.fetchFn,onCancel:I=>{I instanceof Pu&&I.revert&&this.setState({...E(this,fs),fetchStatus:"idle"}),a.abort()},onFail:(I,K)=>{_e(this,_t,pn).call(this,{type:"failed",failureCount:I,error:K})},onPause:()=>{_e(this,_t,pn).call(this,{type:"pause"})},onContinue:()=>{_e(this,_t,pn).call(this,{type:"continue"})},retry:h.options.retry,retryDelay:h.options.retryDelay,networkMode:h.options.networkMode,canRun:()=>!0}));try{const I=await E(this,nt).start();if(I===void 0)throw new Error(`${this.queryHash} data is undefined`);return this.setData(I),(_=(R=E(this,At).config).onSuccess)==null||_.call(R,I,this),(S=(D=E(this,At).config).onSettled)==null||S.call(D,I,this.state.error,this),I}catch(I){if(I instanceof Pu){if(I.silent)return E(this,nt).promise;if(I.revert){if(this.state.data===void 0)throw I;return this.state.data}}throw _e(this,_t,pn).call(this,{type:"error",error:I}),(A=(P=E(this,At).config).onError)==null||A.call(P,I,this),(V=(F=E(this,At).config).onSettled)==null||V.call(F,this.state.data,I,this),I}finally{this.scheduleGc()}}},ds=new WeakMap,pr=new WeakMap,fs=new WeakMap,At=new WeakMap,mr=new WeakMap,nt=new WeakMap,Ro=new WeakMap,gr=new WeakMap,_t=new WeakSet,xp=function(){return this.state.fetchStatus==="paused"&&this.state.status==="pending"},pn=function(s){const i=a=>{switch(s.type){case"failed":return{...a,fetchFailureCount:s.failureCount,fetchFailureReason:s.error};case"pause":return{...a,fetchStatus:"paused"};case"continue":return{...a,fetchStatus:"fetching"};case"fetch":return{...a,...wp(a.data,this.options),fetchMeta:s.meta??null};case"success":const u={...a,...kh(s.data,s.dataUpdatedAt),dataUpdateCount:a.dataUpdateCount+1,...!s.manual&&{fetchStatus:"idle",fetchFailureCount:0,fetchFailureReason:null}};return J(this,fs,s.manual?u:void 0),u;case"error":const f=s.error;return{...a,error:f,errorUpdateCount:a.errorUpdateCount+1,errorUpdatedAt:Date.now(),fetchFailureCount:a.fetchFailureCount+1,fetchFailureReason:f,fetchStatus:"idle",status:"error",isInvalidated:!0};case"invalidate":return{...a,isInvalidated:!0};case"setState":return{...a,...s.state}}};this.state=i(this.state),ot.batch(()=>{this.observers.forEach(a=>{a.onQueryUpdate()}),E(this,At).notify({query:this,type:"updated",action:s})})},sp);function wp(r,s){return{fetchFailureCount:0,fetchFailureReason:null,fetchStatus:gp(s.networkMode)?"fetching":"paused",...r===void 0&&{error:null,status:"pending"}}}function kh(r,s){return{data:r,dataUpdatedAt:s??Date.now(),error:null,isInvalidated:!1,status:"success"}}function bh(r){const s=typeof r.initialData=="function"?r.initialData():r.initialData,i=s!==void 0,a=i?typeof r.initialDataUpdatedAt=="function"?r.initialDataUpdatedAt():r.initialDataUpdatedAt:0;return{data:s,dataUpdateCount:0,dataUpdatedAt:i?a??Date.now():0,error:null,errorUpdateCount:0,errorUpdatedAt:0,fetchFailureCount:0,fetchFailureReason:null,fetchMeta:null,isInvalidated:!1,status:i?"success":"pending",fetchStatus:"idle"}}var kt,Re,Mo,pt,vr,hs,mn,Hn,Oo,ps,ms,yr,xr,Wn,gs,Te,wo,Ru,Mu,Ou,Tu,Lu,Du,Au,kp,op,ey=(op=class extends Do{constructor(s,i){super();pe(this,Te);pe(this,kt);pe(this,Re);pe(this,Mo);pe(this,pt);pe(this,vr);pe(this,hs);pe(this,mn);pe(this,Hn);pe(this,Oo);pe(this,ps);pe(this,ms);pe(this,yr);pe(this,xr);pe(this,Wn);pe(this,gs,new Set);this.options=i,J(this,kt,s),J(this,Hn,null),J(this,mn,_u()),this.bindMethods(),this.setOptions(i)}bindMethods(){this.refetch=this.refetch.bind(this)}onSubscribe(){this.listeners.size===1&&(E(this,Re).addObserver(this),Sh(E(this,Re),this.options)?_e(this,Te,wo).call(this):this.updateResult(),_e(this,Te,Tu).call(this))}onUnsubscribe(){this.hasListeners()||this.destroy()}shouldFetchOnReconnect(){return Iu(E(this,Re),this.options,this.options.refetchOnReconnect)}shouldFetchOnWindowFocus(){return Iu(E(this,Re),this.options,this.options.refetchOnWindowFocus)}destroy(){this.listeners=new Set,_e(this,Te,Lu).call(this),_e(this,Te,Du).call(this),E(this,Re).removeObserver(this)}setOptions(s){const i=this.options,a=E(this,Re);if(this.options=E(this,kt).defaultQueryOptions(s),this.options.enabled!==void 0&&typeof this.options.enabled!="boolean"&&typeof this.options.enabled!="function"&&typeof Pt(this.options.enabled,E(this,Re))!="boolean")throw new Error("Expected enabled to be a boolean or a callback that returns a boolean");_e(this,Te,Au).call(this),E(this,Re).setOptions(this.options),i._defaulted&&!Nu(this.options,i)&&E(this,kt).getQueryCache().notify({type:"observerOptionsUpdated",query:E(this,Re),observer:this});const u=this.hasListeners();u&&Eh(E(this,Re),a,this.options,i)&&_e(this,Te,wo).call(this),this.updateResult(),u&&(E(this,Re)!==a||Pt(this.options.enabled,E(this,Re))!==Pt(i.enabled,E(this,Re))||Gn(this.options.staleTime,E(this,Re))!==Gn(i.staleTime,E(this,Re)))&&_e(this,Te,Ru).call(this);const f=_e(this,Te,Mu).call(this);u&&(E(this,Re)!==a||Pt(this.options.enabled,E(this,Re))!==Pt(i.enabled,E(this,Re))||f!==E(this,Wn))&&_e(this,Te,Ou).call(this,f)}getOptimisticResult(s){const i=E(this,kt).getQueryCache().build(E(this,kt),s),a=this.createResult(i,s);return ny(this,a)&&(J(this,pt,a),J(this,hs,this.options),J(this,vr,E(this,Re).state)),a}getCurrentResult(){return E(this,pt)}trackResult(s,i){return new Proxy(s,{get:(a,u)=>(this.trackProp(u),i==null||i(u),u==="promise"&&(this.trackProp("data"),!this.options.experimental_prefetchInRender&&E(this,mn).status==="pending"&&E(this,mn).reject(new Error("experimental_prefetchInRender feature flag is not enabled"))),Reflect.get(a,u))})}trackProp(s){E(this,gs).add(s)}getCurrentQuery(){return E(this,Re)}refetch({...s}={}){return this.fetch({...s})}fetchOptimistic(s){const i=E(this,kt).defaultQueryOptions(s),a=E(this,kt).getQueryCache().build(E(this,kt),i);return a.fetch().then(()=>this.createResult(a,i))}fetch(s){return _e(this,Te,wo).call(this,{...s,cancelRefetch:s.cancelRefetch??!0}).then(()=>(this.updateResult(),E(this,pt)))}createResult(s,i){var ee;const a=E(this,Re),u=this.options,f=E(this,pt),m=E(this,vr),h=E(this,hs),k=s!==a?s.state:E(this,Mo),{state:w}=s;let x={...w},R=!1,_;if(i._optimisticResults){const me=this.hasListeners(),ke=!me&&Sh(s,i),le=me&&Eh(s,a,i,u);(ke||le)&&(x={...x,...wp(w.data,s.options)}),i._optimisticResults==="isRestoring"&&(x.fetchStatus="idle")}let{error:D,errorUpdatedAt:S,status:P}=x;_=x.data;let A=!1;if(i.placeholderData!==void 0&&_===void 0&&P==="pending"){let me;f!=null&&f.isPlaceholderData&&i.placeholderData===(h==null?void 0:h.placeholderData)?(me=f.data,A=!0):me=typeof i.placeholderData=="function"?i.placeholderData((ee=E(this,ms))==null?void 0:ee.state.data,E(this,ms)):i.placeholderData,me!==void 0&&(P="success",_=Cu(f==null?void 0:f.data,me,i),R=!0)}if(i.select&&_!==void 0&&!A)if(f&&_===(m==null?void 0:m.data)&&i.select===E(this,Oo))_=E(this,ps);else try{J(this,Oo,i.select),_=i.select(_),_=Cu(f==null?void 0:f.data,_,i),J(this,ps,_),J(this,Hn,null)}catch(me){J(this,Hn,me)}E(this,Hn)&&(D=E(this,Hn),_=E(this,ps),S=Date.now(),P="error");const F=x.fetchStatus==="fetching",V=P==="pending",I=P==="error",K=V&&F,G=_!==void 0,ie={status:P,fetchStatus:x.fetchStatus,isPending:V,isSuccess:P==="success",isError:I,isInitialLoading:K,isLoading:K,data:_,dataUpdatedAt:x.dataUpdatedAt,error:D,errorUpdatedAt:S,failureCount:x.fetchFailureCount,failureReason:x.fetchFailureReason,errorUpdateCount:x.errorUpdateCount,isFetched:s.isFetched(),isFetchedAfterMount:x.dataUpdateCount>k.dataUpdateCount||x.errorUpdateCount>k.errorUpdateCount,isFetching:F,isRefetching:F&&!V,isLoadingError:I&&!G,isPaused:x.fetchStatus==="paused",isPlaceholderData:R,isRefetchError:I&&G,isStale:nc(s,i),refetch:this.refetch,promise:E(this,mn),isEnabled:Pt(i.enabled,s)!==!1};if(this.options.experimental_prefetchInRender){const me=ie.data!==void 0,ke=ie.status==="error"&&!me,le=ce=>{ke?ce.reject(ie.error):me&&ce.resolve(ie.data)},Le=()=>{const ce=J(this,mn,ie.promise=_u());le(ce)},Z=E(this,mn);switch(Z.status){case"pending":s.queryHash===a.queryHash&&le(Z);break;case"fulfilled":(ke||ie.data!==Z.value)&&Le();break;case"rejected":(!ke||ie.error!==Z.reason)&&Le();break}}return ie}updateResult(){const s=E(this,pt),i=this.createResult(E(this,Re),this.options);if(J(this,vr,E(this,Re).state),J(this,hs,this.options),E(this,vr).data!==void 0&&J(this,ms,E(this,Re)),Nu(i,s))return;J(this,pt,i);const a=()=>{if(!s)return!0;const{notifyOnChangeProps:u}=this.options,f=typeof u=="function"?u():u;if(f==="all"||!f&&!E(this,gs).size)return!0;const m=new Set(f??E(this,gs));return this.options.throwOnError&&m.add("error"),Object.keys(E(this,pt)).some(h=>{const y=h;return E(this,pt)[y]!==s[y]&&m.has(y)})};_e(this,Te,kp).call(this,{listeners:a()})}onQueryUpdate(){this.updateResult(),this.hasListeners()&&_e(this,Te,Tu).call(this)}},kt=new WeakMap,Re=new WeakMap,Mo=new WeakMap,pt=new WeakMap,vr=new WeakMap,hs=new WeakMap,mn=new WeakMap,Hn=new WeakMap,Oo=new WeakMap,ps=new WeakMap,ms=new WeakMap,yr=new WeakMap,xr=new WeakMap,Wn=new WeakMap,gs=new WeakMap,Te=new WeakSet,wo=function(s){_e(this,Te,Au).call(this);let i=E(this,Re).fetch(this.options,s);return s!=null&&s.throwOnError||(i=i.catch(bt)),i},Ru=function(){_e(this,Te,Lu).call(this);const s=Gn(this.options.staleTime,E(this,Re));if(No.isServer()||E(this,pt).isStale||!Eu(s))return;const a=fp(E(this,pt).dataUpdatedAt,s)+1;J(this,yr,dr.setTimeout(()=>{E(this,pt).isStale||this.updateResult()},a))},Mu=function(){return(typeof this.options.refetchInterval=="function"?this.options.refetchInterval(E(this,Re)):this.options.refetchInterval)??!1},Ou=function(s){_e(this,Te,Du).call(this),J(this,Wn,s),!(No.isServer()||Pt(this.options.enabled,E(this,Re))===!1||!Eu(E(this,Wn))||E(this,Wn)===0)&&J(this,xr,dr.setInterval(()=>{(this.options.refetchIntervalInBackground||Ju.isFocused())&&_e(this,Te,wo).call(this)},E(this,Wn)))},Tu=function(){_e(this,Te,Ru).call(this),_e(this,Te,Ou).call(this,_e(this,Te,Mu).call(this))},Lu=function(){E(this,yr)!==void 0&&(dr.clearTimeout(E(this,yr)),J(this,yr,void 0))},Du=function(){E(this,xr)!==void 0&&(dr.clearInterval(E(this,xr)),J(this,xr,void 0))},Au=function(){const s=E(this,kt).getQueryCache().build(E(this,kt),this.options);if(s===E(this,Re))return;const i=E(this,Re);J(this,Re,s),J(this,Mo,s.state),this.hasListeners()&&(i==null||i.removeObserver(this),s.addObserver(this))},kp=function(s){ot.batch(()=>{s.listeners&&this.listeners.forEach(i=>{i(E(this,pt))}),E(this,kt).getQueryCache().notify({query:E(this,Re),type:"observerResultsUpdated"})})},op);function ty(r,s){return Pt(s.enabled,r)!==!1&&r.state.data===void 0&&!(r.state.status==="error"&&Pt(s.retryOnMount,r)===!1)}function Sh(r,s){return ty(r,s)||r.state.data!==void 0&&Iu(r,s,s.refetchOnMount)}function Iu(r,s,i){if(Pt(s.enabled,r)!==!1&&Gn(s.staleTime,r)!=="static"){const a=typeof i=="function"?i(r):i;return a==="always"||a!==!1&&nc(r,s)}return!1}function Eh(r,s,i,a){return(r!==s||Pt(a.enabled,r)===!1)&&(!i.suspense||r.state.status!=="error")&&nc(r,i)}function nc(r,s){return Pt(s.enabled,r)!==!1&&r.isStaleByTime(Gn(s.staleTime,r))}function ny(r,s){return!Nu(r.getCurrentResult(),s)}var To,Jt,dt,wr,en,Fn,ip,ry=(ip=class extends yp{constructor(s){super();pe(this,en);pe(this,To);pe(this,Jt);pe(this,dt);pe(this,wr);J(this,To,s.client),this.mutationId=s.mutationId,J(this,dt,s.mutationCache),J(this,Jt,[]),this.state=s.state||sy(),this.setOptions(s.options),this.scheduleGc()}setOptions(s){this.options=s,this.updateGcTime(this.options.gcTime)}get meta(){return this.options.meta}addObserver(s){E(this,Jt).includes(s)||(E(this,Jt).push(s),this.clearGcTimeout(),E(this,dt).notify({type:"observerAdded",mutation:this,observer:s}))}removeObserver(s){J(this,Jt,E(this,Jt).filter(i=>i!==s)),this.scheduleGc(),E(this,dt).notify({type:"observerRemoved",mutation:this,observer:s})}optionalRemove(){E(this,Jt).length||(this.state.status==="pending"?this.scheduleGc():E(this,dt).remove(this))}continue(){var s;return((s=E(this,wr))==null?void 0:s.continue())??this.execute(this.state.variables)}async execute(s){var m,h,y,k,w,x,R,_,D,S,P,A,F,V,I,K,G,ue;const i=()=>{_e(this,en,Fn).call(this,{type:"continue"})},a={client:E(this,To),meta:this.options.meta,mutationKey:this.options.mutationKey};J(this,wr,vp({fn:()=>this.options.mutationFn?this.options.mutationFn(s,a):Promise.reject(new Error("No mutationFn found")),onFail:(ie,ee)=>{_e(this,en,Fn).call(this,{type:"failed",failureCount:ie,error:ee})},onPause:()=>{_e(this,en,Fn).call(this,{type:"pause"})},onContinue:i,retry:this.options.retry??0,retryDelay:this.options.retryDelay,networkMode:this.options.networkMode,canRun:()=>E(this,dt).canRun(this)}));const u=this.state.status==="pending",f=!E(this,wr).canStart();try{if(u)i();else{_e(this,en,Fn).call(this,{type:"pending",variables:s,isPaused:f}),E(this,dt).config.onMutate&&await E(this,dt).config.onMutate(s,this,a);const ee=await((h=(m=this.options).onMutate)==null?void 0:h.call(m,s,a));ee!==this.state.context&&_e(this,en,Fn).call(this,{type:"pending",context:ee,variables:s,isPaused:f})}const ie=await E(this,wr).start();return await((k=(y=E(this,dt).config).onSuccess)==null?void 0:k.call(y,ie,s,this.state.context,this,a)),await((x=(w=this.options).onSuccess)==null?void 0:x.call(w,ie,s,this.state.context,a)),await((_=(R=E(this,dt).config).onSettled)==null?void 0:_.call(R,ie,null,this.state.variables,this.state.context,this,a)),await((S=(D=this.options).onSettled)==null?void 0:S.call(D,ie,null,s,this.state.context,a)),_e(this,en,Fn).call(this,{type:"success",data:ie}),ie}catch(ie){try{await((A=(P=E(this,dt).config).onError)==null?void 0:A.call(P,ie,s,this.state.context,this,a))}catch(ee){Promise.reject(ee)}try{await((V=(F=this.options).onError)==null?void 0:V.call(F,ie,s,this.state.context,a))}catch(ee){Promise.reject(ee)}try{await((K=(I=E(this,dt).config).onSettled)==null?void 0:K.call(I,void 0,ie,this.state.variables,this.state.context,this,a))}catch(ee){Promise.reject(ee)}try{await((ue=(G=this.options).onSettled)==null?void 0:ue.call(G,void 0,ie,s,this.state.context,a))}catch(ee){Promise.reject(ee)}throw _e(this,en,Fn).call(this,{type:"error",error:ie}),ie}finally{E(this,dt).runNext(this)}}},To=new WeakMap,Jt=new WeakMap,dt=new WeakMap,wr=new WeakMap,en=new WeakSet,Fn=function(s){const i=a=>{switch(s.type){case"failed":return{...a,failureCount:s.failureCount,failureReason:s.error};case"pause":return{...a,isPaused:!0};case"continue":return{...a,isPaused:!1};case"pending":return{...a,context:s.context,data:void 0,failureCount:0,failureReason:null,error:null,isPaused:s.isPaused,status:"pending",variables:s.variables,submittedAt:Date.now()};case"success":return{...a,data:s.data,failureCount:0,failureReason:null,error:null,status:"success",isPaused:!1};case"error":return{...a,data:void 0,error:s.error,failureCount:a.failureCount+1,failureReason:s.error,isPaused:!1,status:"error"}}};this.state=i(this.state),ot.batch(()=>{E(this,Jt).forEach(a=>{a.onMutationUpdate(s)}),E(this,dt).notify({mutation:this,type:"updated",action:s})})},ip);function sy(){return{context:void 0,data:void 0,error:null,failureCount:0,failureReason:null,isPaused:!1,status:"idle",variables:void 0,submittedAt:0}}var gn,Ht,Lo,lp,oy=(lp=class extends Do{constructor(s={}){super();pe(this,gn);pe(this,Ht);pe(this,Lo);this.config=s,J(this,gn,new Set),J(this,Ht,new Map),J(this,Lo,0)}build(s,i,a){const u=new ry({client:s,mutationCache:this,mutationId:++Wi(this,Lo)._,options:s.defaultMutationOptions(i),state:a});return this.add(u),u}add(s){E(this,gn).add(s);const i=Ki(s);if(typeof i=="string"){const a=E(this,Ht).get(i);a?a.push(s):E(this,Ht).set(i,[s])}this.notify({type:"added",mutation:s})}remove(s){if(E(this,gn).delete(s)){const i=Ki(s);if(typeof i=="string"){const a=E(this,Ht).get(i);if(a)if(a.length>1){const u=a.indexOf(s);u!==-1&&a.splice(u,1)}else a[0]===s&&E(this,Ht).delete(i)}}this.notify({type:"removed",mutation:s})}canRun(s){const i=Ki(s);if(typeof i=="string"){const a=E(this,Ht).get(i),u=a==null?void 0:a.find(f=>f.state.status==="pending");return!u||u===s}else return!0}runNext(s){var a;const i=Ki(s);if(typeof i=="string"){const u=(a=E(this,Ht).get(i))==null?void 0:a.find(f=>f!==s&&f.state.isPaused);return(u==null?void 0:u.continue())??Promise.resolve()}else return Promise.resolve()}clear(){ot.batch(()=>{E(this,gn).forEach(s=>{this.notify({type:"removed",mutation:s})}),E(this,gn).clear(),E(this,Ht).clear()})}getAll(){return Array.from(E(this,gn))}find(s){const i={exact:!0,...s};return this.getAll().find(a=>vh(i,a))}findAll(s={}){return this.getAll().filter(i=>vh(s,i))}notify(s){ot.batch(()=>{this.listeners.forEach(i=>{i(s)})})}resumePausedMutations(){const s=this.getAll().filter(i=>i.state.isPaused);return ot.batch(()=>Promise.all(s.map(i=>i.continue().catch(bt))))}},gn=new WeakMap,Ht=new WeakMap,Lo=new WeakMap,lp);function Ki(r){var s;return(s=r.options.scope)==null?void 0:s.id}var tn,ap,iy=(ap=class extends Do{constructor(s={}){super();pe(this,tn);this.config=s,J(this,tn,new Map)}build(s,i,a){const u=i.queryKey,f=i.queryHash??ec(u,i);let m=this.get(f);return m||(m=new Jv({client:s,queryKey:u,queryHash:f,options:s.defaultQueryOptions(i),state:a,defaultOptions:s.getQueryDefaults(u)}),this.add(m)),m}add(s){E(this,tn).has(s.queryHash)||(E(this,tn).set(s.queryHash,s),this.notify({type:"added",query:s}))}remove(s){const i=E(this,tn).get(s.queryHash);i&&(s.destroy(),i===s&&E(this,tn).delete(s.queryHash),this.notify({type:"removed",query:s}))}clear(){ot.batch(()=>{this.getAll().forEach(s=>{this.remove(s)})})}get(s){return E(this,tn).get(s)}getAll(){return[...E(this,tn).values()]}find(s){const i={exact:!0,...s};return this.getAll().find(a=>gh(i,a))}findAll(s={}){const i=this.getAll();return Object.keys(s).length>0?i.filter(a=>gh(s,a)):i}notify(s){ot.batch(()=>{this.listeners.forEach(i=>{i(s)})})}onFocus(){ot.batch(()=>{this.getAll().forEach(s=>{s.onFocus()})})}onOnline(){ot.batch(()=>{this.getAll().forEach(s=>{s.onOnline()})})}},tn=new WeakMap,ap),Qe,Qn,Kn,vs,ys,qn,xs,ws,up,ly=(up=class{constructor(r={}){pe(this,Qe);pe(this,Qn);pe(this,Kn);pe(this,vs);pe(this,ys);pe(this,qn);pe(this,xs);pe(this,ws);J(this,Qe,r.queryCache||new iy),J(this,Qn,r.mutationCache||new oy),J(this,Kn,r.defaultOptions||{}),J(this,vs,new Map),J(this,ys,new Map),J(this,qn,0)}mount(){Wi(this,qn)._++,E(this,qn)===1&&(J(this,xs,Ju.subscribe(async r=>{r&&(await this.resumePausedMutations(),E(this,Qe).onFocus())})),J(this,ws,sl.subscribe(async r=>{r&&(await this.resumePausedMutations(),E(this,Qe).onOnline())})))}unmount(){var r,s;Wi(this,qn)._--,E(this,qn)===0&&((r=E(this,xs))==null||r.call(this),J(this,xs,void 0),(s=E(this,ws))==null||s.call(this),J(this,ws,void 0))}isFetching(r){return E(this,Qe).findAll({...r,fetchStatus:"fetching"}).length}isMutating(r){return E(this,Qn).findAll({...r,status:"pending"}).length}getQueryData(r){var i;const s=this.defaultQueryOptions({queryKey:r});return(i=E(this,Qe).get(s.queryHash))==null?void 0:i.state.data}ensureQueryData(r){const s=this.defaultQueryOptions(r),i=E(this,Qe).build(this,s),a=i.state.data;return a===void 0?this.fetchQuery(r):(r.revalidateIfStale&&i.isStaleByTime(Gn(s.staleTime,i))&&this.prefetchQuery(s),Promise.resolve(a))}getQueriesData(r){return E(this,Qe).findAll(r).map(({queryKey:s,state:i})=>{const a=i.data;return[s,a]})}setQueryData(r,s,i){const a=this.defaultQueryOptions({queryKey:r}),u=E(this,Qe).get(a.queryHash),f=u==null?void 0:u.state.data,m=$v(s,f);if(m!==void 0)return E(this,Qe).build(this,a).setData(m,{...i,manual:!0})}setQueriesData(r,s,i){return ot.batch(()=>E(this,Qe).findAll(r).map(({queryKey:a})=>[a,this.setQueryData(a,s,i)]))}getQueryState(r){var i;const s=this.defaultQueryOptions({queryKey:r});return(i=E(this,Qe).get(s.queryHash))==null?void 0:i.state}removeQueries(r){const s=E(this,Qe);ot.batch(()=>{s.findAll(r).forEach(i=>{s.remove(i)})})}resetQueries(r,s){const i=E(this,Qe);return ot.batch(()=>(i.findAll(r).forEach(a=>{a.reset()}),this.refetchQueries({type:"active",...r},s)))}cancelQueries(r,s={}){const i={revert:!0,...s},a=ot.batch(()=>E(this,Qe).findAll(r).map(u=>u.cancel(i)));return Promise.all(a).then(bt).catch(bt)}invalidateQueries(r,s={}){return ot.batch(()=>(E(this,Qe).findAll(r).forEach(i=>{i.invalidate()}),(r==null?void 0:r.refetchType)==="none"?Promise.resolve():this.refetchQueries({...r,type:(r==null?void 0:r.refetchType)??(r==null?void 0:r.type)??"active"},s)))}refetchQueries(r,s={}){const i={...s,cancelRefetch:s.cancelRefetch??!0},a=ot.batch(()=>E(this,Qe).findAll(r).filter(u=>!u.isDisabled()&&!u.isStatic()).map(u=>{let f=u.fetch(void 0,i);return i.throwOnError||(f=f.catch(bt)),u.state.fetchStatus==="paused"?Promise.resolve():f}));return Promise.all(a).then(bt)}fetchQuery(r){const s=this.defaultQueryOptions(r);s.retry===void 0&&(s.retry=!1);const i=E(this,Qe).build(this,s);return i.isStaleByTime(Gn(s.staleTime,i))?i.fetch(s):Promise.resolve(i.state.data)}prefetchQuery(r){return this.fetchQuery(r).then(bt).catch(bt)}fetchInfiniteQuery(r){return r._type="infinite",this.fetchQuery(r)}prefetchInfiniteQuery(r){return this.fetchInfiniteQuery(r).then(bt).catch(bt)}ensureInfiniteQueryData(r){return r._type="infinite",this.ensureQueryData(r)}resumePausedMutations(){return sl.isOnline()?E(this,Qn).resumePausedMutations():Promise.resolve()}getQueryCache(){return E(this,Qe)}getMutationCache(){return E(this,Qn)}getDefaultOptions(){return E(this,Kn)}setDefaultOptions(r){J(this,Kn,r)}setQueryDefaults(r,s){E(this,vs).set(So(r),{queryKey:r,defaultOptions:s})}getQueryDefaults(r){const s=[...E(this,vs).values()],i={};return s.forEach(a=>{Eo(r,a.queryKey)&&Object.assign(i,a.defaultOptions)}),i}setMutationDefaults(r,s){E(this,ys).set(So(r),{mutationKey:r,defaultOptions:s})}getMutationDefaults(r){const s=[...E(this,ys).values()],i={};return s.forEach(a=>{Eo(r,a.mutationKey)&&Object.assign(i,a.defaultOptions)}),i}defaultQueryOptions(r){if(r._defaulted)return r;const s={...E(this,Kn).queries,...this.getQueryDefaults(r.queryKey),...r,_defaulted:!0};return s.queryHash||(s.queryHash=ec(s.queryKey,s)),s.refetchOnReconnect===void 0&&(s.refetchOnReconnect=s.networkMode!=="always"),s.throwOnError===void 0&&(s.throwOnError=!!s.suspense),!s.networkMode&&s.persister&&(s.networkMode="offlineFirst"),s.queryFn===tc&&(s.enabled=!1),s}defaultMutationOptions(r){return r!=null&&r._defaulted?r:{...E(this,Kn).mutations,...(r==null?void 0:r.mutationKey)&&this.getMutationDefaults(r.mutationKey),...r,_defaulted:!0}}clear(){E(this,Qe).clear(),E(this,Qn).clear()}},Qe=new WeakMap,Qn=new WeakMap,Kn=new WeakMap,vs=new WeakMap,ys=new WeakMap,qn=new WeakMap,xs=new WeakMap,ws=new WeakMap,up),bp=g.createContext(void 0),ll=r=>{const s=g.useContext(bp);if(!s)throw new Error("No QueryClient set, use QueryClientProvider to set one");return s},ay=({client:r,children:s})=>(g.useEffect(()=>(r.mount(),()=>{r.unmount()}),[r]),d.jsx(bp.Provider,{value:r,children:s})),Sp=g.createContext(!1),uy=()=>g.useContext(Sp);Sp.Provider;function cy(){let r=!1;return{clearReset:()=>{r=!1},reset:()=>{r=!0},isReset:()=>r}}var dy=g.createContext(cy()),fy=()=>g.useContext(dy),hy=(r,s,i)=>{const a=i!=null&&i.state.error&&typeof r.throwOnError=="function"?mp(r.throwOnError,[i.state.error,i]):r.throwOnError;(r.suspense||r.experimental_prefetchInRender||a)&&(s.isReset()||(r.retryOnMount=!1))},py=r=>{g.useEffect(()=>{r.clearReset()},[r])},my=({result:r,errorResetBoundary:s,throwOnError:i,query:a,suspense:u})=>r.isError&&!s.isReset()&&!r.isFetching&&a&&(u&&r.data===void 0||mp(i,[r.error,a])),gy=r=>{if(r.suspense){const i=u=>u==="static"?u:Math.max(u??1e3,1e3),a=r.staleTime;r.staleTime=typeof a=="function"?(...u)=>i(a(...u)):i(a),typeof r.gcTime=="number"&&(r.gcTime=Math.max(r.gcTime,1e3))}},vy=(r,s)=>r.isLoading&&r.isFetching&&!s,yy=(r,s)=>(r==null?void 0:r.suspense)&&s.isPending,Nh=(r,s,i)=>s.fetchOptimistic(r).catch(()=>{i.clearReset()});function xy(r,s,i){var _,D,S,P;const a=uy(),u=fy(),f=ll(),m=f.defaultQueryOptions(r);(D=(_=f.getDefaultOptions().queries)==null?void 0:_._experimental_beforeQuery)==null||D.call(_,m);const h=f.getQueryCache().get(m.queryHash),y=r.subscribed!==!1;m._optimisticResults=a?"isRestoring":y?"optimistic":void 0,gy(m),hy(m,u,h),py(u);const k=!f.getQueryCache().get(m.queryHash),[w]=g.useState(()=>new s(f,m)),x=w.getOptimisticResult(m),R=!a&&y;if(g.useSyncExternalStore(g.useCallback(A=>{const F=R?w.subscribe(ot.batchCalls(A)):bt;return w.updateResult(),F},[w,R]),()=>w.getCurrentResult(),()=>w.getCurrentResult()),g.useEffect(()=>{w.setOptions(m)},[m,w]),yy(m,x))throw Nh(m,w,u);if(my({result:x,errorResetBoundary:u,throwOnError:m.throwOnError,query:h,suspense:m.suspense}))throw x.error;if((P=(S=f.getDefaultOptions().queries)==null?void 0:S._experimental_afterQuery)==null||P.call(S,m,x),m.experimental_prefetchInRender&&!No.isServer()&&vy(x,a)){const A=k?Nh(m,w,u):h==null?void 0:h.promise;A==null||A.catch(bt).finally(()=>{w.updateResult()})}return m.notifyOnChangeProps?x:w.trackResult(x)}function Be(r,s){return xy(r,ey)}const wy="modulepreload",ky=function(r){return"/"+r},jh={},Wt=function(s,i,a){let u=Promise.resolve();if(i&&i.length>0){let m=function(k){return Promise.all(k.map(w=>Promise.resolve(w).then(x=>({status:"fulfilled",value:x}),x=>({status:"rejected",reason:x}))))};document.getElementsByTagName("link");const h=document.querySelector("meta[property=csp-nonce]"),y=(h==null?void 0:h.nonce)||(h==null?void 0:h.getAttribute("nonce"));u=m(i.map(k=>{if(k=ky(k),k in jh)return;jh[k]=!0;const w=k.endsWith(".css"),x=w?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${k}"]${x}`))return;const R=document.createElement("link");if(R.rel=w?"stylesheet":wy,w||(R.as="script"),R.crossOrigin="",R.href=k,y&&R.setAttribute("nonce",y),document.head.appendChild(R),w)return new Promise((_,D)=>{R.addEventListener("load",_),R.addEventListener("error",()=>D(new Error(`Unable to preload CSS for ${k}`)))})}))}function f(m){const h=new Event("vite:preloadError",{cancelable:!0});if(h.payload=m,window.dispatchEvent(h),!h.defaultPrevented)throw m}return u.then(m=>{for(const h of m||[])h.status==="rejected"&&f(h.reason);return s().catch(f)})};/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const by=r=>r.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),Ep=(...r)=>r.filter((s,i,a)=>!!s&&s.trim()!==""&&a.indexOf(s)===i).join(" ").trim();/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */var Sy={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Ey=g.forwardRef(({color:r="currentColor",size:s=24,strokeWidth:i=2,absoluteStrokeWidth:a,className:u="",children:f,iconNode:m,...h},y)=>g.createElement("svg",{ref:y,...Sy,width:s,height:s,stroke:r,strokeWidth:a?Number(i)*24/Number(s):i,className:Ep("lucide",u),...h},[...m.map(([k,w])=>g.createElement(k,w)),...Array.isArray(f)?f:[f]]));/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const ge=(r,s)=>{const i=g.forwardRef(({className:a,...u},f)=>g.createElement(Ey,{ref:f,iconNode:s,className:Ep(`lucide-${by(r)}`,a),...u}));return i.displayName=`${r}`,i};/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Ny=ge("Activity",[["path",{d:"M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2",key:"169zse"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Ch=ge("ArrowRight",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"m12 5 7 7-7 7",key:"xquz4c"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const jy=ge("BookMarked",[["path",{d:"M10 2v8l3-3 3 3V2",key:"sqw3rj"}],["path",{d:"M4 19.5v-15A2.5 2.5 0 0 1 6.5 2H19a1 1 0 0 1 1 1v18a1 1 0 0 1-1 1H6.5a1 1 0 0 1 0-5H20",key:"k3hazp"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const jo=ge("Bot",[["path",{d:"M12 8V4H8",key:"hb8ula"}],["rect",{width:"16",height:"12",x:"4",y:"8",rx:"2",key:"enze0r"}],["path",{d:"M2 14h2",key:"vft8re"}],["path",{d:"M20 14h2",key:"4cs60a"}],["path",{d:"M15 13v2",key:"1xurst"}],["path",{d:"M9 13v2",key:"rq6x2g"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Cy=ge("Box",[["path",{d:"M21 8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16Z",key:"hh9hay"}],["path",{d:"m3.3 7 8.7 5 8.7-5",key:"g66t2b"}],["path",{d:"M12 22V12",key:"d0xqtd"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Np=ge("Boxes",[["path",{d:"M2.97 12.92A2 2 0 0 0 2 14.63v3.24a2 2 0 0 0 .97 1.71l3 1.8a2 2 0 0 0 2.06 0L12 19v-5.5l-5-3-4.03 2.42Z",key:"lc1i9w"}],["path",{d:"m7 16.5-4.74-2.85",key:"1o9zyk"}],["path",{d:"m7 16.5 5-3",key:"va8pkn"}],["path",{d:"M7 16.5v5.17",key:"jnp8gn"}],["path",{d:"M12 13.5V19l3.97 2.38a2 2 0 0 0 2.06 0l3-1.8a2 2 0 0 0 .97-1.71v-3.24a2 2 0 0 0-.97-1.71L17 10.5l-5 3Z",key:"8zsnat"}],["path",{d:"m17 16.5-5-3",key:"8arw3v"}],["path",{d:"m17 16.5 4.74-2.85",key:"8rfmw"}],["path",{d:"M17 16.5v5.17",key:"k6z78m"}],["path",{d:"M7.97 4.42A2 2 0 0 0 7 6.13v4.37l5 3 5-3V6.13a2 2 0 0 0-.97-1.71l-3-1.8a2 2 0 0 0-2.06 0l-3 1.8Z",key:"1xygjf"}],["path",{d:"M12 8 7.26 5.15",key:"1vbdud"}],["path",{d:"m12 8 4.74-2.85",key:"3rx089"}],["path",{d:"M12 13.5V8",key:"1io7kd"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const _y=ge("Brain",[["path",{d:"M12 5a3 3 0 1 0-5.997.125 4 4 0 0 0-2.526 5.77 4 4 0 0 0 .556 6.588A4 4 0 1 0 12 18Z",key:"l5xja"}],["path",{d:"M12 5a3 3 0 1 1 5.997.125 4 4 0 0 1 2.526 5.77 4 4 0 0 1-.556 6.588A4 4 0 1 1 12 18Z",key:"ep3f8r"}],["path",{d:"M15 13a4.5 4.5 0 0 1-3-4 4.5 4.5 0 0 1-3 4",key:"1p4c4q"}],["path",{d:"M17.599 6.5a3 3 0 0 0 .399-1.375",key:"tmeiqw"}],["path",{d:"M6.003 5.125A3 3 0 0 0 6.401 6.5",key:"105sqy"}],["path",{d:"M3.477 10.896a4 4 0 0 1 .585-.396",key:"ql3yin"}],["path",{d:"M19.938 10.5a4 4 0 0 1 .585.396",key:"1qfode"}],["path",{d:"M6 18a4 4 0 0 1-1.967-.516",key:"2e4loj"}],["path",{d:"M19.967 17.484A4 4 0 0 1 18 18",key:"159ez6"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Py=ge("Camera",[["path",{d:"M14.5 4h-5L7 7H4a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2h-3l-2.5-3z",key:"1tc9qg"}],["circle",{cx:"12",cy:"13",r:"3",key:"1vg3eu"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Ry=ge("Check",[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const My=ge("ChevronLeft",[["path",{d:"m15 18-6-6 6-6",key:"1wnfg3"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const ko=ge("ChevronRight",[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Oy=ge("CircleCheck",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const jp=ge("CircleHelp",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3",key:"1u773s"}],["path",{d:"M12 17h.01",key:"p32p05"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Ty=ge("Clock",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["polyline",{points:"12 6 12 12 16 14",key:"68esgv"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Ly=ge("CloudDownload",[["path",{d:"M12 13v8l-4-4",key:"1f5nwf"}],["path",{d:"m12 21 4-4",key:"1lfcce"}],["path",{d:"M4.393 15.269A7 7 0 1 1 15.71 8h1.79a4.5 4.5 0 0 1 2.436 8.284",key:"ui1hmy"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Dy=ge("Command",[["path",{d:"M15 6v12a3 3 0 1 0 3-3H6a3 3 0 1 0 3 3V6a3 3 0 1 0-3 3h12a3 3 0 1 0-3-3",key:"11bfej"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Cp=ge("Cpu",[["rect",{width:"16",height:"16",x:"4",y:"4",rx:"2",key:"14l7u7"}],["rect",{width:"6",height:"6",x:"9",y:"9",rx:"1",key:"5aljv4"}],["path",{d:"M15 2v2",key:"13l42r"}],["path",{d:"M15 20v2",key:"15mkzm"}],["path",{d:"M2 15h2",key:"1gxd5l"}],["path",{d:"M2 9h2",key:"1bbxkp"}],["path",{d:"M20 15h2",key:"19e6y8"}],["path",{d:"M20 9h2",key:"19tzq7"}],["path",{d:"M9 2v2",key:"165o2o"}],["path",{d:"M9 20v2",key:"i2bqo8"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Ay=ge("ExternalLink",[["path",{d:"M15 3h6v6",key:"1q9fwt"}],["path",{d:"M10 14 21 3",key:"gplh6r"}],["path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6",key:"a6xqqp"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const _h=ge("EyeOff",[["path",{d:"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49",key:"ct8e1f"}],["path",{d:"M14.084 14.158a3 3 0 0 1-4.242-4.242",key:"151rxh"}],["path",{d:"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143",key:"13bj9a"}],["path",{d:"m2 2 20 20",key:"1ooewy"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const zu=ge("Eye",[["path",{d:"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0",key:"1nclc0"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Iy=ge("FileText",[["path",{d:"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z",key:"1rqfz7"}],["path",{d:"M14 2v4a2 2 0 0 0 2 2h4",key:"tnqrlb"}],["path",{d:"M10 9H8",key:"b1mrlr"}],["path",{d:"M16 13H8",key:"t4e002"}],["path",{d:"M16 17H8",key:"z1uh3a"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const zy=ge("Gauge",[["path",{d:"m12 14 4-4",key:"9kzdfg"}],["path",{d:"M3.34 19a10 10 0 1 1 17.32 0",key:"19p75a"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Fy=ge("GitCommitHorizontal",[["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}],["line",{x1:"3",x2:"9",y1:"12",y2:"12",key:"1dyftd"}],["line",{x1:"15",x2:"21",y1:"12",y2:"12",key:"oup4p8"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Uy=ge("HardDrive",[["line",{x1:"22",x2:"2",y1:"12",y2:"12",key:"1y58io"}],["path",{d:"M5.45 5.11 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z",key:"oot6mr"}],["line",{x1:"6",x2:"6.01",y1:"16",y2:"16",key:"sgf278"}],["line",{x1:"10",x2:"10.01",y1:"16",y2:"16",key:"1l4acy"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const $y=ge("HeartPulse",[["path",{d:"M19 14c1.49-1.46 3-3.21 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.76 0-3 .5-4.5 2-1.5-1.5-2.74-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4.05 3 5.5l7 7Z",key:"c3ymky"}],["path",{d:"M3.22 12H9.5l.5-1 2 4.5 2-7 1.5 3.5h5.27",key:"1uw2ng"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const By=ge("History",[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"1357e3"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}],["path",{d:"M12 7v5l4 2",key:"1fdv2h"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const rc=ge("Inbox",[["polyline",{points:"22 12 16 12 14 15 10 15 8 12 2 12",key:"o97t9d"}],["path",{d:"M5.45 5.11 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z",key:"oot6mr"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Vy=ge("Key",[["path",{d:"m15.5 7.5 2.3 2.3a1 1 0 0 0 1.4 0l2.1-2.1a1 1 0 0 0 0-1.4L19 4",key:"g0fldk"}],["path",{d:"m21 2-9.6 9.6",key:"1j0ho8"}],["circle",{cx:"7.5",cy:"15.5",r:"5.5",key:"yqb3hr"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Hy=ge("LayoutDashboard",[["rect",{width:"7",height:"9",x:"3",y:"3",rx:"1",key:"10lvy0"}],["rect",{width:"7",height:"5",x:"14",y:"3",rx:"1",key:"16une8"}],["rect",{width:"7",height:"9",x:"14",y:"12",rx:"1",key:"1hutg5"}],["rect",{width:"7",height:"5",x:"3",y:"16",rx:"1",key:"ldoo1y"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Wy=ge("Library",[["path",{d:"m16 6 4 14",key:"ji33uf"}],["path",{d:"M12 6v14",key:"1n7gus"}],["path",{d:"M8 8v12",key:"1gg7y9"}],["path",{d:"M4 4v16",key:"6qkkli"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Qy=ge("Lightbulb",[["path",{d:"M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5",key:"1gvzjb"}],["path",{d:"M9 18h6",key:"x1upvd"}],["path",{d:"M10 22h4",key:"ceow96"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const sc=ge("LoaderCircle",[["path",{d:"M21 12a9 9 0 1 1-6.219-8.56",key:"13zald"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Ky=ge("Menu",[["line",{x1:"4",x2:"20",y1:"12",y2:"12",key:"1e0a9i"}],["line",{x1:"4",x2:"20",y1:"6",y2:"6",key:"1owob3"}],["line",{x1:"4",x2:"20",y1:"18",y2:"18",key:"yk5zj1"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const qy=ge("Mic",[["path",{d:"M12 2a3 3 0 0 0-3 3v7a3 3 0 0 0 6 0V5a3 3 0 0 0-3-3Z",key:"131961"}],["path",{d:"M19 10v2a7 7 0 0 1-14 0v-2",key:"1vc78b"}],["line",{x1:"12",x2:"12",y1:"19",y2:"22",key:"x3vr5v"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Ph=ge("Package",[["path",{d:"M11 21.73a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73z",key:"1a0edw"}],["path",{d:"M12 22V12",key:"d0xqtd"}],["path",{d:"m3.3 7 7.703 4.734a2 2 0 0 0 1.994 0L20.7 7",key:"yx3hmr"}],["path",{d:"m7.5 4.27 9 5.15",key:"1c824w"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const oc=ge("Plug",[["path",{d:"M12 22v-5",key:"1ega77"}],["path",{d:"M9 8V2",key:"14iosj"}],["path",{d:"M15 8V2",key:"18g5xt"}],["path",{d:"M18 8v5a4 4 0 0 1-4 4h-4a4 4 0 0 1-4-4V8Z",key:"osxo6l"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Gy=ge("Power",[["path",{d:"M12 2v10",key:"mnfbl"}],["path",{d:"M18.4 6.6a9 9 0 1 1-12.77.04",key:"obofu9"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const ss=ge("RefreshCw",[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Zy=ge("Search",[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["path",{d:"m21 21-4.3-4.3",key:"1qie3q"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const al=ge("Server",[["rect",{width:"20",height:"8",x:"2",y:"2",rx:"2",ry:"2",key:"ngkwjq"}],["rect",{width:"20",height:"8",x:"2",y:"14",rx:"2",ry:"2",key:"iecqi9"}],["line",{x1:"6",x2:"6.01",y1:"6",y2:"6",key:"16zg32"}],["line",{x1:"6",x2:"6.01",y1:"18",y2:"18",key:"nzw8ys"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const ic=ge("ShieldAlert",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}],["path",{d:"M12 8v4",key:"1got3b"}],["path",{d:"M12 16h.01",key:"1drbdi"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Yy=ge("ShieldCheck",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const lc=ge("Shield",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const _p=ge("Shuffle",[["path",{d:"M2 18h1.4c1.3 0 2.5-.6 3.3-1.7l6.1-8.6c.7-1.1 2-1.7 3.3-1.7H22",key:"1wmou1"}],["path",{d:"m18 2 4 4-4 4",key:"pucp1d"}],["path",{d:"M2 6h1.9c1.5 0 2.9.9 3.6 2.2",key:"10bdb2"}],["path",{d:"M22 18h-5.9c-1.3 0-2.6-.7-3.3-1.8l-.5-.8",key:"vgxac0"}],["path",{d:"m18 14 4 4-4 4",key:"10pe0f"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Xy=ge("SlidersHorizontal",[["line",{x1:"21",x2:"14",y1:"4",y2:"4",key:"obuewd"}],["line",{x1:"10",x2:"3",y1:"4",y2:"4",key:"1q6298"}],["line",{x1:"21",x2:"12",y1:"12",y2:"12",key:"1iu8h1"}],["line",{x1:"8",x2:"3",y1:"12",y2:"12",key:"ntss68"}],["line",{x1:"21",x2:"16",y1:"20",y2:"20",key:"14d8ph"}],["line",{x1:"12",x2:"3",y1:"20",y2:"20",key:"m0wm8r"}],["line",{x1:"14",x2:"14",y1:"2",y2:"6",key:"14e1ph"}],["line",{x1:"8",x2:"8",y1:"10",y2:"14",key:"1i6ji0"}],["line",{x1:"16",x2:"16",y1:"18",y2:"22",key:"1lctlv"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Jy=ge("Sparkles",[["path",{d:"M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z",key:"4pj2yx"}],["path",{d:"M20 3v4",key:"1olli1"}],["path",{d:"M22 5h-4",key:"1gvqau"}],["path",{d:"M4 17v2",key:"vumght"}],["path",{d:"M5 18H3",key:"zchphs"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const e0=ge("SquareTerminal",[["path",{d:"m7 11 2-2-2-2",key:"1lz0vl"}],["path",{d:"M11 13h4",key:"1p7l4v"}],["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",ry:"2",key:"1m3agn"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const t0=ge("Terminal",[["polyline",{points:"4 17 10 11 4 5",key:"akl6gq"}],["line",{x1:"12",x2:"20",y1:"19",y2:"19",key:"q2wloq"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Co=ge("TriangleAlert",[["path",{d:"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3",key:"wmoenq"}],["path",{d:"M12 9v4",key:"juzpu7"}],["path",{d:"M12 17h.01",key:"p32p05"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const n0=ge("Wrench",[["path",{d:"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z",key:"cbrjhi"}]]);/** - * @license lucide-react v0.460.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const ul=ge("X",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]),os=[{id:"dashboard",label:"Cockpit",hint:"Deine Box auf einen Blick",icon:Hy,group:"Operativ"},{id:"ideen",label:"Ideen",hint:"Schreib hin, was entstehen soll",icon:Qy,group:"Operativ"},{id:"auftraege",label:"Auftragsbuch",hint:"Vorschläge der Box — annehmen oder ablehnen",icon:rc,group:"Operativ"},{id:"skills",label:"Skills & Jobs",hint:"Autonome Skills manuell auslösen",icon:jo,group:"Operativ"},{id:"chronik",label:"Chronik",hint:"Was die Box von allein getan hat + Zeitmaschine",icon:By,group:"Operativ"},{id:"wissen",label:"Wissen",hint:"Lucys Wissens-Vault (Traum-Notizen)",icon:Wy,group:"Wissen"},{id:"connect",label:"Verbinden",hint:"IDE-/Agent-Configs erzeugen",icon:oc,group:"Werkzeuge"},{id:"konsole",label:"Konsole",hint:"Direkte Box-Shell (SSH-artig)",icon:e0,group:"Werkzeuge"},{id:"guide",label:"Anleitung",hint:"Einrichten & Vibe-Coding",icon:jp,group:"Werkzeuge"},{id:"models",label:"Modelle",hint:"Speicher, laden & Rollen",icon:Np,group:"Wartung"},{id:"agent",label:"Hermes",hint:"Agent-Status & Verdrahtung",icon:jo,group:"Wartung"}];var Rh=1,r0=.9,s0=.8,o0=.17,fu=.1,hu=.999,i0=.9999,l0=.99,a0=/[\\\/_+.#"@\[\(\{&]/,u0=/[\\\/_+.#"@\[\(\{&]/g,c0=/[\s-]/,Pp=/[\s-]/g;function Fu(r,s,i,a,u,f,m){if(f===s.length)return u===r.length?Rh:l0;var h=`${u},${f}`;if(m[h]!==void 0)return m[h];for(var y=a.charAt(f),k=i.indexOf(y,u),w=0,x,R,_,D;k>=0;)x=Fu(r,s,i,a,k+1,f+1,m),x>w&&(k===u?x*=Rh:a0.test(r.charAt(k-1))?(x*=s0,_=r.slice(u,k-1).match(u0),_&&u>0&&(x*=Math.pow(hu,_.length))):c0.test(r.charAt(k-1))?(x*=r0,D=r.slice(u,k-1).match(Pp),D&&u>0&&(x*=Math.pow(hu,D.length))):(x*=o0,u>0&&(x*=Math.pow(hu,k-u))),r.charAt(k)!==s.charAt(f)&&(x*=i0)),(xx&&(x=R*fu)),x>w&&(w=x),k=i.indexOf(y,k+1);return m[h]=w,w}function Mh(r){return r.toLowerCase().replace(Pp," ")}function d0(r,s,i){return r=i&&i.length>0?`${r+" "+i.join(" ")}`:r,Fu(r,s,Mh(r),Mh(s),0,0,{})}function Zn(r,s,{checkForDefaultPrevented:i=!0}={}){return function(u){if(r==null||r(u),i===!1||!u.defaultPrevented)return s==null?void 0:s(u)}}function Oh(r,s){if(typeof r=="function")return r(s);r!=null&&(r.current=s)}function ks(...r){return s=>{let i=!1;const a=r.map(u=>{const f=Oh(u,s);return!i&&typeof f=="function"&&(i=!0),f});if(i)return()=>{for(let u=0;u{var A;const{scope:R,children:_,...D}=x,S=((A=R==null?void 0:R[r])==null?void 0:A[y])||h,P=g.useMemo(()=>D,Object.values(D));return d.jsx(S.Provider,{value:P,children:_})};k.displayName=f+"Provider";function w(x,R){var S;const _=((S=R==null?void 0:R[r])==null?void 0:S[y])||h,D=g.useContext(_);if(D)return D;if(m!==void 0)return m;throw new Error(`\`${x}\` must be used within \`${f}\``)}return[k,w]}const u=()=>{const f=i.map(m=>g.createContext(m));return function(h){const y=(h==null?void 0:h[r])||f;return g.useMemo(()=>({[`__scope${r}`]:{...h,[r]:y}}),[h,y])}};return u.scopeName=r,[a,h0(u,...s)]}function h0(...r){const s=r[0];if(r.length===1)return s;const i=()=>{const a=r.map(u=>({useScope:u(),scopeName:u.scopeName}));return function(f){const m=a.reduce((h,{useScope:y,scopeName:k})=>{const x=y(f)[`__scope${k}`];return{...h,...x}},{});return g.useMemo(()=>({[`__scope${s.scopeName}`]:m}),[m])}};return i.scopeName=s.scopeName,i}var _o=globalThis!=null&&globalThis.document?g.useLayoutEffect:()=>{},p0=Xu[" useId ".trim().toString()]||(()=>{}),m0=0;function vn(r){const[s,i]=g.useState(p0());return _o(()=>{i(a=>a??String(m0++))},[r]),s?`radix-${s}`:""}var g0=Xu[" useInsertionEffect ".trim().toString()]||_o;function v0({prop:r,defaultProp:s,onChange:i=()=>{},caller:a}){const[u,f,m]=y0({defaultProp:s,onChange:i}),h=r!==void 0,y=h?r:u;{const w=g.useRef(r!==void 0);g.useEffect(()=>{const x=w.current;x!==h&&console.warn(`${a} is changing from ${x?"controlled":"uncontrolled"} to ${h?"controlled":"uncontrolled"}. Components should not switch from controlled to uncontrolled (or vice versa). Decide between using a controlled or uncontrolled value for the lifetime of the component.`),w.current=h},[h,a])}const k=g.useCallback(w=>{var x;if(h){const R=x0(w)?w(r):w;R!==r&&((x=m.current)==null||x.call(m,R))}else f(w)},[h,r,f,m]);return[y,k]}function y0({defaultProp:r,onChange:s}){const[i,a]=g.useState(r),u=g.useRef(i),f=g.useRef(s);return g0(()=>{f.current=s},[s]),g.useEffect(()=>{var m;u.current!==i&&((m=f.current)==null||m.call(f,i),u.current=i)},[i,u]),[i,a,f]}function x0(r){return typeof r=="function"}var Rp=dp();function Mp(r){const s=g.forwardRef((i,a)=>{let{children:u,...f}=i,m=null,h=!1;const y=[];Th(u)&&typeof qi=="function"&&(u=qi(u._payload)),g.Children.forEach(u,R=>{var _;if(E0(R)){h=!0;const D=R;let S="child"in D.props?D.props.child:D.props.children;Th(S)&&typeof qi=="function"&&(S=qi(S._payload)),m=k0(D,S),y.push((_=m==null?void 0:m.props)==null?void 0:_.children)}else y.push(R)}),m?m=g.cloneElement(m,void 0,y):!h&&g.Children.count(u)===1&&g.isValidElement(u)&&(m=u);const k=m?S0(m):void 0,w=br(a,k);if(!m){if(u||u===0)throw new Error(h?_0(r):C0(r));return u}const x=b0(f,m.props??{});return m.type!==g.Fragment&&(x.ref=a?w:k),g.cloneElement(m,x)});return s.displayName=`${r}.Slot`,s}var w0=Symbol.for("radix.slottable"),k0=(r,s)=>{if("child"in r.props){const i=r.props.child;return g.isValidElement(i)?g.cloneElement(i,void 0,r.props.children(i.props.children)):null}return g.isValidElement(s)?s:null};function b0(r,s){const i={...s};for(const a in s){const u=r[a],f=s[a];/^on[A-Z]/.test(a)?u&&f?i[a]=(...h)=>{const y=f(...h);return u(...h),y}:u&&(i[a]=u):a==="style"?i[a]={...u,...f}:a==="className"&&(i[a]=[u,f].filter(Boolean).join(" "))}return{...r,...i}}function S0(r){var a,u;let s=(a=Object.getOwnPropertyDescriptor(r.props,"ref"))==null?void 0:a.get,i=s&&"isReactWarning"in s&&s.isReactWarning;return i?r.ref:(s=(u=Object.getOwnPropertyDescriptor(r,"ref"))==null?void 0:u.get,i=s&&"isReactWarning"in s&&s.isReactWarning,i?r.props.ref:r.props.ref||r.ref)}function E0(r){return g.isValidElement(r)&&typeof r.type=="function"&&"__radixId"in r.type&&r.type.__radixId===w0}var N0=Symbol.for("react.lazy");function Th(r){return r!=null&&typeof r=="object"&&"$$typeof"in r&&r.$$typeof===N0&&"_payload"in r&&j0(r._payload)}function j0(r){return typeof r=="object"&&r!==null&&"then"in r}var C0=r=>`${r} failed to slot onto its children. Expected a single React element child or \`Slottable\`.`,_0=r=>`${r} failed to slot onto its \`Slottable\`. Expected \`Slottable\` to receive a single React element child.`,qi=Xu[" use ".trim().toString()],P0=["a","button","div","form","h2","h3","img","input","label","li","nav","ol","p","select","span","svg","ul"],it=P0.reduce((r,s)=>{const i=Mp(`Primitive.${s}`),a=g.forwardRef((u,f)=>{const{asChild:m,...h}=u,y=m?i:s;return typeof window<"u"&&(window[Symbol.for("radix-ui")]=!0),d.jsx(y,{...h,ref:f})});return a.displayName=`Primitive.${s}`,{...r,[s]:a}},{});function R0(r,s){r&&Rp.flushSync(()=>r.dispatchEvent(s))}function Po(r){const s=g.useRef(r);return g.useEffect(()=>{s.current=r}),g.useMemo(()=>((...i)=>{var a;return(a=s.current)==null?void 0:a.call(s,...i)}),[])}function M0(r,s=globalThis==null?void 0:globalThis.document){const i=Po(r);g.useEffect(()=>{const a=u=>{u.key==="Escape"&&i(u)};return s.addEventListener("keydown",a,{capture:!0}),()=>s.removeEventListener("keydown",a,{capture:!0})},[i,s])}var O0="DismissableLayer",Uu="dismissableLayer.update",T0="dismissableLayer.pointerDownOutside",L0="dismissableLayer.focusOutside",Lh,ac=g.createContext({layers:new Set,layersWithOutsidePointerEventsDisabled:new Set,branches:new Set,dismissableSurfaces:new Set}),Op=g.forwardRef((r,s)=>{const{disableOutsidePointerEvents:i=!1,deferPointerDownOutside:a=!1,onEscapeKeyDown:u,onPointerDownOutside:f,onFocusOutside:m,onInteractOutside:h,onDismiss:y,...k}=r,w=g.useContext(ac),[x,R]=g.useState(null),_=(x==null?void 0:x.ownerDocument)??(globalThis==null?void 0:globalThis.document),[,D]=g.useState({}),S=br(s,ee=>R(ee)),P=Array.from(w.layers),[A]=[...w.layersWithOutsidePointerEventsDisabled].slice(-1),F=P.indexOf(A),V=x?P.indexOf(x):-1,I=w.layersWithOutsidePointerEventsDisabled.size>0,K=V>=F,G=g.useRef(!1),ue=z0(ee=>{const me=ee.target;if(!(me instanceof Node))return;const ke=[...w.branches].some(le=>le.contains(me));!K||ke||(f==null||f(ee),h==null||h(ee),ee.defaultPrevented||y==null||y())},{ownerDocument:_,deferPointerDownOutside:a,isDeferredPointerDownOutsideRef:G,dismissableSurfaces:w.dismissableSurfaces}),ie=F0(ee=>{if(a&&G.current)return;const me=ee.target;[...w.branches].some(le=>le.contains(me))||(m==null||m(ee),h==null||h(ee),ee.defaultPrevented||y==null||y())},_);return M0(ee=>{V===w.layers.size-1&&(u==null||u(ee),!ee.defaultPrevented&&y&&(ee.preventDefault(),y()))},_),g.useEffect(()=>{if(x)return i&&(w.layersWithOutsidePointerEventsDisabled.size===0&&(Lh=_.body.style.pointerEvents,_.body.style.pointerEvents="none"),w.layersWithOutsidePointerEventsDisabled.add(x)),w.layers.add(x),Dh(),()=>{i&&(w.layersWithOutsidePointerEventsDisabled.delete(x),w.layersWithOutsidePointerEventsDisabled.size===0&&(_.body.style.pointerEvents=Lh))}},[x,_,i,w]),g.useEffect(()=>()=>{x&&(w.layers.delete(x),w.layersWithOutsidePointerEventsDisabled.delete(x),Dh())},[x,w]),g.useEffect(()=>{const ee=()=>D({});return document.addEventListener(Uu,ee),()=>document.removeEventListener(Uu,ee)},[]),d.jsx(it.div,{...k,ref:S,style:{pointerEvents:I?K?"auto":"none":void 0,...r.style},onFocusCapture:Zn(r.onFocusCapture,ie.onFocusCapture),onBlurCapture:Zn(r.onBlurCapture,ie.onBlurCapture),onPointerDownCapture:Zn(r.onPointerDownCapture,ue.onPointerDownCapture)})});Op.displayName=O0;var D0="DismissableLayerBranch",A0=g.forwardRef((r,s)=>{const i=g.useContext(ac),a=g.useRef(null),u=br(s,a);return g.useEffect(()=>{const f=a.current;if(f)return i.branches.add(f),()=>{i.branches.delete(f)}},[i.branches]),d.jsx(it.div,{...r,ref:u})});A0.displayName=D0;function I0(){const r=g.useContext(ac),[s,i]=g.useState(null);return g.useEffect(()=>{if(s)return r.dismissableSurfaces.add(s),()=>{r.dismissableSurfaces.delete(s)}},[s,r.dismissableSurfaces]),i}function z0(r,s){const{ownerDocument:i=globalThis==null?void 0:globalThis.document,deferPointerDownOutside:a=!1,isDeferredPointerDownOutsideRef:u,dismissableSurfaces:f}=s,m=Po(r),h=g.useRef(!1),y=g.useRef(!1),k=g.useRef(new Map),w=g.useRef(()=>{});return g.useEffect(()=>{function x(){y.current=!1,u.current=!1,k.current.clear()}function R(){return Array.from(k.current.values()).some(Boolean)}function _(F){if(!y.current)return;const V=F.target;V instanceof Node&&[...f].some(K=>K.contains(V))||k.current.set(F.type,!0),F.type==="click"&&window.setTimeout(()=>{y.current&&w.current()},0)}function D(F){y.current&&k.current.set(F.type,!1)}const S=F=>{if(F.target&&!h.current){let V=function(){i.removeEventListener("click",w.current);const K=R();x(),K||Tp(T0,m,I,{discrete:!0})};const I={originalEvent:F};y.current=!0,u.current=a&&F.button===0,k.current.clear(),!a||F.button!==0?V():(i.removeEventListener("click",w.current),w.current=V,i.addEventListener("click",w.current,{once:!0}))}else i.removeEventListener("click",w.current),x();h.current=!1},P=["pointerup","mousedown","mouseup","touchstart","touchend","click"];for(const F of P)i.addEventListener(F,_,!0),i.addEventListener(F,D);const A=window.setTimeout(()=>{i.addEventListener("pointerdown",S)},0);return()=>{window.clearTimeout(A),i.removeEventListener("pointerdown",S),i.removeEventListener("click",w.current);for(const F of P)i.removeEventListener(F,_,!0),i.removeEventListener(F,D)}},[i,m,a,u,f]),{onPointerDownCapture:()=>h.current=!0}}function F0(r,s=globalThis==null?void 0:globalThis.document){const i=Po(r),a=g.useRef(!1);return g.useEffect(()=>{const u=f=>{f.target&&!a.current&&Tp(L0,i,{originalEvent:f},{discrete:!1})};return s.addEventListener("focusin",u),()=>s.removeEventListener("focusin",u)},[s,i]),{onFocusCapture:()=>a.current=!0,onBlurCapture:()=>a.current=!1}}function Dh(){const r=new CustomEvent(Uu);document.dispatchEvent(r)}function Tp(r,s,i,{discrete:a}){const u=i.originalEvent.target,f=new CustomEvent(r,{bubbles:!1,cancelable:!0,detail:i});s&&u.addEventListener(r,s,{once:!0}),a?R0(u,f):u.dispatchEvent(f)}var pu="focusScope.autoFocusOnMount",mu="focusScope.autoFocusOnUnmount",Ah={bubbles:!1,cancelable:!0},U0="FocusScope",Lp=g.forwardRef((r,s)=>{const{loop:i=!1,trapped:a=!1,onMountAutoFocus:u,onUnmountAutoFocus:f,...m}=r,[h,y]=g.useState(null),k=Po(u),w=Po(f),x=g.useRef(null),R=br(s,S=>y(S)),_=g.useRef({paused:!1,pause(){this.paused=!0},resume(){this.paused=!1}}).current;g.useEffect(()=>{if(a){let S=function(V){if(_.paused||!h)return;const I=V.target;h.contains(I)?x.current=I:Un(x.current,{select:!0})},P=function(V){if(_.paused||!h)return;const I=V.relatedTarget;I!==null&&(h.contains(I)||Un(x.current,{select:!0}))},A=function(V){if(document.activeElement===document.body)for(const K of V)K.removedNodes.length>0&&Un(h)};document.addEventListener("focusin",S),document.addEventListener("focusout",P);const F=new MutationObserver(A);return h&&F.observe(h,{childList:!0,subtree:!0}),()=>{document.removeEventListener("focusin",S),document.removeEventListener("focusout",P),F.disconnect()}}},[a,h,_.paused]),g.useEffect(()=>{if(h){zh.add(_);const S=document.activeElement;if(!h.contains(S)){const A=new CustomEvent(pu,Ah);h.addEventListener(pu,k),h.dispatchEvent(A),A.defaultPrevented||($0(Q0(Dp(h)),{select:!0}),document.activeElement===S&&Un(h))}return()=>{h.removeEventListener(pu,k),setTimeout(()=>{const A=new CustomEvent(mu,Ah);h.addEventListener(mu,w),h.dispatchEvent(A),A.defaultPrevented||Un(S??document.body,{select:!0}),h.removeEventListener(mu,w),zh.remove(_)},0)}}},[h,k,w,_]);const D=g.useCallback(S=>{if(!i&&!a||_.paused)return;const P=S.key==="Tab"&&!S.altKey&&!S.ctrlKey&&!S.metaKey,A=document.activeElement;if(P&&A){const F=S.currentTarget,[V,I]=B0(F);V&&I?!S.shiftKey&&A===I?(S.preventDefault(),i&&Un(V,{select:!0})):S.shiftKey&&A===V&&(S.preventDefault(),i&&Un(I,{select:!0})):A===F&&S.preventDefault()}},[i,a,_.paused]);return d.jsx(it.div,{tabIndex:-1,...m,ref:R,onKeyDown:D})});Lp.displayName=U0;function $0(r,{select:s=!1}={}){const i=document.activeElement;for(const a of r)if(Un(a,{select:s}),document.activeElement!==i)return}function B0(r){const s=Dp(r),i=Ih(s,r),a=Ih(s.reverse(),r);return[i,a]}function Dp(r){const s=[],i=document.createTreeWalker(r,NodeFilter.SHOW_ELEMENT,{acceptNode:a=>{const u=a.tagName==="INPUT"&&a.type==="hidden";return a.disabled||a.hidden||u?NodeFilter.FILTER_SKIP:a.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});for(;i.nextNode();)s.push(i.currentNode);return s}function Ih(r,s){for(const i of r)if(!V0(i,{upTo:s}))return i}function V0(r,{upTo:s}){if(getComputedStyle(r).visibility==="hidden")return!0;for(;r;){if(s!==void 0&&r===s)return!1;if(getComputedStyle(r).display==="none")return!0;r=r.parentElement}return!1}function H0(r){return r instanceof HTMLInputElement&&"select"in r}function Un(r,{select:s=!1}={}){if(r&&r.focus){const i=document.activeElement;r.focus({preventScroll:!0}),r!==i&&H0(r)&&s&&r.select()}}var zh=W0();function W0(){let r=[];return{add(s){const i=r[0];s!==i&&(i==null||i.pause()),r=Fh(r,s),r.unshift(s)},remove(s){var i;r=Fh(r,s),(i=r[0])==null||i.resume()}}}function Fh(r,s){const i=[...r],a=i.indexOf(s);return a!==-1&&i.splice(a,1),i}function Q0(r){return r.filter(s=>s.tagName!=="A")}var K0="Portal",Ap=g.forwardRef((r,s)=>{var h;const{container:i,...a}=r,[u,f]=g.useState(!1);_o(()=>f(!0),[]);const m=i||u&&((h=globalThis==null?void 0:globalThis.document)==null?void 0:h.body);return m?Rp.createPortal(d.jsx(it.div,{...a,ref:s}),m):null});Ap.displayName=K0;function q0(r,s){return g.useReducer((i,a)=>s[i][a]??i,r)}var cl=r=>{const{present:s,children:i}=r,a=G0(s),u=typeof i=="function"?i({present:a.isPresent}):g.Children.only(i),f=Z0(a.ref,Y0(u));return typeof i=="function"||a.isPresent?g.cloneElement(u,{ref:f}):null};cl.displayName="Presence";function G0(r){const[s,i]=g.useState(),a=g.useRef(null),u=g.useRef(r),f=g.useRef("none"),m=r?"mounted":"unmounted",[h,y]=q0(m,{mounted:{UNMOUNT:"unmounted",ANIMATION_OUT:"unmountSuspended"},unmountSuspended:{MOUNT:"mounted",ANIMATION_END:"unmounted"},unmounted:{MOUNT:"mounted"}});return g.useEffect(()=>{const k=Gi(a.current);f.current=h==="mounted"?k:"none"},[h]),_o(()=>{const k=a.current,w=u.current;if(w!==r){const R=f.current,_=Gi(k);r?y("MOUNT"):_==="none"||(k==null?void 0:k.display)==="none"?y("UNMOUNT"):y(w&&R!==_?"ANIMATION_OUT":"UNMOUNT"),u.current=r}},[r,y]),_o(()=>{if(s){let k;const w=s.ownerDocument.defaultView??window,x=_=>{const S=Gi(a.current).includes(CSS.escape(_.animationName));if(_.target===s&&S&&(y("ANIMATION_END"),!u.current)){const P=s.style.animationFillMode;s.style.animationFillMode="forwards",k=w.setTimeout(()=>{s.style.animationFillMode==="forwards"&&(s.style.animationFillMode=P)})}},R=_=>{_.target===s&&(f.current=Gi(a.current))};return s.addEventListener("animationstart",R),s.addEventListener("animationcancel",x),s.addEventListener("animationend",x),()=>{w.clearTimeout(k),s.removeEventListener("animationstart",R),s.removeEventListener("animationcancel",x),s.removeEventListener("animationend",x)}}else y("ANIMATION_END")},[s,y]),{isPresent:["mounted","unmountSuspended"].includes(h),ref:g.useCallback(k=>{a.current=k?getComputedStyle(k):null,i(k)},[])}}function Uh(r,s){if(typeof r=="function")return r(s);r!=null&&(r.current=s)}function Z0(...r){const s=g.useRef(r);return s.current=r,g.useCallback(i=>{const a=s.current;let u=!1;const f=a.map(m=>{const h=Uh(m,i);return!u&&typeof h=="function"&&(u=!0),h});if(u)return()=>{for(let m=0;m{Xt||(Xt={start:$h(),end:$h()});const{start:r,end:s}=Xt;return document.body.firstElementChild!==r&&document.body.insertAdjacentElement("afterbegin",r),document.body.lastElementChild!==s&&document.body.insertAdjacentElement("beforeend",s),Zi++,()=>{Zi===1&&(Xt==null||Xt.start.remove(),Xt==null||Xt.end.remove(),Xt=null),Zi=Math.max(0,Zi-1)}},[])}function $h(){const r=document.createElement("span");return r.setAttribute("data-radix-focus-guard",""),r.tabIndex=0,r.style.outline="none",r.style.opacity="0",r.style.position="fixed",r.style.pointerEvents="none",r}var nn=function(){return nn=Object.assign||function(s){for(var i,a=1,u=arguments.length;a"u")return mx;var s=gx(r),i=document.documentElement.clientWidth,a=window.innerWidth;return{left:s[0],top:s[1],right:s[2],gap:Math.max(0,a-i+s[2]-s[0])}},yx=Up(),is="data-scroll-locked",xx=function(r,s,i,a){var u=r.left,f=r.top,m=r.right,h=r.gap;return i===void 0&&(i="margin"),` - .`.concat(ex,` { - overflow: hidden `).concat(a,`; - padding-right: `).concat(h,"px ").concat(a,`; - } - body[`).concat(is,`] { - overflow: hidden `).concat(a,`; - overscroll-behavior: contain; - `).concat([s&&"position: relative ".concat(a,";"),i==="margin"&&` - padding-left: `.concat(u,`px; - padding-top: `).concat(f,`px; - padding-right: `).concat(m,`px; - margin-left:0; - margin-top:0; - margin-right: `).concat(h,"px ").concat(a,`; - `),i==="padding"&&"padding-right: ".concat(h,"px ").concat(a,";")].filter(Boolean).join(""),` - } - - .`).concat(tl,` { - right: `).concat(h,"px ").concat(a,`; - } - - .`).concat(nl,` { - margin-right: `).concat(h,"px ").concat(a,`; - } - - .`).concat(tl," .").concat(tl,` { - right: 0 `).concat(a,`; - } - - .`).concat(nl," .").concat(nl,` { - margin-right: 0 `).concat(a,`; - } - - body[`).concat(is,`] { - `).concat(tx,": ").concat(h,`px; - } -`)},Vh=function(){var r=parseInt(document.body.getAttribute(is)||"0",10);return isFinite(r)?r:0},wx=function(){g.useEffect(function(){return document.body.setAttribute(is,(Vh()+1).toString()),function(){var r=Vh()-1;r<=0?document.body.removeAttribute(is):document.body.setAttribute(is,r.toString())}},[])},kx=function(r){var s=r.noRelative,i=r.noImportant,a=r.gapMode,u=a===void 0?"margin":a;wx();var f=g.useMemo(function(){return vx(u)},[u]);return g.createElement(yx,{styles:xx(f,!s,u,i?"":"!important")})},$u=!1;if(typeof window<"u")try{var Yi=Object.defineProperty({},"passive",{get:function(){return $u=!0,!0}});window.addEventListener("test",Yi,Yi),window.removeEventListener("test",Yi,Yi)}catch{$u=!1}var Yr=$u?{passive:!1}:!1,bx=function(r){return r.tagName==="TEXTAREA"},$p=function(r,s){if(!(r instanceof Element))return!1;var i=window.getComputedStyle(r);return i[s]!=="hidden"&&!(i.overflowY===i.overflowX&&!bx(r)&&i[s]==="visible")},Sx=function(r){return $p(r,"overflowY")},Ex=function(r){return $p(r,"overflowX")},Hh=function(r,s){var i=s.ownerDocument,a=s;do{typeof ShadowRoot<"u"&&a instanceof ShadowRoot&&(a=a.host);var u=Bp(r,a);if(u){var f=Vp(r,a),m=f[1],h=f[2];if(m>h)return!0}a=a.parentNode}while(a&&a!==i.body);return!1},Nx=function(r){var s=r.scrollTop,i=r.scrollHeight,a=r.clientHeight;return[s,i,a]},jx=function(r){var s=r.scrollLeft,i=r.scrollWidth,a=r.clientWidth;return[s,i,a]},Bp=function(r,s){return r==="v"?Sx(s):Ex(s)},Vp=function(r,s){return r==="v"?Nx(s):jx(s)},Cx=function(r,s){return r==="h"&&s==="rtl"?-1:1},_x=function(r,s,i,a,u){var f=Cx(r,window.getComputedStyle(s).direction),m=f*a,h=i.target,y=s.contains(h),k=!1,w=m>0,x=0,R=0;do{if(!h)break;var _=Vp(r,h),D=_[0],S=_[1],P=_[2],A=S-P-f*D;(D||A)&&Bp(r,h)&&(x+=A,R+=D);var F=h.parentNode;h=F&&F.nodeType===Node.DOCUMENT_FRAGMENT_NODE?F.host:F}while(!y&&h!==document.body||y&&(s.contains(h)||s===h));return(w&&Math.abs(x)<1||!w&&Math.abs(R)<1)&&(k=!0),k},Xi=function(r){return"changedTouches"in r?[r.changedTouches[0].clientX,r.changedTouches[0].clientY]:[0,0]},Wh=function(r){return[r.deltaX,r.deltaY]},Qh=function(r){return r&&"current"in r?r.current:r},Px=function(r,s){return r[0]===s[0]&&r[1]===s[1]},Rx=function(r){return` - .block-interactivity-`.concat(r,` {pointer-events: none;} - .allow-interactivity-`).concat(r,` {pointer-events: all;} -`)},Mx=0,Xr=[];function Ox(r){var s=g.useRef([]),i=g.useRef([0,0]),a=g.useRef(),u=g.useState(Mx++)[0],f=g.useState(Up)[0],m=g.useRef(r);g.useEffect(function(){m.current=r},[r]),g.useEffect(function(){if(r.inert){document.body.classList.add("block-interactivity-".concat(u));var S=J0([r.lockRef.current],(r.shards||[]).map(Qh),!0).filter(Boolean);return S.forEach(function(P){return P.classList.add("allow-interactivity-".concat(u))}),function(){document.body.classList.remove("block-interactivity-".concat(u)),S.forEach(function(P){return P.classList.remove("allow-interactivity-".concat(u))})}}},[r.inert,r.lockRef.current,r.shards]);var h=g.useCallback(function(S,P){if("touches"in S&&S.touches.length===2||S.type==="wheel"&&S.ctrlKey)return!m.current.allowPinchZoom;var A=Xi(S),F=i.current,V="deltaX"in S?S.deltaX:F[0]-A[0],I="deltaY"in S?S.deltaY:F[1]-A[1],K,G=S.target,ue=Math.abs(V)>Math.abs(I)?"h":"v";if("touches"in S&&ue==="h"&&G.type==="range")return!1;var ie=window.getSelection(),ee=ie&&ie.anchorNode,me=ee?ee===G||ee.contains(G):!1;if(me)return!1;var ke=Hh(ue,G);if(!ke)return!0;if(ke?K=ue:(K=ue==="v"?"h":"v",ke=Hh(ue,G)),!ke)return!1;if(!a.current&&"changedTouches"in S&&(V||I)&&(a.current=K),!K)return!0;var le=a.current||K;return _x(le,P,S,le==="h"?V:I)},[]),y=g.useCallback(function(S){var P=S;if(!(!Xr.length||Xr[Xr.length-1]!==f)){var A="deltaY"in P?Wh(P):Xi(P),F=s.current.filter(function(K){return K.name===P.type&&(K.target===P.target||P.target===K.shadowParent)&&Px(K.delta,A)})[0];if(F&&F.should){P.cancelable&&P.preventDefault();return}if(!F){var V=(m.current.shards||[]).map(Qh).filter(Boolean).filter(function(K){return K.contains(P.target)}),I=V.length>0?h(P,V[0]):!m.current.noIsolation;I&&P.cancelable&&P.preventDefault()}}},[]),k=g.useCallback(function(S,P,A,F){var V={name:S,delta:P,target:A,should:F,shadowParent:Tx(A)};s.current.push(V),setTimeout(function(){s.current=s.current.filter(function(I){return I!==V})},1)},[]),w=g.useCallback(function(S){i.current=Xi(S),a.current=void 0},[]),x=g.useCallback(function(S){k(S.type,Wh(S),S.target,h(S,r.lockRef.current))},[]),R=g.useCallback(function(S){k(S.type,Xi(S),S.target,h(S,r.lockRef.current))},[]);g.useEffect(function(){return Xr.push(f),r.setCallbacks({onScrollCapture:x,onWheelCapture:x,onTouchMoveCapture:R}),document.addEventListener("wheel",y,Yr),document.addEventListener("touchmove",y,Yr),document.addEventListener("touchstart",w,Yr),function(){Xr=Xr.filter(function(S){return S!==f}),document.removeEventListener("wheel",y,Yr),document.removeEventListener("touchmove",y,Yr),document.removeEventListener("touchstart",w,Yr)}},[]);var _=r.removeScrollBar,D=r.inert;return g.createElement(g.Fragment,null,D?g.createElement(f,{styles:Rx(u)}):null,_?g.createElement(kx,{noRelative:r.noRelative,gapMode:r.gapMode}):null)}function Tx(r){for(var s=null;r!==null;)r instanceof ShadowRoot&&(s=r.host,r=r.host),r=r.parentNode;return s}const Lx=ax(Fp,Ox);var Hp=g.forwardRef(function(r,s){return g.createElement(dl,nn({},r,{ref:s,sideCar:Lx}))});Hp.classNames=dl.classNames;var Dx=function(r){if(typeof document>"u")return null;var s=Array.isArray(r)?r[0]:r;return s.ownerDocument.body},Jr=new WeakMap,Ji=new WeakMap,el={},xu=0,Wp=function(r){return r&&(r.host||Wp(r.parentNode))},Ax=function(r,s){return s.map(function(i){if(r.contains(i))return i;var a=Wp(i);return a&&r.contains(a)?a:(console.error("aria-hidden",i,"in not contained inside",r,". Doing nothing"),null)}).filter(function(i){return!!i})},Ix=function(r,s,i,a){var u=Ax(s,Array.isArray(r)?r:[r]);el[i]||(el[i]=new WeakMap);var f=el[i],m=[],h=new Set,y=new Set(u),k=function(x){!x||h.has(x)||(h.add(x),k(x.parentNode))};u.forEach(k);var w=function(x){!x||y.has(x)||Array.prototype.forEach.call(x.children,function(R){if(h.has(R))w(R);else try{var _=R.getAttribute(a),D=_!==null&&_!=="false",S=(Jr.get(R)||0)+1,P=(f.get(R)||0)+1;Jr.set(R,S),f.set(R,P),m.push(R),S===1&&D&&Ji.set(R,!0),P===1&&R.setAttribute(i,"true"),D||R.setAttribute(a,"true")}catch(A){console.error("aria-hidden: cannot operate on ",R,A)}})};return w(s),h.clear(),xu++,function(){m.forEach(function(x){var R=Jr.get(x)-1,_=f.get(x)-1;Jr.set(x,R),f.set(x,_),R||(Ji.has(x)||x.removeAttribute(a),Ji.delete(x)),_||x.removeAttribute(i)}),xu--,xu||(Jr=new WeakMap,Jr=new WeakMap,Ji=new WeakMap,el={})}},zx=function(r,s,i){i===void 0&&(i="data-aria-hidden");var a=Array.from(Array.isArray(r)?r:[r]),u=Dx(r);return u?(a.push.apply(a,Array.from(u.querySelectorAll("[aria-live], script"))),Ix(a,u,i,"aria-hidden")):function(){return null}},fl="Dialog",[Qp]=f0(fl),[Fx,Qt]=Qp(fl),Kp=r=>{const{__scopeDialog:s,children:i,open:a,defaultOpen:u,onOpenChange:f,modal:m=!0}=r,h=g.useRef(null),y=g.useRef(null),[k,w]=v0({prop:a,defaultProp:u??!1,onChange:f,caller:fl});return d.jsx(Fx,{scope:s,triggerRef:h,contentRef:y,contentId:vn(),titleId:vn(),descriptionId:vn(),open:k,onOpenChange:w,onOpenToggle:g.useCallback(()=>w(x=>!x),[w]),modal:m,children:i})};Kp.displayName=fl;var qp="DialogTrigger",Ux=g.forwardRef((r,s)=>{const{__scopeDialog:i,...a}=r,u=Qt(qp,i),f=br(s,u.triggerRef);return d.jsx(it.button,{type:"button","aria-haspopup":"dialog","aria-expanded":u.open,"aria-controls":u.open?u.contentId:void 0,"data-state":cc(u.open),...a,ref:f,onClick:Zn(r.onClick,u.onOpenToggle)})});Ux.displayName=qp;var uc="DialogPortal",[$x,Gp]=Qp(uc,{forceMount:void 0}),Zp=r=>{const{__scopeDialog:s,forceMount:i,children:a,container:u}=r,f=Qt(uc,s);return d.jsx($x,{scope:s,forceMount:i,children:g.Children.map(a,m=>d.jsx(cl,{present:i||f.open,children:d.jsx(Ap,{asChild:!0,container:u,children:m})}))})};Zp.displayName=uc;var ol="DialogOverlay",Yp=g.forwardRef((r,s)=>{const i=Gp(ol,r.__scopeDialog),{forceMount:a=i.forceMount,...u}=r,f=Qt(ol,r.__scopeDialog);return f.modal?d.jsx(cl,{present:a||f.open,children:d.jsx(Vx,{...u,ref:s})}):null});Yp.displayName=ol;var Bx=Mp("DialogOverlay.RemoveScroll"),Vx=g.forwardRef((r,s)=>{const{__scopeDialog:i,...a}=r,u=Qt(ol,i),f=I0(),m=br(s,f);return d.jsx(Hp,{as:Bx,allowPinchZoom:!0,shards:[u.contentRef],children:d.jsx(it.div,{"data-state":cc(u.open),...a,ref:m,style:{pointerEvents:"auto",...a.style}})})}),bs="DialogContent",Xp=g.forwardRef((r,s)=>{const i=Gp(bs,r.__scopeDialog),{forceMount:a=i.forceMount,...u}=r,f=Qt(bs,r.__scopeDialog);return d.jsx(cl,{present:a||f.open,children:f.modal?d.jsx(Hx,{...u,ref:s}):d.jsx(Wx,{...u,ref:s})})});Xp.displayName=bs;var Hx=g.forwardRef((r,s)=>{const i=Qt(bs,r.__scopeDialog),a=g.useRef(null),u=br(s,i.contentRef,a);return g.useEffect(()=>{const f=a.current;if(f)return zx(f)},[]),d.jsx(Jp,{...r,ref:u,trapFocus:i.open,disableOutsidePointerEvents:i.open,onCloseAutoFocus:Zn(r.onCloseAutoFocus,f=>{var m;f.preventDefault(),(m=i.triggerRef.current)==null||m.focus()}),onPointerDownOutside:Zn(r.onPointerDownOutside,f=>{const m=f.detail.originalEvent,h=m.button===0&&m.ctrlKey===!0;(m.button===2||h)&&f.preventDefault()}),onFocusOutside:Zn(r.onFocusOutside,f=>f.preventDefault())})}),Wx=g.forwardRef((r,s)=>{const i=Qt(bs,r.__scopeDialog),a=g.useRef(!1),u=g.useRef(!1);return d.jsx(Jp,{...r,ref:s,trapFocus:!1,disableOutsidePointerEvents:!1,onCloseAutoFocus:f=>{var m,h;(m=r.onCloseAutoFocus)==null||m.call(r,f),f.defaultPrevented||(a.current||(h=i.triggerRef.current)==null||h.focus(),f.preventDefault()),a.current=!1,u.current=!1},onInteractOutside:f=>{var y,k;(y=r.onInteractOutside)==null||y.call(r,f),f.defaultPrevented||(a.current=!0,f.detail.originalEvent.type==="pointerdown"&&(u.current=!0));const m=f.target;((k=i.triggerRef.current)==null?void 0:k.contains(m))&&f.preventDefault(),f.detail.originalEvent.type==="focusin"&&u.current&&f.preventDefault()}})}),Jp=g.forwardRef((r,s)=>{const{__scopeDialog:i,trapFocus:a,onOpenAutoFocus:u,onCloseAutoFocus:f,...m}=r,h=Qt(bs,i);return X0(),d.jsx(d.Fragment,{children:d.jsx(Lp,{asChild:!0,loop:!0,trapped:a,onMountAutoFocus:u,onUnmountAutoFocus:f,children:d.jsx(Op,{role:"dialog",id:h.contentId,"aria-describedby":h.descriptionId,"aria-labelledby":h.titleId,"data-state":cc(h.open),...m,ref:s,deferPointerDownOutside:!0,onDismiss:()=>h.onOpenChange(!1)})})})}),em="DialogTitle",Qx=g.forwardRef((r,s)=>{const{__scopeDialog:i,...a}=r,u=Qt(em,i);return d.jsx(it.h2,{id:u.titleId,...a,ref:s})});Qx.displayName=em;var tm="DialogDescription",Kx=g.forwardRef((r,s)=>{const{__scopeDialog:i,...a}=r,u=Qt(tm,i);return d.jsx(it.p,{id:u.descriptionId,...a,ref:s})});Kx.displayName=tm;var nm="DialogClose",qx=g.forwardRef((r,s)=>{const{__scopeDialog:i,...a}=r,u=Qt(nm,i);return d.jsx(it.button,{type:"button",...a,ref:s,onClick:Zn(r.onClick,()=>u.onOpenChange(!1))})});qx.displayName=nm;function cc(r){return r?"open":"closed"}var po='[cmdk-group=""]',wu='[cmdk-group-items=""]',Gx='[cmdk-group-heading=""]',rm='[cmdk-item=""]',Kh=`${rm}:not([aria-disabled="true"])`,Bu="cmdk-item-select",ns="data-value",Zx=(r,s,i)=>d0(r,s,i),sm=g.createContext(void 0),Ao=()=>g.useContext(sm),om=g.createContext(void 0),dc=()=>g.useContext(om),im=g.createContext(void 0),lm=g.forwardRef((r,s)=>{let i=rs(()=>{var N,q;return{search:"",value:(q=(N=r.value)!=null?N:r.defaultValue)!=null?q:"",selectedItemId:void 0,filtered:{count:0,items:new Map,groups:new Set}}}),a=rs(()=>new Set),u=rs(()=>new Map),f=rs(()=>new Map),m=rs(()=>new Set),h=am(r),{label:y,children:k,value:w,onValueChange:x,filter:R,shouldFilter:_,loop:D,disablePointerSelection:S=!1,vimBindings:P=!0,...A}=r,F=vn(),V=vn(),I=vn(),K=g.useRef(null),G=l1();kr(()=>{if(w!==void 0){let N=w.trim();i.current.value=N,ue.emit()}},[w]),kr(()=>{G(6,Le)},[]);let ue=g.useMemo(()=>({subscribe:N=>(m.current.add(N),()=>m.current.delete(N)),snapshot:()=>i.current,setState:(N,q,Y)=>{var W,se,de,ye;if(!Object.is(i.current[N],q)){if(i.current[N]=q,N==="search")le(),me(),G(1,ke);else if(N==="value"){if(document.activeElement.hasAttribute("cmdk-input")||document.activeElement.hasAttribute("cmdk-root")){let we=document.getElementById(I);we?we.focus():(W=document.getElementById(F))==null||W.focus()}if(G(7,()=>{var we;i.current.selectedItemId=(we=Z())==null?void 0:we.id,ue.emit()}),Y||G(5,Le),((se=h.current)==null?void 0:se.value)!==void 0){let we=q??"";(ye=(de=h.current).onValueChange)==null||ye.call(de,we);return}}ue.emit()}},emit:()=>{m.current.forEach(N=>N())}}),[]),ie=g.useMemo(()=>({value:(N,q,Y)=>{var W;q!==((W=f.current.get(N))==null?void 0:W.value)&&(f.current.set(N,{value:q,keywords:Y}),i.current.filtered.items.set(N,ee(q,Y)),G(2,()=>{me(),ue.emit()}))},item:(N,q)=>(a.current.add(N),q&&(u.current.has(q)?u.current.get(q).add(N):u.current.set(q,new Set([N]))),G(3,()=>{le(),me(),i.current.value||ke(),ue.emit()}),()=>{f.current.delete(N),a.current.delete(N),i.current.filtered.items.delete(N);let Y=Z();G(4,()=>{le(),(Y==null?void 0:Y.getAttribute("id"))===N&&ke(),ue.emit()})}),group:N=>(u.current.has(N)||u.current.set(N,new Set),()=>{f.current.delete(N),u.current.delete(N)}),filter:()=>h.current.shouldFilter,label:y||r["aria-label"],getDisablePointerSelection:()=>h.current.disablePointerSelection,listId:F,inputId:I,labelId:V,listInnerRef:K}),[]);function ee(N,q){var Y,W;let se=(W=(Y=h.current)==null?void 0:Y.filter)!=null?W:Zx;return N?se(N,i.current.search,q):0}function me(){if(!i.current.search||h.current.shouldFilter===!1)return;let N=i.current.filtered.items,q=[];i.current.filtered.groups.forEach(W=>{let se=u.current.get(W),de=0;se.forEach(ye=>{let we=N.get(ye);de=Math.max(we,de)}),q.push([W,de])});let Y=K.current;ce().sort((W,se)=>{var de,ye;let we=W.getAttribute("id"),Ge=se.getAttribute("id");return((de=N.get(Ge))!=null?de:0)-((ye=N.get(we))!=null?ye:0)}).forEach(W=>{let se=W.closest(wu);se?se.appendChild(W.parentElement===se?W:W.closest(`${wu} > *`)):Y.appendChild(W.parentElement===Y?W:W.closest(`${wu} > *`))}),q.sort((W,se)=>se[1]-W[1]).forEach(W=>{var se;let de=(se=K.current)==null?void 0:se.querySelector(`${po}[${ns}="${encodeURIComponent(W[0])}"]`);de==null||de.parentElement.appendChild(de)})}function ke(){let N=ce().find(Y=>Y.getAttribute("aria-disabled")!=="true"),q=N==null?void 0:N.getAttribute(ns);ue.setState("value",q||void 0)}function le(){var N,q,Y,W;if(!i.current.search||h.current.shouldFilter===!1){i.current.filtered.count=a.current.size;return}i.current.filtered.groups=new Set;let se=0;for(let de of a.current){let ye=(q=(N=f.current.get(de))==null?void 0:N.value)!=null?q:"",we=(W=(Y=f.current.get(de))==null?void 0:Y.keywords)!=null?W:[],Ge=ee(ye,we);i.current.filtered.items.set(de,Ge),Ge>0&&se++}for(let[de,ye]of u.current)for(let we of ye)if(i.current.filtered.items.get(we)>0){i.current.filtered.groups.add(de);break}i.current.filtered.count=se}function Le(){var N,q,Y;let W=Z();W&&(((N=W.parentElement)==null?void 0:N.firstChild)===W&&((Y=(q=W.closest(po))==null?void 0:q.querySelector(Gx))==null||Y.scrollIntoView({block:"nearest"})),W.scrollIntoView({block:"nearest"}))}function Z(){var N;return(N=K.current)==null?void 0:N.querySelector(`${rm}[aria-selected="true"]`)}function ce(){var N;return Array.from(((N=K.current)==null?void 0:N.querySelectorAll(Kh))||[])}function Ce(N){let q=ce()[N];q&&ue.setState("value",q.getAttribute(ns))}function Ne(N){var q;let Y=Z(),W=ce(),se=W.findIndex(ye=>ye===Y),de=W[se+N];(q=h.current)!=null&&q.loop&&(de=se+N<0?W[W.length-1]:se+N===W.length?W[0]:W[se+N]),de&&ue.setState("value",de.getAttribute(ns))}function z(N){let q=Z(),Y=q==null?void 0:q.closest(po),W;for(;Y&&!W;)Y=N>0?o1(Y,po):i1(Y,po),W=Y==null?void 0:Y.querySelector(Kh);W?ue.setState("value",W.getAttribute(ns)):Ne(N)}let ne=()=>Ce(ce().length-1),Q=N=>{N.preventDefault(),N.metaKey?ne():N.altKey?z(1):Ne(1)},C=N=>{N.preventDefault(),N.metaKey?Ce(0):N.altKey?z(-1):Ne(-1)};return g.createElement(it.div,{ref:s,tabIndex:-1,...A,"cmdk-root":"",onKeyDown:N=>{var q;(q=A.onKeyDown)==null||q.call(A,N);let Y=N.nativeEvent.isComposing||N.keyCode===229;if(!(N.defaultPrevented||Y))switch(N.key){case"n":case"j":{P&&N.ctrlKey&&Q(N);break}case"ArrowDown":{Q(N);break}case"p":case"k":{P&&N.ctrlKey&&C(N);break}case"ArrowUp":{C(N);break}case"Home":{N.preventDefault(),Ce(0);break}case"End":{N.preventDefault(),ne();break}case"Enter":{N.preventDefault();let W=Z();if(W){let se=new Event(Bu);W.dispatchEvent(se)}}}}},g.createElement("label",{"cmdk-label":"",htmlFor:ie.inputId,id:ie.labelId,style:u1},y),hl(r,N=>g.createElement(om.Provider,{value:ue},g.createElement(sm.Provider,{value:ie},N))))}),Yx=g.forwardRef((r,s)=>{var i,a;let u=vn(),f=g.useRef(null),m=g.useContext(im),h=Ao(),y=am(r),k=(a=(i=y.current)==null?void 0:i.forceMount)!=null?a:m==null?void 0:m.forceMount;kr(()=>{if(!k)return h.item(u,m==null?void 0:m.id)},[k]);let w=um(u,f,[r.value,r.children,f],r.keywords),x=dc(),R=Yn(G=>G.value&&G.value===w.current),_=Yn(G=>k||h.filter()===!1?!0:G.search?G.filtered.items.get(u)>0:!0);g.useEffect(()=>{let G=f.current;if(!(!G||r.disabled))return G.addEventListener(Bu,D),()=>G.removeEventListener(Bu,D)},[_,r.onSelect,r.disabled]);function D(){var G,ue;S(),(ue=(G=y.current).onSelect)==null||ue.call(G,w.current)}function S(){x.setState("value",w.current,!0)}if(!_)return null;let{disabled:P,value:A,onSelect:F,forceMount:V,keywords:I,...K}=r;return g.createElement(it.div,{ref:ks(f,s),...K,id:u,"cmdk-item":"",role:"option","aria-disabled":!!P,"aria-selected":!!R,"data-disabled":!!P,"data-selected":!!R,onPointerMove:P||h.getDisablePointerSelection()?void 0:S,onClick:P?void 0:D},r.children)}),Xx=g.forwardRef((r,s)=>{let{heading:i,children:a,forceMount:u,...f}=r,m=vn(),h=g.useRef(null),y=g.useRef(null),k=vn(),w=Ao(),x=Yn(_=>u||w.filter()===!1?!0:_.search?_.filtered.groups.has(m):!0);kr(()=>w.group(m),[]),um(m,h,[r.value,r.heading,y]);let R=g.useMemo(()=>({id:m,forceMount:u}),[u]);return g.createElement(it.div,{ref:ks(h,s),...f,"cmdk-group":"",role:"presentation",hidden:x?void 0:!0},i&&g.createElement("div",{ref:y,"cmdk-group-heading":"","aria-hidden":!0,id:k},i),hl(r,_=>g.createElement("div",{"cmdk-group-items":"",role:"group","aria-labelledby":i?k:void 0},g.createElement(im.Provider,{value:R},_))))}),Jx=g.forwardRef((r,s)=>{let{alwaysRender:i,...a}=r,u=g.useRef(null),f=Yn(m=>!m.search);return!i&&!f?null:g.createElement(it.div,{ref:ks(u,s),...a,"cmdk-separator":"",role:"separator"})}),e1=g.forwardRef((r,s)=>{let{onValueChange:i,...a}=r,u=r.value!=null,f=dc(),m=Yn(k=>k.search),h=Yn(k=>k.selectedItemId),y=Ao();return g.useEffect(()=>{r.value!=null&&f.setState("search",r.value)},[r.value]),g.createElement(it.input,{ref:s,...a,"cmdk-input":"",autoComplete:"off",autoCorrect:"off",spellCheck:!1,"aria-autocomplete":"list",role:"combobox","aria-expanded":!0,"aria-controls":y.listId,"aria-labelledby":y.labelId,"aria-activedescendant":h,id:y.inputId,type:"text",value:u?r.value:m,onChange:k=>{u||f.setState("search",k.target.value),i==null||i(k.target.value)}})}),t1=g.forwardRef((r,s)=>{let{children:i,label:a="Suggestions",...u}=r,f=g.useRef(null),m=g.useRef(null),h=Yn(k=>k.selectedItemId),y=Ao();return g.useEffect(()=>{if(m.current&&f.current){let k=m.current,w=f.current,x,R=new ResizeObserver(()=>{x=requestAnimationFrame(()=>{let _=k.offsetHeight;w.style.setProperty("--cmdk-list-height",_.toFixed(1)+"px")})});return R.observe(k),()=>{cancelAnimationFrame(x),R.unobserve(k)}}},[]),g.createElement(it.div,{ref:ks(f,s),...u,"cmdk-list":"",role:"listbox",tabIndex:-1,"aria-activedescendant":h,"aria-label":a,id:y.listId},hl(r,k=>g.createElement("div",{ref:ks(m,y.listInnerRef),"cmdk-list-sizer":""},k)))}),n1=g.forwardRef((r,s)=>{let{open:i,onOpenChange:a,overlayClassName:u,contentClassName:f,container:m,...h}=r;return g.createElement(Kp,{open:i,onOpenChange:a},g.createElement(Zp,{container:m},g.createElement(Yp,{"cmdk-overlay":"",className:u}),g.createElement(Xp,{"aria-label":r.label,"cmdk-dialog":"",className:f},g.createElement(lm,{ref:s,...h}))))}),r1=g.forwardRef((r,s)=>Yn(i=>i.filtered.count===0)?g.createElement(it.div,{ref:s,...r,"cmdk-empty":"",role:"presentation"}):null),s1=g.forwardRef((r,s)=>{let{progress:i,children:a,label:u="Loading...",...f}=r;return g.createElement(it.div,{ref:s,...f,"cmdk-loading":"",role:"progressbar","aria-valuenow":i,"aria-valuemin":0,"aria-valuemax":100,"aria-label":u},hl(r,m=>g.createElement("div",{"aria-hidden":!0},m)))}),es=Object.assign(lm,{List:t1,Item:Yx,Input:e1,Group:Xx,Separator:Jx,Dialog:n1,Empty:r1,Loading:s1});function o1(r,s){let i=r.nextElementSibling;for(;i;){if(i.matches(s))return i;i=i.nextElementSibling}}function i1(r,s){let i=r.previousElementSibling;for(;i;){if(i.matches(s))return i;i=i.previousElementSibling}}function am(r){let s=g.useRef(r);return kr(()=>{s.current=r}),s}var kr=typeof window>"u"?g.useEffect:g.useLayoutEffect;function rs(r){let s=g.useRef();return s.current===void 0&&(s.current=r()),s}function Yn(r){let s=dc(),i=()=>r(s.snapshot());return g.useSyncExternalStore(s.subscribe,i,i)}function um(r,s,i,a=[]){let u=g.useRef(),f=Ao();return kr(()=>{var m;let h=(()=>{var k;for(let w of i){if(typeof w=="string")return w.trim();if(typeof w=="object"&&"current"in w)return w.current?(k=w.current.textContent)==null?void 0:k.trim():u.current}})(),y=a.map(k=>k.trim());f.value(r,h,y),(m=s.current)==null||m.setAttribute(ns,h),u.current=h}),u}var l1=()=>{let[r,s]=g.useState(),i=rs(()=>new Map);return kr(()=>{i.current.forEach(a=>a()),i.current=new Map},[r]),(a,u)=>{i.current.set(a,u),s({})}};function a1(r){let s=r.type;return typeof s=="function"?s(r.props):"render"in s?s.render(r.props):r}function hl({asChild:r,children:s},i){return r&&g.isValidElement(s)?g.cloneElement(a1(s),{ref:s.ref},i(s.props.children)):i(s)}var u1={position:"absolute",width:"1px",height:"1px",padding:"0",margin:"-1px",overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",borderWidth:"0"};function c1({onNavigate:r}){const[s,i]=g.useState(!1);return g.useEffect(()=>{const a=u=>{(u.metaKey||u.ctrlKey)&&u.key.toLowerCase()==="k"&&(u.preventDefault(),i(f=>!f))};return document.addEventListener("keydown",a),()=>document.removeEventListener("keydown",a)},[]),d.jsx(es.Dialog,{open:s,onOpenChange:i,label:"Befehlspalette",className:"fixed inset-0 z-50 flex items-start justify-center bg-black/50 p-4 pt-[12vh] overscroll-contain",onClick:()=>i(!1),children:d.jsxs("div",{className:"w-full max-w-lg overflow-hidden rounded-xl border border-border bg-popover text-popover-foreground shadow-2xl",onClick:a=>a.stopPropagation(),children:[d.jsx(es.Input,{autoFocus:!0,placeholder:"Springe zu… (Modelle, Routing, System …)",className:"w-full border-b border-border bg-transparent px-4 py-3 text-sm outline-none placeholder:text-muted-foreground"}),d.jsxs(es.List,{className:"max-h-80 overflow-y-auto p-2",children:[d.jsx(es.Empty,{className:"px-3 py-6 text-center text-sm text-muted-foreground",children:"Nichts gefunden."}),d.jsx(es.Group,{heading:"Bereiche",className:"px-1 py-1 text-xs text-muted-foreground",children:os.map(a=>d.jsxs(es.Item,{value:`${a.label} ${a.hint}`,onSelect:()=>{r(a.id),i(!1)},className:"flex cursor-pointer items-center gap-3 rounded-md px-3 py-2 text-sm text-foreground aria-selected:bg-accent aria-selected:text-accent-foreground",children:[d.jsx(a.icon,{className:"h-4 w-4 text-primary"}),d.jsx("span",{children:a.label}),d.jsx("span",{className:"ml-auto truncate text-xs text-muted-foreground",children:a.hint})]},a.id))})]})]})})}const cm="mc_expert_mode",Vu="mc-expert-mode-change",d1=()=>{try{return localStorage.getItem(cm)==="true"}catch{return!1}};function f1(r){return window.addEventListener(Vu,r),window.addEventListener("storage",r),()=>{window.removeEventListener(Vu,r),window.removeEventListener("storage",r)}}function qh(r){localStorage.setItem(cm,String(r)),window.dispatchEvent(new Event(Vu))}function h1(){return g.useSyncExternalStore(f1,d1,()=>!1)}function dm(r){var s,i,a="";if(typeof r=="string"||typeof r=="number")a+=r;else if(typeof r=="object")if(Array.isArray(r)){var u=r.length;for(s=0;s{const s=v1(r),{conflictingClassGroups:i,conflictingClassGroupModifiers:a}=r;return{getClassGroupId:m=>{const h=m.split(fc);return h[0]===""&&h.length!==1&&h.shift(),fm(h,s)||g1(m)},getConflictingClassGroupIds:(m,h)=>{const y=i[m]||[];return h&&a[m]?[...y,...a[m]]:y}}},fm=(r,s)=>{var m;if(r.length===0)return s.classGroupId;const i=r[0],a=s.nextPart.get(i),u=a?fm(r.slice(1),a):void 0;if(u)return u;if(s.validators.length===0)return;const f=r.join(fc);return(m=s.validators.find(({validator:h})=>h(f)))==null?void 0:m.classGroupId},Gh=/^\[(.+)\]$/,g1=r=>{if(Gh.test(r)){const s=Gh.exec(r)[1],i=s==null?void 0:s.substring(0,s.indexOf(":"));if(i)return"arbitrary.."+i}},v1=r=>{const{theme:s,prefix:i}=r,a={nextPart:new Map,validators:[]};return x1(Object.entries(r.classGroups),i).forEach(([f,m])=>{Hu(m,a,f,s)}),a},Hu=(r,s,i,a)=>{r.forEach(u=>{if(typeof u=="string"){const f=u===""?s:Zh(s,u);f.classGroupId=i;return}if(typeof u=="function"){if(y1(u)){Hu(u(a),s,i,a);return}s.validators.push({validator:u,classGroupId:i});return}Object.entries(u).forEach(([f,m])=>{Hu(m,Zh(s,f),i,a)})})},Zh=(r,s)=>{let i=r;return s.split(fc).forEach(a=>{i.nextPart.has(a)||i.nextPart.set(a,{nextPart:new Map,validators:[]}),i=i.nextPart.get(a)}),i},y1=r=>r.isThemeGetter,x1=(r,s)=>s?r.map(([i,a])=>{const u=a.map(f=>typeof f=="string"?s+f:typeof f=="object"?Object.fromEntries(Object.entries(f).map(([m,h])=>[s+m,h])):f);return[i,u]}):r,w1=r=>{if(r<1)return{get:()=>{},set:()=>{}};let s=0,i=new Map,a=new Map;const u=(f,m)=>{i.set(f,m),s++,s>r&&(s=0,a=i,i=new Map)};return{get(f){let m=i.get(f);if(m!==void 0)return m;if((m=a.get(f))!==void 0)return u(f,m),m},set(f,m){i.has(f)?i.set(f,m):u(f,m)}}},hm="!",k1=r=>{const{separator:s,experimentalParseClassName:i}=r,a=s.length===1,u=s[0],f=s.length,m=h=>{const y=[];let k=0,w=0,x;for(let P=0;Pw?x-w:void 0;return{modifiers:y,hasImportantModifier:_,baseClassName:D,maybePostfixModifierPosition:S}};return i?h=>i({className:h,parseClassName:m}):m},b1=r=>{if(r.length<=1)return r;const s=[];let i=[];return r.forEach(a=>{a[0]==="["?(s.push(...i.sort(),a),i=[]):i.push(a)}),s.push(...i.sort()),s},S1=r=>({cache:w1(r.cacheSize),parseClassName:k1(r),...m1(r)}),E1=/\s+/,N1=(r,s)=>{const{parseClassName:i,getClassGroupId:a,getConflictingClassGroupIds:u}=s,f=[],m=r.trim().split(E1);let h="";for(let y=m.length-1;y>=0;y-=1){const k=m[y],{modifiers:w,hasImportantModifier:x,baseClassName:R,maybePostfixModifierPosition:_}=i(k);let D=!!_,S=a(D?R.substring(0,_):R);if(!S){if(!D){h=k+(h.length>0?" "+h:h);continue}if(S=a(R),!S){h=k+(h.length>0?" "+h:h);continue}D=!1}const P=b1(w).join(":"),A=x?P+hm:P,F=A+S;if(f.includes(F))continue;f.push(F);const V=u(S,D);for(let I=0;I0?" "+h:h)}return h};function j1(){let r=0,s,i,a="";for(;r{if(typeof r=="string")return r;let s,i="";for(let a=0;ax(w),r());return i=S1(k),a=i.cache.get,u=i.cache.set,f=h,h(y)}function h(y){const k=a(y);if(k)return k;const w=N1(y,i);return u(y,w),w}return function(){return f(j1.apply(null,arguments))}}const Ue=r=>{const s=i=>i[r]||[];return s.isThemeGetter=!0,s},mm=/^\[(?:([a-z-]+):)?(.+)\]$/i,_1=/^\d+\/\d+$/,P1=new Set(["px","full","screen"]),R1=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,M1=/\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/,O1=/^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\(.+\)$/,T1=/^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,L1=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/,hn=r=>ls(r)||P1.has(r)||_1.test(r),In=r=>Es(r,"length",B1),ls=r=>!!r&&!Number.isNaN(Number(r)),ku=r=>Es(r,"number",ls),mo=r=>!!r&&Number.isInteger(Number(r)),D1=r=>r.endsWith("%")&&ls(r.slice(0,-1)),be=r=>mm.test(r),zn=r=>R1.test(r),A1=new Set(["length","size","percentage"]),I1=r=>Es(r,A1,gm),z1=r=>Es(r,"position",gm),F1=new Set(["image","url"]),U1=r=>Es(r,F1,H1),$1=r=>Es(r,"",V1),go=()=>!0,Es=(r,s,i)=>{const a=mm.exec(r);return a?a[1]?typeof s=="string"?a[1]===s:s.has(a[1]):i(a[2]):!1},B1=r=>M1.test(r)&&!O1.test(r),gm=()=>!1,V1=r=>T1.test(r),H1=r=>L1.test(r),W1=()=>{const r=Ue("colors"),s=Ue("spacing"),i=Ue("blur"),a=Ue("brightness"),u=Ue("borderColor"),f=Ue("borderRadius"),m=Ue("borderSpacing"),h=Ue("borderWidth"),y=Ue("contrast"),k=Ue("grayscale"),w=Ue("hueRotate"),x=Ue("invert"),R=Ue("gap"),_=Ue("gradientColorStops"),D=Ue("gradientColorStopPositions"),S=Ue("inset"),P=Ue("margin"),A=Ue("opacity"),F=Ue("padding"),V=Ue("saturate"),I=Ue("scale"),K=Ue("sepia"),G=Ue("skew"),ue=Ue("space"),ie=Ue("translate"),ee=()=>["auto","contain","none"],me=()=>["auto","hidden","clip","visible","scroll"],ke=()=>["auto",be,s],le=()=>[be,s],Le=()=>["",hn,In],Z=()=>["auto",ls,be],ce=()=>["bottom","center","left","left-bottom","left-top","right","right-bottom","right-top","top"],Ce=()=>["solid","dashed","dotted","double","none"],Ne=()=>["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity"],z=()=>["start","end","center","between","around","evenly","stretch"],ne=()=>["","0",be],Q=()=>["auto","avoid","all","avoid-page","page","left","right","column"],C=()=>[ls,be];return{cacheSize:500,separator:":",theme:{colors:[go],spacing:[hn,In],blur:["none","",zn,be],brightness:C(),borderColor:[r],borderRadius:["none","","full",zn,be],borderSpacing:le(),borderWidth:Le(),contrast:C(),grayscale:ne(),hueRotate:C(),invert:ne(),gap:le(),gradientColorStops:[r],gradientColorStopPositions:[D1,In],inset:ke(),margin:ke(),opacity:C(),padding:le(),saturate:C(),scale:C(),sepia:ne(),skew:C(),space:le(),translate:le()},classGroups:{aspect:[{aspect:["auto","square","video",be]}],container:["container"],columns:[{columns:[zn]}],"break-after":[{"break-after":Q()}],"break-before":[{"break-before":Q()}],"break-inside":[{"break-inside":["auto","avoid","avoid-page","avoid-column"]}],"box-decoration":[{"box-decoration":["slice","clone"]}],box:[{box:["border","content"]}],display:["block","inline-block","inline","flex","inline-flex","table","inline-table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row-group","table-row","flow-root","grid","inline-grid","contents","list-item","hidden"],float:[{float:["right","left","none","start","end"]}],clear:[{clear:["left","right","both","none","start","end"]}],isolation:["isolate","isolation-auto"],"object-fit":[{object:["contain","cover","fill","none","scale-down"]}],"object-position":[{object:[...ce(),be]}],overflow:[{overflow:me()}],"overflow-x":[{"overflow-x":me()}],"overflow-y":[{"overflow-y":me()}],overscroll:[{overscroll:ee()}],"overscroll-x":[{"overscroll-x":ee()}],"overscroll-y":[{"overscroll-y":ee()}],position:["static","fixed","absolute","relative","sticky"],inset:[{inset:[S]}],"inset-x":[{"inset-x":[S]}],"inset-y":[{"inset-y":[S]}],start:[{start:[S]}],end:[{end:[S]}],top:[{top:[S]}],right:[{right:[S]}],bottom:[{bottom:[S]}],left:[{left:[S]}],visibility:["visible","invisible","collapse"],z:[{z:["auto",mo,be]}],basis:[{basis:ke()}],"flex-direction":[{flex:["row","row-reverse","col","col-reverse"]}],"flex-wrap":[{flex:["wrap","wrap-reverse","nowrap"]}],flex:[{flex:["1","auto","initial","none",be]}],grow:[{grow:ne()}],shrink:[{shrink:ne()}],order:[{order:["first","last","none",mo,be]}],"grid-cols":[{"grid-cols":[go]}],"col-start-end":[{col:["auto",{span:["full",mo,be]},be]}],"col-start":[{"col-start":Z()}],"col-end":[{"col-end":Z()}],"grid-rows":[{"grid-rows":[go]}],"row-start-end":[{row:["auto",{span:[mo,be]},be]}],"row-start":[{"row-start":Z()}],"row-end":[{"row-end":Z()}],"grid-flow":[{"grid-flow":["row","col","dense","row-dense","col-dense"]}],"auto-cols":[{"auto-cols":["auto","min","max","fr",be]}],"auto-rows":[{"auto-rows":["auto","min","max","fr",be]}],gap:[{gap:[R]}],"gap-x":[{"gap-x":[R]}],"gap-y":[{"gap-y":[R]}],"justify-content":[{justify:["normal",...z()]}],"justify-items":[{"justify-items":["start","end","center","stretch"]}],"justify-self":[{"justify-self":["auto","start","end","center","stretch"]}],"align-content":[{content:["normal",...z(),"baseline"]}],"align-items":[{items:["start","end","center","baseline","stretch"]}],"align-self":[{self:["auto","start","end","center","stretch","baseline"]}],"place-content":[{"place-content":[...z(),"baseline"]}],"place-items":[{"place-items":["start","end","center","baseline","stretch"]}],"place-self":[{"place-self":["auto","start","end","center","stretch"]}],p:[{p:[F]}],px:[{px:[F]}],py:[{py:[F]}],ps:[{ps:[F]}],pe:[{pe:[F]}],pt:[{pt:[F]}],pr:[{pr:[F]}],pb:[{pb:[F]}],pl:[{pl:[F]}],m:[{m:[P]}],mx:[{mx:[P]}],my:[{my:[P]}],ms:[{ms:[P]}],me:[{me:[P]}],mt:[{mt:[P]}],mr:[{mr:[P]}],mb:[{mb:[P]}],ml:[{ml:[P]}],"space-x":[{"space-x":[ue]}],"space-x-reverse":["space-x-reverse"],"space-y":[{"space-y":[ue]}],"space-y-reverse":["space-y-reverse"],w:[{w:["auto","min","max","fit","svw","lvw","dvw",be,s]}],"min-w":[{"min-w":[be,s,"min","max","fit"]}],"max-w":[{"max-w":[be,s,"none","full","min","max","fit","prose",{screen:[zn]},zn]}],h:[{h:[be,s,"auto","min","max","fit","svh","lvh","dvh"]}],"min-h":[{"min-h":[be,s,"min","max","fit","svh","lvh","dvh"]}],"max-h":[{"max-h":[be,s,"min","max","fit","svh","lvh","dvh"]}],size:[{size:[be,s,"auto","min","max","fit"]}],"font-size":[{text:["base",zn,In]}],"font-smoothing":["antialiased","subpixel-antialiased"],"font-style":["italic","not-italic"],"font-weight":[{font:["thin","extralight","light","normal","medium","semibold","bold","extrabold","black",ku]}],"font-family":[{font:[go]}],"fvn-normal":["normal-nums"],"fvn-ordinal":["ordinal"],"fvn-slashed-zero":["slashed-zero"],"fvn-figure":["lining-nums","oldstyle-nums"],"fvn-spacing":["proportional-nums","tabular-nums"],"fvn-fraction":["diagonal-fractions","stacked-fractions"],tracking:[{tracking:["tighter","tight","normal","wide","wider","widest",be]}],"line-clamp":[{"line-clamp":["none",ls,ku]}],leading:[{leading:["none","tight","snug","normal","relaxed","loose",hn,be]}],"list-image":[{"list-image":["none",be]}],"list-style-type":[{list:["none","disc","decimal",be]}],"list-style-position":[{list:["inside","outside"]}],"placeholder-color":[{placeholder:[r]}],"placeholder-opacity":[{"placeholder-opacity":[A]}],"text-alignment":[{text:["left","center","right","justify","start","end"]}],"text-color":[{text:[r]}],"text-opacity":[{"text-opacity":[A]}],"text-decoration":["underline","overline","line-through","no-underline"],"text-decoration-style":[{decoration:[...Ce(),"wavy"]}],"text-decoration-thickness":[{decoration:["auto","from-font",hn,In]}],"underline-offset":[{"underline-offset":["auto",hn,be]}],"text-decoration-color":[{decoration:[r]}],"text-transform":["uppercase","lowercase","capitalize","normal-case"],"text-overflow":["truncate","text-ellipsis","text-clip"],"text-wrap":[{text:["wrap","nowrap","balance","pretty"]}],indent:[{indent:le()}],"vertical-align":[{align:["baseline","top","middle","bottom","text-top","text-bottom","sub","super",be]}],whitespace:[{whitespace:["normal","nowrap","pre","pre-line","pre-wrap","break-spaces"]}],break:[{break:["normal","words","all","keep"]}],hyphens:[{hyphens:["none","manual","auto"]}],content:[{content:["none",be]}],"bg-attachment":[{bg:["fixed","local","scroll"]}],"bg-clip":[{"bg-clip":["border","padding","content","text"]}],"bg-opacity":[{"bg-opacity":[A]}],"bg-origin":[{"bg-origin":["border","padding","content"]}],"bg-position":[{bg:[...ce(),z1]}],"bg-repeat":[{bg:["no-repeat",{repeat:["","x","y","round","space"]}]}],"bg-size":[{bg:["auto","cover","contain",I1]}],"bg-image":[{bg:["none",{"gradient-to":["t","tr","r","br","b","bl","l","tl"]},U1]}],"bg-color":[{bg:[r]}],"gradient-from-pos":[{from:[D]}],"gradient-via-pos":[{via:[D]}],"gradient-to-pos":[{to:[D]}],"gradient-from":[{from:[_]}],"gradient-via":[{via:[_]}],"gradient-to":[{to:[_]}],rounded:[{rounded:[f]}],"rounded-s":[{"rounded-s":[f]}],"rounded-e":[{"rounded-e":[f]}],"rounded-t":[{"rounded-t":[f]}],"rounded-r":[{"rounded-r":[f]}],"rounded-b":[{"rounded-b":[f]}],"rounded-l":[{"rounded-l":[f]}],"rounded-ss":[{"rounded-ss":[f]}],"rounded-se":[{"rounded-se":[f]}],"rounded-ee":[{"rounded-ee":[f]}],"rounded-es":[{"rounded-es":[f]}],"rounded-tl":[{"rounded-tl":[f]}],"rounded-tr":[{"rounded-tr":[f]}],"rounded-br":[{"rounded-br":[f]}],"rounded-bl":[{"rounded-bl":[f]}],"border-w":[{border:[h]}],"border-w-x":[{"border-x":[h]}],"border-w-y":[{"border-y":[h]}],"border-w-s":[{"border-s":[h]}],"border-w-e":[{"border-e":[h]}],"border-w-t":[{"border-t":[h]}],"border-w-r":[{"border-r":[h]}],"border-w-b":[{"border-b":[h]}],"border-w-l":[{"border-l":[h]}],"border-opacity":[{"border-opacity":[A]}],"border-style":[{border:[...Ce(),"hidden"]}],"divide-x":[{"divide-x":[h]}],"divide-x-reverse":["divide-x-reverse"],"divide-y":[{"divide-y":[h]}],"divide-y-reverse":["divide-y-reverse"],"divide-opacity":[{"divide-opacity":[A]}],"divide-style":[{divide:Ce()}],"border-color":[{border:[u]}],"border-color-x":[{"border-x":[u]}],"border-color-y":[{"border-y":[u]}],"border-color-s":[{"border-s":[u]}],"border-color-e":[{"border-e":[u]}],"border-color-t":[{"border-t":[u]}],"border-color-r":[{"border-r":[u]}],"border-color-b":[{"border-b":[u]}],"border-color-l":[{"border-l":[u]}],"divide-color":[{divide:[u]}],"outline-style":[{outline:["",...Ce()]}],"outline-offset":[{"outline-offset":[hn,be]}],"outline-w":[{outline:[hn,In]}],"outline-color":[{outline:[r]}],"ring-w":[{ring:Le()}],"ring-w-inset":["ring-inset"],"ring-color":[{ring:[r]}],"ring-opacity":[{"ring-opacity":[A]}],"ring-offset-w":[{"ring-offset":[hn,In]}],"ring-offset-color":[{"ring-offset":[r]}],shadow:[{shadow:["","inner","none",zn,$1]}],"shadow-color":[{shadow:[go]}],opacity:[{opacity:[A]}],"mix-blend":[{"mix-blend":[...Ne(),"plus-lighter","plus-darker"]}],"bg-blend":[{"bg-blend":Ne()}],filter:[{filter:["","none"]}],blur:[{blur:[i]}],brightness:[{brightness:[a]}],contrast:[{contrast:[y]}],"drop-shadow":[{"drop-shadow":["","none",zn,be]}],grayscale:[{grayscale:[k]}],"hue-rotate":[{"hue-rotate":[w]}],invert:[{invert:[x]}],saturate:[{saturate:[V]}],sepia:[{sepia:[K]}],"backdrop-filter":[{"backdrop-filter":["","none"]}],"backdrop-blur":[{"backdrop-blur":[i]}],"backdrop-brightness":[{"backdrop-brightness":[a]}],"backdrop-contrast":[{"backdrop-contrast":[y]}],"backdrop-grayscale":[{"backdrop-grayscale":[k]}],"backdrop-hue-rotate":[{"backdrop-hue-rotate":[w]}],"backdrop-invert":[{"backdrop-invert":[x]}],"backdrop-opacity":[{"backdrop-opacity":[A]}],"backdrop-saturate":[{"backdrop-saturate":[V]}],"backdrop-sepia":[{"backdrop-sepia":[K]}],"border-collapse":[{border:["collapse","separate"]}],"border-spacing":[{"border-spacing":[m]}],"border-spacing-x":[{"border-spacing-x":[m]}],"border-spacing-y":[{"border-spacing-y":[m]}],"table-layout":[{table:["auto","fixed"]}],caption:[{caption:["top","bottom"]}],transition:[{transition:["none","all","","colors","opacity","shadow","transform",be]}],duration:[{duration:C()}],ease:[{ease:["linear","in","out","in-out",be]}],delay:[{delay:C()}],animate:[{animate:["none","spin","ping","pulse","bounce",be]}],transform:[{transform:["","gpu","none"]}],scale:[{scale:[I]}],"scale-x":[{"scale-x":[I]}],"scale-y":[{"scale-y":[I]}],rotate:[{rotate:[mo,be]}],"translate-x":[{"translate-x":[ie]}],"translate-y":[{"translate-y":[ie]}],"skew-x":[{"skew-x":[G]}],"skew-y":[{"skew-y":[G]}],"transform-origin":[{origin:["center","top","top-right","right","bottom-right","bottom","bottom-left","left","top-left",be]}],accent:[{accent:["auto",r]}],appearance:[{appearance:["none","auto"]}],cursor:[{cursor:["auto","default","pointer","wait","text","move","help","not-allowed","none","context-menu","progress","cell","crosshair","vertical-text","alias","copy","no-drop","grab","grabbing","all-scroll","col-resize","row-resize","n-resize","e-resize","s-resize","w-resize","ne-resize","nw-resize","se-resize","sw-resize","ew-resize","ns-resize","nesw-resize","nwse-resize","zoom-in","zoom-out",be]}],"caret-color":[{caret:[r]}],"pointer-events":[{"pointer-events":["none","auto"]}],resize:[{resize:["none","y","x",""]}],"scroll-behavior":[{scroll:["auto","smooth"]}],"scroll-m":[{"scroll-m":le()}],"scroll-mx":[{"scroll-mx":le()}],"scroll-my":[{"scroll-my":le()}],"scroll-ms":[{"scroll-ms":le()}],"scroll-me":[{"scroll-me":le()}],"scroll-mt":[{"scroll-mt":le()}],"scroll-mr":[{"scroll-mr":le()}],"scroll-mb":[{"scroll-mb":le()}],"scroll-ml":[{"scroll-ml":le()}],"scroll-p":[{"scroll-p":le()}],"scroll-px":[{"scroll-px":le()}],"scroll-py":[{"scroll-py":le()}],"scroll-ps":[{"scroll-ps":le()}],"scroll-pe":[{"scroll-pe":le()}],"scroll-pt":[{"scroll-pt":le()}],"scroll-pr":[{"scroll-pr":le()}],"scroll-pb":[{"scroll-pb":le()}],"scroll-pl":[{"scroll-pl":le()}],"snap-align":[{snap:["start","end","center","align-none"]}],"snap-stop":[{snap:["normal","always"]}],"snap-type":[{snap:["none","x","y","both"]}],"snap-strictness":[{snap:["mandatory","proximity"]}],touch:[{touch:["auto","none","manipulation"]}],"touch-x":[{"touch-pan":["x","left","right"]}],"touch-y":[{"touch-pan":["y","up","down"]}],"touch-pz":["touch-pinch-zoom"],select:[{select:["none","text","all","auto"]}],"will-change":[{"will-change":["auto","scroll","contents","transform",be]}],fill:[{fill:[r,"none"]}],"stroke-w":[{stroke:[hn,In,ku]}],stroke:[{stroke:[r,"none"]}],sr:["sr-only","not-sr-only"],"forced-color-adjust":[{"forced-color-adjust":["auto","none"]}]},conflictingClassGroups:{overflow:["overflow-x","overflow-y"],overscroll:["overscroll-x","overscroll-y"],inset:["inset-x","inset-y","start","end","top","right","bottom","left"],"inset-x":["right","left"],"inset-y":["top","bottom"],flex:["basis","grow","shrink"],gap:["gap-x","gap-y"],p:["px","py","ps","pe","pt","pr","pb","pl"],px:["pr","pl"],py:["pt","pb"],m:["mx","my","ms","me","mt","mr","mb","ml"],mx:["mr","ml"],my:["mt","mb"],size:["w","h"],"font-size":["leading"],"fvn-normal":["fvn-ordinal","fvn-slashed-zero","fvn-figure","fvn-spacing","fvn-fraction"],"fvn-ordinal":["fvn-normal"],"fvn-slashed-zero":["fvn-normal"],"fvn-figure":["fvn-normal"],"fvn-spacing":["fvn-normal"],"fvn-fraction":["fvn-normal"],"line-clamp":["display","overflow"],rounded:["rounded-s","rounded-e","rounded-t","rounded-r","rounded-b","rounded-l","rounded-ss","rounded-se","rounded-ee","rounded-es","rounded-tl","rounded-tr","rounded-br","rounded-bl"],"rounded-s":["rounded-ss","rounded-es"],"rounded-e":["rounded-se","rounded-ee"],"rounded-t":["rounded-tl","rounded-tr"],"rounded-r":["rounded-tr","rounded-br"],"rounded-b":["rounded-br","rounded-bl"],"rounded-l":["rounded-tl","rounded-bl"],"border-spacing":["border-spacing-x","border-spacing-y"],"border-w":["border-w-s","border-w-e","border-w-t","border-w-r","border-w-b","border-w-l"],"border-w-x":["border-w-r","border-w-l"],"border-w-y":["border-w-t","border-w-b"],"border-color":["border-color-s","border-color-e","border-color-t","border-color-r","border-color-b","border-color-l"],"border-color-x":["border-color-r","border-color-l"],"border-color-y":["border-color-t","border-color-b"],"scroll-m":["scroll-mx","scroll-my","scroll-ms","scroll-me","scroll-mt","scroll-mr","scroll-mb","scroll-ml"],"scroll-mx":["scroll-mr","scroll-ml"],"scroll-my":["scroll-mt","scroll-mb"],"scroll-p":["scroll-px","scroll-py","scroll-ps","scroll-pe","scroll-pt","scroll-pr","scroll-pb","scroll-pl"],"scroll-px":["scroll-pr","scroll-pl"],"scroll-py":["scroll-pt","scroll-pb"],touch:["touch-x","touch-y","touch-pz"],"touch-x":["touch"],"touch-y":["touch"],"touch-pz":["touch"]},conflictingClassGroupModifiers:{"font-size":["leading"]}}},Q1=C1(W1);function Ee(...r){return Q1(p1(r))}function Yw(r){return r?r.replace(/127\.0\.0\.1|localhost/g,"192.168.178.151"):""}function K1(){const r=h1();return d.jsxs("div",{className:"flex items-center rounded-md border border-border/40 bg-background/40 p-0.5",role:"group","aria-label":"Ansichtsmodus",title:"Einfach zeigt nur das Wichtigste. Experte zeigt alle technischen Details.",children:[d.jsxs("button",{onClick:()=>qh(!1),"aria-pressed":!r,className:Ee("flex items-center gap-1 rounded px-2 py-1 text-xs font-semibold transition-all cursor-pointer",r?"text-muted-foreground hover:text-foreground":"bg-primary/15 text-primary shadow-sm"),children:[d.jsx(Jy,{className:"h-3.5 w-3.5"})," Einfach"]}),d.jsxs("button",{onClick:()=>qh(!0),"aria-pressed":r,className:Ee("flex items-center gap-1 rounded px-2 py-1 text-xs font-semibold transition-all cursor-pointer",r?"bg-primary/15 text-primary shadow-sm":"text-muted-foreground hover:text-foreground"),children:[d.jsx(Xy,{className:"h-3.5 w-3.5"})," Experte"]})]})}async function Se(r,s){var y;const i={"Content-Type":"application/json",...s==null?void 0:s.headers},a=((y=s==null?void 0:s.method)==null?void 0:y.toUpperCase())||"GET",u=a==="GET"?null:localStorage.getItem("mc_sudo_password"),f=a==="GET"?null:localStorage.getItem("mc_hf_token");u&&(i["X-Sudo-Password"]=u);let m=s==null?void 0:s.body;if(a==="POST"){if(typeof m=="string")try{const k=JSON.parse(m);let w=!1;u&&!("sudo_password"in k)&&(k.sudo_password=u,w=!0),f&&!("hf_token"in k)&&(k.hf_token=f,w=!0),w&&(m=JSON.stringify(k))}catch{}else if(!m){const k={};u&&(k.sudo_password=u),f&&(k.hf_token=f),Object.keys(k).length>0&&(m=JSON.stringify(k))}}const h=await fetch(r,{...s,headers:i,body:m});if(!h.ok)throw new Error(`${h.status} ${h.statusText}`);return h.json()}const Xw=(r,s,i=!1,a=!0)=>Se("/api/groups",{method:"PUT",body:JSON.stringify({group:r,members:s,swap:i,persist:a})}),Jw=r=>Se("/api/routing/policy",{method:"PUT",body:JSON.stringify(r)});function q1({type:r,title:s,message:i,defaultValue:a,autoValue:u,autoLabel:f,onConfirm:m,onCancel:h}){const y=g.useRef(null);return d.jsx("div",{className:"fixed inset-0 z-[99] bg-black/60 backdrop-blur-sm flex items-center justify-center p-4 overscroll-contain",role:"dialog","aria-modal":"true","aria-label":s,children:d.jsxs("div",{className:"w-full max-w-sm rounded-2xl border border-border/80 bg-card p-6 shadow-2xl space-y-4 animate-in fade-in zoom-in-95 duration-200",children:[d.jsxs("div",{className:"flex items-center justify-between border-b border-border/20 pb-2",children:[d.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-primary",children:s}),d.jsx("button",{onClick:h||(()=>m()),"aria-label":"Schließen",className:"p-1 rounded hover:bg-accent text-muted-foreground hover:text-foreground cursor-pointer",children:d.jsx(ul,{className:"h-4 w-4","aria-hidden":"true"})})]}),d.jsx("p",{className:"max-h-72 overflow-y-auto whitespace-pre-line text-xs text-muted-foreground leading-relaxed scrollbar-thin",children:i}),r==="prompt"&&d.jsxs("div",{className:"flex gap-2",children:[d.jsx("input",{ref:y,type:"text",defaultValue:a,"aria-label":s,className:"flex-1 h-9 px-3 text-xs bg-background/40 border border-border/60 rounded-lg outline-none focus:border-primary transition-colors text-foreground",autoFocus:!0,onKeyDown:k=>{var w;k.key==="Enter"&&m((w=y.current)==null?void 0:w.value)}}),u!==void 0&&d.jsx("button",{type:"button",onClick:()=>{y.current&&(y.current.value=u)},title:"Setup-bewussten Optimalwert eintragen",className:"h-9 px-3 shrink-0 text-xs font-semibold text-primary border border-primary/50 bg-primary/10 hover:bg-primary/20 rounded-lg transition-colors cursor-pointer",children:f||"Auto"})]}),d.jsxs("div",{className:"flex justify-end gap-3 pt-2",children:[(r==="confirm"||r==="prompt")&&d.jsx("button",{onClick:h,className:"h-8 px-4 flex items-center justify-center text-xs font-semibold text-muted-foreground border border-border/60 bg-background/20 hover:bg-accent rounded-lg transition-colors cursor-pointer",children:"Abbrechen"}),d.jsx("button",{onClick:()=>{var w;const k=r==="prompt"?(w=y.current)==null?void 0:w.value:void 0;m(k)},className:"h-8 px-4 flex items-center justify-center text-xs font-semibold text-primary-foreground bg-primary hover:bg-primary/95 rounded-lg transition-colors cursor-pointer",children:r==="confirm"?"Ja, fortfahren":r==="prompt"?"Übernehmen":"OK"})]})]})})}function vm(){const[r,s]=g.useState(null),i=g.useCallback(()=>s(null),[]),a=g.useCallback((h,y,k)=>{s({type:"alert",title:h,message:y,onConfirm:()=>{s(null),k==null||k()}})},[]),u=g.useCallback((h,y,k,w)=>{s({type:"confirm",title:h,message:y,onConfirm:()=>{s(null),k()},onCancel:()=>{s(null),w==null||w()}})},[]),f=g.useCallback((h,y,k,w,x,R)=>{s({type:"prompt",title:h,message:y,defaultValue:k,autoValue:R==null?void 0:R.autoValue,autoLabel:R==null?void 0:R.autoLabel,onConfirm:_=>{s(null),w(_)},onCancel:()=>{s(null),x==null||x()}})},[]),m=r?d.jsx(q1,{...r}):null;return{showAlert:a,showConfirm:u,showPrompt:f,close:i,dialogElement:m}}let rl=!1;const G1=()=>rl;function Z1(){const r=ll();g.useEffect(()=>{const s=new EventSource("/api/events");return s.onopen=()=>{rl=!0},s.onerror=()=>{rl=!1},s.addEventListener("invalidate",i=>{var a;try{const u=((a=JSON.parse(i.data))==null?void 0:a.keys)??[];for(const f of u)r.invalidateQueries({queryKey:[f]})}catch{}}),()=>{rl=!1,s.close()}},[r])}const Pe={health:["health"],systemStatus:["system-status"],services:["services"],models:["models"],groups:["groups"],routing:["routing"],routingPolicy:["routing-policy"],jobs:["jobs"],tokenStats:["token-stats"],agentStatus:["agent-status"],hermesBrain:["hermes-brain"],updates:["updates"],discover:["discover"],drafts:r=>["drafts",r??""],connect:r=>["connect",r??""],connectHealth:["connect-health"],memoryGraph:["memory-graph"],voiceTrace:["voice-trace"],auftragsbuch:["auftragsbuch"],ideen:["ideen"],chronik:["chronik"],wissen:["wissen"],zeitmaschine:["zeitmaschine"],reminders:["reminders"]},St={graph:3e3,schnell:8e3,normal:1e4,gemuetlich:3e4,traege:6e4},pl=r=>()=>G1()?r*5:r,Y1=(r=St.schnell)=>Be({queryKey:Pe.auftragsbuch,queryFn:()=>Se("/api/auftragsbuch"),refetchInterval:pl(r)}),X1=(r=St.gemuetlich)=>Be({queryKey:Pe.ideen,queryFn:()=>Se("/api/ideen"),refetchInterval:pl(r)}),ek=(r,s=!1)=>Be({queryKey:["ideen-log",r],queryFn:()=>Se(`/api/ideen/${r}/log`),enabled:s,refetchInterval:4e3,staleTime:0}),tk=(r=150,s=St.gemuetlich)=>Be({queryKey:[...Pe.chronik,r],queryFn:()=>Se(`/api/chronik?limit=${r}`),refetchInterval:pl(s),select:i=>i.items??[]}),nk=()=>Be({queryKey:Pe.wissen,queryFn:()=>Se("/api/wissen")}),J1=(r=St.traege,s=!0)=>Be({queryKey:Pe.zeitmaschine,queryFn:()=>Se("/api/zeitmaschine"),refetchInterval:r,enabled:s}),ew=(r=12,s=St.schnell)=>Be({queryKey:Pe.voiceTrace,queryFn:()=>Se(`/api/voice/trace?limit=${r}`),refetchInterval:s,select:i=>i.turns??[]}),rk=(r=!0)=>Be({queryKey:Pe.memoryGraph,queryFn:()=>Se("/api/wissen/graph"),enabled:r,staleTime:60*1e3}),ym=()=>Be({queryKey:Pe.health,queryFn:()=>Se("/api/health"),refetchInterval:St.normal}),ml=(r=St.graph)=>Be({queryKey:Pe.systemStatus,queryFn:()=>Se("/api/system/status"),refetchInterval:r}),xm=(r,s=!0)=>Be({queryKey:["metrics-history",r],queryFn:()=>Se(`/api/system/history?minutes=${r}`),enabled:s,refetchInterval:6e4}),hc=(r=St.normal)=>Be({queryKey:Pe.services,queryFn:()=>Se("/api/system/services"),refetchInterval:r}),wm=(r=St.schnell)=>Be({queryKey:Pe.models,queryFn:()=>Se("/api/models"),refetchInterval:pl(r)}),sk=(r=St.normal)=>Be({queryKey:Pe.groups,queryFn:()=>Se("/api/groups"),refetchInterval:r}),ok=()=>Be({queryKey:Pe.routingPolicy,queryFn:()=>Se("/api/routing/policy")}),tw=(r=3e3,s=!0)=>Be({queryKey:Pe.jobs,queryFn:()=>Se("/api/jobs"),refetchInterval:r,enabled:s,select:i=>i.jobs??[]}),km=(r=St.graph)=>Be({queryKey:Pe.tokenStats,queryFn:()=>Se("/api/system/token-stats"),refetchInterval:r}),nw=(r=St.normal)=>Be({queryKey:Pe.agentStatus,queryFn:()=>Se("/api/agent/status"),refetchInterval:r}),ik=(r=St.traege)=>Be({queryKey:Pe.hermesBrain,queryFn:()=>Se("/api/agent/brain"),refetchInterval:r}),bm=(r=St.traege)=>Be({queryKey:Pe.updates,queryFn:()=>Se("/api/maintenance/updates"),refetchInterval:r}),lk=()=>Be({queryKey:Pe.discover,queryFn:()=>Se("/api/discover")}),ak=r=>Be({queryKey:Pe.drafts(r),queryFn:()=>Se(`/api/models/drafts?target=${encodeURIComponent(r??"")}`),enabled:!!r}),uk=r=>Be({queryKey:Pe.connect(r),queryFn:()=>Se(r?`/api/connect?${r}`:"/api/connect")}),rw=()=>Be({queryKey:Pe.connectHealth,queryFn:()=>Se("/api/connect/health"),refetchInterval:15e3});function vo(r,...s){for(const i of s)r.invalidateQueries({queryKey:i})}function ts(r){return(r/1024**3).toFixed(1)}function bu(r){return r?r>1024**3?`${(r/1024**3).toFixed(1)} GB`:`${(r/1024**2).toFixed(0)} MB`:""}function ck(r){if(!r)return"—";const s=r/1024**3;return s>=1?`${s.toFixed(1)} GB`:`${(r/1024**2).toFixed(0)} MB`}function dk(r){if(!r)return"";const s=Math.floor(r/60);return s>0?`${s} min`:`${r} s`}function fk(r){return r?`${Math.round(r/1024)}k`:"—"}function hk(r){return r?new Date(r*1e3).toLocaleString("de-DE",{day:"2-digit",month:"2-digit",hour:"2-digit",minute:"2-digit"}):"—"}function yo({icon:r,iconClass:s,name:i,status:a,available:u,busy:f,actionLabel:m,onAction:h}){return d.jsxs("div",{className:Ee("flex items-center gap-3 rounded-lg border px-3 py-2",u?"border-amber-500/30 bg-amber-500/5":"border-border/50 bg-background/20"),children:[d.jsx(r,{className:Ee("h-4 w-4 shrink-0",s)}),d.jsxs("div",{className:"flex-1 min-w-0",children:[d.jsx("div",{className:"text-xs text-foreground truncate",children:i}),d.jsx("div",{className:Ee("text-[10px] truncate",u?"text-amber-400/90":"text-muted-foreground"),children:a})]}),d.jsx("button",{onClick:h,disabled:!u||f,className:Ee("text-[11px] font-semibold rounded-lg px-2.5 py-1 transition-colors shrink-0",u?"bg-primary text-primary-foreground hover:opacity-90 cursor-pointer":"border border-border/50 text-muted-foreground/40 cursor-default"),children:f?"…":m})]})}function sw({label:r,ok:s,system:i,busy:a,onRestart:u,onLogs:f}){return d.jsxs("div",{className:"flex items-center gap-2.5 rounded-lg border border-border/50 bg-background/20 px-3 py-2",children:[d.jsx("span",{className:Ee("w-1.5 h-1.5 rounded-full shrink-0",s===!0?"bg-emerald-500":s===!1?"bg-red-500":"bg-muted-foreground/40")}),d.jsxs("span",{className:"flex-1 text-xs text-foreground truncate",children:[r,i&&d.jsx("span",{className:"text-[9px] text-muted-foreground",children:" (root)"})]}),d.jsx("button",{onClick:u,disabled:a,title:"Neu starten",className:"text-muted-foreground hover:text-primary transition-colors disabled:opacity-50",children:d.jsx(ss,{className:Ee("h-3.5 w-3.5",a&&"animate-spin")})}),d.jsx("button",{onClick:f,title:"Logs ansehen",className:"text-muted-foreground hover:text-primary transition-colors",children:d.jsx(Iy,{className:"h-3.5 w-3.5"})})]})}const ow=/\b(error|fehler|fail(ed|ure)?|fatal|critical|crit|panic|traceback|exception|denied|refused|unable|emerg|alert|oom|killed)\b/i,iw=/\b(warn(ing)?|deprecat\w*|retry(ing)?|timeout|timed out|degraded|missing|not found|nicht gefunden)\b/i;function lw(r){return ow.test(r)?"error":iw.test(r)?"warn":"info"}const aw={error:"text-red-400",warn:"text-amber-300",info:"text-cyan-300/80"};function uw({service:r,text:s,loading:i,logStatus:a,onRefresh:u,onOpenSettings:f}){const[m,h]=g.useState(!1),[y,k]=g.useState(""),w=g.useRef(null),x=g.useMemo(()=>s?s.split(` -`).map(P=>({t:P,level:lw(P)})):[],[s]),R=g.useMemo(()=>x.filter(P=>P.level!=="info").length,[x]),_=y.trim().toLowerCase(),D=x.filter(P=>(!m||P.level!=="info")&&(!_||P.t.toLowerCase().includes(_))),S=a==="password_required"||a==="incorrect_password";return d.jsxs("div",{className:"flex-1 flex flex-col min-h-[300px] border border-border/60 bg-black/50 rounded-xl overflow-hidden shadow-inner",children:[d.jsxs("div",{className:"flex h-10 items-center justify-between gap-2 px-3 border-b border-border/40 bg-black/30 shrink-0",children:[d.jsxs("div",{className:"flex items-center gap-1.5 text-[10px] font-mono text-muted-foreground shrink-0",children:[d.jsx(t0,{className:"h-3 w-3 text-primary"}),d.jsx("span",{className:"hidden sm:inline",children:"stdout/stderr —"})," ",r]}),d.jsxs("div",{className:"flex items-center gap-1.5",children:[d.jsxs("div",{className:"relative",children:[d.jsx(Zy,{className:"pointer-events-none absolute left-2 top-1/2 h-3 w-3 -translate-y-1/2 text-muted-foreground"}),d.jsx("input",{value:y,onChange:P=>k(P.target.value),placeholder:"filtern…",className:"h-7 w-24 sm:w-36 rounded-md border border-border/50 bg-background/40 pl-6 pr-2 text-[10px] text-foreground outline-none focus:border-primary/50"})]}),d.jsxs("button",{onClick:()=>h(P=>!P),title:"Nur Fehler und Warnungen zeigen",className:Ee("flex h-7 items-center gap-1 rounded-md border px-2 text-[10px] font-semibold transition-colors",m?"border-amber-500/50 bg-amber-500/15 text-amber-300":"border-border/50 bg-background/20 text-muted-foreground hover:text-foreground"),children:[d.jsx(Co,{className:"h-3 w-3"}),"Nur Probleme",R>0?` (${R})`:""]}),d.jsx("button",{onClick:u,disabled:i,title:"Neu laden",className:"flex h-7 w-7 items-center justify-center rounded-md border border-border/50 bg-background/20 text-muted-foreground hover:text-foreground transition-colors disabled:opacity-50",children:d.jsx(ss,{className:Ee("h-3 w-3",i&&"animate-spin")})})]})]}),d.jsx("div",{ref:w,className:"flex-1 overflow-y-auto p-3 text-[10px] font-mono leading-relaxed scrollbar-thin select-text",children:S?d.jsxs("div",{className:"flex h-full flex-col items-center justify-center space-y-3 p-6 text-center",children:[d.jsx(Co,{className:"h-8 w-8 text-amber-400 animate-pulse animate-duration-1000"}),d.jsx("div",{className:"text-xs font-semibold text-amber-300",children:a==="incorrect_password"?"Falsches Sudo-Passwort hinterlegt.":"Sudo-Passwort für systemd-Dienste erforderlich."}),d.jsxs("p",{className:"max-w-xs text-[10px] leading-normal text-muted-foreground",children:["Für das Auslesen der systemd-Logs von ",r," werden Root-Rechte benötigt. Hinterlege dein Passwort in den Einstellungen."]}),d.jsx("button",{onClick:f,className:"mt-2 rounded-md bg-primary px-3 py-1.5 text-[10px] font-semibold text-primary-foreground transition-colors hover:bg-primary/95",children:"Sudo-Passwort eintragen"})]}):i&&!s?d.jsx("span",{className:"text-muted-foreground",children:"Lade Logs…"}):x.length===0?d.jsx("span",{className:"text-muted-foreground",children:"Keine Logeinträge vorhanden."}):D.length===0?d.jsx("span",{className:"text-muted-foreground",children:m?"Keine Fehler oder Warnungen — der Dienst läuft sauber. ✓":"Kein Treffer für den Filter."}):D.map((P,A)=>d.jsx("div",{className:Ee("whitespace-pre-wrap",aw[P.level]),children:P.t||" "},A))})]})}function cw({open:r,showAlert:s}){const[i,a]=g.useState(""),[u,f]=g.useState(""),[m,h]=g.useState(!1),[y,k]=g.useState(!1);return g.useEffect(()=>{r&&(a(localStorage.getItem("mc_sudo_password")||""),f(localStorage.getItem("mc_hf_token")||""))},[r]),d.jsxs("div",{className:"space-y-6",children:[d.jsxs("div",{className:"space-y-2",children:[d.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground",children:"Zugangsdaten & Schlüssel"}),d.jsx("p",{className:"text-[10px] text-muted-foreground leading-normal",children:"Diese Daten werden ausschließlich lokal in deinem Browser (localStorage) gespeichert und bei Bedarf an das Backend übertragen."})]}),d.jsxs("div",{className:"space-y-2",children:[d.jsxs("label",{className:"text-xs font-semibold flex items-center gap-1.5",children:[d.jsx(lc,{className:"h-4 w-4 text-amber-400"}),"Host Sudo-Passwort"]}),d.jsxs("div",{className:"relative",children:[d.jsx("input",{type:m?"text":"password",value:i,onChange:w=>a(w.target.value),"aria-label":"Host Sudo-Passwort",name:"sudo-password",autoComplete:"off",spellCheck:!1,placeholder:"Sudo-Passwort für System-Operationen",className:"w-full h-10 pl-3 pr-10 text-xs bg-background/40 border border-border/60 rounded-lg outline-none focus:border-primary transition-colors text-foreground"}),d.jsx("button",{type:"button",onClick:()=>h(!m),"aria-label":m?"Passwort verbergen":"Passwort anzeigen",className:"absolute inset-y-0 right-0 flex items-center pr-3 text-muted-foreground hover:text-foreground transition-colors",children:m?d.jsx(_h,{className:"h-4 w-4","aria-hidden":"true"}):d.jsx(zu,{className:"h-4 w-4","aria-hidden":"true"})})]}),d.jsx("p",{className:"text-[9px] text-muted-foreground leading-normal",children:"Wird benötigt für systemd-Dienste (Llama Swap logs/restart), OS-Update (apt) und Reboot."})]}),d.jsxs("div",{className:"space-y-2",children:[d.jsxs("label",{className:"text-xs font-semibold flex items-center gap-1.5",children:[d.jsx(Vy,{className:"h-4 w-4 text-violet-400"}),"HuggingFace API Token"]}),d.jsxs("div",{className:"relative",children:[d.jsx("input",{type:y?"text":"password",value:u,onChange:w=>f(w.target.value),"aria-label":"HuggingFace API Token",name:"hf-token",autoComplete:"off",spellCheck:!1,placeholder:"hf_…",className:"w-full h-10 pl-3 pr-10 text-xs bg-background/40 border border-border/60 rounded-lg outline-none focus:border-primary transition-colors text-foreground"}),d.jsx("button",{type:"button",onClick:()=>k(!y),"aria-label":y?"Token verbergen":"Token anzeigen",className:"absolute inset-y-0 right-0 flex items-center pr-3 text-muted-foreground hover:text-foreground transition-colors",children:y?d.jsx(_h,{className:"h-4 w-4","aria-hidden":"true"}):d.jsx(zu,{className:"h-4 w-4","aria-hidden":"true"})})]}),d.jsx("p",{className:"text-[9px] text-muted-foreground leading-normal",children:"Erlaubt das Herunterladen von geschützten oder Gate-restricted Modellen direkt über Mission Control."})]}),d.jsxs("div",{className:"flex gap-3 pt-2",children:[d.jsx("button",{onClick:()=>{localStorage.setItem("mc_sudo_password",i),localStorage.setItem("mc_hf_token",u),s("Erfolgreich","Einstellungen erfolgreich lokal gespeichert.")},className:"flex-1 h-9 flex items-center justify-center text-xs font-semibold text-primary-foreground bg-primary hover:bg-primary/90 rounded-lg transition-colors shadow shadow-primary/10 cursor-pointer",children:"Speichern"}),d.jsx("button",{onClick:()=>{a(""),f(""),localStorage.removeItem("mc_sudo_password"),localStorage.removeItem("mc_hf_token"),s("Gelöscht","Zugangsdaten gelöscht.")},className:"h-9 px-4 flex items-center justify-center text-xs font-semibold text-muted-foreground border border-border/60 bg-background/20 hover:bg-accent rounded-lg transition-colors cursor-pointer",children:"Zurücksetzen"})]})]})}function dw({detail:r,maintenanceJob:s,onClose:i,onApply:a}){var y,k;const u=r.data,f={os:{icon:lc,cls:"text-cyan-400",title:"OS-Pakete (apt)"},engine:{icon:al,cls:"text-violet-400",title:"Inferenz-Engine (llama.cpp)"},swap:{icon:_p,cls:"text-fuchsia-400",title:"Router (llama-swap)"},hermes:{icon:jo,cls:"text-amber-400",title:"Hermes-Agent"}}[r.kind],m=f.icon,h=u?r.kind==="os"?(u.count??0)===0:r.kind==="hermes"?(u.behind??0)===0:u.installed_build!=null&&u.latest_build!=null&&u.latest_build<=u.installed_build:!0;return d.jsxs("div",{className:"fixed inset-0 z-[60] flex items-center justify-center p-4",children:[d.jsx("div",{className:"absolute inset-0 bg-black/70 backdrop-blur-sm",onClick:i}),d.jsxs("div",{className:"relative w-full max-w-lg max-h-[80vh] flex flex-col rounded-2xl border border-border/60 bg-card shadow-2xl font-sans text-foreground",children:[d.jsxs("div",{className:"flex h-14 shrink-0 items-center justify-between border-b border-border/40 px-5",children:[d.jsxs("div",{className:"flex items-center gap-2",children:[d.jsx(m,{className:Ee("h-4.5 w-4.5",f.cls)}),d.jsx("h3",{className:"text-sm font-semibold",children:f.title})]}),d.jsx("button",{onClick:i,className:"flex h-7 w-7 items-center justify-center rounded-lg border border-border/40 text-muted-foreground hover:bg-accent transition-colors",children:d.jsx(ul,{className:"h-4 w-4"})})]}),d.jsx("div",{className:"flex-1 overflow-y-auto p-5 text-xs space-y-3 scrollbar-thin",children:r.loading?d.jsxs("div",{className:"flex h-24 items-center justify-center gap-2 text-muted-foreground",children:[d.jsx(ss,{className:"h-4 w-4 animate-spin"})," Details werden geladen…"]}):u!=null&&u.error?d.jsx("div",{className:"rounded-lg border border-red-500/30 bg-red-500/5 p-3 text-red-400",children:u.error}):d.jsxs(d.Fragment,{children:[(u==null?void 0:u.action_needed)!=null&&d.jsxs("div",{className:Ee("flex items-start gap-2 rounded-lg border p-3",u.action_needed?"border-amber-500/40 bg-amber-500/10":"border-emerald-500/40 bg-emerald-500/10"),children:[u.action_needed?d.jsx(Co,{className:"h-4 w-4 text-amber-400 shrink-0 mt-0.5"}):d.jsx(Oy,{className:"h-4 w-4 text-emerald-400 shrink-0 mt-0.5"}),d.jsxs("div",{className:"min-w-0",children:[d.jsxs("div",{className:Ee("text-xs font-semibold",u.action_needed?"text-amber-300":"text-emerald-300"),children:["Musst du etwas tun? ",u.action_needed?"Ja":"Nein — die Box regelt das (Fangnetz)"]}),u.action_needed&&u.action_text&&d.jsx("div",{className:"mt-0.5 text-[11px] text-foreground/90",children:u.action_text})]})]}),(u==null?void 0:u.summary)&&d.jsxs("div",{className:"rounded-lg border border-primary/25 bg-primary/5 p-3 space-y-1",children:[d.jsx("div",{className:"text-[10px] font-bold uppercase tracking-wider text-primary",children:"Was dieses Update bedeutet (Zusammenfassung der Box)"}),d.jsx("pre",{className:"whitespace-pre-wrap text-[11px] leading-relaxed text-foreground/90 font-sans",children:u.summary})]}),r.kind==="os"?d.jsxs(d.Fragment,{children:[((u==null?void 0:u.count)??0)===0?d.jsx("div",{className:"text-muted-foreground",children:"Keine Pakete zu aktualisieren — System ist aktuell."}):d.jsxs(d.Fragment,{children:[d.jsxs("div",{className:"text-muted-foreground",children:[u.count," Paket(e) werden aktualisiert:"]}),d.jsx("div",{className:"space-y-1",children:u.packages.map(w=>d.jsxs("div",{className:"flex items-center justify-between gap-2 rounded-md border border-border/40 bg-background/30 px-2.5 py-1.5",children:[d.jsxs("span",{className:"flex items-center gap-1.5 font-mono text-[11px] truncate",children:[d.jsx(Ph,{className:"h-3 w-3 text-cyan-400 shrink-0"}),w.name]}),d.jsxs("span",{className:"flex items-center gap-1 font-mono text-[10px] text-muted-foreground shrink-0",children:[d.jsx("span",{children:w.current}),d.jsx(Ch,{className:"h-3 w-3"}),d.jsx("span",{className:"text-emerald-400",children:w.candidate})]})]},w.name))})]}),(((y=u==null?void 0:u.held_back)==null?void 0:y.length)??0)>0&&d.jsxs("div",{className:"space-y-1.5 rounded-lg border border-border/40 bg-background/20 p-3",children:[d.jsxs("div",{className:"flex items-center gap-1.5 text-[11px] font-semibold text-muted-foreground",children:[d.jsx(Ty,{className:"h-3.5 w-3.5"})," Vom Hersteller zurückgestellt — kein Handeln nötig"]}),d.jsx("p",{className:"text-[10px] text-muted-foreground leading-normal",children:"Diese Pakete gäbe es bereits, Ubuntu spielt sie aber gestaffelt aus (Phasen-Rollout) bzw. hält sie kurz zurück. Sie kommen bei einem der nächsten automatischen Läufe von selbst — das ist kein Fehler und nichts hängt fest."}),d.jsx("div",{className:"space-y-1",children:u.held_back.map(w=>d.jsxs("div",{className:"flex items-center justify-between gap-2 rounded-md border border-border/30 bg-background/30 px-2.5 py-1.5",children:[d.jsxs("span",{className:"flex items-center gap-1.5 font-mono text-[11px] truncate",children:[d.jsx(Ph,{className:"h-3 w-3 text-muted-foreground shrink-0"}),w.name]}),d.jsx("span",{className:"text-[9px] text-muted-foreground shrink-0",children:w.reason==="phasing"?"Phasen-Rollout":"vorerst zurückgehalten"})]},w.name))})]})]}):r.kind==="engine"||r.kind==="swap"?d.jsxs(d.Fragment,{children:[d.jsxs("div",{className:"flex items-center gap-2 font-mono text-[11px]",children:[d.jsxs("span",{className:"rounded-md border border-border/40 bg-background/30 px-2 py-1",children:["Build ",(u==null?void 0:u.installed_build)??"?"]}),d.jsx(Ch,{className:"h-3.5 w-3.5 text-muted-foreground"}),d.jsxs("span",{className:"rounded-md border border-emerald-500/30 bg-emerald-500/5 px-2 py-1 text-emerald-400",children:["Build ",(u==null?void 0:u.latest_build)??"?"]})]}),((u==null?void 0:u.name)||(u==null?void 0:u.latest_tag))&&d.jsxs("div",{className:"text-muted-foreground",children:["Release: ",d.jsx("span",{className:"text-foreground",children:u==null?void 0:u.name}),u!=null&&u.latest_tag?` (${u.latest_tag})`:""]}),(u==null?void 0:u.url)&&d.jsxs("a",{href:u.url,target:"_blank",rel:"noreferrer",className:"inline-flex items-center gap-1 text-primary hover:underline",children:["Original-Release-Notes auf GitHub ",d.jsx(Ay,{className:"h-3 w-3"})]}),(u==null?void 0:u.body)&&d.jsxs("details",{className:"group",children:[d.jsx("summary",{className:"cursor-pointer text-[10px] text-muted-foreground hover:text-foreground",children:"Original-Notizen (englisch) anzeigen"}),d.jsx("pre",{className:"mt-1.5 whitespace-pre-wrap rounded-lg border border-border/40 bg-background/30 p-3 text-[10px] leading-relaxed text-muted-foreground max-h-60 overflow-y-auto scrollbar-thin",children:u.body})]})]}):(((k=u==null?void 0:u.commits)==null?void 0:k.length)??0)===0?d.jsx("div",{className:"text-muted-foreground",children:"Keine neuen Commits — Hermes-Agent ist bereits aktuell."}):d.jsxs(d.Fragment,{children:[d.jsxs("div",{className:"text-muted-foreground",children:[u.behind," neue Commit(s) auf ",d.jsxs("span",{className:"font-mono text-foreground",children:["origin/",u.branch]}),":"]}),d.jsx("div",{className:"space-y-1",children:u.commits.map(w=>d.jsxs("div",{className:"flex items-start gap-2 rounded-md border border-border/40 bg-background/30 px-2.5 py-1.5",children:[d.jsx(Fy,{className:"h-3.5 w-3.5 text-primary shrink-0 mt-0.5"}),d.jsxs("div",{className:"min-w-0",children:[d.jsx("div",{className:"text-[11px] truncate",children:w.subject}),d.jsxs("div",{className:"font-mono text-[9px] text-muted-foreground",children:[w.hash," · ",w.when]})]})]},w.hash))})]}),r.kind!=="os"&&!h&&d.jsxs("div",{className:"flex items-start gap-2 rounded-lg border border-border/40 bg-background/20 p-2.5",children:[d.jsx(Yy,{className:"h-3.5 w-3.5 text-emerald-400 shrink-0 mt-0.5"}),d.jsxs("p",{className:"text-[10px] text-muted-foreground leading-normal",children:["Vor dem Update sichert die Box automatisch den alten Stand. Danach prüft sie den ganzen Stack per echter Anfrage — läuft etwas nicht, rollt sie von selbst zurück",r.kind==="hermes"?" und startet den Gateway neu":"","."]})]})]})}),d.jsxs("div",{className:"flex gap-3 border-t border-border/40 p-4 shrink-0",children:[d.jsx("button",{onClick:i,className:"h-9 flex-1 rounded-lg border border-border/60 bg-background/20 text-xs font-semibold text-muted-foreground hover:bg-accent transition-colors cursor-pointer",children:"Schließen"}),d.jsx("button",{onClick:a,disabled:r.loading||h||!!s,title:s?`Update läuft bereits: ${s.label}`:void 0,className:"h-9 flex-1 rounded-lg bg-primary text-xs font-semibold text-primary-foreground hover:opacity-90 transition-all cursor-pointer disabled:opacity-40 disabled:cursor-default",children:s?"Update läuft…":"Jetzt aktualisieren"})]})]})]})}function fw({open:r,onClose:s,defaultTab:i="maintenance"}){var jr,Cs;const a=ll(),{showAlert:u,showConfirm:f,dialogElement:m}=vm(),{data:h}=bm(),{data:y}=hc(),k=tw(3e3,r).data??[],{data:w}=J1(void 0,r),[x,R]=g.useState("llama-swap"),[_,D]=g.useState(""),[S,P]=g.useState(!1),[A,F]=g.useState(null),[V,I]=g.useState({}),[K,G]=g.useState("maintenance"),[ue,ie]=g.useState(!1),[ee,me]=g.useState(""),[ke,le]=g.useState(!1),[Le,Z]=g.useState(!1),[ce,Ce]=g.useState(null),Ne=(y==null?void 0:y.services)??[],z=()=>vo(a,Pe.jobs);function ne(L){return L?new Date(L*1e3).toLocaleString("de-DE",{day:"2-digit",month:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"}):"Nie"}g.useEffect(()=>{r&&i&&G(i)},[r,i]),g.useEffect(()=>{r&&vo(a,Pe.updates,Pe.services,Pe.jobs,Pe.zeitmaschine)},[r]);function Q(L){P(!0),F(null),Se(`/api/maintenance/logs?service=${L}&lines=150`).then(xe=>{xe.ok?D(xe.text):(D(`Fehler beim Laden der Logs: ${xe.err||"Unbekannter Fehler"}`),(xe.status==="incorrect_password"||xe.status==="password_required")&&F(xe.status))}).catch(xe=>D(`Fehler: ${xe.message}`)).finally(()=>P(!1))}g.useEffect(()=>{!r||K!=="logs"||Q(x)},[r,K,x]);function C(L){return(L==null?void 0:L.status)==="busy"?(u("Update läuft bereits",`Es läuft gerade „${L.running}". Bitte warte, bis es fertig ist.`),z(),!0):!1}function N(L){return(L==null?void 0:L.status)==="password_required"||(L==null?void 0:L.status)==="incorrect_password"?(u("Box-Passwort nötig",(L.status==="incorrect_password"?"Das gespeicherte Box-Passwort stimmt nicht. ":"Für dieses Update braucht die Box dein Passwort. ")+"Bitte oben im Reiter „Einstellungen“ setzen bzw. korrigieren."),!0):L&&L.ok===!1?(u("Update fehlgeschlagen",L.err||"Unbekannter Fehler."),!0):!1}async function q(L){const xe={os:"os-update",engine:"engine-update",swap:"swap-update"}[L];try{const Ie=await Se(`/api/maintenance/${xe}`,{method:"POST"});if(C(Ie)||N(Ie))return;z(),G("maintenance")}catch(Ie){u("Fehler",`Update konnte nicht starten: ${Ie.message}`)}}async function Y(){Z(!0);try{const L=await Se("/api/maintenance/hermes-update",{method:"POST"});if(C(L))return;z()}catch(L){u("Fehler",`Hermes-Update fehlgeschlagen: ${L.message}`)}finally{Z(!1)}}async function W(L){Ce({kind:L,loading:!0,data:null});try{const xe=await Se(`/api/maintenance/update-details?kind=${L}`);Ce({kind:L,loading:!1,data:xe})}catch(xe){Ce({kind:L,loading:!1,data:{kind:L,error:xe.message}})}}function se(){const L=ce==null?void 0:ce.kind;Ce(null),L==="os"||L==="engine"||L==="swap"?q(L):L==="hermes"&&Y()}function de(){var xe;const L=[h!=null&&h.engine?"Engine":null,h!=null&&h.swap?"Router":null,(xe=h==null?void 0:h.components)!=null&&xe.some(Ie=>Ie.update===!0)?"Hermes-Agent":null,h!=null&&h.os?`OS (${h.os} Pakete)`:null].filter(Boolean);f("Alle Updates einspielen?",`Nacheinander in einem Job: ${L.join(" → ")}. Jeder Schritt sichert und prüft sich selbst; schlägt einer fehl, stoppt der Rest. (OS braucht das Box-Passwort aus den Einstellungen — fehlt es, wird OS übersprungen.)`,async()=>{try{const Ie=await Se("/api/maintenance/update-all",{method:"POST"});if(C(Ie)||N(Ie))return;if((Ie==null?void 0:Ie.status)==="nothing"){u("Nichts zu tun","Es stehen keine Updates aus.");return}z(),G("maintenance")}catch(Ie){u("Fehler",`„Alle aktualisieren" konnte nicht starten: ${Ie.message}`)}})}async function ye(){ie(!0);try{await Se("/api/maintenance/check-updates",{method:"POST"}),vo(a,Pe.jobs,Pe.updates),G("maintenance")}catch(L){u("Fehler",`Fehler bei der Update-Suche: ${L.message}`)}finally{ie(!1)}}async function we(L,xe){try{await Se("/api/models/install",{method:"POST",body:JSON.stringify({repo:L,role:xe})}),u("Gestartet",`Modell-Upgrade für '${xe}' (${L}) gestartet.`),z(),G("maintenance")}catch(Ie){u("Fehler",`Fehler beim Starten des Modell-Upgrades: ${Ie.message}`)}}async function Ge(){f("Reboot bestätigen","Bist du sicher, dass du das gesamte Host-System neu starten willst?",async()=>{try{await Se("/api/maintenance/reboot",{method:"POST"}),u("Reboot","Reboot ausgelöst. System startet neu...",()=>s())}catch(L){u("Fehler",`Fehler beim Reboot: ${L.message}`)}})}async function Sr(){le(!0),me("Snapshot wird erzeugt...");try{const L=await Se("/api/system/backup",{method:"POST"});me(L.ok?`Snapshot erzeugt: ${L.snapshot} (${L.files.length} Komponenten)`:"Backup fehlgeschlagen."),vo(a,Pe.zeitmaschine)}catch(L){me(`Fehler: ${L.message}`)}finally{le(!1)}}async function Ns(L){I(xe=>({...xe,[L]:!0}));try{const xe=await Se("/api/maintenance/restart",{method:"POST",body:JSON.stringify({service:L})});xe.ok?(u("Dienst neu gestartet",`Dienst ${L} wurde erfolgreich neu gestartet.`,()=>{K==="logs"&&x===L&&Q(L)}),vo(a,Pe.services,Pe.health,Pe.models)):u("Fehler",`Fehler beim Neustart: ${xe.err||"Unbekannter Fehler"}`)}catch(xe){u("Fehler",`Fehler beim Neustart: ${xe.message}`)}finally{I(xe=>({...xe,[L]:!1}))}}async function Er(L){try{await Se(`/api/jobs/${L}/cancel`,{method:"POST"}),z()}catch(xe){u("Fehler",`Fehler beim Abbrechen: ${xe.message}`)}}const rn=k.find(L=>(L.state==="running"||L.state==="queued")&&L.group==="maintenance"),js=(h?(h.os>0?1:0)+(h.engine?1:0)+(h.swap?1:0):0)+(((jr=h==null?void 0:h.components)==null?void 0:jr.filter(L=>L.update===!0).length)??0),Nr=(w==null?void 0:w.backups)??[];return d.jsxs(d.Fragment,{children:[d.jsx("div",{className:Ee("fixed inset-0 bg-black/60 backdrop-blur-sm z-50 transition-opacity duration-300",r?"opacity-100 pointer-events-auto":"opacity-0 pointer-events-none"),onClick:s}),d.jsxs("div",{className:Ee("fixed inset-y-0 right-0 w-full sm:w-[640px] bg-card/85 backdrop-blur-xl border-l border-border/60 shadow-2xl z-50 flex flex-col transform transition-transform duration-300 ease-in-out font-sans text-foreground",r?"translate-x-0":"translate-x-full"),children:[d.jsxs("div",{className:"flex h-16 shrink-0 items-center justify-between border-b border-border/40 px-6",children:[d.jsxs("div",{className:"flex items-center gap-2",children:[d.jsx(Cp,{className:"h-4.5 w-4.5 text-primary"}),d.jsx("h2",{className:"text-sm font-semibold tracking-wide uppercase font-space",children:"OS-Zentrale & Pflege"})]}),d.jsx("button",{onClick:s,className:"flex h-8 w-8 items-center justify-center rounded-lg border border-border/40 text-muted-foreground hover:bg-accent transition-colors",children:d.jsx(ul,{className:"h-4 w-4"})})]}),d.jsx("div",{className:"flex border-b border-border/40 px-6",children:["maintenance","logs","settings"].map(L=>d.jsx("button",{onClick:()=>G(L),className:Ee("flex-1 py-3 text-xs font-semibold uppercase tracking-wider border-b-2 text-center transition-all",K===L?"border-primary text-primary":"border-transparent text-muted-foreground hover:text-foreground"),children:L==="maintenance"?"System-Wartung":L==="logs"?"System-Logs":"Einstellungen"},L))}),d.jsxs("div",{className:"flex-1 overflow-y-auto p-6 space-y-6",children:[K==="maintenance"&&d.jsxs(d.Fragment,{children:[d.jsxs("div",{className:"space-y-2.5",children:[d.jsxs("div",{className:"flex items-center justify-between",children:[d.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground",children:"Updates"}),d.jsxs("div",{className:"flex items-center gap-3",children:[js>0&&d.jsxs("button",{onClick:de,disabled:!!rn,className:"flex items-center gap-1 rounded-md border border-primary/40 bg-primary/10 px-2 py-1 text-[10px] font-bold text-primary transition-colors hover:bg-primary/20 disabled:opacity-50",children:[d.jsx(Ly,{className:"h-3 w-3"})," Alle aktualisieren (",js,")"]}),d.jsxs("button",{onClick:ye,disabled:ue||!!rn,className:"flex items-center gap-1 text-[10px] font-semibold text-primary hover:text-primary/80 transition-colors disabled:opacity-50",children:[d.jsx(ss,{className:Ee("h-3 w-3",ue&&"animate-spin")})," Nach Updates suchen"]})]})]}),(h==null?void 0:h.last_check)&&d.jsxs("div",{className:"text-[9px] text-muted-foreground -mt-1",children:["Zuletzt gesucht: ",ne(h.last_check)]}),rn&&d.jsxs("div",{className:"flex items-center gap-2 rounded-lg border border-amber-500/30 bg-amber-500/10 px-3 py-2 text-[11px] text-amber-300",children:[d.jsx(ss,{className:"h-3.5 w-3.5 shrink-0 animate-spin"}),d.jsxs("span",{children:["Update läuft: ",d.jsx("span",{className:"font-semibold",children:rn.label})," — bitte warten. Weitere Updates sind solange gesperrt."]})]}),d.jsxs("div",{className:"space-y-1.5",children:[d.jsx(yo,{icon:lc,iconClass:"text-cyan-400",name:"OS-Pakete (apt)",available:!!(h!=null&&h.os),status:h!=null&&h.os?`${h.os} verfügbar`:"aktuell",actionLabel:"Anzeigen",onAction:()=>W("os")}),d.jsx(yo,{icon:al,iconClass:"text-violet-400",name:"Inferenz-Engine (llama.cpp)",available:!!(h!=null&&h.engine),status:h!=null&&h.engine?"Update verfügbar":"aktuell",actionLabel:"Anzeigen",onAction:()=>W("engine")}),d.jsx(yo,{icon:_p,iconClass:"text-fuchsia-400",name:"Router (llama-swap)",available:!!(h!=null&&h.swap),status:h!=null&&h.swap?"Update verfügbar":"aktuell",actionLabel:"Anzeigen",onAction:()=>W("swap")}),(()=>{var xe;const L=(xe=h==null?void 0:h.components)==null?void 0:xe.find(Ie=>Ie.key==="hermes_agent");return d.jsx(yo,{icon:jo,iconClass:"text-amber-400",name:"Hermes-Agent",available:(L==null?void 0:L.update)===!0,busy:Le,status:(L==null?void 0:L.update)===!0?`Update: ${L.latest}`:(L==null?void 0:L.reachable)===!1?"offline":"aktuell",actionLabel:"Anzeigen",onAction:()=>W("hermes")})})(),(Cs=h==null?void 0:h.model_list)==null?void 0:Cs.map(L=>d.jsx(yo,{icon:Cy,iconClass:"text-emerald-400",name:`Modell · ${L.role}`,available:!0,status:L.title,actionLabel:"Upgrade",onAction:()=>we(L.repo,L.role)},L.role))]})]}),d.jsxs("div",{className:"space-y-2.5",children:[d.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground",children:"Dienste"}),d.jsxs("div",{className:"space-y-1.5",children:[Ne.length===0&&d.jsx("div",{className:"rounded-lg border border-dashed border-border/50 p-4 text-center text-xs text-muted-foreground",children:"Dienste-Liste wird geladen …"}),Ne.map(L=>d.jsx(sw,{label:L.name,system:L.scope==="system",ok:L.ok,busy:V[L.unit],onRestart:()=>Ns(L.unit),onLogs:()=>{R(L.unit),G("logs")}},L.unit))]})]}),d.jsxs("div",{className:"space-y-2.5",children:[d.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground",children:"Backup"}),d.jsxs("div",{className:"rounded-lg border border-border/50 bg-background/20 px-3 py-2.5 flex items-center gap-3",children:[d.jsxs("div",{className:"flex-1 min-w-0",children:[d.jsx("div",{className:"text-xs text-foreground truncate",children:Nr[0]?`Letztes: ${Nr[0].snapshot}`:"Noch kein Backup"}),d.jsxs("div",{className:"text-[10px] text-muted-foreground",children:[Nr.length," Snapshots · Wiederherstellen: Chronik → Zeitmaschine"]})]}),d.jsxs("button",{onClick:Sr,disabled:ke,className:"flex items-center gap-1.5 text-[11px] font-semibold rounded-lg px-2.5 py-1 bg-primary text-primary-foreground hover:opacity-90 transition-all cursor-pointer disabled:opacity-50 shrink-0",children:[d.jsx(Py,{className:Ee("h-3.5 w-3.5",ke&&"animate-pulse")})," Snapshot"]})]}),ee&&d.jsx("div",{className:"text-[10px] font-mono text-primary bg-primary/5 p-2 rounded-lg border border-primary/20 break-all leading-normal",children:ee})]}),d.jsxs("div",{className:"space-y-2.5",children:[d.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-red-400/80",children:"Gefahrenzone"}),d.jsxs("button",{onClick:Ge,className:"flex w-full items-center gap-3 p-3 rounded-lg border border-red-500/20 bg-red-500/5 hover:bg-red-500/10 text-red-400 transition-all text-left text-xs font-semibold",children:[d.jsx(Gy,{className:"h-4.5 w-4.5"}),d.jsxs("div",{children:[d.jsx("div",{children:"Host-System neu starten"}),d.jsx("div",{className:"text-[10px] text-red-400/80 font-normal",children:"Startet die ganze Box neu"})]})]})]}),d.jsxs("div",{className:"space-y-3",children:[d.jsxs("div",{className:"flex items-center justify-between",children:[d.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground",children:"Hintergrund-Aufgaben"}),d.jsxs("span",{className:"text-[10px] font-mono bg-primary/10 text-primary px-1.5 py-0.5 rounded-full",children:[k.filter(L=>L.state==="running"||L.state==="queued").length," Aktiv"]})]}),d.jsx("div",{className:"space-y-3",children:k.length===0?d.jsx("div",{className:"text-xs text-muted-foreground border border-dashed border-border/60 rounded-xl p-6 text-center",children:"Aktuell keine aktiven Hintergrund-Jobs."}):k.map(L=>{const xe=L.state==="running"||L.state==="queued";return d.jsxs("div",{className:Ee("p-3 rounded-xl border transition-all duration-300",xe?"border-primary/40 bg-primary/5 shadow-md shadow-primary/5":"border-border/40 bg-background/20 opacity-80"),children:[d.jsxs("div",{className:"flex items-start justify-between gap-3",children:[d.jsxs("div",{className:"space-y-1",children:[d.jsxs("div",{className:"text-xs font-semibold flex items-center gap-1.5",children:[xe&&d.jsxs("span",{className:"flex h-2 w-2 relative",children:[d.jsx("span",{className:"animate-ping absolute inline-flex h-full w-full rounded-full bg-primary opacity-75"}),d.jsx("span",{className:"relative inline-flex rounded-full h-2 w-2 bg-primary"})]}),L.label]}),d.jsxs("div",{className:"text-[10px] font-mono text-muted-foreground uppercase flex items-center gap-2",children:[d.jsxs("span",{children:["ID: ",L.id]}),d.jsx("span",{children:"•"}),d.jsx("span",{className:Ee(L.state==="done"&&"text-emerald-400",L.state==="failed"&&"text-red-400",L.state==="running"&&"text-primary",L.state==="queued"&&"text-amber-400",L.state==="canceled"&&"text-muted-foreground"),children:L.state})]})]}),xe&&d.jsx("button",{onClick:()=>Er(L.id),className:"text-[10px] font-semibold text-red-400 hover:text-red-300 border border-red-500/20 bg-red-500/5 hover:bg-red-500/10 px-2 py-0.5 rounded transition-colors",children:"Abbrechen"})]}),L.state==="running"&&d.jsxs("div",{className:"mt-3 space-y-1",children:[d.jsx("div",{className:"w-full h-1.5 bg-muted rounded-full overflow-hidden",children:d.jsx("div",{className:"h-full bg-primary transition-all duration-500",style:{width:`${L.progress??0}%`}})}),d.jsxs("div",{className:"flex justify-between items-center text-[9px] font-mono text-muted-foreground",children:[d.jsxs("span",{children:[L.progress??0,"%"]}),L.done_bytes!=null&&L.total_bytes!=null&&d.jsxs("span",{children:[bu(L.done_bytes)," / ",bu(L.total_bytes),L.rate_bps!=null&&` (${bu(L.rate_bps)}/s)`]}),L.eta_s!=null&&d.jsxs("span",{children:["ETA: ",L.eta_s,"s"]})]})]})]},L.id)})})]})]}),K==="logs"&&d.jsxs("div",{className:"flex flex-col h-full space-y-4",children:[d.jsxs("div",{className:"flex items-center gap-2",children:[d.jsx("select",{value:x,onChange:L=>R(L.target.value),className:"flex-1 h-9 px-3 text-xs bg-background/40 border border-border/60 rounded-lg outline-none text-foreground font-semibold",children:Ne.map(L=>d.jsxs("option",{value:L.unit,children:[L.name," (",L.scope==="system"?"systemd-root":"user",")"]},L.unit))}),d.jsxs("button",{onClick:()=>Ns(x),disabled:V[x],className:"flex h-9 px-3 items-center gap-1.5 text-xs font-semibold rounded-lg border border-border/60 bg-background/20 hover:border-primary/50 transition-colors disabled:opacity-50",title:"Dienst neu starten",children:[d.jsx(ss,{className:Ee("h-3.5 w-3.5",V[x]&&"animate-spin")}),"Restart"]})]}),d.jsx(uw,{service:x,text:_,loading:S,logStatus:A,onRefresh:()=>Q(x),onOpenSettings:()=>G("settings")})]}),K==="settings"&&d.jsx(cw,{open:r,showAlert:u})]})]}),ce&&d.jsx(dw,{detail:ce,maintenanceJob:rn,onClose:()=>Ce(null),onApply:se}),m]})}let Wu=[],Qu=[];const Ku=new Set,Sm=()=>Ku.forEach(r=>r());function Em(r){return Ku.add(r),()=>{Ku.delete(r)}}function hw(r){Wu=[...Wu,r].slice(-40),Sm()}function pw(r){Qu=[...Qu,r].slice(-40),Sm()}const mw=()=>g.useSyncExternalStore(Em,()=>Wu),gw=()=>g.useSyncExternalStore(Em,()=>Qu);function vw(){const{data:r,dataUpdatedAt:s}=ml(),{data:i,dataUpdatedAt:a}=km(),u=g.useRef(null);g.useEffect(()=>{var f,m,h,y;r&&hw({t:Date.now(),cpu:((f=r.cpu)==null?void 0:f.percent)??0,ram:((m=r.ram)==null?void 0:m.percent)??0,gpu:((h=r.gpu)==null?void 0:h.busy_percent)??null,disk:((y=r.disk)==null?void 0:y.percent)??null})},[s]),g.useEffect(()=>{if(!i)return;const f=Date.now(),m=i.prompt_tokens,h=i.completion_tokens;if(u.current){const y=Math.max((f-u.current.t)/1e3,.001);pw({t:f,prompt:Math.max(0,(m-u.current.p)/y),completion:Math.max(0,(h-u.current.c)/y)})}u.current={p:m,c:h,t:f}},[a])}function yw(){var ie,ee,me,ke,le,Le;const{data:r,isError:s}=ym(),{data:i,isError:a}=hc(),{data:u}=wm(),{data:f}=ml(),m=s||a,h=!!r&&!!i,y=Z=>{var ce;return(ce=i==null?void 0:i.services.find(Ce=>Ce.unit===Z))==null?void 0:ce.ok},k=Z=>!!(i!=null&&i.services.some(ce=>ce.unit===Z)),w=r==null?void 0:r.engine_reachable,x=(ie=r==null?void 0:r.brain)==null?void 0:ie.ready,R=((ee=r==null?void 0:r.brain)==null?void 0:ee.model)||((me=u==null?void 0:u.models.find(Z=>Z.role==="hermes"))==null?void 0:me.name)||"",_=[];m&&_.push({id:"mc2",label:"Steuerpult (MC2)",icon:al,critical:!0,status:"down",detail:"Die Zentrale antwortet nicht — alle Anzeigen hier können veraltet sein. Läuft die Box? Deploy aktiv?"}),_.push((()=>{const Z={id:"brain",label:"Lucys Hirn",icon:_y,critical:!0};return h?w===!1?{...Z,status:"down",detail:"Die Motor-Maschine (Engine) läuft nicht — Lucy kann gerade gar nicht denken.",repair:{kind:"restart",service:"llama-swap",label:"Motor neu starten",needsSudo:!0}}:x===!1?{...Z,status:"down",detail:"Lucys Hirn ist gerade eingeschlafen — einmal aufwecken.",repair:R?{kind:"loadModel",model:R,label:"Hirn aufwecken"}:void 0}:{...Z,status:"ok",detail:"Wach und ansprechbar."}:{...Z,status:"loading",detail:"Wird geprüft …"}})()),_.push((()=>{const Z={id:"vision",label:"Lucys Augen",icon:zu,critical:!1};if(!h||!u)return{...Z,status:"loading",detail:"Wird geprüft …"};const ce=u.models.find(Ne=>Ne.role==="vision");return ce?(u.running??[]).includes(ce.name)?{...Z,status:"ok",detail:"Sieht gerade zu (geladen, solange Lucy sie nutzt)."}:{...Z,status:"ok",detail:"Augen ruhen — sie laden von selbst, sobald Lucy startet oder ein Bild kommt.",repair:{kind:"loadModel",model:ce.name,label:"Augen wecken"}}:{...Z,status:"warn",detail:"Kein Augen-Modell eingerichtet — Lucy kann keine Bilder ansehen."}})()),_.push((()=>{const Z={id:"memory",label:"Lucys Gedächtnis",icon:jy,critical:!0},ce=y("hermes-gateway");return!h||ce===void 0?{...Z,status:"loading",detail:"Wird geprüft …"}:ce?{...Z,status:"ok",detail:"Hermes-Natives Gedächtnis aktiv (SQLite & Embeddings)."}:{...Z,status:"down",detail:"Lucy kann sich gerade nichts merken — das Gateway antwortet nicht.",repair:{kind:"restart",service:"hermes-gateway",label:"Gateway neu starten"}}})()),_.push((()=>{const Z={id:"gateway",label:"Verbindung (Gateway)",icon:oc,critical:!0},ce=r?r.gateway_reachable:y("mc2-gateway");if(!h||ce===void 0)return{...Z,status:"loading",detail:"Wird geprüft …"};const Ce=k("mc2-gateway")?"mc2-gateway":"mission-control-2";return ce?{...Z,status:"ok",detail:"Apps und IDEs können Lucy erreichen."}:{...Z,status:"down",detail:"Der Modell-Gateway antwortet nicht — Lucy und die IDEs erreichen kein Modell.",repair:{kind:"restart",service:Ce,label:"Gateway neu starten"}}})()),_.push((()=>{const Z={id:"steward",label:"Wächter (Steward)",icon:ic,critical:!1};return h?k("mc2-steward")?y("mc2-steward")?{...Z,status:"ok",detail:"Wacht über Warm-Set, Dienste und Gedächtnis."}:{...Z,status:"warn",detail:"Der Wächter schläft — niemand meldet gerade Ausfälle oder wärmt Modelle nach.",repair:{kind:"restart",service:"mc2-steward",label:"Wächter neu starten"}}:{...Z,status:"ok",detail:"Auf dieser Installation nicht eingerichtet."}:{...Z,status:"loading",detail:"Wird geprüft …"}})()),_.push((()=>{const Z={id:"agent",label:"Lucys Agent (Hermes)",icon:jo,critical:!0},ce=y("hermes-gateway");return!h||ce===void 0?{...Z,status:"loading",detail:"Wird geprüft …"}:ce?{...Z,status:"ok",detail:"Lucy ist bereit zu reden und zu handeln."}:{...Z,status:"down",detail:"Lucys Agent ist offline — sie reagiert gerade nicht.",repair:{kind:"restart",service:"hermes-gateway",label:"Agent neu starten"}}})()),_.push((()=>{const Z={id:"voice",label:"Lucys Stimme",icon:qy,critical:!1},ce=y("voice-service");return!h||ce===void 0?{...Z,status:"loading",detail:"Wird geprüft …"}:ce?{...Z,status:"ok",detail:"Lucy kann hören und sprechen."}:{...Z,status:"warn",detail:"Sprechen ist gerade aus — Tippen geht weiter normal.",repair:{kind:"restart",service:"voice-service",label:"Stimme neu starten"}}})());const D=((ke=f==null?void 0:f.ram)==null?void 0:ke.total)??0,S=((le=f==null?void 0:f.ram)==null?void 0:le.used)??0,P=((Le=f==null?void 0:f.ram)==null?void 0:Le.percent)??(D>0?Math.min(100,S/D*100):0),A=1024**3,F=D?P>=93?{status:"full",usedGb:S/A,totalGb:D/A,pct:P,text:"Speicher fast voll — Lucy könnte langsamer werden."}:P>=85?{status:"warn",usedGb:S/A,totalGb:D/A,pct:P,text:"Speicher gut gefüllt — noch okay."}:{status:"ok",usedGb:S/A,totalGb:D/A,pct:P,text:"Genug Speicher frei."}:{status:"unknown",usedGb:0,totalGb:0,pct:0,text:"Speicher-Auslastung unbekannt."},V=_.some(Z=>Z.status==="loading"),I=_.filter(Z=>Z.critical&&Z.status==="down"),K=_.filter(Z=>Z.status==="warn"||!Z.critical&&Z.status==="down"),G=F.status==="full";return{verdict:V&&!I.length?"loading":I.length?"problem":K.length||G?"warn":"gut",checks:_,memory:F,problems:I,warns:K,unreachable:m}}const xw={ok:"bg-emerald-500",warn:"bg-amber-500",alert:"bg-red-500",muted:"bg-muted-foreground/40",loading:"bg-muted-foreground/40 animate-pulse"},ww={ok:"hover:border-emerald-500/40",warn:"hover:border-amber-500/50",alert:"hover:border-red-500/50",muted:"hover:border-primary/40",loading:"hover:border-border/60"};function xo({icon:r,title:s,value:i,unit:a,tone:u="muted",hint:f,onClick:m}){return d.jsxs("button",{onClick:m,className:Ee("group relative flex flex-col items-start mc-card p-5 text-left cursor-pointer",ww[u]),children:[d.jsxs("div",{className:"mb-4 flex w-full items-center justify-between",children:[d.jsx("span",{className:"flex h-10 w-10 items-center justify-center rounded-xl border border-border/40 bg-background/30 text-foreground/80 transition-colors group-hover:text-primary",children:d.jsx(r,{className:"h-5 w-5"})}),d.jsx("span",{className:Ee("h-2.5 w-2.5 rounded-full ring-2 ring-black/40",xw[u]),title:f})]}),d.jsxs("div",{className:"flex items-baseline gap-1.5",children:[d.jsx("span",{className:"text-2xl font-bold tracking-tight text-foreground font-space tabular-nums",children:i}),a&&d.jsx("span",{className:"text-xs font-medium text-muted-foreground",children:a})]}),d.jsxs("div",{className:"mt-1 flex w-full items-center justify-between",children:[d.jsx("span",{className:"text-sm font-semibold text-foreground/90",children:s}),d.jsx(ko,{className:"h-4 w-4 text-muted-foreground/40 transition-all group-hover:translate-x-0.5 group-hover:text-primary"})]}),f&&d.jsx("span",{className:"mt-0.5 text-[11px] text-muted-foreground",children:f})]})}function kw(){const{data:r,error:s}=ml(),i=mw();return{sys:r,hist:i,error:s}}const bw=g.lazy(()=>Wt(()=>import("./LiveAreaChartImpl-BkyPZEnE.js"),__vite__mapDeps([0,1])));function Nm(r){return d.jsx(g.Suspense,{fallback:d.jsx(Sw,{height:r.height??176}),children:d.jsx(bw,{...r})})}function Sw({height:r}){return d.jsx("div",{style:{height:r},className:"flex w-full items-end","aria-hidden":"true",children:d.jsx("div",{className:"h-px w-full bg-border/40"})})}const jm={"1h":60,"24h":1440},Yh={live:"Live","1h":"1 h","24h":"24 h"};function Cm({value:r,onChange:s}){return d.jsx("div",{className:"flex rounded-lg border border-border/40 bg-background/30 p-0.5",children:Object.keys(Yh).map(i=>d.jsx("button",{onClick:()=>s(i),className:Ee("rounded-md px-2 py-0.5 text-[9px] font-bold uppercase tracking-wide transition-all cursor-pointer",r===i?"bg-primary text-primary-foreground":"text-muted-foreground hover:text-foreground"),children:Yh[i]},i))})}const Ew=[{key:"cpu",label:"CPU",color:"#2dd4bf"},{key:"ram",label:"RAM",color:"#38bdf8"},{key:"gpu",label:"GPU",color:"#a78bfa"},{key:"disk",label:"Disk",color:"#fbbf24"}];function Nw(){var w,x,R,_;const{sys:r,hist:s}=kw(),[i,a]=g.useState("live"),u=xm(i==="live"?60:jm[i],i!=="live"),f=g.useMemo(()=>{var D;return i==="live"?s:(((D=u.data)==null?void 0:D.points)??[]).map(S=>({t:S.t*1e3,cpu:S.cpu,ram:S.ram,gpu:S.gpu,disk:S.disk}))},[i,s,u.data]),m=!!(r!=null&&r.gpu&&r.gpu.busy_percent!=null&&r.gpu.gtt_used!=null&&r.gpu.gtt_total!=null),h=Ew.filter(D=>D.key!=="gpu"||m),y={cpu:(w=r==null?void 0:r.cpu)==null?void 0:w.percent,ram:(x=r==null?void 0:r.ram)==null?void 0:x.percent,gpu:m?r.gpu.busy_percent:null,disk:(R=r==null?void 0:r.disk)==null?void 0:R.percent},k={cpu:(_=r==null?void 0:r.cpu)!=null&&_.cores?`${r.cpu.cores} Cores`:"",ram:r?`${ts(r.ram.used)}/${ts(r.ram.total)} GB`:"",gpu:m?`${ts(r.gpu.gtt_used)}/${ts(r.gpu.gtt_total)} GB`:"",disk:r!=null&&r.disk?`${ts(r.disk.used)}/${ts(r.disk.total)} GB`:""};return d.jsxs("div",{className:"flex flex-col justify-between mc-card p-5",children:[d.jsxs("div",{children:[d.jsxs("div",{className:"mb-3 flex items-center gap-2",children:[d.jsx(Cp,{className:"h-4.5 w-4.5 text-primary"}),d.jsx("h2",{className:"text-sm font-semibold uppercase tracking-wide text-foreground",children:"System-Status"}),i==="live"&&d.jsxs("span",{className:"ml-1 inline-flex items-center gap-1 text-[10px] font-medium text-muted-foreground/70",children:[d.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-emerald-500 animate-pulse"})," live"]}),d.jsx("div",{className:"ml-auto",children:d.jsx(Cm,{value:i,onChange:a})})]}),r?d.jsxs(d.Fragment,{children:[d.jsx("div",{className:"mb-2 grid grid-cols-2 gap-x-4 gap-y-1.5",children:h.map(D=>d.jsxs("div",{className:"flex min-w-0 items-center gap-1.5",children:[d.jsx("span",{className:"h-2 w-2 shrink-0 rounded-full",style:{background:D.color}}),d.jsx("span",{className:"shrink-0 text-[11px] font-semibold uppercase tracking-wider text-muted-foreground",children:D.label}),d.jsxs("span",{className:"shrink-0 font-mono text-xs font-bold tabular-nums text-foreground",children:[Math.round(y[D.key]??0),"%"]}),k[D.key]&&d.jsx("span",{className:"truncate font-mono text-[10px] text-muted-foreground/60",children:k[D.key]})]},D.key))}),i!=="live"&&f.length===0&&d.jsx("div",{className:"flex h-44 items-center justify-center text-xs text-muted-foreground",children:u.isLoading?"Verlauf wird geladen …":"Noch kein Verlauf — der Sammler baut die Historie gerade erst auf."}),(i==="live"||f.length>0)&&d.jsx(Nm,{data:f,series:h,unit:"%",yMode:"percent",height:176,showTime:!0})]}):d.jsx("div",{className:"flex h-44 items-center justify-center text-xs text-muted-foreground",children:"Lade Systemdaten…"})]}),(r==null?void 0:r.temp)&&(r.temp.cpu||r.temp.gpu)&&d.jsxs("div",{className:"mt-3 flex gap-4 border-t border-border/30 pt-3 font-mono text-xs text-muted-foreground/80",children:[r.temp.cpu!=null&&d.jsxs("span",{children:["CPU Temp: ",r.temp.cpu," °C"]}),r.temp.gpu!=null&&d.jsxs("span",{children:["GPU Temp: ",r.temp.gpu," °C"]})]})]})}const Ss=[{key:"stt_ms",label:"STT",color:"#f59e0b"},{key:"vision_ms",label:"Sehen",color:"#a78bfa"},{key:"hirn_ms",label:"Hirn",color:"#2dd4bf"},{key:"gen_ms",label:"Antwort",color:"#60a5fa"}],bo=r=>r==null?"–":`${(r/1e3).toLocaleString("de-DE",{minimumFractionDigits:1,maximumFractionDigits:1})} s`;function jw(r){const s=Math.max(0,Date.now()/1e3-r);return s<60?`vor ${Math.round(s)} s`:s<3600?`vor ${Math.round(s/60)} min`:`vor ${Math.round(s/3600)} h`}function qu(r){return Ss.reduce((s,i)=>s+(r[i.key]??0),0)}function Cw(r){let s=null;for(const i of Ss){const a=r[i.key];a!=null&&(s==null||a>s.ms)&&(s={label:i.label,color:i.color,ms:a})}return s}function _w({t:r,scale:s}){const i=Ss.map(a=>`${a.label} ${bo(r[a.key])}`).join(" · ");return d.jsxs("div",{className:"flex items-center gap-2.5",children:[d.jsx("span",{className:"w-14 shrink-0 text-right font-mono text-[10px] text-muted-foreground/60",children:jw(r.ts)}),d.jsxs("div",{className:"relative h-4 flex-1 overflow-hidden rounded-sm bg-muted/25",title:i,children:[d.jsx("div",{className:"absolute inset-0 flex",children:Ss.map(a=>{const u=r[a.key];return!u||u<=0?null:d.jsx("div",{style:{width:`${u/s*100}%`,background:a.color},className:"h-full first:rounded-l-sm"},a.key)})}),r.error&&d.jsx("div",{className:"absolute inset-0 flex items-center justify-center bg-rose-500/15 text-[10px] font-semibold text-rose-300",children:"Fehler"})]}),d.jsx("span",{className:"w-12 shrink-0 text-right font-mono text-[11px] font-semibold tabular-nums text-foreground",children:r.error?"–":bo(qu(r))})]})}function Pw(){const{data:r}=ew(12),s=r??[],i=Math.max(1,...s.map(f=>qu(f))),a=s[0],u=a?Cw(a):null;return d.jsxs("div",{className:"mc-card p-5",children:[d.jsxs("div",{className:"mb-3 flex items-start justify-between gap-3",children:[d.jsxs("div",{children:[d.jsxs("div",{className:"flex items-center gap-2",children:[d.jsx(zy,{className:"h-4.5 w-4.5 text-primary"}),d.jsx("h2",{className:"text-sm font-semibold uppercase tracking-wide text-foreground",children:"Latenz je Turn"}),d.jsxs("span",{className:"ml-1 inline-flex items-center gap-1 text-[10px] font-medium text-muted-foreground/70",children:[d.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-emerald-500 animate-pulse"})," live"]})]}),a?d.jsxs("div",{className:"mt-2 flex items-baseline gap-2",children:[d.jsx("span",{className:`font-space text-3xl font-bold tracking-tight tabular-nums ${a.error?"text-rose-400":"text-foreground"}`,children:a.error?"Fehler":bo(qu(a))}),d.jsxs("span",{className:"text-xs text-muted-foreground",children:["letzter Turn",!a.error&&u&&d.jsxs(d.Fragment,{children:[" · Täter: ",d.jsx("span",{style:{color:u.color},className:"font-semibold",children:u.label})," ",bo(u.ms)]})]})]}):d.jsx("div",{className:"mt-2 text-xs text-muted-foreground",children:"Noch kein Voice-Turn aufgezeichnet."}),a&&!a.error&&d.jsx("div",{className:"mt-0.5 font-mono text-[11px] text-muted-foreground/70",children:Ss.filter(f=>a[f.key]!=null).map(f=>`${f.label} ${bo(a[f.key])}`).join(" · ")})]}),d.jsx("div",{className:"flex shrink-0 flex-col items-end gap-1 pt-1",children:Ss.map(f=>d.jsxs("div",{className:"flex items-center gap-1.5",children:[d.jsx("span",{className:"h-2 w-2 rounded-full",style:{background:f.color}}),d.jsx("span",{className:"text-[11px] font-semibold uppercase tracking-wider text-muted-foreground",children:f.label})]},f.key))})]}),s.length>0?d.jsx("div",{className:"space-y-1.5",children:s.map(f=>d.jsx(_w,{t:f,scale:i},f.id))}):d.jsx("div",{className:"flex h-[120px] items-center justify-center px-6 text-center text-xs text-muted-foreground",children:"Sprich einmal mit Lucy — dann erscheint hier der Zeit-Wasserfall pro Turn, damit man den einen Hänger sofort sieht."}),d.jsx("div",{className:"mt-3 border-t border-border/30 pt-2 text-[10px] leading-relaxed text-muted-foreground/70",children:'„Hirn" = Zeit bis zum ersten Wort (Agent + Gedächtnis-Suche + Modell); Tool-Runden stecken in „Antwort". Reine Telegram-Turns laufen an MC2 vorbei und erscheinen hier nicht.'})]})}const Xh=[{key:"prompt",label:"Prompt",color:"#f59e0b"},{key:"completion",label:"Antwort",color:"#2dd4bf"}];function Rw(){const{data:r}=km(),s=gw(),[i,a]=g.useState("live"),u=xm(i==="live"?60:jm[i],i!=="live"),f=g.useMemo(()=>{var w;if(i==="live")return s;const y=((w=u.data)==null?void 0:w.points)??[],k=[];for(let x=1;xd.jsxs("div",{className:"flex items-center gap-1.5",children:[d.jsx("span",{className:"h-2 w-2 rounded-full",style:{background:y.color}}),d.jsx("span",{className:"text-[11px] font-semibold uppercase tracking-wider text-muted-foreground",children:y.label}),d.jsx("span",{className:"font-mono text-xs font-bold tabular-nums text-foreground",children:Math.round((m==null?void 0:m[y.key])??0)})]},y.key))})]})]}),i!=="live"&&f.length===0?d.jsx("div",{className:"flex h-[150px] items-center justify-center text-xs text-muted-foreground",children:u.isLoading?"Verlauf wird geladen …":"Noch kein Verlauf — der Sammler baut die Historie gerade erst auf."}):r?d.jsx(Nm,{data:f,series:Xh,unit:" tok/s",yMode:"auto",height:150,showTime:!0}):d.jsx("div",{className:"flex h-[150px] items-center justify-center text-xs text-muted-foreground",children:"Lade Durchsatz…"}),d.jsx("div",{className:"mt-2 border-t border-border/30 pt-2 text-[10px] text-muted-foreground/70",children:"Durchsatz aus dem Gateway abgeleitet (Prefill vs. Generierung). Flach bei Leerlauf."})]})}const il=r=>window.dispatchEvent(new CustomEvent("open-system-drawer",{detail:{tab:r}}));function Mw({onNavigate:r}){var Z,ce,Ce,Ne;const{data:s}=wm(),{data:i}=hc(),{data:a}=bm(),{data:u}=nw(),{data:f}=rw(),{data:m}=Y1(),{data:h}=X1(),y=yw(),{showAlert:k,dialogElement:w}=vm(),x=ll(),[R,_]=g.useState({});async function D(z,ne){_(Q=>({...Q,[z]:!0}));try{if(ne.kind==="loadModel")await Se(`/api/models/${encodeURIComponent(ne.model)}/load`,{method:"POST"});else{const Q=await Se("/api/maintenance/restart",{method:"POST",body:JSON.stringify({service:ne.service})});Q.ok||k("Reparatur nicht ganz geklappt",(Q.err||"Unbekannter Fehler")+(ne.needsSudo?` - -Tipp: Dafür wird evtl. das Box-Passwort gebraucht (oben rechts hinterlegen).`:""))}x.invalidateQueries({queryKey:Pe.health}),x.invalidateQueries({queryKey:Pe.services}),x.invalidateQueries({queryKey:Pe.models})}catch(Q){k("Reparatur fehlgeschlagen",String((Q==null?void 0:Q.message)||Q))}finally{_(Q=>({...Q,[z]:!1}))}}const S=((Z=s==null?void 0:s.running)==null?void 0:Z.length)??0,P=(i==null?void 0:i.services.filter(z=>z.ok).length)??0,A=(i==null?void 0:i.services.length)??0,F=A-P,V=(a?(a.os>0?1:0)+(a.engine>0?1:0)+(a.swap>0?1:0)+(a.models>0?1:0):0)+(((ce=a==null?void 0:a.components)==null?void 0:ce.filter(z=>z.update===!0).length)??0),I=m!=null&&m.available?m.open_count:0,K=h!=null&&h.available?h.items.filter(z=>z.status==="blocked").length:0,G=f?[f.gateway,f.memory,f.desktop_gateway]:[],ue=G.filter(z=>z==null?void 0:z.ok).length,ie=f?f.gateway.ok?f.memory.ok?f.desktop_gateway.ok?"":"Desktop-Gateway":"Gedächtnis-Leitung":"Modell-Leitung":"",ee=(Ce=s==null?void 0:s.models)==null?void 0:Ce.find(z=>z.role==="hermes"),me=ee!=null&&ee.name?(Ne=ee.name.split("/").pop())==null?void 0:Ne.replace(/\.gguf$/i,""):"",ke=i==null?void 0:i.services.filter(z=>!z.ok).map(z=>z.name).join(", "),le=a?[a.os>0&&"OS",a.engine>0&&"Engine",a.swap>0&&"Swap",a.models>0&&"Modelle"].filter(Boolean):[],Le=le.length>0?le.join(" + "):"";return d.jsxs("div",{className:"space-y-6",children:[d.jsxs("div",{children:[d.jsx("h1",{className:"bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text font-space text-2xl font-bold tracking-tight text-transparent",children:"Cockpit"}),d.jsx("p",{className:"text-sm text-muted-foreground",children:"Deine Box auf einen Blick — Details hinter jeder Kachel."})]}),d.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-3 gap-6 items-start",children:[d.jsxs("div",{className:"lg:col-span-2 space-y-6",children:[d.jsx(Ow,{verdict:y.verdict,memory:y.memory,warns:y.warns,problems:y.problems}),d.jsxs("section",{children:[d.jsx(Su,{children:"Leistung"}),d.jsx("div",{className:"grid gap-4 md:grid-cols-1",children:d.jsx(Nw,{})}),d.jsx("div",{className:"mt-4",children:d.jsx(Pw,{})}),d.jsx("div",{className:"mt-4",children:d.jsx(Rw,{})})]}),d.jsxs("section",{children:[d.jsx(Su,{children:"Bereiche"}),d.jsxs("div",{className:"grid gap-4 grid-cols-2 md:grid-cols-3",children:[d.jsx(xo,{icon:rc,title:"Auftragsbuch",value:m!=null&&m.available?I:"—",unit:I===1?"Vorschlag":"Vorschläge",tone:m?K>0||I>0?"warn":"ok":"loading",hint:K>0?`${K} Karte${K===1?"":"n"} wartet auf deine Antwort`:I>0?`${I} offene Patches`:"Keine ausstehenden Vorschläge",onClick:()=>r("auftraege")}),d.jsx(xo,{icon:Np,title:"Modelle",value:S,unit:"warm",tone:S>0?"ok":"muted",hint:me?`Hirn: ${me}`:"Kein Hermes-Modell geladen",onClick:()=>r("models")}),d.jsx(xo,{icon:al,title:"Dienste",value:i?`${P}/${A}`:"…",unit:"laufen",tone:i?F>0?"warn":"ok":"loading",hint:ke?`Ausfall: ${ke}`:"Alle Dienste online",onClick:()=>il("maintenance")}),d.jsx(xo,{icon:ic,title:"Updates",value:a?V>0?V:"0":"…",unit:V>0?"bereit":"aktuell",tone:a?V>0?"warn":"ok":"loading",hint:V>0?`Verfügbar: ${Le}`:"Alles auf dem neuesten Stand",onClick:()=>il("maintenance")}),d.jsx(xo,{icon:oc,title:"Verbinden",value:f?`${ue}/${G.length}`:"…",unit:"Leitungen",tone:f?ue===G.length?"ok":"warn":"loading",hint:ie?`Gestört: ${ie}`:"Hermes Desktop & IDEs bereit",onClick:()=>r("connect")})]})]})]}),d.jsxs("div",{className:"space-y-6",children:[d.jsx(Tw,{problems:y.problems,pendingCount:V,openAuftraege:I,blockedIdeen:K,busy:R,onRepair:D,onNavigate:r}),d.jsxs("section",{children:[d.jsx(Su,{children:"Werkzeuge & Diagnose"}),d.jsx(Lw,{agent:u,svcErrors:F,onNavigate:r})]})]})]}),w]})}function Su({children:r}){return d.jsx("p",{className:"mb-2 ml-0.5 text-[11px] font-semibold uppercase tracking-wider text-muted-foreground/60",children:r})}function Ow({verdict:r,memory:s,warns:i,problems:a}){const u=i.length?`${i[0].label}: ${i[0].detail}${i.length>1?` (+${i.length-1} weitere)`:""}`:s.status==="full"?s.text:"Nichts Schlimmes — nur ein Hinweis.",f=a.length?`${a[0].label}: ${a[0].detail}${a.length>1?` (+${a.length-1} weitere)`:""}`:"Ein wichtiger Dienst hakt.",m={loading:{ring:"border-border/60 bg-card/45",icon:sc,iconCls:"text-muted-foreground animate-spin",title:"Box wird geprüft …",sub:"Einen Moment."},gut:{ring:"border-emerald-500/40 bg-emerald-500/5",icon:$y,iconCls:"text-emerald-400",title:"Box gesund",sub:"Alle wichtigen Dienste laufen."},warn:{ring:"border-amber-500/40 bg-amber-500/5",icon:Co,iconCls:"text-amber-400",title:"Kleinigkeit an der Box",sub:u},problem:{ring:"border-red-500/50 bg-red-500/5",icon:Co,iconCls:"text-red-400",title:"Box braucht Hilfe",sub:f}}[r],h=m.icon,y={ok:"text-emerald-400",warn:"text-amber-400",full:"text-red-400",unknown:"text-muted-foreground"}[s.status],k={ok:"bg-emerald-500",warn:"bg-amber-500",full:"bg-red-500",unknown:"bg-muted-foreground/40"}[s.status];return d.jsxs("div",{className:Ee("flex flex-col gap-4 rounded-2xl border p-5 shadow-lg shadow-black/15 backdrop-blur-md transition-colors sm:flex-row sm:items-center sm:justify-between h-full",m.ring),children:[d.jsxs("div",{className:"flex items-center gap-3",children:[d.jsx("div",{className:"flex h-11 w-11 shrink-0 items-center justify-center rounded-xl border border-border/40 bg-background/30",children:d.jsx(h,{className:Ee("h-6 w-6",m.iconCls)})}),d.jsxs("div",{className:"min-w-0",children:[d.jsx("h2",{className:"text-base font-bold tracking-tight text-foreground",children:m.title}),d.jsx("p",{className:"text-xs text-muted-foreground",children:m.sub})]})]}),d.jsxs("div",{className:"w-full max-w-[16rem] rounded-xl border border-border/30 bg-background/20 p-3",children:[d.jsxs("div",{className:"mb-1.5 flex items-center justify-between text-[11px]",children:[d.jsxs("span",{className:"flex items-center gap-1.5 font-semibold uppercase tracking-wider text-muted-foreground",children:[d.jsx(Uy,{className:"h-3.5 w-3.5"})," Speicher"]}),d.jsx("span",{className:Ee("font-mono font-bold",y),children:s.status==="unknown"?"—":`${s.usedGb.toFixed(1)} / ${s.totalGb.toFixed(1)} GB`})]}),d.jsx("div",{className:"h-2 w-full overflow-hidden rounded-full border border-border/30 bg-background/50",children:d.jsx("div",{className:Ee("h-full rounded-full transition-all duration-500",k),style:{width:`${s.pct}%`}})})]})]})}function Tw({problems:r,pendingCount:s,openAuftraege:i,blockedIdeen:a,busy:u,onRepair:f,onNavigate:m}){const h=s>0,y=i>0,k=a>0,w=r.length===0&&!h&&!y&&!k;return d.jsx("div",{className:"h-full flex flex-col justify-between",children:w?d.jsxs("div",{className:"flex items-center gap-3 rounded-2xl border border-emerald-500/25 bg-emerald-500/5 p-4 h-full",children:[d.jsx(Ry,{className:"h-5 w-5 shrink-0 text-emerald-400"}),d.jsxs("div",{children:[d.jsx("p",{className:"text-sm font-semibold text-foreground",children:"Nichts zu tun"}),d.jsx("p",{className:"text-xs text-muted-foreground",children:"Alles läuft. Du musst gerade nichts abnicken."})]})]}):d.jsxs("div",{className:"space-y-2 h-full flex flex-col justify-center",children:[r.map(x=>d.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center justify-between gap-3 rounded-2xl border border-red-500/25 bg-red-500/5 p-4",children:[d.jsxs("div",{className:"flex min-w-0 items-center gap-3 w-full",children:[d.jsx("span",{className:"flex h-9 w-9 shrink-0 items-center justify-center rounded-lg border border-red-500/30 bg-background/30 text-red-300",children:d.jsx(x.icon,{className:"h-4.5 w-4.5"})}),d.jsxs("div",{className:"min-w-0 flex-1",children:[d.jsx("p",{className:"text-sm font-bold text-foreground",children:x.label}),d.jsx("p",{className:"truncate text-xs text-muted-foreground",children:x.detail})]})]}),x.repair&&d.jsxs("button",{onClick:()=>x.repair&&f(x.id,x.repair),disabled:!!u[x.id],className:"flex h-9 shrink-0 items-center gap-1.5 rounded-lg border border-red-500/40 bg-red-500/10 px-3 text-[11px] font-bold uppercase tracking-wide text-red-300 transition-all hover:bg-red-500/20 cursor-pointer disabled:opacity-60 w-full sm:w-auto justify-center",children:[u[x.id]?d.jsx(sc,{className:"h-3.5 w-3.5 animate-spin"}):d.jsx(n0,{className:"h-3.5 w-3.5"}),x.repair.label]})]},x.id)),k&&d.jsxs("button",{onClick:()=>m("auftraege"),className:"flex w-full items-center justify-between gap-3 rounded-2xl border border-red-500/30 bg-red-500/5 p-4 text-left transition-all hover:bg-red-500/10 cursor-pointer",children:[d.jsxs("div",{className:"flex items-center gap-3",children:[d.jsx("span",{className:"flex h-9 w-9 shrink-0 items-center justify-center rounded-lg border border-red-500/30 bg-background/30 text-red-300",children:d.jsx(jp,{className:"h-4.5 w-4.5"})}),d.jsxs("div",{children:[d.jsxs("p",{className:"text-sm font-bold text-foreground",children:[a," Karte",a===1?"":"n"," braucht deine Antwort"]}),d.jsx("p",{className:"text-xs text-muted-foreground",children:"Die Box hängt an einer Frage und wartet auf dich."})]})]}),d.jsx(ko,{className:"h-4 w-4 shrink-0 text-red-300/70"})]}),y&&d.jsxs("button",{onClick:()=>m("auftraege"),className:"flex w-full items-center justify-between gap-3 rounded-2xl border border-primary/30 bg-primary/5 p-4 text-left transition-all hover:bg-primary/10 cursor-pointer",children:[d.jsxs("div",{className:"flex items-center gap-3",children:[d.jsx("span",{className:"flex h-9 w-9 shrink-0 items-center justify-center rounded-lg border border-primary/30 bg-background/30 text-primary",children:d.jsx(rc,{className:"h-4.5 w-4.5"})}),d.jsxs("div",{children:[d.jsxs("p",{className:"text-sm font-bold text-foreground",children:[i," Vorschl",i===1?"ag":"äge"," im Auftragsbuch"]}),d.jsx("p",{className:"text-xs text-muted-foreground",children:"Annehmen oder ablehnen."})]})]}),d.jsx(ko,{className:"h-4 w-4 shrink-0 text-primary/70"})]}),h&&d.jsxs("button",{onClick:()=>il("maintenance"),className:"flex w-full items-center justify-between gap-3 rounded-2xl border border-amber-500/30 bg-amber-500/5 p-4 text-left transition-all hover:bg-amber-500/10 cursor-pointer",children:[d.jsxs("div",{className:"flex items-center gap-3",children:[d.jsx("span",{className:"flex h-9 w-9 shrink-0 items-center justify-center rounded-lg border border-amber-500/30 bg-background/30 text-amber-300",children:d.jsx(ic,{className:"h-4.5 w-4.5"})}),d.jsxs("div",{children:[d.jsxs("p",{className:"text-sm font-bold text-foreground",children:[s," Update",s===1?"":"s"," bereit"]}),d.jsx("p",{className:"text-xs text-muted-foreground",children:"Ansehen und entscheiden."})]})]}),d.jsx(ko,{className:"h-4 w-4 shrink-0 text-amber-300/70"})]})]})})}function Lw({agent:r,svcErrors:s,onNavigate:i}){const a=[{label:"Hermes Agent",status:r?r.gateway_reachable?"Bereit":"Offline":"…",tone:r?r.gateway_reachable?"ok":"alert":"loading",action:()=>i("agent")},{label:"Konsole (Box-Shell)",status:r?r.box_console_reachable?"Bereit":"Offline":"…",tone:r?r.box_console_reachable?"ok":"warn":"loading",action:()=>i("konsole")},{label:"Systemlogs & Diagnose",status:s>0?`${s} Fehler`:"Keine Fehler",tone:s>0?"alert":"ok",action:()=>il("logs")},{label:"Wissens-Vault",status:"Öffnen",tone:"muted",action:()=>i("wissen")},{label:"Chronik & Zeitmaschine",status:"Öffnen",tone:"muted",action:()=>i("chronik")}];return d.jsx("div",{className:"rounded-2xl border border-border/60 bg-card/30 p-4 space-y-3 shadow-sm",children:d.jsx("div",{className:"divide-y divide-border/20",children:a.map((u,f)=>{const m={loading:"bg-muted-foreground/45 animate-pulse",ok:"bg-emerald-500 shadow-[0_0_8px_rgba(16,185,129,0.4)]",warn:"bg-amber-500 shadow-[0_0_8px_rgba(245,158,11,0.4)]",alert:"bg-red-500 shadow-[0_0_8px_rgba(239,68,68,0.4)]",muted:"bg-muted-foreground/30"}[u.tone];return d.jsxs("button",{onClick:u.action,className:"w-full py-2.5 px-1.5 flex items-center justify-between text-left hover:bg-card/45 rounded-lg transition-all group cursor-pointer text-xs",children:[d.jsx("span",{className:"text-muted-foreground group-hover:text-foreground transition-colors font-medium",children:u.label}),d.jsxs("div",{className:"flex items-center gap-2",children:[d.jsx("span",{className:Ee("text-[10px] font-semibold font-mono",u.tone==="ok"?"text-emerald-400":u.tone==="warn"?"text-amber-400":u.tone==="alert"?"text-red-400":"text-muted-foreground/60"),children:u.status}),d.jsx("span",{className:Ee("h-1.5 w-1.5 rounded-full",m)})]})]},f)})})})}const Dw=g.lazy(()=>Wt(()=>import("./ModelsView-Ck3R7mcg.js"),__vite__mapDeps([2,3,4,5,6,7,8])).then(r=>({default:r.ModelsView}))),Aw=g.lazy(()=>Wt(()=>import("./ConnectView-CxDIL-EH.js"),__vite__mapDeps([9,7])).then(r=>({default:r.ConnectView}))),Iw=g.lazy(()=>Wt(()=>import("./AgentView-BJR2UXXN.js"),[]).then(r=>({default:r.AgentView}))),zw=g.lazy(()=>Wt(()=>import("./KonsoleView-BwsSoiDo.js"),[]).then(r=>({default:r.KonsoleView}))),Fw=g.lazy(()=>Wt(()=>import("./GuideView-FadZtBSQ.js"),__vite__mapDeps([10,6,8])).then(r=>({default:r.GuideView}))),Uw=g.lazy(()=>Wt(()=>import("./AuftragsbuchView-Cr_8mzDy.js"),__vite__mapDeps([11,12,7])).then(r=>({default:r.AuftragsbuchView}))),$w=g.lazy(()=>Wt(()=>import("./IdeenView-CZhoWV4q.js"),__vite__mapDeps([13,12,4,8,7,5])).then(r=>({default:r.IdeenView}))),Bw=g.lazy(()=>Wt(()=>import("./SkillsView-DIrPeuP2.js"),__vite__mapDeps([14,3])).then(r=>({default:r.SkillsView}))),Vw=g.lazy(()=>Wt(()=>import("./ChronikView-xh-P-c-1.js"),__vite__mapDeps([15,5])).then(r=>({default:r.ChronikView}))),Hw=g.lazy(()=>Wt(()=>import("./WissenView-DOBd5fRz.js"),__vite__mapDeps([16,1])).then(r=>({default:r.WissenView})));function Ww(){return d.jsx("div",{className:"flex h-64 items-center justify-center text-muted-foreground",children:d.jsx(sc,{className:"h-5 w-5 animate-spin","aria-label":"Lädt …"})})}const Qw=/Mac|iPhone|iPad/.test(navigator.platform);function Kw(){vw(),Z1();const[r,s]=g.useState(()=>{const S=window.location.hash.slice(1);return os.some(P=>P.id===S)?S:"dashboard"}),i=g.useCallback(S=>{window.location.hash.slice(1)===S?s(S):window.location.hash=S},[]),[a,u]=g.useState(()=>localStorage.getItem("mc_sidebar_collapsed")==="true"),[f,m]=g.useState(!1),[h,y]=g.useState(!1),[k,w]=g.useState("maintenance"),{data:x,isError:R}=ym(),{data:_}=ml();g.useEffect(()=>{document.documentElement.classList.add("dark")},[]),g.useEffect(()=>{const S=P=>{var F;w(((F=P.detail)==null?void 0:F.tab)||"maintenance"),y(!0)};return window.addEventListener("open-system-drawer",S),()=>window.removeEventListener("open-system-drawer",S)},[]),g.useEffect(()=>{const S=P=>{var F;const A=(F=P.detail)==null?void 0:F.view;A&&i(A)};return window.addEventListener("mc-navigate",S),()=>window.removeEventListener("mc-navigate",S)},[i]),g.useEffect(()=>{const S=()=>{const P=window.location.hash.slice(1);os.some(A=>A.id===P)&&s(P)};return window.addEventListener("hashchange",S),()=>window.removeEventListener("hashchange",S)},[]),g.useEffect(()=>{m(!1)},[r]);const D=os.find(S=>S.id===r);return d.jsxs("div",{className:"flex h-full relative",children:[d.jsx("div",{className:"fixed inset-0 -z-50 pointer-events-none",style:{backgroundColor:"hsl(224,30%,6%)",backgroundImage:["radial-gradient(45% 40% at 12% 8%, hsl(172 72% 50% / 0.10), transparent 70%)","radial-gradient(50% 45% at 88% 92%, hsl(270 70% 60% / 0.10), transparent 70%)","radial-gradient(40% 35% at 75% 30%, hsl(239 70% 62% / 0.07), transparent 70%)"].join(", ")}}),d.jsx(c1,{onNavigate:i}),d.jsx(fw,{open:h,onClose:()=>y(!1),defaultTab:k}),d.jsx("aside",{className:Ee("hidden md:flex shrink-0 flex-col border-r border-border/40 bg-card/45 backdrop-blur-md transition-all duration-300 ease-in-out",a?"w-16":"w-60"),children:d.jsx(Jh,{collapsed:a,onToggleCollapse:()=>{u(S=>{const P=!S;return localStorage.setItem("mc_sidebar_collapsed",P.toString()),P})},view:r,health:x,backendDown:R,sysStatus:_})}),d.jsxs("div",{className:Ee("md:hidden fixed inset-0 z-50 transition-opacity duration-200",f?"opacity-100":"pointer-events-none opacity-0"),"aria-hidden":!f,children:[d.jsx("div",{className:"absolute inset-0 bg-black/60",onClick:()=>m(!1)}),d.jsx("aside",{className:Ee("absolute inset-y-0 left-0 flex w-72 max-w-[85vw] flex-col border-r border-border/40 bg-[hsl(224,28%,8%)] transition-transform duration-300 ease-in-out",f?"translate-x-0":"-translate-x-full"),children:d.jsx(Jh,{collapsed:!1,onClose:()=>m(!1),view:r,health:x,backendDown:R,sysStatus:_})})]}),d.jsxs("div",{className:"flex min-w-0 flex-1 flex-col",children:[d.jsxs("header",{className:"flex h-14 shrink-0 items-center justify-between gap-3 border-b border-border/40 px-4 md:px-6 bg-card/20 backdrop-blur-sm",children:[d.jsxs("div",{className:"flex min-w-0 items-center gap-3",children:[d.jsx("button",{onClick:()=>m(!0),className:"md:hidden p-1.5 -ml-1 rounded-md hover:bg-accent text-muted-foreground transition-colors cursor-pointer","aria-label":"Navigation öffnen",children:d.jsx(Ky,{className:"h-5 w-5","aria-hidden":"true"})}),d.jsx("div",{className:"truncate text-xs font-medium text-muted-foreground tracking-wide uppercase font-sans",children:D.hint})]}),d.jsxs("div",{className:"flex shrink-0 items-center gap-2",children:[d.jsx(K1,{}),d.jsx("a",{href:"https://git.tobisniceshomelab.ddnsfree.com/Hitonabi/mission-control-v2/src/branch/main/docs/BEDIENUNG.md",target:"_blank",rel:"noopener",className:"hidden sm:flex h-8 items-center rounded-md border border-border/40 bg-background/40 px-2.5 text-xs text-muted-foreground hover:bg-accent hover:text-accent-foreground transition-all cursor-pointer font-semibold",title:"Bedien-Anleitung",children:"Hilfe"}),d.jsxs("button",{onClick:()=>{const S=new KeyboardEvent("keydown",{key:"k",metaKey:!0});document.dispatchEvent(S)},className:"flex items-center gap-2 rounded-md border border-border/40 bg-background/40 px-2.5 py-1.5 text-xs text-muted-foreground hover:bg-accent hover:text-accent-foreground transition-all cursor-pointer",children:[d.jsx(Dy,{className:"h-3.5 w-3.5"}),d.jsx("span",{className:"hidden sm:inline",children:"Suchen"}),d.jsx("kbd",{className:"hidden sm:inline rounded bg-muted px-1.5 py-0.5 font-mono text-[9px]",children:Qw?"⌘K":"Strg+K"})]})]})]}),d.jsx("main",{className:"flex-1 overflow-y-auto p-4 md:p-6 scrollbar-thin",children:d.jsxs(g.Suspense,{fallback:d.jsx(Ww,{}),children:[r==="dashboard"&&d.jsx(Mw,{onNavigate:S=>i(S)}),r==="ideen"&&d.jsx($w,{}),r==="auftraege"&&d.jsx(Uw,{}),r==="skills"&&d.jsx(Bw,{}),r==="models"&&d.jsx(Dw,{}),r==="connect"&&d.jsx(Aw,{}),r==="wissen"&&d.jsx(Hw,{}),r==="chronik"&&d.jsx(Vw,{}),r==="agent"&&d.jsx(Iw,{}),r==="konsole"&&d.jsx(zw,{}),r==="guide"&&d.jsx(Fw,{})]})})]})]})}function Jh({collapsed:r,onToggleCollapse:s,onClose:i,view:a,health:u,backendDown:f,sysStatus:m}){var h,y,k,w,x;return d.jsxs(d.Fragment,{children:[d.jsxs("div",{className:Ee("flex items-center py-4 border-b border-border/40 shrink-0",r?"flex-col gap-3 px-2":"justify-between px-5"),children:[d.jsxs("div",{className:"flex items-center gap-2 overflow-hidden",children:[d.jsx("div",{className:"h-7 w-7 rounded-lg bg-primary shadow-md shadow-primary/20 shrink-0"}),!r&&d.jsxs("div",{className:"leading-tight",children:[d.jsx("div",{className:"text-sm font-semibold tracking-wide font-space",children:"Mission Control"}),d.jsx("div",{className:"text-xs text-muted-foreground",children:"2.0"})]})]}),s&&d.jsx("button",{onClick:s,className:"p-1 rounded-md hover:bg-accent text-muted-foreground transition-colors cursor-pointer","aria-label":r?"Seitenleiste ausklappen":"Seitenleiste einklappen",title:r?"Maximieren":"Minimieren",children:r?d.jsx(ko,{className:"h-4 w-4","aria-hidden":"true"}):d.jsx(My,{className:"h-4 w-4","aria-hidden":"true"})}),i&&d.jsx("button",{onClick:i,className:"p-1 rounded-md hover:bg-accent text-muted-foreground transition-colors cursor-pointer","aria-label":"Navigation schließen",children:d.jsx(ul,{className:"h-4 w-4","aria-hidden":"true"})})]}),d.jsx("nav",{className:"flex-1 space-y-1 px-3 py-4 overflow-y-auto",children:(()=>{let R=null;return os.map(_=>{const D=_.group!==R;return R=_.group,d.jsxs("div",{className:"space-y-1",children:[D&&(r?R!==os[0].group&&d.jsx("div",{className:"my-3 border-t border-border/30"}):d.jsx("div",{className:"mt-5 mb-1.5 px-3 text-[10px] font-bold uppercase tracking-widest text-muted-foreground/40 first:mt-0 select-none",children:_.group})),d.jsxs("a",{href:`#${_.id}`,onClick:i,"aria-current":a===_.id?"page":void 0,className:Ee("flex w-full items-center rounded-md text-sm transition-all cursor-pointer",r?"justify-center p-2.5":"gap-3 px-3 py-2",a===_.id?r?"nav-active-collapsed":"nav-active":"text-muted-foreground hover:bg-accent hover:text-accent-foreground"),title:r?_.label:void 0,"aria-label":r?_.label:void 0,children:[d.jsx(_.icon,{className:"h-4.5 w-4.5 shrink-0","aria-hidden":"true"}),!r&&d.jsx("span",{className:"truncate",children:_.label})]})]},_.id)})})()}),d.jsx("div",{className:Ee("py-3 text-xs text-muted-foreground border-t border-border/40 shrink-0",r?"px-2 text-center":"px-5"),children:r?d.jsx("div",{className:"flex justify-center",children:d.jsx("span",{className:Ee("h-2.5 w-2.5 rounded-full ring-2 ring-black/40",f||!u?"bg-red-500":u.engine_reachable?u.brain&&!u.brain.ready?"bg-amber-500 animate-pulse":"bg-emerald-500 animate-pulse":"bg-amber-500"),title:f?"Zentrale antwortet nicht — Anzeigen evtl. veraltet":u?u.engine_reachable?u.brain&&!u.brain.ready?`Hirn offline (${u.brain.model??"fast"})`:"Engine + Hirn online":"Engine offline":"Backend offline"})}):d.jsxs("div",{className:"space-y-2 text-left",children:[f?d.jsxs("span",{className:"flex items-center gap-2 text-red-400",children:[d.jsx("span",{className:"h-2 w-2 rounded-full bg-red-500 animate-pulse"}),d.jsx("span",{className:"truncate",children:"Zentrale antwortet nicht"})]}):u?d.jsxs(d.Fragment,{children:[d.jsxs("span",{className:"flex items-center gap-2",children:[d.jsx("span",{className:Ee("h-2 w-2 rounded-full animate-pulse",u.engine_reachable?"bg-emerald-500":"bg-amber-500")}),d.jsxs("span",{className:"truncate",children:["Engine ",u.engine_reachable?"online":"offline"]})]}),u.brain&&!u.brain.ready&&d.jsxs("span",{className:"flex items-center gap-2 text-amber-400",title:`Agent-Hirn '${u.brain.model??"fast"}' lädt nicht/abgestürzt`,children:[d.jsx("span",{className:"h-2 w-2 rounded-full bg-amber-500 animate-pulse"}),d.jsxs("span",{className:"truncate",children:["Hirn offline",u.brain.model?` (${u.brain.model})`:""]})]})]}):d.jsxs("span",{className:"flex items-center gap-2",children:[d.jsx("span",{className:"h-2 w-2 rounded-full bg-red-500"})," ",d.jsx("span",{className:"truncate",children:"Backend offline"})]}),(m==null?void 0:m.versions)&&d.jsxs("div",{className:"space-y-1 text-[9px] text-muted-foreground/60 mt-2 pt-2 border-t border-border/30",children:[d.jsxs("div",{className:"truncate",title:m.versions.mc2?`${m.versions.mc2.branch}-${m.versions.mc2.hash}${m.versions.mc2.dirty?"*":""} (${m.versions.mc2.date})`:"nicht gefunden",children:[d.jsx("strong",{children:"MC2:"})," ",m.versions.mc2?`${m.versions.mc2.hash}${m.versions.mc2.dirty?"*":""}`:"—"]}),d.jsxs("div",{className:"truncate",title:((h=m.versions.engine)==null?void 0:h.type)==="git"?`${m.versions.engine.branch}-${m.versions.engine.hash}${m.versions.engine.dirty?"*":""} (${m.versions.engine.date})`:((y=m.versions.engine)==null?void 0:y.version_text)||"unbekannt",children:[d.jsx("strong",{children:"Engine:"})," ",((k=m.versions.engine)==null?void 0:k.type)==="git"?`${m.versions.engine.hash}${m.versions.engine.dirty?"*":""}`:((x=(w=m.versions.engine)==null?void 0:w.version_text)==null?void 0:x.split(" ").pop())||"—"]}),d.jsxs("div",{className:"truncate",title:m.versions.hermes_agent?`${m.versions.hermes_agent.branch}-${m.versions.hermes_agent.hash}${m.versions.hermes_agent.dirty?"*":""} (${m.versions.hermes_agent.date})`:"nicht gefunden",children:[d.jsx("strong",{children:"Hermes Agent:"})," ",m.versions.hermes_agent?`${m.versions.hermes_agent.hash}${m.versions.hermes_agent.dirty?"*":""}`:"—"]})]})]})})]})}class qw extends Yu.Component{constructor(){super(...arguments);ih(this,"state",{error:null})}static getDerivedStateFromError(i){return{error:i}}componentDidCatch(i,a){console.error("Unbehandelter UI-Fehler:",i,a.componentStack)}render(){return this.state.error?d.jsx("div",{className:"min-h-screen flex items-center justify-center bg-neutral-950 text-neutral-200 p-8",children:d.jsxs("div",{className:"max-w-lg space-y-4 text-center",children:[d.jsx("div",{className:"text-2xl",children:"Da ist etwas schiefgelaufen."}),d.jsx("div",{className:"text-sm text-neutral-400 break-all",children:this.state.error.message}),d.jsx("button",{className:"px-4 py-2 rounded-lg bg-neutral-800 hover:bg-neutral-700 border border-neutral-700",onClick:()=>window.location.reload(),children:"Neu laden"})]})}):this.props.children}}const Gw=new ly({defaultOptions:{queries:{retry:1,refetchOnWindowFocus:!1,staleTime:5e3}}});Dv.createRoot(document.getElementById("root")).render(d.jsx(Yu.StrictMode,{children:d.jsx(qw,{children:d.jsx(ay,{client:Gw,children:d.jsx(Kw,{})})})}));export{zy as $,rw as A,_y as B,Ry as C,Ch as D,zu as E,ko as F,Oy as G,Uy as H,nw as I,Ay as J,Yw as K,sc as L,jo as M,Ny as N,lc as O,Gy as P,e0 as Q,ss as R,Zy as S,Co as T,vo as U,al as V,n0 as W,ul as X,Np as Y,oc as Z,Qy as _,ok as a,Jy as a0,Y1 as a1,X1 as a2,Ty as a3,hk as a4,rc as a5,ek as a6,jp as a7,Iy as a8,Do as a9,Nu as aa,So as ab,sy as ac,ot as ad,bt as ae,mp as af,Be as ag,tw as ah,dk as ai,tk as aj,By as ak,ic as al,$y as am,J1 as an,Yu as ao,cp as ap,nk as aq,rk as ar,Wy as as,p1 as at,Zu as au,Rp as av,Xu as aw,Ee as b,ge as c,Jw as d,jy as e,wm as f,sk as g,ml as h,ik as i,d as j,vm as k,ck as l,ak as m,Se as n,ts as o,h1 as p,Pe as q,g as r,Xw as s,Cp as t,ll as u,fk as v,lk as w,bm as x,bu as y,uk as z}; diff --git a/frontend/dist/assets/index-BYlMs6Dj.js b/frontend/dist/assets/index-BYlMs6Dj.js new file mode 100644 index 0000000..e83053a --- /dev/null +++ b/frontend/dist/assets/index-BYlMs6Dj.js @@ -0,0 +1,360 @@ +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/LiveAreaChartImpl-Bb72EW29.js","assets/string-DoZi9Vij.js","assets/ModelsView-BYDzvdzC.js","assets/JobsBar-B1nmMx5i.js","assets/code-xml-DZ6lLr-w.js","assets/rotate-ccw-Dx0bZ_kA.js","assets/zap-B_VSdjfC.js","assets/chevron-down-D5zhK_UQ.js","assets/layers-DCwnbkXd.js","assets/ConnectView-Cz-npKrg.js","assets/GuideView-CP1Y1rbp.js","assets/AuftragsbuchView-C0bzCKZ0.js","assets/SectionLabel-R1yae0WQ.js","assets/IdeenView-wVxyfCCm.js","assets/SkillsView-C5MWeKc5.js","assets/ChronikView-Bz_yVFvS.js","assets/WissenView-DOJLqZxA.js"])))=>i.map(i=>d[i]); +var Nv=Object.defineProperty;var ih=r=>{throw TypeError(r)};var jv=(r,s,o)=>s in r?Nv(r,s,{enumerable:!0,configurable:!0,writable:!0,value:o}):r[s]=o;var Qo=(r,s,o)=>jv(r,typeof s!="symbol"?s+"":s,o),au=(r,s,o)=>s.has(r)||ih("Cannot "+o);var E=(r,s,o)=>(au(r,s,"read from private field"),o?o.call(r):s.get(r)),pe=(r,s,o)=>s.has(r)?ih("Cannot add the same private member more than once"):s instanceof WeakSet?s.add(r):s.set(r,o),J=(r,s,o,a)=>(au(r,s,"write to private field"),a?a.call(r,o):s.set(r,o),o),_e=(r,s,o)=>(au(r,s,"access private method"),o);var Ko=(r,s,o,a)=>({set _(u){J(r,s,u,o)},get _(){return E(r,s,a)}});function Cv(r,s){for(var o=0;oa[u]})}}}return Object.freeze(Object.defineProperty(r,Symbol.toStringTag,{value:"Module"}))}(function(){const s=document.createElement("link").relList;if(s&&s.supports&&s.supports("modulepreload"))return;for(const u of document.querySelectorAll('link[rel="modulepreload"]'))a(u);new MutationObserver(u=>{for(const f of u)if(f.type==="childList")for(const m of f.addedNodes)m.tagName==="LINK"&&m.rel==="modulepreload"&&a(m)}).observe(document,{childList:!0,subtree:!0});function o(u){const f={};return u.integrity&&(f.integrity=u.integrity),u.referrerPolicy&&(f.referrerPolicy=u.referrerPolicy),u.crossOrigin==="use-credentials"?f.credentials="include":u.crossOrigin==="anonymous"?f.credentials="omit":f.credentials="same-origin",f}function a(u){if(u.ep)return;u.ep=!0;const f=o(u);fetch(u.href,f)}})();function ap(r){return r&&r.__esModule&&Object.prototype.hasOwnProperty.call(r,"default")?r.default:r}var uu={exports:{}},fi={},cu={exports:{}},je={};/** + * @license React + * react.production.min.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. + */var oh;function _v(){if(oh)return je;oh=1;var r=Symbol.for("react.element"),s=Symbol.for("react.portal"),o=Symbol.for("react.fragment"),a=Symbol.for("react.strict_mode"),u=Symbol.for("react.profiler"),f=Symbol.for("react.provider"),m=Symbol.for("react.context"),h=Symbol.for("react.forward_ref"),y=Symbol.for("react.suspense"),k=Symbol.for("react.memo"),w=Symbol.for("react.lazy"),x=Symbol.iterator;function P(C){return C===null||typeof C!="object"?null:(C=x&&C[x]||C["@@iterator"],typeof C=="function"?C:null)}var _={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},D=Object.assign,b={};function R(C,N,q){this.props=C,this.context=N,this.refs=b,this.updater=q||_}R.prototype.isReactComponent={},R.prototype.setState=function(C,N){if(typeof C!="object"&&typeof C!="function"&&C!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,C,N,"setState")},R.prototype.forceUpdate=function(C){this.updater.enqueueForceUpdate(this,C,"forceUpdate")};function A(){}A.prototype=R.prototype;function I(C,N,q){this.props=C,this.context=N,this.refs=b,this.updater=q||_}var V=I.prototype=new A;V.constructor=I,D(V,R.prototype),V.isPureReactComponent=!0;var z=Array.isArray,K=Object.prototype.hasOwnProperty,G={current:null},ue={key:!0,ref:!0,__self:!0,__source:!0};function oe(C,N,q){var Y,W={},se=null,de=null;if(N!=null)for(Y in N.ref!==void 0&&(de=N.ref),N.key!==void 0&&(se=""+N.key),N)K.call(N,Y)&&!ue.hasOwnProperty(Y)&&(W[Y]=N[Y]);var ye=arguments.length-2;if(ye===1)W.children=q;else if(1>>1,N=F[C];if(0>>1;Cu(W,Q))seu(de,W)?(F[C]=de,F[se]=Q,C=se):(F[C]=W,F[Y]=Q,C=Y);else if(seu(de,Q))F[C]=de,F[se]=Q,C=se;else break e}}return ne}function u(F,ne){var Q=F.sortIndex-ne.sortIndex;return Q!==0?Q:F.id-ne.id}if(typeof performance=="object"&&typeof performance.now=="function"){var f=performance;r.unstable_now=function(){return f.now()}}else{var m=Date,h=m.now();r.unstable_now=function(){return m.now()-h}}var y=[],k=[],w=1,x=null,P=3,_=!1,D=!1,b=!1,R=typeof setTimeout=="function"?setTimeout:null,A=typeof clearTimeout=="function"?clearTimeout:null,I=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function V(F){for(var ne=o(k);ne!==null;){if(ne.callback===null)a(k);else if(ne.startTime<=F)a(k),ne.sortIndex=ne.expirationTime,s(y,ne);else break;ne=o(k)}}function z(F){if(b=!1,V(F),!D)if(o(y)!==null)D=!0,Ce(K);else{var ne=o(k);ne!==null&&Ne(z,ne.startTime-F)}}function K(F,ne){D=!1,b&&(b=!1,A(oe),oe=-1),_=!0;var Q=P;try{for(V(ne),x=o(y);x!==null&&(!(x.expirationTime>ne)||F&&!ke());){var C=x.callback;if(typeof C=="function"){x.callback=null,P=x.priorityLevel;var N=C(x.expirationTime<=ne);ne=r.unstable_now(),typeof N=="function"?x.callback=N:x===o(y)&&a(y),V(ne)}else a(y);x=o(y)}if(x!==null)var q=!0;else{var Y=o(k);Y!==null&&Ne(z,Y.startTime-ne),q=!1}return q}finally{x=null,P=Q,_=!1}}var G=!1,ue=null,oe=-1,ee=5,me=-1;function ke(){return!(r.unstable_now()-meF||125C?(F.sortIndex=Q,s(k,F),o(y)===null&&F===o(k)&&(b?(A(oe),oe=-1):b=!0,Ne(z,Q-C))):(F.sortIndex=N,s(y,F),D||_||(D=!0,Ce(K))),F},r.unstable_shouldYield=ke,r.unstable_wrapCallback=function(F){var ne=P;return function(){var Q=P;P=ne;try{return F.apply(this,arguments)}finally{P=Q}}}})(hu)),hu}var dh;function Ov(){return dh||(dh=1,fu.exports=Mv()),fu.exports}/** + * @license React + * react-dom.production.min.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. + */var fh;function Tv(){if(fh)return wt;fh=1;var r=Xu(),s=Ov();function o(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),y=Object.prototype.hasOwnProperty,k=/^[: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][: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\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,w={},x={};function P(e){return y.call(x,e)?!0:y.call(w,e)?!1:k.test(e)?x[e]=!0:(w[e]=!0,!1)}function _(e,t,n,i){if(n!==null&&n.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return i?!1:n!==null?!n.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function D(e,t,n,i){if(t===null||typeof t>"u"||_(e,t,n,i))return!0;if(i)return!1;if(n!==null)switch(n.type){case 3:return!t;case 4:return t===!1;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function b(e,t,n,i,l,c,p){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=i,this.attributeNamespace=l,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=c,this.removeEmptyString=p}var R={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){R[e]=new b(e,0,!1,e,null,!1,!1)}),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];R[t]=new b(t,1,!1,e[1],null,!1,!1)}),["contentEditable","draggable","spellCheck","value"].forEach(function(e){R[e]=new b(e,2,!1,e.toLowerCase(),null,!1,!1)}),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){R[e]=new b(e,2,!1,e,null,!1,!1)}),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){R[e]=new b(e,3,!1,e.toLowerCase(),null,!1,!1)}),["checked","multiple","muted","selected"].forEach(function(e){R[e]=new b(e,3,!0,e,null,!1,!1)}),["capture","download"].forEach(function(e){R[e]=new b(e,4,!1,e,null,!1,!1)}),["cols","rows","size","span"].forEach(function(e){R[e]=new b(e,6,!1,e,null,!1,!1)}),["rowSpan","start"].forEach(function(e){R[e]=new b(e,5,!1,e.toLowerCase(),null,!1,!1)});var A=/[\-:]([a-z])/g;function I(e){return e[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".split(" ").forEach(function(e){var t=e.replace(A,I);R[t]=new b(t,1,!1,e,null,!1,!1)}),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(A,I);R[t]=new b(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)}),["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(A,I);R[t]=new b(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)}),["tabIndex","crossOrigin"].forEach(function(e){R[e]=new b(e,1,!1,e.toLowerCase(),null,!1,!1)}),R.xlinkHref=new b("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach(function(e){R[e]=new b(e,1,!1,e.toLowerCase(),null,!0,!0)});function V(e,t,n,i){var l=R.hasOwnProperty(t)?R[t]:null;(l!==null?l.type!==0:i||!(2v||l[p]!==c[v]){var S=` +`+l[p].replace(" at new "," at ");return e.displayName&&S.includes("")&&(S=S.replace("",e.displayName)),S}while(1<=p&&0<=v);break}}}finally{q=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?N(e):""}function W(e){switch(e.tag){case 5:return N(e.type);case 16:return N("Lazy");case 13:return N("Suspense");case 19:return N("SuspenseList");case 0:case 2:case 15:return e=Y(e.type,!1),e;case 11:return e=Y(e.type.render,!1),e;case 1:return e=Y(e.type,!0),e;default:return""}}function se(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case ue:return"Fragment";case G:return"Portal";case ee:return"Profiler";case oe:return"StrictMode";case Le:return"Suspense";case Z:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case ke:return(e.displayName||"Context")+".Consumer";case me:return(e._context.displayName||"Context")+".Provider";case le:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case ce:return t=e.displayName||null,t!==null?t:se(e.type)||"Memo";case Ce:t=e._payload,e=e._init;try{return se(e(t))}catch{}}return null}function de(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return se(t);case 8:return t===oe?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function ye(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function we(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function Ge(e){var t=we(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),i=""+e[t];if(!e.hasOwnProperty(t)&&typeof n<"u"&&typeof n.get=="function"&&typeof n.set=="function"){var l=n.get,c=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return l.call(this)},set:function(p){i=""+p,c.call(this,p)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return i},setValue:function(p){i=""+p},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function Sr(e){e._valueTracker||(e._valueTracker=Ge(e))}function Ns(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),i="";return e&&(i=we(e)?e.checked?"true":"false":e.value),e=i,e!==n?(t.setValue(e),!0):!1}function Er(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function rn(e,t){var n=t.checked;return Q({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:n??e._wrapperState.initialChecked})}function js(e,t){var n=t.defaultValue==null?"":t.defaultValue,i=t.checked!=null?t.checked:t.defaultChecked;n=ye(t.value!=null?t.value:n),e._wrapperState={initialChecked:i,initialValue:n,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function Nr(e,t){t=t.checked,t!=null&&V(e,"checked",t,!1)}function jr(e,t){Nr(e,t);var n=ye(t.value),i=t.type;if(n!=null)i==="number"?(n===0&&e.value===""||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if(i==="submit"||i==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?L(e,t.type,n):t.hasOwnProperty("defaultValue")&&L(e,t.type,ye(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function Cs(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var i=t.type;if(!(i!=="submit"&&i!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}n=e.name,n!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,n!==""&&(e.name=n)}function L(e,t,n){(t!=="number"||Er(e.ownerDocument)!==e)&&(n==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}var xe=Array.isArray;function ze(e,t,n,i){if(e=e.options,t){t={};for(var l=0;l"+t.valueOf().toString()+"",t=zi.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function _s(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&n.nodeType===3){n.nodeValue=t;return}}e.textContent=t}var Ps={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},Pm=["Webkit","ms","Moz","O"];Object.keys(Ps).forEach(function(e){Pm.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),Ps[t]=Ps[e]})});function xc(e,t,n){return t==null||typeof t=="boolean"||t===""?"":n||typeof t!="number"||t===0||Ps.hasOwnProperty(e)&&Ps[e]?(""+t).trim():t+"px"}function wc(e,t){e=e.style;for(var n in t)if(t.hasOwnProperty(n)){var i=n.indexOf("--")===0,l=xc(n,t[n],i);n==="float"&&(n="cssFloat"),i?e.setProperty(n,l):e[n]=l}}var Rm=Q({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function wl(e,t){if(t){if(Rm[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(o(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(o(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(o(61))}if(t.style!=null&&typeof t.style!="object")throw Error(o(62))}}function kl(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var bl=null;function Sl(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var El=null,Cr=null,_r=null;function kc(e){if(e=Ys(e)){if(typeof El!="function")throw Error(o(280));var t=e.stateNode;t&&(t=oo(t),El(e.stateNode,e.type,t))}}function bc(e){Cr?_r?_r.push(e):_r=[e]:Cr=e}function Sc(){if(Cr){var e=Cr,t=_r;if(_r=Cr=null,kc(e),t)for(e=0;e>>=0,e===0?32:31-($m(e)/Bm|0)|0}var Bi=64,Vi=4194304;function Ts(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function Hi(e,t){var n=e.pendingLanes;if(n===0)return 0;var i=0,l=e.suspendedLanes,c=e.pingedLanes,p=n&268435455;if(p!==0){var v=p&~l;v!==0?i=Ts(v):(c&=p,c!==0&&(i=Ts(c)))}else p=n&~l,p!==0?i=Ts(p):c!==0&&(i=Ts(c));if(i===0)return 0;if(t!==0&&t!==i&&(t&l)===0&&(l=i&-i,c=t&-t,l>=c||l===16&&(c&4194240)!==0))return t;if((i&4)!==0&&(i|=n&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=i;0n;n++)t.push(e);return t}function Ls(e,t,n){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-zt(t),e[t]=n}function Qm(e,t){var n=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var i=e.eventTimes;for(e=e.expirationTimes;0=Bs),Yc=" ",Xc=!1;function Jc(e,t){switch(e){case"keyup":return wg.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function ed(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var Mr=!1;function bg(e,t){switch(e){case"compositionend":return ed(t);case"keypress":return t.which!==32?null:(Xc=!0,Yc);case"textInput":return e=t.data,e===Yc&&Xc?null:e;default:return null}}function Sg(e,t){if(Mr)return e==="compositionend"||!Bl&&Jc(e,t)?(e=Wc(),Gi=Al=bn=null,Mr=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=i}e:{for(;n;){if(n.nextSibling){n=n.nextSibling;break e}n=n.parentNode}n=void 0}n=ld(n)}}function ud(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?ud(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function cd(){for(var e=window,t=Er();t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href=="string"}catch{n=!1}if(n)e=t.contentWindow;else break;t=Er(e.document)}return t}function Wl(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function Og(e){var t=cd(),n=e.focusedElem,i=e.selectionRange;if(t!==n&&n&&n.ownerDocument&&ud(n.ownerDocument.documentElement,n)){if(i!==null&&Wl(n)){if(t=i.start,e=i.end,e===void 0&&(e=t),"selectionStart"in n)n.selectionStart=t,n.selectionEnd=Math.min(e,n.value.length);else if(e=(t=n.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var l=n.textContent.length,c=Math.min(i.start,l);i=i.end===void 0?c:Math.min(i.end,l),!e.extend&&c>i&&(l=i,i=c,c=l),l=ad(n,c);var p=ad(n,i);l&&p&&(e.rangeCount!==1||e.anchorNode!==l.node||e.anchorOffset!==l.offset||e.focusNode!==p.node||e.focusOffset!==p.offset)&&(t=t.createRange(),t.setStart(l.node,l.offset),e.removeAllRanges(),c>i?(e.addRange(t),e.extend(p.node,p.offset)):(t.setEnd(p.node,p.offset),e.addRange(t)))}}for(t=[],e=n;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof n.focus=="function"&&n.focus(),n=0;n=document.documentMode,Or=null,Ql=null,Qs=null,Kl=!1;function dd(e,t,n){var i=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;Kl||Or==null||Or!==Er(i)||(i=Or,"selectionStart"in i&&Wl(i)?i={start:i.selectionStart,end:i.selectionEnd}:(i=(i.ownerDocument&&i.ownerDocument.defaultView||window).getSelection(),i={anchorNode:i.anchorNode,anchorOffset:i.anchorOffset,focusNode:i.focusNode,focusOffset:i.focusOffset}),Qs&&Ws(Qs,i)||(Qs=i,i=ro(Ql,"onSelect"),0zr||(e.current=ia[zr],ia[zr]=null,zr--)}function Ae(e,t){zr++,ia[zr]=e.current,e.current=t}var jn={},lt=Nn(jn),mt=Nn(!1),er=jn;function Fr(e,t){var n=e.type.contextTypes;if(!n)return jn;var i=e.stateNode;if(i&&i.__reactInternalMemoizedUnmaskedChildContext===t)return i.__reactInternalMemoizedMaskedChildContext;var l={},c;for(c in n)l[c]=t[c];return i&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=l),l}function gt(e){return e=e.childContextTypes,e!=null}function lo(){Ie(mt),Ie(lt)}function jd(e,t,n){if(lt.current!==jn)throw Error(o(168));Ae(lt,t),Ae(mt,n)}function Cd(e,t,n){var i=e.stateNode;if(t=t.childContextTypes,typeof i.getChildContext!="function")return n;i=i.getChildContext();for(var l in i)if(!(l in t))throw Error(o(108,de(e)||"Unknown",l));return Q({},n,i)}function ao(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||jn,er=lt.current,Ae(lt,e),Ae(mt,mt.current),!0}function _d(e,t,n){var i=e.stateNode;if(!i)throw Error(o(169));n?(e=Cd(e,t,er),i.__reactInternalMemoizedMergedChildContext=e,Ie(mt),Ie(lt),Ae(lt,e)):Ie(mt),Ae(mt,n)}var on=null,uo=!1,oa=!1;function Pd(e){on===null?on=[e]:on.push(e)}function Hg(e){uo=!0,Pd(e)}function Cn(){if(!oa&&on!==null){oa=!0;var e=0,t=De;try{var n=on;for(De=1;e>=p,l-=p,ln=1<<32-zt(t)+l|n<ve?(tt=he,he=null):tt=he.sibling;var Oe=U(M,he,O[ve],H);if(Oe===null){he===null&&(he=tt);break}e&&he&&Oe.alternate===null&&t(M,he),j=c(Oe,j,ve),fe===null?ae=Oe:fe.sibling=Oe,fe=Oe,he=tt}if(ve===O.length)return n(M,he),$e&&nr(M,ve),ae;if(he===null){for(;veve?(tt=he,he=null):tt=he.sibling;var An=U(M,he,Oe.value,H);if(An===null){he===null&&(he=tt);break}e&&he&&An.alternate===null&&t(M,he),j=c(An,j,ve),fe===null?ae=An:fe.sibling=An,fe=An,he=tt}if(Oe.done)return n(M,he),$e&&nr(M,ve),ae;if(he===null){for(;!Oe.done;ve++,Oe=O.next())Oe=B(M,Oe.value,H),Oe!==null&&(j=c(Oe,j,ve),fe===null?ae=Oe:fe.sibling=Oe,fe=Oe);return $e&&nr(M,ve),ae}for(he=i(M,he);!Oe.done;ve++,Oe=O.next())Oe=X(he,M,ve,Oe.value,H),Oe!==null&&(e&&Oe.alternate!==null&&he.delete(Oe.key===null?ve:Oe.key),j=c(Oe,j,ve),fe===null?ae=Oe:fe.sibling=Oe,fe=Oe);return e&&he.forEach(function(Ev){return t(M,Ev)}),$e&&nr(M,ve),ae}function qe(M,j,O,H){if(typeof O=="object"&&O!==null&&O.type===ue&&O.key===null&&(O=O.props.children),typeof O=="object"&&O!==null){switch(O.$$typeof){case K:e:{for(var ae=O.key,fe=j;fe!==null;){if(fe.key===ae){if(ae=O.type,ae===ue){if(fe.tag===7){n(M,fe.sibling),j=l(fe,O.props.children),j.return=M,M=j;break e}}else if(fe.elementType===ae||typeof ae=="object"&&ae!==null&&ae.$$typeof===Ce&&Dd(ae)===fe.type){n(M,fe.sibling),j=l(fe,O.props),j.ref=Xs(M,fe,O),j.return=M,M=j;break e}n(M,fe);break}else t(M,fe);fe=fe.sibling}O.type===ue?(j=cr(O.props.children,M.mode,H,O.key),j.return=M,M=j):(H=Fo(O.type,O.key,O.props,null,M.mode,H),H.ref=Xs(M,j,O),H.return=M,M=H)}return p(M);case G:e:{for(fe=O.key;j!==null;){if(j.key===fe)if(j.tag===4&&j.stateNode.containerInfo===O.containerInfo&&j.stateNode.implementation===O.implementation){n(M,j.sibling),j=l(j,O.children||[]),j.return=M,M=j;break e}else{n(M,j);break}else t(M,j);j=j.sibling}j=ru(O,M.mode,H),j.return=M,M=j}return p(M);case Ce:return fe=O._init,qe(M,j,fe(O._payload),H)}if(xe(O))return re(M,j,O,H);if(ne(O))return ie(M,j,O,H);po(M,O)}return typeof O=="string"&&O!==""||typeof O=="number"?(O=""+O,j!==null&&j.tag===6?(n(M,j.sibling),j=l(j,O),j.return=M,M=j):(n(M,j),j=nu(O,M.mode,H),j.return=M,M=j),p(M)):n(M,j)}return qe}var Br=Ad(!0),zd=Ad(!1),mo=Nn(null),go=null,Vr=null,fa=null;function ha(){fa=Vr=go=null}function pa(e){var t=mo.current;Ie(mo),e._currentValue=t}function ma(e,t,n){for(;e!==null;){var i=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,i!==null&&(i.childLanes|=t)):i!==null&&(i.childLanes&t)!==t&&(i.childLanes|=t),e===n)break;e=e.return}}function Hr(e,t){go=e,fa=Vr=null,e=e.dependencies,e!==null&&e.firstContext!==null&&((e.lanes&t)!==0&&(vt=!0),e.firstContext=null)}function Ot(e){var t=e._currentValue;if(fa!==e)if(e={context:e,memoizedValue:t,next:null},Vr===null){if(go===null)throw Error(o(308));Vr=e,go.dependencies={lanes:0,firstContext:e}}else Vr=Vr.next=e;return t}var rr=null;function ga(e){rr===null?rr=[e]:rr.push(e)}function Fd(e,t,n,i){var l=t.interleaved;return l===null?(n.next=n,ga(t)):(n.next=l.next,l.next=n),t.interleaved=n,un(e,i)}function un(e,t){e.lanes|=t;var n=e.alternate;for(n!==null&&(n.lanes|=t),n=e,e=e.return;e!==null;)e.childLanes|=t,n=e.alternate,n!==null&&(n.childLanes|=t),n=e,e=e.return;return n.tag===3?n.stateNode:null}var _n=!1;function va(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function Id(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function cn(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function Pn(e,t,n){var i=e.updateQueue;if(i===null)return null;if(i=i.shared,(Me&2)!==0){var l=i.pending;return l===null?t.next=t:(t.next=l.next,l.next=t),i.pending=t,un(e,n)}return l=i.interleaved,l===null?(t.next=t,ga(i)):(t.next=l.next,l.next=t),i.interleaved=t,un(e,n)}function vo(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,(n&4194240)!==0)){var i=t.lanes;i&=e.pendingLanes,n|=i,t.lanes=n,Ml(e,n)}}function Ud(e,t){var n=e.updateQueue,i=e.alternate;if(i!==null&&(i=i.updateQueue,n===i)){var l=null,c=null;if(n=n.firstBaseUpdate,n!==null){do{var p={eventTime:n.eventTime,lane:n.lane,tag:n.tag,payload:n.payload,callback:n.callback,next:null};c===null?l=c=p:c=c.next=p,n=n.next}while(n!==null);c===null?l=c=t:c=c.next=t}else l=c=t;n={baseState:i.baseState,firstBaseUpdate:l,lastBaseUpdate:c,shared:i.shared,effects:i.effects},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}function yo(e,t,n,i){var l=e.updateQueue;_n=!1;var c=l.firstBaseUpdate,p=l.lastBaseUpdate,v=l.shared.pending;if(v!==null){l.shared.pending=null;var S=v,T=S.next;S.next=null,p===null?c=T:p.next=T,p=S;var $=e.alternate;$!==null&&($=$.updateQueue,v=$.lastBaseUpdate,v!==p&&(v===null?$.firstBaseUpdate=T:v.next=T,$.lastBaseUpdate=S))}if(c!==null){var B=l.baseState;p=0,$=T=S=null,v=c;do{var U=v.lane,X=v.eventTime;if((i&U)===U){$!==null&&($=$.next={eventTime:X,lane:0,tag:v.tag,payload:v.payload,callback:v.callback,next:null});e:{var re=e,ie=v;switch(U=t,X=n,ie.tag){case 1:if(re=ie.payload,typeof re=="function"){B=re.call(X,B,U);break e}B=re;break e;case 3:re.flags=re.flags&-65537|128;case 0:if(re=ie.payload,U=typeof re=="function"?re.call(X,B,U):re,U==null)break e;B=Q({},B,U);break e;case 2:_n=!0}}v.callback!==null&&v.lane!==0&&(e.flags|=64,U=l.effects,U===null?l.effects=[v]:U.push(v))}else X={eventTime:X,lane:U,tag:v.tag,payload:v.payload,callback:v.callback,next:null},$===null?(T=$=X,S=B):$=$.next=X,p|=U;if(v=v.next,v===null){if(v=l.shared.pending,v===null)break;U=v,v=U.next,U.next=null,l.lastBaseUpdate=U,l.shared.pending=null}}while(!0);if($===null&&(S=B),l.baseState=S,l.firstBaseUpdate=T,l.lastBaseUpdate=$,t=l.shared.interleaved,t!==null){l=t;do p|=l.lane,l=l.next;while(l!==t)}else c===null&&(l.shared.lanes=0);or|=p,e.lanes=p,e.memoizedState=B}}function $d(e,t,n){if(e=t.effects,t.effects=null,e!==null)for(t=0;tn?n:4,e(!0);var i=ba.transition;ba.transition={};try{e(!1),t()}finally{De=n,ba.transition=i}}function lf(){return Tt().memoizedState}function qg(e,t,n){var i=Tn(e);if(n={lane:i,action:n,hasEagerState:!1,eagerState:null,next:null},af(e))uf(t,n);else if(n=Fd(e,t,n,i),n!==null){var l=ht();Vt(n,e,i,l),cf(n,t,i)}}function Gg(e,t,n){var i=Tn(e),l={lane:i,action:n,hasEagerState:!1,eagerState:null,next:null};if(af(e))uf(t,l);else{var c=e.alternate;if(e.lanes===0&&(c===null||c.lanes===0)&&(c=t.lastRenderedReducer,c!==null))try{var p=t.lastRenderedState,v=c(p,n);if(l.hasEagerState=!0,l.eagerState=v,Ft(v,p)){var S=t.interleaved;S===null?(l.next=l,ga(t)):(l.next=S.next,S.next=l),t.interleaved=l;return}}catch{}finally{}n=Fd(e,t,l,i),n!==null&&(l=ht(),Vt(n,e,i,l),cf(n,t,i))}}function af(e){var t=e.alternate;return e===He||t!==null&&t===He}function uf(e,t){ni=ko=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function cf(e,t,n){if((n&4194240)!==0){var i=t.lanes;i&=e.pendingLanes,n|=i,t.lanes=n,Ml(e,n)}}var Eo={readContext:Ot,useCallback:at,useContext:at,useEffect:at,useImperativeHandle:at,useInsertionEffect:at,useLayoutEffect:at,useMemo:at,useReducer:at,useRef:at,useState:at,useDebugValue:at,useDeferredValue:at,useTransition:at,useMutableSource:at,useSyncExternalStore:at,useId:at,unstable_isNewReconciler:!1},Zg={readContext:Ot,useCallback:function(e,t){return Zt().memoizedState=[e,t===void 0?null:t],e},useContext:Ot,useEffect:Xd,useImperativeHandle:function(e,t,n){return n=n!=null?n.concat([e]):null,bo(4194308,4,tf.bind(null,t,e),n)},useLayoutEffect:function(e,t){return bo(4194308,4,e,t)},useInsertionEffect:function(e,t){return bo(4,2,e,t)},useMemo:function(e,t){var n=Zt();return t=t===void 0?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var i=Zt();return t=n!==void 0?n(t):t,i.memoizedState=i.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},i.queue=e,e=e.dispatch=qg.bind(null,He,e),[i.memoizedState,e]},useRef:function(e){var t=Zt();return e={current:e},t.memoizedState=e},useState:Zd,useDebugValue:Pa,useDeferredValue:function(e){return Zt().memoizedState=e},useTransition:function(){var e=Zd(!1),t=e[0];return e=Kg.bind(null,e[1]),Zt().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,n){var i=He,l=Zt();if($e){if(n===void 0)throw Error(o(407));n=n()}else{if(n=t(),et===null)throw Error(o(349));(ir&30)!==0||Wd(i,t,n)}l.memoizedState=n;var c={value:n,getSnapshot:t};return l.queue=c,Xd(Kd.bind(null,i,c,e),[e]),i.flags|=2048,ii(9,Qd.bind(null,i,c,n,t),void 0,null),n},useId:function(){var e=Zt(),t=et.identifierPrefix;if($e){var n=an,i=ln;n=(i&~(1<<32-zt(i)-1)).toString(32)+n,t=":"+t+"R"+n,n=ri++,0<\/script>",e=e.removeChild(e.firstChild)):typeof i.is=="string"?e=p.createElement(n,{is:i.is}):(e=p.createElement(n),n==="select"&&(p=e,i.multiple?p.multiple=!0:i.size&&(p.size=i.size))):e=p.createElementNS(e,n),e[qt]=t,e[Zs]=i,Rf(e,t,!1,!1),t.stateNode=e;e:{switch(p=kl(n,i),n){case"dialog":Fe("cancel",e),Fe("close",e),l=i;break;case"iframe":case"object":case"embed":Fe("load",e),l=i;break;case"video":case"audio":for(l=0;lGr&&(t.flags|=128,i=!0,oi(c,!1),t.lanes=4194304)}else{if(!i)if(e=xo(p),e!==null){if(t.flags|=128,i=!0,n=e.updateQueue,n!==null&&(t.updateQueue=n,t.flags|=4),oi(c,!0),c.tail===null&&c.tailMode==="hidden"&&!p.alternate&&!$e)return ut(t),null}else 2*Ke()-c.renderingStartTime>Gr&&n!==1073741824&&(t.flags|=128,i=!0,oi(c,!1),t.lanes=4194304);c.isBackwards?(p.sibling=t.child,t.child=p):(n=c.last,n!==null?n.sibling=p:t.child=p,c.last=p)}return c.tail!==null?(t=c.tail,c.rendering=t,c.tail=t.sibling,c.renderingStartTime=Ke(),t.sibling=null,n=Ve.current,Ae(Ve,i?n&1|2:n&1),t):(ut(t),null);case 22:case 23:return Ja(),i=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==i&&(t.flags|=8192),i&&(t.mode&1)!==0?(Ct&1073741824)!==0&&(ut(t),t.subtreeFlags&6&&(t.flags|=8192)):ut(t),null;case 24:return null;case 25:return null}throw Error(o(156,t.tag))}function sv(e,t){switch(aa(t),t.tag){case 1:return gt(t.type)&&lo(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return Wr(),Ie(mt),Ie(lt),ka(),e=t.flags,(e&65536)!==0&&(e&128)===0?(t.flags=e&-65537|128,t):null;case 5:return xa(t),null;case 13:if(Ie(Ve),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(o(340));$r()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return Ie(Ve),null;case 4:return Wr(),null;case 10:return pa(t.type._context),null;case 22:case 23:return Ja(),null;case 24:return null;default:return null}}var _o=!1,ct=!1,iv=typeof WeakSet=="function"?WeakSet:Set,te=null;function Kr(e,t){var n=e.ref;if(n!==null)if(typeof n=="function")try{n(null)}catch(i){We(e,t,i)}else n.current=null}function $a(e,t,n){try{n()}catch(i){We(e,t,i)}}var Tf=!1;function ov(e,t){if(Jl=Ki,e=cd(),Wl(e)){if("selectionStart"in e)var n={start:e.selectionStart,end:e.selectionEnd};else e:{n=(n=e.ownerDocument)&&n.defaultView||window;var i=n.getSelection&&n.getSelection();if(i&&i.rangeCount!==0){n=i.anchorNode;var l=i.anchorOffset,c=i.focusNode;i=i.focusOffset;try{n.nodeType,c.nodeType}catch{n=null;break e}var p=0,v=-1,S=-1,T=0,$=0,B=e,U=null;t:for(;;){for(var X;B!==n||l!==0&&B.nodeType!==3||(v=p+l),B!==c||i!==0&&B.nodeType!==3||(S=p+i),B.nodeType===3&&(p+=B.nodeValue.length),(X=B.firstChild)!==null;)U=B,B=X;for(;;){if(B===e)break t;if(U===n&&++T===l&&(v=p),U===c&&++$===i&&(S=p),(X=B.nextSibling)!==null)break;B=U,U=B.parentNode}B=X}n=v===-1||S===-1?null:{start:v,end:S}}else n=null}n=n||{start:0,end:0}}else n=null;for(ea={focusedElem:e,selectionRange:n},Ki=!1,te=t;te!==null;)if(t=te,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,te=e;else for(;te!==null;){t=te;try{var re=t.alternate;if((t.flags&1024)!==0)switch(t.tag){case 0:case 11:case 15:break;case 1:if(re!==null){var ie=re.memoizedProps,qe=re.memoizedState,M=t.stateNode,j=M.getSnapshotBeforeUpdate(t.elementType===t.type?ie:Ut(t.type,ie),qe);M.__reactInternalSnapshotBeforeUpdate=j}break;case 3:var O=t.stateNode.containerInfo;O.nodeType===1?O.textContent="":O.nodeType===9&&O.documentElement&&O.removeChild(O.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(o(163))}}catch(H){We(t,t.return,H)}if(e=t.sibling,e!==null){e.return=t.return,te=e;break}te=t.return}return re=Tf,Tf=!1,re}function li(e,t,n){var i=t.updateQueue;if(i=i!==null?i.lastEffect:null,i!==null){var l=i=i.next;do{if((l.tag&e)===e){var c=l.destroy;l.destroy=void 0,c!==void 0&&$a(t,n,c)}l=l.next}while(l!==i)}}function Po(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var n=t=t.next;do{if((n.tag&e)===e){var i=n.create;n.destroy=i()}n=n.next}while(n!==t)}}function Ba(e){var t=e.ref;if(t!==null){var n=e.stateNode;switch(e.tag){case 5:e=n;break;default:e=n}typeof t=="function"?t(e):t.current=e}}function Lf(e){var t=e.alternate;t!==null&&(e.alternate=null,Lf(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[qt],delete t[Zs],delete t[sa],delete t[Bg],delete t[Vg])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function Df(e){return e.tag===5||e.tag===3||e.tag===4}function Af(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||Df(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function Va(e,t,n){var i=e.tag;if(i===5||i===6)e=e.stateNode,t?n.nodeType===8?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(n.nodeType===8?(t=n.parentNode,t.insertBefore(e,n)):(t=n,t.appendChild(e)),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=io));else if(i!==4&&(e=e.child,e!==null))for(Va(e,t,n),e=e.sibling;e!==null;)Va(e,t,n),e=e.sibling}function Ha(e,t,n){var i=e.tag;if(i===5||i===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(i!==4&&(e=e.child,e!==null))for(Ha(e,t,n),e=e.sibling;e!==null;)Ha(e,t,n),e=e.sibling}var rt=null,$t=!1;function Rn(e,t,n){for(n=n.child;n!==null;)zf(e,t,n),n=n.sibling}function zf(e,t,n){if(Kt&&typeof Kt.onCommitFiberUnmount=="function")try{Kt.onCommitFiberUnmount($i,n)}catch{}switch(n.tag){case 5:ct||Kr(n,t);case 6:var i=rt,l=$t;rt=null,Rn(e,t,n),rt=i,$t=l,rt!==null&&($t?(e=rt,n=n.stateNode,e.nodeType===8?e.parentNode.removeChild(n):e.removeChild(n)):rt.removeChild(n.stateNode));break;case 18:rt!==null&&($t?(e=rt,n=n.stateNode,e.nodeType===8?ra(e.parentNode,n):e.nodeType===1&&ra(e,n),Is(e)):ra(rt,n.stateNode));break;case 4:i=rt,l=$t,rt=n.stateNode.containerInfo,$t=!0,Rn(e,t,n),rt=i,$t=l;break;case 0:case 11:case 14:case 15:if(!ct&&(i=n.updateQueue,i!==null&&(i=i.lastEffect,i!==null))){l=i=i.next;do{var c=l,p=c.destroy;c=c.tag,p!==void 0&&((c&2)!==0||(c&4)!==0)&&$a(n,t,p),l=l.next}while(l!==i)}Rn(e,t,n);break;case 1:if(!ct&&(Kr(n,t),i=n.stateNode,typeof i.componentWillUnmount=="function"))try{i.props=n.memoizedProps,i.state=n.memoizedState,i.componentWillUnmount()}catch(v){We(n,t,v)}Rn(e,t,n);break;case 21:Rn(e,t,n);break;case 22:n.mode&1?(ct=(i=ct)||n.memoizedState!==null,Rn(e,t,n),ct=i):Rn(e,t,n);break;default:Rn(e,t,n)}}function Ff(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var n=e.stateNode;n===null&&(n=e.stateNode=new iv),t.forEach(function(i){var l=mv.bind(null,e,i);n.has(i)||(n.add(i),i.then(l,l))})}}function Bt(e,t){var n=t.deletions;if(n!==null)for(var i=0;il&&(l=p),i&=~c}if(i=l,i=Ke()-i,i=(120>i?120:480>i?480:1080>i?1080:1920>i?1920:3e3>i?3e3:4320>i?4320:1960*av(i/1960))-i,10e?16:e,On===null)var i=!1;else{if(e=On,On=null,Lo=0,(Me&6)!==0)throw Error(o(331));var l=Me;for(Me|=4,te=e.current;te!==null;){var c=te,p=c.child;if((te.flags&16)!==0){var v=c.deletions;if(v!==null){for(var S=0;SKe()-Ka?ar(e,0):Qa|=n),xt(e,t)}function Yf(e,t){t===0&&((e.mode&1)===0?t=1:(t=Vi,Vi<<=1,(Vi&130023424)===0&&(Vi=4194304)));var n=ht();e=un(e,t),e!==null&&(Ls(e,t,n),xt(e,n))}function pv(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),Yf(e,n)}function mv(e,t){var n=0;switch(e.tag){case 13:var i=e.stateNode,l=e.memoizedState;l!==null&&(n=l.retryLane);break;case 19:i=e.stateNode;break;default:throw Error(o(314))}i!==null&&i.delete(t),Yf(e,n)}var Xf;Xf=function(e,t,n){if(e!==null)if(e.memoizedProps!==t.pendingProps||mt.current)vt=!0;else{if((e.lanes&n)===0&&(t.flags&128)===0)return vt=!1,nv(e,t,n);vt=(e.flags&131072)!==0}else vt=!1,$e&&(t.flags&1048576)!==0&&Rd(t,fo,t.index);switch(t.lanes=0,t.tag){case 2:var i=t.type;Co(e,t),e=t.pendingProps;var l=Fr(t,lt.current);Hr(t,n),l=Ea(null,t,i,e,l,n);var c=Na();return t.flags|=1,typeof l=="object"&&l!==null&&typeof l.render=="function"&&l.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,gt(i)?(c=!0,ao(t)):c=!1,t.memoizedState=l.state!==null&&l.state!==void 0?l.state:null,va(t),l.updater=No,t.stateNode=l,l._reactInternals=t,Ma(t,i,e,n),t=Da(null,t,i,!0,c,n)):(t.tag=0,$e&&c&&la(t),ft(null,t,l,n),t=t.child),t;case 16:i=t.elementType;e:{switch(Co(e,t),e=t.pendingProps,l=i._init,i=l(i._payload),t.type=i,l=t.tag=vv(i),e=Ut(i,e),l){case 0:t=La(null,t,i,e,n);break e;case 1:t=Ef(null,t,i,e,n);break e;case 11:t=xf(null,t,i,e,n);break e;case 14:t=wf(null,t,i,Ut(i.type,e),n);break e}throw Error(o(306,i,""))}return t;case 0:return i=t.type,l=t.pendingProps,l=t.elementType===i?l:Ut(i,l),La(e,t,i,l,n);case 1:return i=t.type,l=t.pendingProps,l=t.elementType===i?l:Ut(i,l),Ef(e,t,i,l,n);case 3:e:{if(Nf(t),e===null)throw Error(o(387));i=t.pendingProps,c=t.memoizedState,l=c.element,Id(e,t),yo(t,i,null,n);var p=t.memoizedState;if(i=p.element,c.isDehydrated)if(c={element:i,isDehydrated:!1,cache:p.cache,pendingSuspenseBoundaries:p.pendingSuspenseBoundaries,transitions:p.transitions},t.updateQueue.baseState=c,t.memoizedState=c,t.flags&256){l=Qr(Error(o(423)),t),t=jf(e,t,i,n,l);break e}else if(i!==l){l=Qr(Error(o(424)),t),t=jf(e,t,i,n,l);break e}else for(jt=En(t.stateNode.containerInfo.firstChild),Nt=t,$e=!0,It=null,n=zd(t,null,i,n),t.child=n;n;)n.flags=n.flags&-3|4096,n=n.sibling;else{if($r(),i===l){t=dn(e,t,n);break e}ft(e,t,i,n)}t=t.child}return t;case 5:return Bd(t),e===null&&ca(t),i=t.type,l=t.pendingProps,c=e!==null?e.memoizedProps:null,p=l.children,ta(i,l)?p=null:c!==null&&ta(i,c)&&(t.flags|=32),Sf(e,t),ft(e,t,p,n),t.child;case 6:return e===null&&ca(t),null;case 13:return Cf(e,t,n);case 4:return ya(t,t.stateNode.containerInfo),i=t.pendingProps,e===null?t.child=Br(t,null,i,n):ft(e,t,i,n),t.child;case 11:return i=t.type,l=t.pendingProps,l=t.elementType===i?l:Ut(i,l),xf(e,t,i,l,n);case 7:return ft(e,t,t.pendingProps,n),t.child;case 8:return ft(e,t,t.pendingProps.children,n),t.child;case 12:return ft(e,t,t.pendingProps.children,n),t.child;case 10:e:{if(i=t.type._context,l=t.pendingProps,c=t.memoizedProps,p=l.value,Ae(mo,i._currentValue),i._currentValue=p,c!==null)if(Ft(c.value,p)){if(c.children===l.children&&!mt.current){t=dn(e,t,n);break e}}else for(c=t.child,c!==null&&(c.return=t);c!==null;){var v=c.dependencies;if(v!==null){p=c.child;for(var S=v.firstContext;S!==null;){if(S.context===i){if(c.tag===1){S=cn(-1,n&-n),S.tag=2;var T=c.updateQueue;if(T!==null){T=T.shared;var $=T.pending;$===null?S.next=S:(S.next=$.next,$.next=S),T.pending=S}}c.lanes|=n,S=c.alternate,S!==null&&(S.lanes|=n),ma(c.return,n,t),v.lanes|=n;break}S=S.next}}else if(c.tag===10)p=c.type===t.type?null:c.child;else if(c.tag===18){if(p=c.return,p===null)throw Error(o(341));p.lanes|=n,v=p.alternate,v!==null&&(v.lanes|=n),ma(p,n,t),p=c.sibling}else p=c.child;if(p!==null)p.return=c;else for(p=c;p!==null;){if(p===t){p=null;break}if(c=p.sibling,c!==null){c.return=p.return,p=c;break}p=p.return}c=p}ft(e,t,l.children,n),t=t.child}return t;case 9:return l=t.type,i=t.pendingProps.children,Hr(t,n),l=Ot(l),i=i(l),t.flags|=1,ft(e,t,i,n),t.child;case 14:return i=t.type,l=Ut(i,t.pendingProps),l=Ut(i.type,l),wf(e,t,i,l,n);case 15:return kf(e,t,t.type,t.pendingProps,n);case 17:return i=t.type,l=t.pendingProps,l=t.elementType===i?l:Ut(i,l),Co(e,t),t.tag=1,gt(i)?(e=!0,ao(t)):e=!1,Hr(t,n),ff(t,i,l),Ma(t,i,l,n),Da(null,t,i,!0,e,n);case 19:return Pf(e,t,n);case 22:return bf(e,t,n)}throw Error(o(156,t.tag))};function Jf(e,t){return Mc(e,t)}function gv(e,t,n,i){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=i,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Dt(e,t,n,i){return new gv(e,t,n,i)}function tu(e){return e=e.prototype,!(!e||!e.isReactComponent)}function vv(e){if(typeof e=="function")return tu(e)?1:0;if(e!=null){if(e=e.$$typeof,e===le)return 11;if(e===ce)return 14}return 2}function Dn(e,t){var n=e.alternate;return n===null?(n=Dt(e.tag,t,e.key,e.mode),n.elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=e.flags&14680064,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function Fo(e,t,n,i,l,c){var p=2;if(i=e,typeof e=="function")tu(e)&&(p=1);else if(typeof e=="string")p=5;else e:switch(e){case ue:return cr(n.children,l,c,t);case oe:p=8,l|=8;break;case ee:return e=Dt(12,n,t,l|2),e.elementType=ee,e.lanes=c,e;case Le:return e=Dt(13,n,t,l),e.elementType=Le,e.lanes=c,e;case Z:return e=Dt(19,n,t,l),e.elementType=Z,e.lanes=c,e;case Ne:return Io(n,l,c,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case me:p=10;break e;case ke:p=9;break e;case le:p=11;break e;case ce:p=14;break e;case Ce:p=16,i=null;break e}throw Error(o(130,e==null?e:typeof e,""))}return t=Dt(p,n,t,l),t.elementType=e,t.type=i,t.lanes=c,t}function cr(e,t,n,i){return e=Dt(7,e,i,t),e.lanes=n,e}function Io(e,t,n,i){return e=Dt(22,e,i,t),e.elementType=Ne,e.lanes=n,e.stateNode={isHidden:!1},e}function nu(e,t,n){return e=Dt(6,e,null,t),e.lanes=n,e}function ru(e,t,n){return t=Dt(4,e.children!==null?e.children:[],e.key,t),t.lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function yv(e,t,n,i,l){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=Rl(0),this.expirationTimes=Rl(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Rl(0),this.identifierPrefix=i,this.onRecoverableError=l,this.mutableSourceEagerHydrationData=null}function su(e,t,n,i,l,c,p,v,S){return e=new yv(e,t,n,v,S),t===1?(t=1,c===!0&&(t|=8)):t=0,c=Dt(3,null,null,t),e.current=c,c.stateNode=e,c.memoizedState={element:i,isDehydrated:n,cache:null,transitions:null,pendingSuspenseBoundaries:null},va(c),e}function xv(e,t,n){var i=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(r)}catch(s){console.error(s)}}return r(),du.exports=Tv(),du.exports}var ph;function Lv(){if(ph)return qo;ph=1;var r=up();return qo.createRoot=r.createRoot,qo.hydrateRoot=r.hydrateRoot,qo}var Dv=Lv();const Av=ap(Dv);var Di=class{constructor(){this.listeners=new Set,this.subscribe=this.subscribe.bind(this)}subscribe(r){return this.listeners.add(r),this.onSubscribe(),()=>{this.listeners.delete(r),this.onUnsubscribe()}}hasListeners(){return this.listeners.size>0}onSubscribe(){}onUnsubscribe(){}},fr,$n,as,Xh,zv=(Xh=class extends Di{constructor(){super();pe(this,fr);pe(this,$n);pe(this,as);J(this,as,s=>{if(typeof window<"u"&&window.addEventListener){const o=()=>s();return window.addEventListener("visibilitychange",o,!1),()=>{window.removeEventListener("visibilitychange",o)}}})}onSubscribe(){E(this,$n)||this.setEventListener(E(this,as))}onUnsubscribe(){var s;this.hasListeners()||((s=E(this,$n))==null||s.call(this),J(this,$n,void 0))}setEventListener(s){var o;J(this,as,s),(o=E(this,$n))==null||o.call(this),J(this,$n,s(a=>{typeof a=="boolean"?this.setFocused(a):this.onFocus()}))}setFocused(s){E(this,fr)!==s&&(J(this,fr,s),this.onFocus())}onFocus(){const s=this.isFocused();this.listeners.forEach(o=>{o(s)})}isFocused(){var s;return typeof E(this,fr)=="boolean"?E(this,fr):((s=globalThis.document)==null?void 0:s.visibilityState)!=="hidden"}},fr=new WeakMap,$n=new WeakMap,as=new WeakMap,Xh),tc=new zv,Fv={setTimeout:(r,s)=>setTimeout(r,s),clearTimeout:r=>clearTimeout(r),setInterval:(r,s)=>setInterval(r,s),clearInterval:r=>clearInterval(r)},Bn,Yu,Jh,Iv=(Jh=class{constructor(){pe(this,Bn,Fv);pe(this,Yu,!1)}setTimeoutProvider(r){J(this,Bn,r)}setTimeout(r,s){return E(this,Bn).setTimeout(r,s)}clearTimeout(r){E(this,Bn).clearTimeout(r)}setInterval(r,s){return E(this,Bn).setInterval(r,s)}clearInterval(r){E(this,Bn).clearInterval(r)}},Bn=new WeakMap,Yu=new WeakMap,Jh),dr=new Iv;function Uv(r){setTimeout(r,0)}var $v=typeof window>"u"||"Deno"in globalThis;function bt(){}function Bv(r,s){return typeof r=="function"?r(s):r}function Cu(r){return typeof r=="number"&&r>=0&&r!==1/0}function cp(r,s){return Math.max(r+(s||0)-Date.now(),0)}function Gn(r,s){return typeof r=="function"?r(s):r}function Pt(r,s){return typeof r=="function"?r(s):r}function mh(r,s){const{type:o="all",exact:a,fetchStatus:u,predicate:f,queryKey:m,stale:h}=r;if(m){if(a){if(s.queryHash!==nc(m,s.options))return!1}else if(!Si(s.queryKey,m))return!1}if(o!=="all"){const y=s.isActive();if(o==="active"&&!y||o==="inactive"&&y)return!1}return!(typeof h=="boolean"&&s.isStale()!==h||u&&u!==s.state.fetchStatus||f&&!f(s))}function gh(r,s){const{exact:o,status:a,predicate:u,mutationKey:f}=r;if(f){if(!s.options.mutationKey)return!1;if(o){if(bi(s.options.mutationKey)!==bi(f))return!1}else if(!Si(s.options.mutationKey,f))return!1}return!(a&&s.state.status!==a||u&&!u(s))}function nc(r,s){return((s==null?void 0:s.queryKeyHashFn)||bi)(r)}function bi(r){return JSON.stringify(r,(s,o)=>Pu(o)?Object.keys(o).sort().reduce((a,u)=>(a[u]=o[u],a),{}):o)}function Si(r,s){return r===s?!0:typeof r!=typeof s?!1:r&&s&&typeof r=="object"&&typeof s=="object"?Object.keys(s).every(o=>Si(r[o],s[o])):!1}var Vv=Object.prototype.hasOwnProperty;function dp(r,s,o=0){if(r===s)return r;if(o>500)return s;const a=vh(r)&&vh(s);if(!a&&!(Pu(r)&&Pu(s)))return s;const f=(a?r:Object.keys(r)).length,m=a?s:Object.keys(s),h=m.length,y=a?new Array(h):{};let k=0;for(let w=0;w{dr.setTimeout(s,r)})}function Ru(r,s,o){return typeof o.structuralSharing=="function"?o.structuralSharing(r,s):o.structuralSharing!==!1?dp(r,s):s}function Wv(r,s,o=0){const a=[...r,s];return o&&a.length>o?a.slice(1):a}function Qv(r,s,o=0){const a=[s,...r];return o&&a.length>o?a.slice(0,-1):a}var rc=Symbol();function fp(r,s){return!r.queryFn&&(s!=null&&s.initialPromise)?()=>s.initialPromise:!r.queryFn||r.queryFn===rc?()=>Promise.reject(new Error(`Missing queryFn: '${r.queryHash}'`)):r.queryFn}function hp(r,s){return typeof r=="function"?r(...s):!!r}function Kv(r,s,o){let a=!1,u;return Object.defineProperty(r,"signal",{enumerable:!0,get:()=>(u??(u=s()),a||(a=!0,u.aborted?o():u.addEventListener("abort",o,{once:!0})),u)}),r}var Ei=(()=>{let r=()=>$v;return{isServer(){return r()},setIsServer(s){r=s}}})();function Mu(){let r,s;const o=new Promise((u,f)=>{r=u,s=f});o.status="pending",o.catch(()=>{});function a(u){Object.assign(o,u),delete o.resolve,delete o.reject}return o.resolve=u=>{a({status:"fulfilled",value:u}),r(u)},o.reject=u=>{a({status:"rejected",reason:u}),s(u)},o}var qv=Uv;function Gv(){let r=[],s=0,o=h=>{h()},a=h=>{h()},u=qv;const f=h=>{s?r.push(h):u(()=>{o(h)})},m=()=>{const h=r;r=[],h.length&&u(()=>{a(()=>{h.forEach(y=>{o(y)})})})};return{batch:h=>{let y;s++;try{y=h()}finally{s--,s||m()}return y},batchCalls:h=>(...y)=>{f(()=>{h(...y)})},schedule:f,setNotifyFunction:h=>{o=h},setBatchNotifyFunction:h=>{a=h},setScheduler:h=>{u=h}}}var it=Gv(),us,Vn,cs,ep,Zv=(ep=class extends Di{constructor(){super();pe(this,us,!0);pe(this,Vn);pe(this,cs);J(this,cs,s=>{if(typeof window<"u"&&window.addEventListener){const o=()=>s(!0),a=()=>s(!1);return window.addEventListener("online",o,!1),window.addEventListener("offline",a,!1),()=>{window.removeEventListener("online",o),window.removeEventListener("offline",a)}}})}onSubscribe(){E(this,Vn)||this.setEventListener(E(this,cs))}onUnsubscribe(){var s;this.hasListeners()||((s=E(this,Vn))==null||s.call(this),J(this,Vn,void 0))}setEventListener(s){var o;J(this,cs,s),(o=E(this,Vn))==null||o.call(this),J(this,Vn,s(this.setOnline.bind(this)))}setOnline(s){E(this,us)!==s&&(J(this,us,s),this.listeners.forEach(a=>{a(s)}))}isOnline(){return E(this,us)}},us=new WeakMap,Vn=new WeakMap,cs=new WeakMap,ep),ol=new Zv;function Yv(r){return Math.min(1e3*2**r,3e4)}function pp(r){return(r??"online")==="online"?ol.isOnline():!0}var Ou=class extends Error{constructor(r){super("CancelledError"),this.revert=r==null?void 0:r.revert,this.silent=r==null?void 0:r.silent}};function mp(r){let s=!1,o=0,a;const u=Mu(),f=()=>u.status!=="pending",m=b=>{var R;if(!f()){const A=new Ou(b);P(A),(R=r.onCancel)==null||R.call(r,A)}},h=()=>{s=!0},y=()=>{s=!1},k=()=>tc.isFocused()&&(r.networkMode==="always"||ol.isOnline())&&r.canRun(),w=()=>pp(r.networkMode)&&r.canRun(),x=b=>{f()||(a==null||a(),u.resolve(b))},P=b=>{f()||(a==null||a(),u.reject(b))},_=()=>new Promise(b=>{var R;a=A=>{(f()||k())&&b(A)},(R=r.onPause)==null||R.call(r)}).then(()=>{var b;a=void 0,f()||(b=r.onContinue)==null||b.call(r)}),D=()=>{if(f())return;let b;const R=o===0?r.initialPromise:void 0;try{b=R??r.fn()}catch(A){b=Promise.reject(A)}Promise.resolve(b).then(x).catch(A=>{var G;if(f())return;const I=r.retry??(Ei.isServer()?0:3),V=r.retryDelay??Yv,z=typeof V=="function"?V(o,A):V,K=I===!0||typeof I=="number"&&ok()?void 0:_()).then(()=>{s?P(A):D()})})};return{promise:u,status:()=>u.status,cancel:m,continue:()=>(a==null||a(),u),cancelRetry:h,continueRetry:y,canStart:w,start:()=>(w()?D():_().then(D),u)}}var hr,tp,gp=(tp=class{constructor(){pe(this,hr)}destroy(){this.clearGcTimeout()}scheduleGc(){this.clearGcTimeout(),Cu(this.gcTime)&&J(this,hr,dr.setTimeout(()=>{this.optionalRemove()},this.gcTime))}updateGcTime(r){this.gcTime=Math.max(this.gcTime||0,r??(Ei.isServer()?1/0:300*1e3))}clearGcTimeout(){E(this,hr)!==void 0&&(dr.clearTimeout(E(this,hr)),J(this,hr,void 0))}},hr=new WeakMap,tp);function Xv(r){return{onFetch:(s,o)=>{var w,x,P,_,D;const a=s.options,u=(P=(x=(w=s.fetchOptions)==null?void 0:w.meta)==null?void 0:x.fetchMore)==null?void 0:P.direction,f=((_=s.state.data)==null?void 0:_.pages)||[],m=((D=s.state.data)==null?void 0:D.pageParams)||[];let h={pages:[],pageParams:[]},y=0;const k=async()=>{let b=!1;const R=V=>{Kv(V,()=>s.signal,()=>b=!0)},A=fp(s.options,s.fetchOptions),I=async(V,z,K)=>{if(b)return Promise.reject(s.signal.reason);if(z==null&&V.pages.length)return Promise.resolve(V);const ue=(()=>{const ke={client:s.client,queryKey:s.queryKey,pageParam:z,direction:K?"backward":"forward",meta:s.options.meta};return R(ke),ke})(),oe=await A(ue),{maxPages:ee}=s.options,me=K?Qv:Wv;return{pages:me(V.pages,oe,ee),pageParams:me(V.pageParams,z,ee)}};if(u&&f.length){const V=u==="backward",z=V?Jv:xh,K={pages:f,pageParams:m},G=z(a,K);h=await I(K,G,V)}else{const V=r??f.length;do{const z=y===0?m[0]??a.initialPageParam:xh(a,h);if(y>0&&z==null)break;h=await I(h,z),y++}while(y{var b,R;return(R=(b=s.options).persister)==null?void 0:R.call(b,k,{client:s.client,queryKey:s.queryKey,meta:s.options.meta,signal:s.signal},o)}:s.fetchFn=k}}}function xh(r,{pages:s,pageParams:o}){const a=s.length-1;return s.length>0?r.getNextPageParam(s[a],s,o[a],o):void 0}function Jv(r,{pages:s,pageParams:o}){var a;return s.length>0?(a=r.getPreviousPageParam)==null?void 0:a.call(r,s[0],s,o[0],o):void 0}var ds,pr,fs,At,mr,nt,Ri,gr,_t,vp,pn,np,ey=(np=class extends gp{constructor(s){super();pe(this,_t);pe(this,ds);pe(this,pr);pe(this,fs);pe(this,At);pe(this,mr);pe(this,nt);pe(this,Ri);pe(this,gr);J(this,gr,!1),J(this,Ri,s.defaultOptions),this.setOptions(s.options),this.observers=[],J(this,mr,s.client),J(this,At,E(this,mr).getQueryCache()),this.queryKey=s.queryKey,this.queryHash=s.queryHash,J(this,pr,kh(this.options)),this.state=s.state??E(this,pr),this.scheduleGc()}get meta(){return this.options.meta}get queryType(){return E(this,ds)}get promise(){var s;return(s=E(this,nt))==null?void 0:s.promise}setOptions(s){if(this.options={...E(this,Ri),...s},s!=null&&s._type&&J(this,ds,s._type),this.updateGcTime(this.options.gcTime),this.state&&this.state.data===void 0){const o=kh(this.options);o.data!==void 0&&(this.setState(wh(o.data,o.dataUpdatedAt)),J(this,pr,o))}}optionalRemove(){!this.observers.length&&this.state.fetchStatus==="idle"&&E(this,At).remove(this)}setData(s,o){const a=Ru(this.state.data,s,this.options);return _e(this,_t,pn).call(this,{data:a,type:"success",dataUpdatedAt:o==null?void 0:o.updatedAt,manual:o==null?void 0:o.manual}),a}setState(s){_e(this,_t,pn).call(this,{type:"setState",state:s})}cancel(s){var a,u;const o=(a=E(this,nt))==null?void 0:a.promise;return(u=E(this,nt))==null||u.cancel(s),o?o.then(bt).catch(bt):Promise.resolve()}destroy(){super.destroy(),this.cancel({silent:!0})}get resetState(){return E(this,pr)}reset(){this.destroy(),this.setState(this.resetState)}isActive(){return this.observers.some(s=>Pt(s.options.enabled,this)!==!1)}isDisabled(){return this.getObserversCount()>0?!this.isActive():this.options.queryFn===rc||!this.isFetched()}isFetched(){return this.state.dataUpdateCount+this.state.errorUpdateCount>0}isStatic(){return this.getObserversCount()>0?this.observers.some(s=>Gn(s.options.staleTime,this)==="static"):!1}isStale(){return this.getObserversCount()>0?this.observers.some(s=>s.getCurrentResult().isStale):this.state.data===void 0||this.state.isInvalidated}isStaleByTime(s=0){return this.state.data===void 0?!0:s==="static"?!1:this.state.isInvalidated?!0:!cp(this.state.dataUpdatedAt,s)}onFocus(){var o;const s=this.observers.find(a=>a.shouldFetchOnWindowFocus());s==null||s.refetch({cancelRefetch:!1}),(o=E(this,nt))==null||o.continue()}onOnline(){var o;const s=this.observers.find(a=>a.shouldFetchOnReconnect());s==null||s.refetch({cancelRefetch:!1}),(o=E(this,nt))==null||o.continue()}addObserver(s){this.observers.includes(s)||(this.observers.push(s),this.clearGcTimeout(),E(this,At).notify({type:"observerAdded",query:this,observer:s}))}removeObserver(s){this.observers.includes(s)&&(this.observers=this.observers.filter(o=>o!==s),this.observers.length||(E(this,nt)&&(E(this,gr)||_e(this,_t,vp).call(this)?E(this,nt).cancel({revert:!0}):E(this,nt).cancelRetry()),this.scheduleGc()),E(this,At).notify({type:"observerRemoved",query:this,observer:s}))}getObserversCount(){return this.observers.length}invalidate(){this.state.isInvalidated||_e(this,_t,pn).call(this,{type:"invalidate"})}async fetch(s,o){var k,w,x,P,_,D,b,R,A,I,V;if(this.state.fetchStatus!=="idle"&&((k=E(this,nt))==null?void 0:k.status())!=="rejected"){if(this.state.data!==void 0&&(o!=null&&o.cancelRefetch))this.cancel({silent:!0});else if(E(this,nt))return E(this,nt).continueRetry(),E(this,nt).promise}if(s&&this.setOptions(s),!this.options.queryFn){const z=this.observers.find(K=>K.options.queryFn);z&&this.setOptions(z.options)}const a=new AbortController,u=z=>{Object.defineProperty(z,"signal",{enumerable:!0,get:()=>(J(this,gr,!0),a.signal)})},f=()=>{const z=fp(this.options,o),G=(()=>{const ue={client:E(this,mr),queryKey:this.queryKey,meta:this.meta};return u(ue),ue})();return J(this,gr,!1),this.options.persister?this.options.persister(z,G,this):z(G)},h=(()=>{const z={fetchOptions:o,options:this.options,queryKey:this.queryKey,client:E(this,mr),state:this.state,fetchFn:f};return u(z),z})(),y=E(this,ds)==="infinite"?Xv(this.options.pages):this.options.behavior;y==null||y.onFetch(h,this),J(this,fs,this.state),(this.state.fetchStatus==="idle"||this.state.fetchMeta!==((w=h.fetchOptions)==null?void 0:w.meta))&&_e(this,_t,pn).call(this,{type:"fetch",meta:(x=h.fetchOptions)==null?void 0:x.meta}),J(this,nt,mp({initialPromise:o==null?void 0:o.initialPromise,fn:h.fetchFn,onCancel:z=>{z instanceof Ou&&z.revert&&this.setState({...E(this,fs),fetchStatus:"idle"}),a.abort()},onFail:(z,K)=>{_e(this,_t,pn).call(this,{type:"failed",failureCount:z,error:K})},onPause:()=>{_e(this,_t,pn).call(this,{type:"pause"})},onContinue:()=>{_e(this,_t,pn).call(this,{type:"continue"})},retry:h.options.retry,retryDelay:h.options.retryDelay,networkMode:h.options.networkMode,canRun:()=>!0}));try{const z=await E(this,nt).start();if(z===void 0)throw new Error(`${this.queryHash} data is undefined`);return this.setData(z),(_=(P=E(this,At).config).onSuccess)==null||_.call(P,z,this),(b=(D=E(this,At).config).onSettled)==null||b.call(D,z,this.state.error,this),z}catch(z){if(z instanceof Ou){if(z.silent)return E(this,nt).promise;if(z.revert){if(this.state.data===void 0)throw z;return this.state.data}}throw _e(this,_t,pn).call(this,{type:"error",error:z}),(A=(R=E(this,At).config).onError)==null||A.call(R,z,this),(V=(I=E(this,At).config).onSettled)==null||V.call(I,this.state.data,z,this),z}finally{this.scheduleGc()}}},ds=new WeakMap,pr=new WeakMap,fs=new WeakMap,At=new WeakMap,mr=new WeakMap,nt=new WeakMap,Ri=new WeakMap,gr=new WeakMap,_t=new WeakSet,vp=function(){return this.state.fetchStatus==="paused"&&this.state.status==="pending"},pn=function(s){const o=a=>{switch(s.type){case"failed":return{...a,fetchFailureCount:s.failureCount,fetchFailureReason:s.error};case"pause":return{...a,fetchStatus:"paused"};case"continue":return{...a,fetchStatus:"fetching"};case"fetch":return{...a,...yp(a.data,this.options),fetchMeta:s.meta??null};case"success":const u={...a,...wh(s.data,s.dataUpdatedAt),dataUpdateCount:a.dataUpdateCount+1,...!s.manual&&{fetchStatus:"idle",fetchFailureCount:0,fetchFailureReason:null}};return J(this,fs,s.manual?u:void 0),u;case"error":const f=s.error;return{...a,error:f,errorUpdateCount:a.errorUpdateCount+1,errorUpdatedAt:Date.now(),fetchFailureCount:a.fetchFailureCount+1,fetchFailureReason:f,fetchStatus:"idle",status:"error",isInvalidated:!0};case"invalidate":return{...a,isInvalidated:!0};case"setState":return{...a,...s.state}}};this.state=o(this.state),it.batch(()=>{this.observers.forEach(a=>{a.onQueryUpdate()}),E(this,At).notify({query:this,type:"updated",action:s})})},np);function yp(r,s){return{fetchFailureCount:0,fetchFailureReason:null,fetchStatus:pp(s.networkMode)?"fetching":"paused",...r===void 0&&{error:null,status:"pending"}}}function wh(r,s){return{data:r,dataUpdatedAt:s??Date.now(),error:null,isInvalidated:!1,status:"success"}}function kh(r){const s=typeof r.initialData=="function"?r.initialData():r.initialData,o=s!==void 0,a=o?typeof r.initialDataUpdatedAt=="function"?r.initialDataUpdatedAt():r.initialDataUpdatedAt:0;return{data:s,dataUpdateCount:0,dataUpdatedAt:o?a??Date.now():0,error:null,errorUpdateCount:0,errorUpdatedAt:0,fetchFailureCount:0,fetchFailureReason:null,fetchMeta:null,isInvalidated:!1,status:o?"success":"pending",fetchStatus:"idle"}}var kt,Re,Mi,pt,vr,hs,mn,Hn,Oi,ps,ms,yr,xr,Wn,gs,Te,xi,Tu,Lu,Du,Au,zu,Fu,Iu,xp,rp,ty=(rp=class extends Di{constructor(s,o){super();pe(this,Te);pe(this,kt);pe(this,Re);pe(this,Mi);pe(this,pt);pe(this,vr);pe(this,hs);pe(this,mn);pe(this,Hn);pe(this,Oi);pe(this,ps);pe(this,ms);pe(this,yr);pe(this,xr);pe(this,Wn);pe(this,gs,new Set);this.options=o,J(this,kt,s),J(this,Hn,null),J(this,mn,Mu()),this.bindMethods(),this.setOptions(o)}bindMethods(){this.refetch=this.refetch.bind(this)}onSubscribe(){this.listeners.size===1&&(E(this,Re).addObserver(this),bh(E(this,Re),this.options)?_e(this,Te,xi).call(this):this.updateResult(),_e(this,Te,Au).call(this))}onUnsubscribe(){this.hasListeners()||this.destroy()}shouldFetchOnReconnect(){return Uu(E(this,Re),this.options,this.options.refetchOnReconnect)}shouldFetchOnWindowFocus(){return Uu(E(this,Re),this.options,this.options.refetchOnWindowFocus)}destroy(){this.listeners=new Set,_e(this,Te,zu).call(this),_e(this,Te,Fu).call(this),E(this,Re).removeObserver(this)}setOptions(s){const o=this.options,a=E(this,Re);if(this.options=E(this,kt).defaultQueryOptions(s),this.options.enabled!==void 0&&typeof this.options.enabled!="boolean"&&typeof this.options.enabled!="function"&&typeof Pt(this.options.enabled,E(this,Re))!="boolean")throw new Error("Expected enabled to be a boolean or a callback that returns a boolean");_e(this,Te,Iu).call(this),E(this,Re).setOptions(this.options),o._defaulted&&!_u(this.options,o)&&E(this,kt).getQueryCache().notify({type:"observerOptionsUpdated",query:E(this,Re),observer:this});const u=this.hasListeners();u&&Sh(E(this,Re),a,this.options,o)&&_e(this,Te,xi).call(this),this.updateResult(),u&&(E(this,Re)!==a||Pt(this.options.enabled,E(this,Re))!==Pt(o.enabled,E(this,Re))||Gn(this.options.staleTime,E(this,Re))!==Gn(o.staleTime,E(this,Re)))&&_e(this,Te,Tu).call(this);const f=_e(this,Te,Lu).call(this);u&&(E(this,Re)!==a||Pt(this.options.enabled,E(this,Re))!==Pt(o.enabled,E(this,Re))||f!==E(this,Wn))&&_e(this,Te,Du).call(this,f)}getOptimisticResult(s){const o=E(this,kt).getQueryCache().build(E(this,kt),s),a=this.createResult(o,s);return ry(this,a)&&(J(this,pt,a),J(this,hs,this.options),J(this,vr,E(this,Re).state)),a}getCurrentResult(){return E(this,pt)}trackResult(s,o){return new Proxy(s,{get:(a,u)=>(this.trackProp(u),o==null||o(u),u==="promise"&&(this.trackProp("data"),!this.options.experimental_prefetchInRender&&E(this,mn).status==="pending"&&E(this,mn).reject(new Error("experimental_prefetchInRender feature flag is not enabled"))),Reflect.get(a,u))})}trackProp(s){E(this,gs).add(s)}getCurrentQuery(){return E(this,Re)}refetch({...s}={}){return this.fetch({...s})}fetchOptimistic(s){const o=E(this,kt).defaultQueryOptions(s),a=E(this,kt).getQueryCache().build(E(this,kt),o);return a.fetch().then(()=>this.createResult(a,o))}fetch(s){return _e(this,Te,xi).call(this,{...s,cancelRefetch:s.cancelRefetch??!0}).then(()=>(this.updateResult(),E(this,pt)))}createResult(s,o){var ee;const a=E(this,Re),u=this.options,f=E(this,pt),m=E(this,vr),h=E(this,hs),k=s!==a?s.state:E(this,Mi),{state:w}=s;let x={...w},P=!1,_;if(o._optimisticResults){const me=this.hasListeners(),ke=!me&&bh(s,o),le=me&&Sh(s,a,o,u);(ke||le)&&(x={...x,...yp(w.data,s.options)}),o._optimisticResults==="isRestoring"&&(x.fetchStatus="idle")}let{error:D,errorUpdatedAt:b,status:R}=x;_=x.data;let A=!1;if(o.placeholderData!==void 0&&_===void 0&&R==="pending"){let me;f!=null&&f.isPlaceholderData&&o.placeholderData===(h==null?void 0:h.placeholderData)?(me=f.data,A=!0):me=typeof o.placeholderData=="function"?o.placeholderData((ee=E(this,ms))==null?void 0:ee.state.data,E(this,ms)):o.placeholderData,me!==void 0&&(R="success",_=Ru(f==null?void 0:f.data,me,o),P=!0)}if(o.select&&_!==void 0&&!A)if(f&&_===(m==null?void 0:m.data)&&o.select===E(this,Oi))_=E(this,ps);else try{J(this,Oi,o.select),_=o.select(_),_=Ru(f==null?void 0:f.data,_,o),J(this,ps,_),J(this,Hn,null)}catch(me){J(this,Hn,me)}E(this,Hn)&&(D=E(this,Hn),_=E(this,ps),b=Date.now(),R="error");const I=x.fetchStatus==="fetching",V=R==="pending",z=R==="error",K=V&&I,G=_!==void 0,oe={status:R,fetchStatus:x.fetchStatus,isPending:V,isSuccess:R==="success",isError:z,isInitialLoading:K,isLoading:K,data:_,dataUpdatedAt:x.dataUpdatedAt,error:D,errorUpdatedAt:b,failureCount:x.fetchFailureCount,failureReason:x.fetchFailureReason,errorUpdateCount:x.errorUpdateCount,isFetched:s.isFetched(),isFetchedAfterMount:x.dataUpdateCount>k.dataUpdateCount||x.errorUpdateCount>k.errorUpdateCount,isFetching:I,isRefetching:I&&!V,isLoadingError:z&&!G,isPaused:x.fetchStatus==="paused",isPlaceholderData:P,isRefetchError:z&&G,isStale:sc(s,o),refetch:this.refetch,promise:E(this,mn),isEnabled:Pt(o.enabled,s)!==!1};if(this.options.experimental_prefetchInRender){const me=oe.data!==void 0,ke=oe.status==="error"&&!me,le=ce=>{ke?ce.reject(oe.error):me&&ce.resolve(oe.data)},Le=()=>{const ce=J(this,mn,oe.promise=Mu());le(ce)},Z=E(this,mn);switch(Z.status){case"pending":s.queryHash===a.queryHash&&le(Z);break;case"fulfilled":(ke||oe.data!==Z.value)&&Le();break;case"rejected":(!ke||oe.error!==Z.reason)&&Le();break}}return oe}updateResult(){const s=E(this,pt),o=this.createResult(E(this,Re),this.options);if(J(this,vr,E(this,Re).state),J(this,hs,this.options),E(this,vr).data!==void 0&&J(this,ms,E(this,Re)),_u(o,s))return;J(this,pt,o);const a=()=>{if(!s)return!0;const{notifyOnChangeProps:u}=this.options,f=typeof u=="function"?u():u;if(f==="all"||!f&&!E(this,gs).size)return!0;const m=new Set(f??E(this,gs));return this.options.throwOnError&&m.add("error"),Object.keys(E(this,pt)).some(h=>{const y=h;return E(this,pt)[y]!==s[y]&&m.has(y)})};_e(this,Te,xp).call(this,{listeners:a()})}onQueryUpdate(){this.updateResult(),this.hasListeners()&&_e(this,Te,Au).call(this)}},kt=new WeakMap,Re=new WeakMap,Mi=new WeakMap,pt=new WeakMap,vr=new WeakMap,hs=new WeakMap,mn=new WeakMap,Hn=new WeakMap,Oi=new WeakMap,ps=new WeakMap,ms=new WeakMap,yr=new WeakMap,xr=new WeakMap,Wn=new WeakMap,gs=new WeakMap,Te=new WeakSet,xi=function(s){_e(this,Te,Iu).call(this);let o=E(this,Re).fetch(this.options,s);return s!=null&&s.throwOnError||(o=o.catch(bt)),o},Tu=function(){_e(this,Te,zu).call(this);const s=Gn(this.options.staleTime,E(this,Re));if(Ei.isServer()||E(this,pt).isStale||!Cu(s))return;const a=cp(E(this,pt).dataUpdatedAt,s)+1;J(this,yr,dr.setTimeout(()=>{E(this,pt).isStale||this.updateResult()},a))},Lu=function(){return(typeof this.options.refetchInterval=="function"?this.options.refetchInterval(E(this,Re)):this.options.refetchInterval)??!1},Du=function(s){_e(this,Te,Fu).call(this),J(this,Wn,s),!(Ei.isServer()||Pt(this.options.enabled,E(this,Re))===!1||!Cu(E(this,Wn))||E(this,Wn)===0)&&J(this,xr,dr.setInterval(()=>{(this.options.refetchIntervalInBackground||tc.isFocused())&&_e(this,Te,xi).call(this)},E(this,Wn)))},Au=function(){_e(this,Te,Tu).call(this),_e(this,Te,Du).call(this,_e(this,Te,Lu).call(this))},zu=function(){E(this,yr)!==void 0&&(dr.clearTimeout(E(this,yr)),J(this,yr,void 0))},Fu=function(){E(this,xr)!==void 0&&(dr.clearInterval(E(this,xr)),J(this,xr,void 0))},Iu=function(){const s=E(this,kt).getQueryCache().build(E(this,kt),this.options);if(s===E(this,Re))return;const o=E(this,Re);J(this,Re,s),J(this,Mi,s.state),this.hasListeners()&&(o==null||o.removeObserver(this),s.addObserver(this))},xp=function(s){it.batch(()=>{s.listeners&&this.listeners.forEach(o=>{o(E(this,pt))}),E(this,kt).getQueryCache().notify({query:E(this,Re),type:"observerResultsUpdated"})})},rp);function ny(r,s){return Pt(s.enabled,r)!==!1&&r.state.data===void 0&&!(r.state.status==="error"&&Pt(s.retryOnMount,r)===!1)}function bh(r,s){return ny(r,s)||r.state.data!==void 0&&Uu(r,s,s.refetchOnMount)}function Uu(r,s,o){if(Pt(s.enabled,r)!==!1&&Gn(s.staleTime,r)!=="static"){const a=typeof o=="function"?o(r):o;return a==="always"||a!==!1&&sc(r,s)}return!1}function Sh(r,s,o,a){return(r!==s||Pt(a.enabled,r)===!1)&&(!o.suspense||r.state.status!=="error")&&sc(r,o)}function sc(r,s){return Pt(s.enabled,r)!==!1&&r.isStaleByTime(Gn(s.staleTime,r))}function ry(r,s){return!_u(r.getCurrentResult(),s)}var Ti,Jt,dt,wr,en,In,sp,sy=(sp=class extends gp{constructor(s){super();pe(this,en);pe(this,Ti);pe(this,Jt);pe(this,dt);pe(this,wr);J(this,Ti,s.client),this.mutationId=s.mutationId,J(this,dt,s.mutationCache),J(this,Jt,[]),this.state=s.state||iy(),this.setOptions(s.options),this.scheduleGc()}setOptions(s){this.options=s,this.updateGcTime(this.options.gcTime)}get meta(){return this.options.meta}addObserver(s){E(this,Jt).includes(s)||(E(this,Jt).push(s),this.clearGcTimeout(),E(this,dt).notify({type:"observerAdded",mutation:this,observer:s}))}removeObserver(s){J(this,Jt,E(this,Jt).filter(o=>o!==s)),this.scheduleGc(),E(this,dt).notify({type:"observerRemoved",mutation:this,observer:s})}optionalRemove(){E(this,Jt).length||(this.state.status==="pending"?this.scheduleGc():E(this,dt).remove(this))}continue(){var s;return((s=E(this,wr))==null?void 0:s.continue())??this.execute(this.state.variables)}async execute(s){var m,h,y,k,w,x,P,_,D,b,R,A,I,V,z,K,G,ue;const o=()=>{_e(this,en,In).call(this,{type:"continue"})},a={client:E(this,Ti),meta:this.options.meta,mutationKey:this.options.mutationKey};J(this,wr,mp({fn:()=>this.options.mutationFn?this.options.mutationFn(s,a):Promise.reject(new Error("No mutationFn found")),onFail:(oe,ee)=>{_e(this,en,In).call(this,{type:"failed",failureCount:oe,error:ee})},onPause:()=>{_e(this,en,In).call(this,{type:"pause"})},onContinue:o,retry:this.options.retry??0,retryDelay:this.options.retryDelay,networkMode:this.options.networkMode,canRun:()=>E(this,dt).canRun(this)}));const u=this.state.status==="pending",f=!E(this,wr).canStart();try{if(u)o();else{_e(this,en,In).call(this,{type:"pending",variables:s,isPaused:f}),E(this,dt).config.onMutate&&await E(this,dt).config.onMutate(s,this,a);const ee=await((h=(m=this.options).onMutate)==null?void 0:h.call(m,s,a));ee!==this.state.context&&_e(this,en,In).call(this,{type:"pending",context:ee,variables:s,isPaused:f})}const oe=await E(this,wr).start();return await((k=(y=E(this,dt).config).onSuccess)==null?void 0:k.call(y,oe,s,this.state.context,this,a)),await((x=(w=this.options).onSuccess)==null?void 0:x.call(w,oe,s,this.state.context,a)),await((_=(P=E(this,dt).config).onSettled)==null?void 0:_.call(P,oe,null,this.state.variables,this.state.context,this,a)),await((b=(D=this.options).onSettled)==null?void 0:b.call(D,oe,null,s,this.state.context,a)),_e(this,en,In).call(this,{type:"success",data:oe}),oe}catch(oe){try{await((A=(R=E(this,dt).config).onError)==null?void 0:A.call(R,oe,s,this.state.context,this,a))}catch(ee){Promise.reject(ee)}try{await((V=(I=this.options).onError)==null?void 0:V.call(I,oe,s,this.state.context,a))}catch(ee){Promise.reject(ee)}try{await((K=(z=E(this,dt).config).onSettled)==null?void 0:K.call(z,void 0,oe,this.state.variables,this.state.context,this,a))}catch(ee){Promise.reject(ee)}try{await((ue=(G=this.options).onSettled)==null?void 0:ue.call(G,void 0,oe,s,this.state.context,a))}catch(ee){Promise.reject(ee)}throw _e(this,en,In).call(this,{type:"error",error:oe}),oe}finally{E(this,dt).runNext(this)}}},Ti=new WeakMap,Jt=new WeakMap,dt=new WeakMap,wr=new WeakMap,en=new WeakSet,In=function(s){const o=a=>{switch(s.type){case"failed":return{...a,failureCount:s.failureCount,failureReason:s.error};case"pause":return{...a,isPaused:!0};case"continue":return{...a,isPaused:!1};case"pending":return{...a,context:s.context,data:void 0,failureCount:0,failureReason:null,error:null,isPaused:s.isPaused,status:"pending",variables:s.variables,submittedAt:Date.now()};case"success":return{...a,data:s.data,failureCount:0,failureReason:null,error:null,status:"success",isPaused:!1};case"error":return{...a,data:void 0,error:s.error,failureCount:a.failureCount+1,failureReason:s.error,isPaused:!1,status:"error"}}};this.state=o(this.state),it.batch(()=>{E(this,Jt).forEach(a=>{a.onMutationUpdate(s)}),E(this,dt).notify({mutation:this,type:"updated",action:s})})},sp);function iy(){return{context:void 0,data:void 0,error:null,failureCount:0,failureReason:null,isPaused:!1,status:"idle",variables:void 0,submittedAt:0}}var gn,Ht,Li,ip,oy=(ip=class extends Di{constructor(s={}){super();pe(this,gn);pe(this,Ht);pe(this,Li);this.config=s,J(this,gn,new Set),J(this,Ht,new Map),J(this,Li,0)}build(s,o,a){const u=new sy({client:s,mutationCache:this,mutationId:++Ko(this,Li)._,options:s.defaultMutationOptions(o),state:a});return this.add(u),u}add(s){E(this,gn).add(s);const o=Go(s);if(typeof o=="string"){const a=E(this,Ht).get(o);a?a.push(s):E(this,Ht).set(o,[s])}this.notify({type:"added",mutation:s})}remove(s){if(E(this,gn).delete(s)){const o=Go(s);if(typeof o=="string"){const a=E(this,Ht).get(o);if(a)if(a.length>1){const u=a.indexOf(s);u!==-1&&a.splice(u,1)}else a[0]===s&&E(this,Ht).delete(o)}}this.notify({type:"removed",mutation:s})}canRun(s){const o=Go(s);if(typeof o=="string"){const a=E(this,Ht).get(o),u=a==null?void 0:a.find(f=>f.state.status==="pending");return!u||u===s}else return!0}runNext(s){var a;const o=Go(s);if(typeof o=="string"){const u=(a=E(this,Ht).get(o))==null?void 0:a.find(f=>f!==s&&f.state.isPaused);return(u==null?void 0:u.continue())??Promise.resolve()}else return Promise.resolve()}clear(){it.batch(()=>{E(this,gn).forEach(s=>{this.notify({type:"removed",mutation:s})}),E(this,gn).clear(),E(this,Ht).clear()})}getAll(){return Array.from(E(this,gn))}find(s){const o={exact:!0,...s};return this.getAll().find(a=>gh(o,a))}findAll(s={}){return this.getAll().filter(o=>gh(s,o))}notify(s){it.batch(()=>{this.listeners.forEach(o=>{o(s)})})}resumePausedMutations(){const s=this.getAll().filter(o=>o.state.isPaused);return it.batch(()=>Promise.all(s.map(o=>o.continue().catch(bt))))}},gn=new WeakMap,Ht=new WeakMap,Li=new WeakMap,ip);function Go(r){var s;return(s=r.options.scope)==null?void 0:s.id}var tn,op,ly=(op=class extends Di{constructor(s={}){super();pe(this,tn);this.config=s,J(this,tn,new Map)}build(s,o,a){const u=o.queryKey,f=o.queryHash??nc(u,o);let m=this.get(f);return m||(m=new ey({client:s,queryKey:u,queryHash:f,options:s.defaultQueryOptions(o),state:a,defaultOptions:s.getQueryDefaults(u)}),this.add(m)),m}add(s){E(this,tn).has(s.queryHash)||(E(this,tn).set(s.queryHash,s),this.notify({type:"added",query:s}))}remove(s){const o=E(this,tn).get(s.queryHash);o&&(s.destroy(),o===s&&E(this,tn).delete(s.queryHash),this.notify({type:"removed",query:s}))}clear(){it.batch(()=>{this.getAll().forEach(s=>{this.remove(s)})})}get(s){return E(this,tn).get(s)}getAll(){return[...E(this,tn).values()]}find(s){const o={exact:!0,...s};return this.getAll().find(a=>mh(o,a))}findAll(s={}){const o=this.getAll();return Object.keys(s).length>0?o.filter(a=>mh(s,a)):o}notify(s){it.batch(()=>{this.listeners.forEach(o=>{o(s)})})}onFocus(){it.batch(()=>{this.getAll().forEach(s=>{s.onFocus()})})}onOnline(){it.batch(()=>{this.getAll().forEach(s=>{s.onOnline()})})}},tn=new WeakMap,op),Qe,Qn,Kn,vs,ys,qn,xs,ws,lp,ay=(lp=class{constructor(r={}){pe(this,Qe);pe(this,Qn);pe(this,Kn);pe(this,vs);pe(this,ys);pe(this,qn);pe(this,xs);pe(this,ws);J(this,Qe,r.queryCache||new ly),J(this,Qn,r.mutationCache||new oy),J(this,Kn,r.defaultOptions||{}),J(this,vs,new Map),J(this,ys,new Map),J(this,qn,0)}mount(){Ko(this,qn)._++,E(this,qn)===1&&(J(this,xs,tc.subscribe(async r=>{r&&(await this.resumePausedMutations(),E(this,Qe).onFocus())})),J(this,ws,ol.subscribe(async r=>{r&&(await this.resumePausedMutations(),E(this,Qe).onOnline())})))}unmount(){var r,s;Ko(this,qn)._--,E(this,qn)===0&&((r=E(this,xs))==null||r.call(this),J(this,xs,void 0),(s=E(this,ws))==null||s.call(this),J(this,ws,void 0))}isFetching(r){return E(this,Qe).findAll({...r,fetchStatus:"fetching"}).length}isMutating(r){return E(this,Qn).findAll({...r,status:"pending"}).length}getQueryData(r){var o;const s=this.defaultQueryOptions({queryKey:r});return(o=E(this,Qe).get(s.queryHash))==null?void 0:o.state.data}ensureQueryData(r){const s=this.defaultQueryOptions(r),o=E(this,Qe).build(this,s),a=o.state.data;return a===void 0?this.fetchQuery(r):(r.revalidateIfStale&&o.isStaleByTime(Gn(s.staleTime,o))&&this.prefetchQuery(s),Promise.resolve(a))}getQueriesData(r){return E(this,Qe).findAll(r).map(({queryKey:s,state:o})=>{const a=o.data;return[s,a]})}setQueryData(r,s,o){const a=this.defaultQueryOptions({queryKey:r}),u=E(this,Qe).get(a.queryHash),f=u==null?void 0:u.state.data,m=Bv(s,f);if(m!==void 0)return E(this,Qe).build(this,a).setData(m,{...o,manual:!0})}setQueriesData(r,s,o){return it.batch(()=>E(this,Qe).findAll(r).map(({queryKey:a})=>[a,this.setQueryData(a,s,o)]))}getQueryState(r){var o;const s=this.defaultQueryOptions({queryKey:r});return(o=E(this,Qe).get(s.queryHash))==null?void 0:o.state}removeQueries(r){const s=E(this,Qe);it.batch(()=>{s.findAll(r).forEach(o=>{s.remove(o)})})}resetQueries(r,s){const o=E(this,Qe);return it.batch(()=>(o.findAll(r).forEach(a=>{a.reset()}),this.refetchQueries({type:"active",...r},s)))}cancelQueries(r,s={}){const o={revert:!0,...s},a=it.batch(()=>E(this,Qe).findAll(r).map(u=>u.cancel(o)));return Promise.all(a).then(bt).catch(bt)}invalidateQueries(r,s={}){return it.batch(()=>(E(this,Qe).findAll(r).forEach(o=>{o.invalidate()}),(r==null?void 0:r.refetchType)==="none"?Promise.resolve():this.refetchQueries({...r,type:(r==null?void 0:r.refetchType)??(r==null?void 0:r.type)??"active"},s)))}refetchQueries(r,s={}){const o={...s,cancelRefetch:s.cancelRefetch??!0},a=it.batch(()=>E(this,Qe).findAll(r).filter(u=>!u.isDisabled()&&!u.isStatic()).map(u=>{let f=u.fetch(void 0,o);return o.throwOnError||(f=f.catch(bt)),u.state.fetchStatus==="paused"?Promise.resolve():f}));return Promise.all(a).then(bt)}fetchQuery(r){const s=this.defaultQueryOptions(r);s.retry===void 0&&(s.retry=!1);const o=E(this,Qe).build(this,s);return o.isStaleByTime(Gn(s.staleTime,o))?o.fetch(s):Promise.resolve(o.state.data)}prefetchQuery(r){return this.fetchQuery(r).then(bt).catch(bt)}fetchInfiniteQuery(r){return r._type="infinite",this.fetchQuery(r)}prefetchInfiniteQuery(r){return this.fetchInfiniteQuery(r).then(bt).catch(bt)}ensureInfiniteQueryData(r){return r._type="infinite",this.ensureQueryData(r)}resumePausedMutations(){return ol.isOnline()?E(this,Qn).resumePausedMutations():Promise.resolve()}getQueryCache(){return E(this,Qe)}getMutationCache(){return E(this,Qn)}getDefaultOptions(){return E(this,Kn)}setDefaultOptions(r){J(this,Kn,r)}setQueryDefaults(r,s){E(this,vs).set(bi(r),{queryKey:r,defaultOptions:s})}getQueryDefaults(r){const s=[...E(this,vs).values()],o={};return s.forEach(a=>{Si(r,a.queryKey)&&Object.assign(o,a.defaultOptions)}),o}setMutationDefaults(r,s){E(this,ys).set(bi(r),{mutationKey:r,defaultOptions:s})}getMutationDefaults(r){const s=[...E(this,ys).values()],o={};return s.forEach(a=>{Si(r,a.mutationKey)&&Object.assign(o,a.defaultOptions)}),o}defaultQueryOptions(r){if(r._defaulted)return r;const s={...E(this,Kn).queries,...this.getQueryDefaults(r.queryKey),...r,_defaulted:!0};return s.queryHash||(s.queryHash=nc(s.queryKey,s)),s.refetchOnReconnect===void 0&&(s.refetchOnReconnect=s.networkMode!=="always"),s.throwOnError===void 0&&(s.throwOnError=!!s.suspense),!s.networkMode&&s.persister&&(s.networkMode="offlineFirst"),s.queryFn===rc&&(s.enabled=!1),s}defaultMutationOptions(r){return r!=null&&r._defaulted?r:{...E(this,Kn).mutations,...(r==null?void 0:r.mutationKey)&&this.getMutationDefaults(r.mutationKey),...r,_defaulted:!0}}clear(){E(this,Qe).clear(),E(this,Qn).clear()}},Qe=new WeakMap,Qn=new WeakMap,Kn=new WeakMap,vs=new WeakMap,ys=new WeakMap,qn=new WeakMap,xs=new WeakMap,ws=new WeakMap,lp),wp=g.createContext(void 0),ul=r=>{const s=g.useContext(wp);if(!s)throw new Error("No QueryClient set, use QueryClientProvider to set one");return s},uy=({client:r,children:s})=>(g.useEffect(()=>(r.mount(),()=>{r.unmount()}),[r]),d.jsx(wp.Provider,{value:r,children:s})),kp=g.createContext(!1),cy=()=>g.useContext(kp);kp.Provider;function dy(){let r=!1;return{clearReset:()=>{r=!1},reset:()=>{r=!0},isReset:()=>r}}var fy=g.createContext(dy()),hy=()=>g.useContext(fy),py=(r,s,o)=>{const a=o!=null&&o.state.error&&typeof r.throwOnError=="function"?hp(r.throwOnError,[o.state.error,o]):r.throwOnError;(r.suspense||r.experimental_prefetchInRender||a)&&(s.isReset()||(r.retryOnMount=!1))},my=r=>{g.useEffect(()=>{r.clearReset()},[r])},gy=({result:r,errorResetBoundary:s,throwOnError:o,query:a,suspense:u})=>r.isError&&!s.isReset()&&!r.isFetching&&a&&(u&&r.data===void 0||hp(o,[r.error,a])),vy=r=>{if(r.suspense){const o=u=>u==="static"?u:Math.max(u??1e3,1e3),a=r.staleTime;r.staleTime=typeof a=="function"?(...u)=>o(a(...u)):o(a),typeof r.gcTime=="number"&&(r.gcTime=Math.max(r.gcTime,1e3))}},yy=(r,s)=>r.isLoading&&r.isFetching&&!s,xy=(r,s)=>(r==null?void 0:r.suspense)&&s.isPending,Eh=(r,s,o)=>s.fetchOptimistic(r).catch(()=>{o.clearReset()});function wy(r,s,o){var _,D,b,R;const a=cy(),u=hy(),f=ul(),m=f.defaultQueryOptions(r);(D=(_=f.getDefaultOptions().queries)==null?void 0:_._experimental_beforeQuery)==null||D.call(_,m);const h=f.getQueryCache().get(m.queryHash),y=r.subscribed!==!1;m._optimisticResults=a?"isRestoring":y?"optimistic":void 0,vy(m),py(m,u,h),my(u);const k=!f.getQueryCache().get(m.queryHash),[w]=g.useState(()=>new s(f,m)),x=w.getOptimisticResult(m),P=!a&&y;if(g.useSyncExternalStore(g.useCallback(A=>{const I=P?w.subscribe(it.batchCalls(A)):bt;return w.updateResult(),I},[w,P]),()=>w.getCurrentResult(),()=>w.getCurrentResult()),g.useEffect(()=>{w.setOptions(m)},[m,w]),xy(m,x))throw Eh(m,w,u);if(gy({result:x,errorResetBoundary:u,throwOnError:m.throwOnError,query:h,suspense:m.suspense}))throw x.error;if((R=(b=f.getDefaultOptions().queries)==null?void 0:b._experimental_afterQuery)==null||R.call(b,m,x),m.experimental_prefetchInRender&&!Ei.isServer()&&yy(x,a)){const A=k?Eh(m,w,u):h==null?void 0:h.promise;A==null||A.catch(bt).finally(()=>{w.updateResult()})}return m.notifyOnChangeProps?x:w.trackResult(x)}function Be(r,s){return wy(r,ty)}const ky="modulepreload",by=function(r){return"/"+r},Nh={},Wt=function(s,o,a){let u=Promise.resolve();if(o&&o.length>0){let m=function(k){return Promise.all(k.map(w=>Promise.resolve(w).then(x=>({status:"fulfilled",value:x}),x=>({status:"rejected",reason:x}))))};document.getElementsByTagName("link");const h=document.querySelector("meta[property=csp-nonce]"),y=(h==null?void 0:h.nonce)||(h==null?void 0:h.getAttribute("nonce"));u=m(o.map(k=>{if(k=by(k),k in Nh)return;Nh[k]=!0;const w=k.endsWith(".css"),x=w?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${k}"]${x}`))return;const P=document.createElement("link");if(P.rel=w?"stylesheet":ky,w||(P.as="script"),P.crossOrigin="",P.href=k,y&&P.setAttribute("nonce",y),document.head.appendChild(P),w)return new Promise((_,D)=>{P.addEventListener("load",_),P.addEventListener("error",()=>D(new Error(`Unable to preload CSS for ${k}`)))})}))}function f(m){const h=new Event("vite:preloadError",{cancelable:!0});if(h.payload=m,window.dispatchEvent(h),!h.defaultPrevented)throw m}return u.then(m=>{for(const h of m||[])h.status==="rejected"&&f(h.reason);return s().catch(f)})};/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Sy=r=>r.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),bp=(...r)=>r.filter((s,o,a)=>!!s&&s.trim()!==""&&a.indexOf(s)===o).join(" ").trim();/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */var Ey={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Ny=g.forwardRef(({color:r="currentColor",size:s=24,strokeWidth:o=2,absoluteStrokeWidth:a,className:u="",children:f,iconNode:m,...h},y)=>g.createElement("svg",{ref:y,...Ey,width:s,height:s,stroke:r,strokeWidth:a?Number(o)*24/Number(s):o,className:bp("lucide",u),...h},[...m.map(([k,w])=>g.createElement(k,w)),...Array.isArray(f)?f:[f]]));/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const ge=(r,s)=>{const o=g.forwardRef(({className:a,...u},f)=>g.createElement(Ny,{ref:f,iconNode:s,className:bp(`lucide-${Sy(r)}`,a),...u}));return o.displayName=`${r}`,o};/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const jy=ge("Activity",[["path",{d:"M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2",key:"169zse"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const jh=ge("ArrowRight",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"m12 5 7 7-7 7",key:"xquz4c"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Cy=ge("BookMarked",[["path",{d:"M10 2v8l3-3 3 3V2",key:"sqw3rj"}],["path",{d:"M4 19.5v-15A2.5 2.5 0 0 1 6.5 2H19a1 1 0 0 1 1 1v18a1 1 0 0 1-1 1H6.5a1 1 0 0 1 0-5H20",key:"k3hazp"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Ni=ge("Bot",[["path",{d:"M12 8V4H8",key:"hb8ula"}],["rect",{width:"16",height:"12",x:"4",y:"8",rx:"2",key:"enze0r"}],["path",{d:"M2 14h2",key:"vft8re"}],["path",{d:"M20 14h2",key:"4cs60a"}],["path",{d:"M15 13v2",key:"1xurst"}],["path",{d:"M9 13v2",key:"rq6x2g"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const _y=ge("Box",[["path",{d:"M21 8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16Z",key:"hh9hay"}],["path",{d:"m3.3 7 8.7 5 8.7-5",key:"g66t2b"}],["path",{d:"M12 22V12",key:"d0xqtd"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Sp=ge("Boxes",[["path",{d:"M2.97 12.92A2 2 0 0 0 2 14.63v3.24a2 2 0 0 0 .97 1.71l3 1.8a2 2 0 0 0 2.06 0L12 19v-5.5l-5-3-4.03 2.42Z",key:"lc1i9w"}],["path",{d:"m7 16.5-4.74-2.85",key:"1o9zyk"}],["path",{d:"m7 16.5 5-3",key:"va8pkn"}],["path",{d:"M7 16.5v5.17",key:"jnp8gn"}],["path",{d:"M12 13.5V19l3.97 2.38a2 2 0 0 0 2.06 0l3-1.8a2 2 0 0 0 .97-1.71v-3.24a2 2 0 0 0-.97-1.71L17 10.5l-5 3Z",key:"8zsnat"}],["path",{d:"m17 16.5-5-3",key:"8arw3v"}],["path",{d:"m17 16.5 4.74-2.85",key:"8rfmw"}],["path",{d:"M17 16.5v5.17",key:"k6z78m"}],["path",{d:"M7.97 4.42A2 2 0 0 0 7 6.13v4.37l5 3 5-3V6.13a2 2 0 0 0-.97-1.71l-3-1.8a2 2 0 0 0-2.06 0l-3 1.8Z",key:"1xygjf"}],["path",{d:"M12 8 7.26 5.15",key:"1vbdud"}],["path",{d:"m12 8 4.74-2.85",key:"3rx089"}],["path",{d:"M12 13.5V8",key:"1io7kd"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Py=ge("Brain",[["path",{d:"M12 5a3 3 0 1 0-5.997.125 4 4 0 0 0-2.526 5.77 4 4 0 0 0 .556 6.588A4 4 0 1 0 12 18Z",key:"l5xja"}],["path",{d:"M12 5a3 3 0 1 1 5.997.125 4 4 0 0 1 2.526 5.77 4 4 0 0 1-.556 6.588A4 4 0 1 1 12 18Z",key:"ep3f8r"}],["path",{d:"M15 13a4.5 4.5 0 0 1-3-4 4.5 4.5 0 0 1-3 4",key:"1p4c4q"}],["path",{d:"M17.599 6.5a3 3 0 0 0 .399-1.375",key:"tmeiqw"}],["path",{d:"M6.003 5.125A3 3 0 0 0 6.401 6.5",key:"105sqy"}],["path",{d:"M3.477 10.896a4 4 0 0 1 .585-.396",key:"ql3yin"}],["path",{d:"M19.938 10.5a4 4 0 0 1 .585.396",key:"1qfode"}],["path",{d:"M6 18a4 4 0 0 1-1.967-.516",key:"2e4loj"}],["path",{d:"M19.967 17.484A4 4 0 0 1 18 18",key:"159ez6"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Ry=ge("Camera",[["path",{d:"M14.5 4h-5L7 7H4a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2h-3l-2.5-3z",key:"1tc9qg"}],["circle",{cx:"12",cy:"13",r:"3",key:"1vg3eu"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const My=ge("Check",[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Oy=ge("ChevronLeft",[["path",{d:"m15 18-6-6 6-6",key:"1wnfg3"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const wi=ge("ChevronRight",[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Ty=ge("CircleCheck",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Ep=ge("CircleHelp",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3",key:"1u773s"}],["path",{d:"M12 17h.01",key:"p32p05"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Ly=ge("Clock",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["polyline",{points:"12 6 12 12 16 14",key:"68esgv"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Dy=ge("CloudDownload",[["path",{d:"M12 13v8l-4-4",key:"1f5nwf"}],["path",{d:"m12 21 4-4",key:"1lfcce"}],["path",{d:"M4.393 15.269A7 7 0 1 1 15.71 8h1.79a4.5 4.5 0 0 1 2.436 8.284",key:"ui1hmy"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Ay=ge("Command",[["path",{d:"M15 6v12a3 3 0 1 0 3-3H6a3 3 0 1 0 3 3V6a3 3 0 1 0-3 3h12a3 3 0 1 0-3-3",key:"11bfej"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Np=ge("Cpu",[["rect",{width:"16",height:"16",x:"4",y:"4",rx:"2",key:"14l7u7"}],["rect",{width:"6",height:"6",x:"9",y:"9",rx:"1",key:"5aljv4"}],["path",{d:"M15 2v2",key:"13l42r"}],["path",{d:"M15 20v2",key:"15mkzm"}],["path",{d:"M2 15h2",key:"1gxd5l"}],["path",{d:"M2 9h2",key:"1bbxkp"}],["path",{d:"M20 15h2",key:"19e6y8"}],["path",{d:"M20 9h2",key:"19tzq7"}],["path",{d:"M9 2v2",key:"165o2o"}],["path",{d:"M9 20v2",key:"i2bqo8"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const zy=ge("ExternalLink",[["path",{d:"M15 3h6v6",key:"1q9fwt"}],["path",{d:"M10 14 21 3",key:"gplh6r"}],["path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6",key:"a6xqqp"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Fy=ge("EyeOff",[["path",{d:"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49",key:"ct8e1f"}],["path",{d:"M14.084 14.158a3 3 0 0 1-4.242-4.242",key:"151rxh"}],["path",{d:"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143",key:"13bj9a"}],["path",{d:"m2 2 20 20",key:"1ooewy"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const jp=ge("Eye",[["path",{d:"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0",key:"1nclc0"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Iy=ge("FileText",[["path",{d:"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z",key:"1rqfz7"}],["path",{d:"M14 2v4a2 2 0 0 0 2 2h4",key:"tnqrlb"}],["path",{d:"M10 9H8",key:"b1mrlr"}],["path",{d:"M16 13H8",key:"t4e002"}],["path",{d:"M16 17H8",key:"z1uh3a"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Uy=ge("Gauge",[["path",{d:"m12 14 4-4",key:"9kzdfg"}],["path",{d:"M3.34 19a10 10 0 1 1 17.32 0",key:"19p75a"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const $y=ge("GitCommitHorizontal",[["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}],["line",{x1:"3",x2:"9",y1:"12",y2:"12",key:"1dyftd"}],["line",{x1:"15",x2:"21",y1:"12",y2:"12",key:"oup4p8"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const By=ge("HardDrive",[["line",{x1:"22",x2:"2",y1:"12",y2:"12",key:"1y58io"}],["path",{d:"M5.45 5.11 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z",key:"oot6mr"}],["line",{x1:"6",x2:"6.01",y1:"16",y2:"16",key:"sgf278"}],["line",{x1:"10",x2:"10.01",y1:"16",y2:"16",key:"1l4acy"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Vy=ge("HeartPulse",[["path",{d:"M19 14c1.49-1.46 3-3.21 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.76 0-3 .5-4.5 2-1.5-1.5-2.74-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4.05 3 5.5l7 7Z",key:"c3ymky"}],["path",{d:"M3.22 12H9.5l.5-1 2 4.5 2-7 1.5 3.5h5.27",key:"1uw2ng"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Hy=ge("History",[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"1357e3"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}],["path",{d:"M12 7v5l4 2",key:"1fdv2h"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const ic=ge("Inbox",[["polyline",{points:"22 12 16 12 14 15 10 15 8 12 2 12",key:"o97t9d"}],["path",{d:"M5.45 5.11 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z",key:"oot6mr"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Wy=ge("Key",[["path",{d:"m15.5 7.5 2.3 2.3a1 1 0 0 0 1.4 0l2.1-2.1a1 1 0 0 0 0-1.4L19 4",key:"g0fldk"}],["path",{d:"m21 2-9.6 9.6",key:"1j0ho8"}],["circle",{cx:"7.5",cy:"15.5",r:"5.5",key:"yqb3hr"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Qy=ge("LayoutDashboard",[["rect",{width:"7",height:"9",x:"3",y:"3",rx:"1",key:"10lvy0"}],["rect",{width:"7",height:"5",x:"14",y:"3",rx:"1",key:"16une8"}],["rect",{width:"7",height:"9",x:"14",y:"12",rx:"1",key:"1hutg5"}],["rect",{width:"7",height:"5",x:"3",y:"16",rx:"1",key:"ldoo1y"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Ky=ge("Library",[["path",{d:"m16 6 4 14",key:"ji33uf"}],["path",{d:"M12 6v14",key:"1n7gus"}],["path",{d:"M8 8v12",key:"1gg7y9"}],["path",{d:"M4 4v16",key:"6qkkli"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const qy=ge("Lightbulb",[["path",{d:"M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5",key:"1gvzjb"}],["path",{d:"M9 18h6",key:"x1upvd"}],["path",{d:"M10 22h4",key:"ceow96"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const ji=ge("LoaderCircle",[["path",{d:"M21 12a9 9 0 1 1-6.219-8.56",key:"13zald"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Gy=ge("Menu",[["line",{x1:"4",x2:"20",y1:"12",y2:"12",key:"1e0a9i"}],["line",{x1:"4",x2:"20",y1:"6",y2:"6",key:"1owob3"}],["line",{x1:"4",x2:"20",y1:"18",y2:"18",key:"yk5zj1"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Zy=ge("Mic",[["path",{d:"M12 2a3 3 0 0 0-3 3v7a3 3 0 0 0 6 0V5a3 3 0 0 0-3-3Z",key:"131961"}],["path",{d:"M19 10v2a7 7 0 0 1-14 0v-2",key:"1vc78b"}],["line",{x1:"12",x2:"12",y1:"19",y2:"22",key:"x3vr5v"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Ch=ge("Package",[["path",{d:"M11 21.73a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73z",key:"1a0edw"}],["path",{d:"M12 22V12",key:"d0xqtd"}],["path",{d:"m3.3 7 7.703 4.734a2 2 0 0 0 1.994 0L20.7 7",key:"yx3hmr"}],["path",{d:"m7.5 4.27 9 5.15",key:"1c824w"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const oc=ge("Plug",[["path",{d:"M12 22v-5",key:"1ega77"}],["path",{d:"M9 8V2",key:"14iosj"}],["path",{d:"M15 8V2",key:"18g5xt"}],["path",{d:"M18 8v5a4 4 0 0 1-4 4h-4a4 4 0 0 1-4-4V8Z",key:"osxo6l"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Yy=ge("Power",[["path",{d:"M12 2v10",key:"mnfbl"}],["path",{d:"M18.4 6.6a9 9 0 1 1-12.77.04",key:"obofu9"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const ss=ge("RefreshCw",[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Xy=ge("Search",[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["path",{d:"m21 21-4.3-4.3",key:"1qie3q"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const cl=ge("Server",[["rect",{width:"20",height:"8",x:"2",y:"2",rx:"2",ry:"2",key:"ngkwjq"}],["rect",{width:"20",height:"8",x:"2",y:"14",rx:"2",ry:"2",key:"iecqi9"}],["line",{x1:"6",x2:"6.01",y1:"6",y2:"6",key:"16zg32"}],["line",{x1:"6",x2:"6.01",y1:"18",y2:"18",key:"nzw8ys"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const lc=ge("ShieldAlert",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}],["path",{d:"M12 8v4",key:"1got3b"}],["path",{d:"M12 16h.01",key:"1drbdi"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Cp=ge("ShieldCheck",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const _p=ge("Shield",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Pp=ge("Shuffle",[["path",{d:"M2 18h1.4c1.3 0 2.5-.6 3.3-1.7l6.1-8.6c.7-1.1 2-1.7 3.3-1.7H22",key:"1wmou1"}],["path",{d:"m18 2 4 4-4 4",key:"pucp1d"}],["path",{d:"M2 6h1.9c1.5 0 2.9.9 3.6 2.2",key:"10bdb2"}],["path",{d:"M22 18h-5.9c-1.3 0-2.6-.7-3.3-1.8l-.5-.8",key:"vgxac0"}],["path",{d:"m18 14 4 4-4 4",key:"10pe0f"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Jy=ge("SlidersHorizontal",[["line",{x1:"21",x2:"14",y1:"4",y2:"4",key:"obuewd"}],["line",{x1:"10",x2:"3",y1:"4",y2:"4",key:"1q6298"}],["line",{x1:"21",x2:"12",y1:"12",y2:"12",key:"1iu8h1"}],["line",{x1:"8",x2:"3",y1:"12",y2:"12",key:"ntss68"}],["line",{x1:"21",x2:"16",y1:"20",y2:"20",key:"14d8ph"}],["line",{x1:"12",x2:"3",y1:"20",y2:"20",key:"m0wm8r"}],["line",{x1:"14",x2:"14",y1:"2",y2:"6",key:"14e1ph"}],["line",{x1:"8",x2:"8",y1:"10",y2:"14",key:"1i6ji0"}],["line",{x1:"16",x2:"16",y1:"18",y2:"22",key:"1lctlv"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const e0=ge("Sparkles",[["path",{d:"M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z",key:"4pj2yx"}],["path",{d:"M20 3v4",key:"1olli1"}],["path",{d:"M22 5h-4",key:"1gvqau"}],["path",{d:"M4 17v2",key:"vumght"}],["path",{d:"M5 18H3",key:"zchphs"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const t0=ge("SquareTerminal",[["path",{d:"m7 11 2-2-2-2",key:"1lz0vl"}],["path",{d:"M11 13h4",key:"1p7l4v"}],["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",ry:"2",key:"1m3agn"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const n0=ge("Terminal",[["polyline",{points:"4 17 10 11 4 5",key:"akl6gq"}],["line",{x1:"12",x2:"20",y1:"19",y2:"19",key:"q2wloq"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Ci=ge("TriangleAlert",[["path",{d:"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3",key:"wmoenq"}],["path",{d:"M12 9v4",key:"juzpu7"}],["path",{d:"M12 17h.01",key:"p32p05"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const r0=ge("Wrench",[["path",{d:"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z",key:"cbrjhi"}]]);/** + * @license lucide-react v0.460.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const dl=ge("X",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]),is=[{id:"dashboard",label:"Cockpit",hint:"Deine Box auf einen Blick",icon:Qy,group:"Operativ"},{id:"ideen",label:"Ideen",hint:"Schreib hin, was entstehen soll",icon:qy,group:"Operativ"},{id:"auftraege",label:"Auftragsbuch",hint:"Vorschläge der Box — annehmen oder ablehnen",icon:ic,group:"Operativ"},{id:"skills",label:"Skills & Jobs",hint:"Autonome Skills manuell auslösen",icon:Ni,group:"Operativ"},{id:"chronik",label:"Chronik",hint:"Was die Box von allein getan hat + Zeitmaschine",icon:Hy,group:"Operativ"},{id:"wissen",label:"Wissen",hint:"Lucys Wissens-Vault (Traum-Notizen)",icon:Ky,group:"Wissen"},{id:"connect",label:"Verbinden",hint:"IDE-/Agent-Configs erzeugen",icon:oc,group:"Werkzeuge"},{id:"konsole",label:"Konsole",hint:"Direkte Box-Shell (SSH-artig)",icon:t0,group:"Werkzeuge"},{id:"guide",label:"Anleitung",hint:"Einrichten & Vibe-Coding",icon:Ep,group:"Werkzeuge"},{id:"models",label:"Modelle",hint:"Speicher, laden & Rollen",icon:Sp,group:"Wartung"},{id:"agent",label:"Hermes",hint:"Agent-Status & Verdrahtung",icon:Ni,group:"Wartung"}];var _h=1,s0=.9,i0=.8,o0=.17,pu=.1,mu=.999,l0=.9999,a0=.99,u0=/[\\\/_+.#"@\[\(\{&]/,c0=/[\\\/_+.#"@\[\(\{&]/g,d0=/[\s-]/,Rp=/[\s-]/g;function $u(r,s,o,a,u,f,m){if(f===s.length)return u===r.length?_h:a0;var h=`${u},${f}`;if(m[h]!==void 0)return m[h];for(var y=a.charAt(f),k=o.indexOf(y,u),w=0,x,P,_,D;k>=0;)x=$u(r,s,o,a,k+1,f+1,m),x>w&&(k===u?x*=_h:u0.test(r.charAt(k-1))?(x*=i0,_=r.slice(u,k-1).match(c0),_&&u>0&&(x*=Math.pow(mu,_.length))):d0.test(r.charAt(k-1))?(x*=s0,D=r.slice(u,k-1).match(Rp),D&&u>0&&(x*=Math.pow(mu,D.length))):(x*=o0,u>0&&(x*=Math.pow(mu,k-u))),r.charAt(k)!==s.charAt(f)&&(x*=l0)),(xx&&(x=P*pu)),x>w&&(w=x),k=o.indexOf(y,k+1);return m[h]=w,w}function Ph(r){return r.toLowerCase().replace(Rp," ")}function f0(r,s,o){return r=o&&o.length>0?`${r+" "+o.join(" ")}`:r,$u(r,s,Ph(r),Ph(s),0,0,{})}function Zn(r,s,{checkForDefaultPrevented:o=!0}={}){return function(u){if(r==null||r(u),o===!1||!u.defaultPrevented)return s==null?void 0:s(u)}}function Rh(r,s){if(typeof r=="function")return r(s);r!=null&&(r.current=s)}function ks(...r){return s=>{let o=!1;const a=r.map(u=>{const f=Rh(u,s);return!o&&typeof f=="function"&&(o=!0),f});if(o)return()=>{for(let u=0;u{var A;const{scope:P,children:_,...D}=x,b=((A=P==null?void 0:P[r])==null?void 0:A[y])||h,R=g.useMemo(()=>D,Object.values(D));return d.jsx(b.Provider,{value:R,children:_})};k.displayName=f+"Provider";function w(x,P){var b;const _=((b=P==null?void 0:P[r])==null?void 0:b[y])||h,D=g.useContext(_);if(D)return D;if(m!==void 0)return m;throw new Error(`\`${x}\` must be used within \`${f}\``)}return[k,w]}const u=()=>{const f=o.map(m=>g.createContext(m));return function(h){const y=(h==null?void 0:h[r])||f;return g.useMemo(()=>({[`__scope${r}`]:{...h,[r]:y}}),[h,y])}};return u.scopeName=r,[a,p0(u,...s)]}function p0(...r){const s=r[0];if(r.length===1)return s;const o=()=>{const a=r.map(u=>({useScope:u(),scopeName:u.scopeName}));return function(f){const m=a.reduce((h,{useScope:y,scopeName:k})=>{const x=y(f)[`__scope${k}`];return{...h,...x}},{});return g.useMemo(()=>({[`__scope${s.scopeName}`]:m}),[m])}};return o.scopeName=s.scopeName,o}var _i=globalThis!=null&&globalThis.document?g.useLayoutEffect:()=>{},m0=ec[" useId ".trim().toString()]||(()=>{}),g0=0;function vn(r){const[s,o]=g.useState(m0());return _i(()=>{o(a=>a??String(g0++))},[r]),s?`radix-${s}`:""}var v0=ec[" useInsertionEffect ".trim().toString()]||_i;function y0({prop:r,defaultProp:s,onChange:o=()=>{},caller:a}){const[u,f,m]=x0({defaultProp:s,onChange:o}),h=r!==void 0,y=h?r:u;{const w=g.useRef(r!==void 0);g.useEffect(()=>{const x=w.current;x!==h&&console.warn(`${a} is changing from ${x?"controlled":"uncontrolled"} to ${h?"controlled":"uncontrolled"}. Components should not switch from controlled to uncontrolled (or vice versa). Decide between using a controlled or uncontrolled value for the lifetime of the component.`),w.current=h},[h,a])}const k=g.useCallback(w=>{var x;if(h){const P=w0(w)?w(r):w;P!==r&&((x=m.current)==null||x.call(m,P))}else f(w)},[h,r,f,m]);return[y,k]}function x0({defaultProp:r,onChange:s}){const[o,a]=g.useState(r),u=g.useRef(o),f=g.useRef(s);return v0(()=>{f.current=s},[s]),g.useEffect(()=>{var m;u.current!==o&&((m=f.current)==null||m.call(f,o),u.current=o)},[o,u]),[o,a,f]}function w0(r){return typeof r=="function"}var Mp=up();function Op(r){const s=g.forwardRef((o,a)=>{let{children:u,...f}=o,m=null,h=!1;const y=[];Mh(u)&&typeof Zo=="function"&&(u=Zo(u._payload)),g.Children.forEach(u,P=>{var _;if(N0(P)){h=!0;const D=P;let b="child"in D.props?D.props.child:D.props.children;Mh(b)&&typeof Zo=="function"&&(b=Zo(b._payload)),m=b0(D,b),y.push((_=m==null?void 0:m.props)==null?void 0:_.children)}else y.push(P)}),m?m=g.cloneElement(m,void 0,y):!h&&g.Children.count(u)===1&&g.isValidElement(u)&&(m=u);const k=m?E0(m):void 0,w=br(a,k);if(!m){if(u||u===0)throw new Error(h?P0(r):_0(r));return u}const x=S0(f,m.props??{});return m.type!==g.Fragment&&(x.ref=a?w:k),g.cloneElement(m,x)});return s.displayName=`${r}.Slot`,s}var k0=Symbol.for("radix.slottable"),b0=(r,s)=>{if("child"in r.props){const o=r.props.child;return g.isValidElement(o)?g.cloneElement(o,void 0,r.props.children(o.props.children)):null}return g.isValidElement(s)?s:null};function S0(r,s){const o={...s};for(const a in s){const u=r[a],f=s[a];/^on[A-Z]/.test(a)?u&&f?o[a]=(...h)=>{const y=f(...h);return u(...h),y}:u&&(o[a]=u):a==="style"?o[a]={...u,...f}:a==="className"&&(o[a]=[u,f].filter(Boolean).join(" "))}return{...r,...o}}function E0(r){var a,u;let s=(a=Object.getOwnPropertyDescriptor(r.props,"ref"))==null?void 0:a.get,o=s&&"isReactWarning"in s&&s.isReactWarning;return o?r.ref:(s=(u=Object.getOwnPropertyDescriptor(r,"ref"))==null?void 0:u.get,o=s&&"isReactWarning"in s&&s.isReactWarning,o?r.props.ref:r.props.ref||r.ref)}function N0(r){return g.isValidElement(r)&&typeof r.type=="function"&&"__radixId"in r.type&&r.type.__radixId===k0}var j0=Symbol.for("react.lazy");function Mh(r){return r!=null&&typeof r=="object"&&"$$typeof"in r&&r.$$typeof===j0&&"_payload"in r&&C0(r._payload)}function C0(r){return typeof r=="object"&&r!==null&&"then"in r}var _0=r=>`${r} failed to slot onto its children. Expected a single React element child or \`Slottable\`.`,P0=r=>`${r} failed to slot onto its \`Slottable\`. Expected \`Slottable\` to receive a single React element child.`,Zo=ec[" use ".trim().toString()],R0=["a","button","div","form","h2","h3","img","input","label","li","nav","ol","p","select","span","svg","ul"],ot=R0.reduce((r,s)=>{const o=Op(`Primitive.${s}`),a=g.forwardRef((u,f)=>{const{asChild:m,...h}=u,y=m?o:s;return typeof window<"u"&&(window[Symbol.for("radix-ui")]=!0),d.jsx(y,{...h,ref:f})});return a.displayName=`Primitive.${s}`,{...r,[s]:a}},{});function M0(r,s){r&&Mp.flushSync(()=>r.dispatchEvent(s))}function Pi(r){const s=g.useRef(r);return g.useEffect(()=>{s.current=r}),g.useMemo(()=>((...o)=>{var a;return(a=s.current)==null?void 0:a.call(s,...o)}),[])}function O0(r,s=globalThis==null?void 0:globalThis.document){const o=Pi(r);g.useEffect(()=>{const a=u=>{u.key==="Escape"&&o(u)};return s.addEventListener("keydown",a,{capture:!0}),()=>s.removeEventListener("keydown",a,{capture:!0})},[o,s])}var T0="DismissableLayer",Bu="dismissableLayer.update",L0="dismissableLayer.pointerDownOutside",D0="dismissableLayer.focusOutside",Oh,ac=g.createContext({layers:new Set,layersWithOutsidePointerEventsDisabled:new Set,branches:new Set,dismissableSurfaces:new Set}),Tp=g.forwardRef((r,s)=>{const{disableOutsidePointerEvents:o=!1,deferPointerDownOutside:a=!1,onEscapeKeyDown:u,onPointerDownOutside:f,onFocusOutside:m,onInteractOutside:h,onDismiss:y,...k}=r,w=g.useContext(ac),[x,P]=g.useState(null),_=(x==null?void 0:x.ownerDocument)??(globalThis==null?void 0:globalThis.document),[,D]=g.useState({}),b=br(s,ee=>P(ee)),R=Array.from(w.layers),[A]=[...w.layersWithOutsidePointerEventsDisabled].slice(-1),I=R.indexOf(A),V=x?R.indexOf(x):-1,z=w.layersWithOutsidePointerEventsDisabled.size>0,K=V>=I,G=g.useRef(!1),ue=I0(ee=>{const me=ee.target;if(!(me instanceof Node))return;const ke=[...w.branches].some(le=>le.contains(me));!K||ke||(f==null||f(ee),h==null||h(ee),ee.defaultPrevented||y==null||y())},{ownerDocument:_,deferPointerDownOutside:a,isDeferredPointerDownOutsideRef:G,dismissableSurfaces:w.dismissableSurfaces}),oe=U0(ee=>{if(a&&G.current)return;const me=ee.target;[...w.branches].some(le=>le.contains(me))||(m==null||m(ee),h==null||h(ee),ee.defaultPrevented||y==null||y())},_);return O0(ee=>{V===w.layers.size-1&&(u==null||u(ee),!ee.defaultPrevented&&y&&(ee.preventDefault(),y()))},_),g.useEffect(()=>{if(x)return o&&(w.layersWithOutsidePointerEventsDisabled.size===0&&(Oh=_.body.style.pointerEvents,_.body.style.pointerEvents="none"),w.layersWithOutsidePointerEventsDisabled.add(x)),w.layers.add(x),Th(),()=>{o&&(w.layersWithOutsidePointerEventsDisabled.delete(x),w.layersWithOutsidePointerEventsDisabled.size===0&&(_.body.style.pointerEvents=Oh))}},[x,_,o,w]),g.useEffect(()=>()=>{x&&(w.layers.delete(x),w.layersWithOutsidePointerEventsDisabled.delete(x),Th())},[x,w]),g.useEffect(()=>{const ee=()=>D({});return document.addEventListener(Bu,ee),()=>document.removeEventListener(Bu,ee)},[]),d.jsx(ot.div,{...k,ref:b,style:{pointerEvents:z?K?"auto":"none":void 0,...r.style},onFocusCapture:Zn(r.onFocusCapture,oe.onFocusCapture),onBlurCapture:Zn(r.onBlurCapture,oe.onBlurCapture),onPointerDownCapture:Zn(r.onPointerDownCapture,ue.onPointerDownCapture)})});Tp.displayName=T0;var A0="DismissableLayerBranch",z0=g.forwardRef((r,s)=>{const o=g.useContext(ac),a=g.useRef(null),u=br(s,a);return g.useEffect(()=>{const f=a.current;if(f)return o.branches.add(f),()=>{o.branches.delete(f)}},[o.branches]),d.jsx(ot.div,{...r,ref:u})});z0.displayName=A0;function F0(){const r=g.useContext(ac),[s,o]=g.useState(null);return g.useEffect(()=>{if(s)return r.dismissableSurfaces.add(s),()=>{r.dismissableSurfaces.delete(s)}},[s,r.dismissableSurfaces]),o}function I0(r,s){const{ownerDocument:o=globalThis==null?void 0:globalThis.document,deferPointerDownOutside:a=!1,isDeferredPointerDownOutsideRef:u,dismissableSurfaces:f}=s,m=Pi(r),h=g.useRef(!1),y=g.useRef(!1),k=g.useRef(new Map),w=g.useRef(()=>{});return g.useEffect(()=>{function x(){y.current=!1,u.current=!1,k.current.clear()}function P(){return Array.from(k.current.values()).some(Boolean)}function _(I){if(!y.current)return;const V=I.target;V instanceof Node&&[...f].some(K=>K.contains(V))||k.current.set(I.type,!0),I.type==="click"&&window.setTimeout(()=>{y.current&&w.current()},0)}function D(I){y.current&&k.current.set(I.type,!1)}const b=I=>{if(I.target&&!h.current){let V=function(){o.removeEventListener("click",w.current);const K=P();x(),K||Lp(L0,m,z,{discrete:!0})};const z={originalEvent:I};y.current=!0,u.current=a&&I.button===0,k.current.clear(),!a||I.button!==0?V():(o.removeEventListener("click",w.current),w.current=V,o.addEventListener("click",w.current,{once:!0}))}else o.removeEventListener("click",w.current),x();h.current=!1},R=["pointerup","mousedown","mouseup","touchstart","touchend","click"];for(const I of R)o.addEventListener(I,_,!0),o.addEventListener(I,D);const A=window.setTimeout(()=>{o.addEventListener("pointerdown",b)},0);return()=>{window.clearTimeout(A),o.removeEventListener("pointerdown",b),o.removeEventListener("click",w.current);for(const I of R)o.removeEventListener(I,_,!0),o.removeEventListener(I,D)}},[o,m,a,u,f]),{onPointerDownCapture:()=>h.current=!0}}function U0(r,s=globalThis==null?void 0:globalThis.document){const o=Pi(r),a=g.useRef(!1);return g.useEffect(()=>{const u=f=>{f.target&&!a.current&&Lp(D0,o,{originalEvent:f},{discrete:!1})};return s.addEventListener("focusin",u),()=>s.removeEventListener("focusin",u)},[s,o]),{onFocusCapture:()=>a.current=!0,onBlurCapture:()=>a.current=!1}}function Th(){const r=new CustomEvent(Bu);document.dispatchEvent(r)}function Lp(r,s,o,{discrete:a}){const u=o.originalEvent.target,f=new CustomEvent(r,{bubbles:!1,cancelable:!0,detail:o});s&&u.addEventListener(r,s,{once:!0}),a?M0(u,f):u.dispatchEvent(f)}var gu="focusScope.autoFocusOnMount",vu="focusScope.autoFocusOnUnmount",Lh={bubbles:!1,cancelable:!0},$0="FocusScope",Dp=g.forwardRef((r,s)=>{const{loop:o=!1,trapped:a=!1,onMountAutoFocus:u,onUnmountAutoFocus:f,...m}=r,[h,y]=g.useState(null),k=Pi(u),w=Pi(f),x=g.useRef(null),P=br(s,b=>y(b)),_=g.useRef({paused:!1,pause(){this.paused=!0},resume(){this.paused=!1}}).current;g.useEffect(()=>{if(a){let b=function(V){if(_.paused||!h)return;const z=V.target;h.contains(z)?x.current=z:Un(x.current,{select:!0})},R=function(V){if(_.paused||!h)return;const z=V.relatedTarget;z!==null&&(h.contains(z)||Un(x.current,{select:!0}))},A=function(V){if(document.activeElement===document.body)for(const K of V)K.removedNodes.length>0&&Un(h)};document.addEventListener("focusin",b),document.addEventListener("focusout",R);const I=new MutationObserver(A);return h&&I.observe(h,{childList:!0,subtree:!0}),()=>{document.removeEventListener("focusin",b),document.removeEventListener("focusout",R),I.disconnect()}}},[a,h,_.paused]),g.useEffect(()=>{if(h){Ah.add(_);const b=document.activeElement;if(!h.contains(b)){const A=new CustomEvent(gu,Lh);h.addEventListener(gu,k),h.dispatchEvent(A),A.defaultPrevented||(B0(K0(Ap(h)),{select:!0}),document.activeElement===b&&Un(h))}return()=>{h.removeEventListener(gu,k),setTimeout(()=>{const A=new CustomEvent(vu,Lh);h.addEventListener(vu,w),h.dispatchEvent(A),A.defaultPrevented||Un(b??document.body,{select:!0}),h.removeEventListener(vu,w),Ah.remove(_)},0)}}},[h,k,w,_]);const D=g.useCallback(b=>{if(!o&&!a||_.paused)return;const R=b.key==="Tab"&&!b.altKey&&!b.ctrlKey&&!b.metaKey,A=document.activeElement;if(R&&A){const I=b.currentTarget,[V,z]=V0(I);V&&z?!b.shiftKey&&A===z?(b.preventDefault(),o&&Un(V,{select:!0})):b.shiftKey&&A===V&&(b.preventDefault(),o&&Un(z,{select:!0})):A===I&&b.preventDefault()}},[o,a,_.paused]);return d.jsx(ot.div,{tabIndex:-1,...m,ref:P,onKeyDown:D})});Dp.displayName=$0;function B0(r,{select:s=!1}={}){const o=document.activeElement;for(const a of r)if(Un(a,{select:s}),document.activeElement!==o)return}function V0(r){const s=Ap(r),o=Dh(s,r),a=Dh(s.reverse(),r);return[o,a]}function Ap(r){const s=[],o=document.createTreeWalker(r,NodeFilter.SHOW_ELEMENT,{acceptNode:a=>{const u=a.tagName==="INPUT"&&a.type==="hidden";return a.disabled||a.hidden||u?NodeFilter.FILTER_SKIP:a.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});for(;o.nextNode();)s.push(o.currentNode);return s}function Dh(r,s){for(const o of r)if(!H0(o,{upTo:s}))return o}function H0(r,{upTo:s}){if(getComputedStyle(r).visibility==="hidden")return!0;for(;r;){if(s!==void 0&&r===s)return!1;if(getComputedStyle(r).display==="none")return!0;r=r.parentElement}return!1}function W0(r){return r instanceof HTMLInputElement&&"select"in r}function Un(r,{select:s=!1}={}){if(r&&r.focus){const o=document.activeElement;r.focus({preventScroll:!0}),r!==o&&W0(r)&&s&&r.select()}}var Ah=Q0();function Q0(){let r=[];return{add(s){const o=r[0];s!==o&&(o==null||o.pause()),r=zh(r,s),r.unshift(s)},remove(s){var o;r=zh(r,s),(o=r[0])==null||o.resume()}}}function zh(r,s){const o=[...r],a=o.indexOf(s);return a!==-1&&o.splice(a,1),o}function K0(r){return r.filter(s=>s.tagName!=="A")}var q0="Portal",zp=g.forwardRef((r,s)=>{var h;const{container:o,...a}=r,[u,f]=g.useState(!1);_i(()=>f(!0),[]);const m=o||u&&((h=globalThis==null?void 0:globalThis.document)==null?void 0:h.body);return m?Mp.createPortal(d.jsx(ot.div,{...a,ref:s}),m):null});zp.displayName=q0;function G0(r,s){return g.useReducer((o,a)=>s[o][a]??o,r)}var fl=r=>{const{present:s,children:o}=r,a=Z0(s),u=typeof o=="function"?o({present:a.isPresent}):g.Children.only(o),f=Y0(a.ref,X0(u));return typeof o=="function"||a.isPresent?g.cloneElement(u,{ref:f}):null};fl.displayName="Presence";function Z0(r){const[s,o]=g.useState(),a=g.useRef(null),u=g.useRef(r),f=g.useRef("none"),m=r?"mounted":"unmounted",[h,y]=G0(m,{mounted:{UNMOUNT:"unmounted",ANIMATION_OUT:"unmountSuspended"},unmountSuspended:{MOUNT:"mounted",ANIMATION_END:"unmounted"},unmounted:{MOUNT:"mounted"}});return g.useEffect(()=>{const k=Yo(a.current);f.current=h==="mounted"?k:"none"},[h]),_i(()=>{const k=a.current,w=u.current;if(w!==r){const P=f.current,_=Yo(k);r?y("MOUNT"):_==="none"||(k==null?void 0:k.display)==="none"?y("UNMOUNT"):y(w&&P!==_?"ANIMATION_OUT":"UNMOUNT"),u.current=r}},[r,y]),_i(()=>{if(s){let k;const w=s.ownerDocument.defaultView??window,x=_=>{const b=Yo(a.current).includes(CSS.escape(_.animationName));if(_.target===s&&b&&(y("ANIMATION_END"),!u.current)){const R=s.style.animationFillMode;s.style.animationFillMode="forwards",k=w.setTimeout(()=>{s.style.animationFillMode==="forwards"&&(s.style.animationFillMode=R)})}},P=_=>{_.target===s&&(f.current=Yo(a.current))};return s.addEventListener("animationstart",P),s.addEventListener("animationcancel",x),s.addEventListener("animationend",x),()=>{w.clearTimeout(k),s.removeEventListener("animationstart",P),s.removeEventListener("animationcancel",x),s.removeEventListener("animationend",x)}}else y("ANIMATION_END")},[s,y]),{isPresent:["mounted","unmountSuspended"].includes(h),ref:g.useCallback(k=>{a.current=k?getComputedStyle(k):null,o(k)},[])}}function Fh(r,s){if(typeof r=="function")return r(s);r!=null&&(r.current=s)}function Y0(...r){const s=g.useRef(r);return s.current=r,g.useCallback(o=>{const a=s.current;let u=!1;const f=a.map(m=>{const h=Fh(m,o);return!u&&typeof h=="function"&&(u=!0),h});if(u)return()=>{for(let m=0;m{Xt||(Xt={start:Ih(),end:Ih()});const{start:r,end:s}=Xt;return document.body.firstElementChild!==r&&document.body.insertAdjacentElement("afterbegin",r),document.body.lastElementChild!==s&&document.body.insertAdjacentElement("beforeend",s),Xo++,()=>{Xo===1&&(Xt==null||Xt.start.remove(),Xt==null||Xt.end.remove(),Xt=null),Xo=Math.max(0,Xo-1)}},[])}function Ih(){const r=document.createElement("span");return r.setAttribute("data-radix-focus-guard",""),r.tabIndex=0,r.style.outline="none",r.style.opacity="0",r.style.position="fixed",r.style.pointerEvents="none",r}var nn=function(){return nn=Object.assign||function(s){for(var o,a=1,u=arguments.length;a"u")return gx;var s=vx(r),o=document.documentElement.clientWidth,a=window.innerWidth;return{left:s[0],top:s[1],right:s[2],gap:Math.max(0,a-o+s[2]-s[0])}},xx=$p(),os="data-scroll-locked",wx=function(r,s,o,a){var u=r.left,f=r.top,m=r.right,h=r.gap;return o===void 0&&(o="margin"),` + .`.concat(tx,` { + overflow: hidden `).concat(a,`; + padding-right: `).concat(h,"px ").concat(a,`; + } + body[`).concat(os,`] { + overflow: hidden `).concat(a,`; + overscroll-behavior: contain; + `).concat([s&&"position: relative ".concat(a,";"),o==="margin"&&` + padding-left: `.concat(u,`px; + padding-top: `).concat(f,`px; + padding-right: `).concat(m,`px; + margin-left:0; + margin-top:0; + margin-right: `).concat(h,"px ").concat(a,`; + `),o==="padding"&&"padding-right: ".concat(h,"px ").concat(a,";")].filter(Boolean).join(""),` + } + + .`).concat(rl,` { + right: `).concat(h,"px ").concat(a,`; + } + + .`).concat(sl,` { + margin-right: `).concat(h,"px ").concat(a,`; + } + + .`).concat(rl," .").concat(rl,` { + right: 0 `).concat(a,`; + } + + .`).concat(sl," .").concat(sl,` { + margin-right: 0 `).concat(a,`; + } + + body[`).concat(os,`] { + `).concat(nx,": ").concat(h,`px; + } +`)},$h=function(){var r=parseInt(document.body.getAttribute(os)||"0",10);return isFinite(r)?r:0},kx=function(){g.useEffect(function(){return document.body.setAttribute(os,($h()+1).toString()),function(){var r=$h()-1;r<=0?document.body.removeAttribute(os):document.body.setAttribute(os,r.toString())}},[])},bx=function(r){var s=r.noRelative,o=r.noImportant,a=r.gapMode,u=a===void 0?"margin":a;kx();var f=g.useMemo(function(){return yx(u)},[u]);return g.createElement(xx,{styles:wx(f,!s,u,o?"":"!important")})},Vu=!1;if(typeof window<"u")try{var Jo=Object.defineProperty({},"passive",{get:function(){return Vu=!0,!0}});window.addEventListener("test",Jo,Jo),window.removeEventListener("test",Jo,Jo)}catch{Vu=!1}var Yr=Vu?{passive:!1}:!1,Sx=function(r){return r.tagName==="TEXTAREA"},Bp=function(r,s){if(!(r instanceof Element))return!1;var o=window.getComputedStyle(r);return o[s]!=="hidden"&&!(o.overflowY===o.overflowX&&!Sx(r)&&o[s]==="visible")},Ex=function(r){return Bp(r,"overflowY")},Nx=function(r){return Bp(r,"overflowX")},Bh=function(r,s){var o=s.ownerDocument,a=s;do{typeof ShadowRoot<"u"&&a instanceof ShadowRoot&&(a=a.host);var u=Vp(r,a);if(u){var f=Hp(r,a),m=f[1],h=f[2];if(m>h)return!0}a=a.parentNode}while(a&&a!==o.body);return!1},jx=function(r){var s=r.scrollTop,o=r.scrollHeight,a=r.clientHeight;return[s,o,a]},Cx=function(r){var s=r.scrollLeft,o=r.scrollWidth,a=r.clientWidth;return[s,o,a]},Vp=function(r,s){return r==="v"?Ex(s):Nx(s)},Hp=function(r,s){return r==="v"?jx(s):Cx(s)},_x=function(r,s){return r==="h"&&s==="rtl"?-1:1},Px=function(r,s,o,a,u){var f=_x(r,window.getComputedStyle(s).direction),m=f*a,h=o.target,y=s.contains(h),k=!1,w=m>0,x=0,P=0;do{if(!h)break;var _=Hp(r,h),D=_[0],b=_[1],R=_[2],A=b-R-f*D;(D||A)&&Vp(r,h)&&(x+=A,P+=D);var I=h.parentNode;h=I&&I.nodeType===Node.DOCUMENT_FRAGMENT_NODE?I.host:I}while(!y&&h!==document.body||y&&(s.contains(h)||s===h));return(w&&Math.abs(x)<1||!w&&Math.abs(P)<1)&&(k=!0),k},el=function(r){return"changedTouches"in r?[r.changedTouches[0].clientX,r.changedTouches[0].clientY]:[0,0]},Vh=function(r){return[r.deltaX,r.deltaY]},Hh=function(r){return r&&"current"in r?r.current:r},Rx=function(r,s){return r[0]===s[0]&&r[1]===s[1]},Mx=function(r){return` + .block-interactivity-`.concat(r,` {pointer-events: none;} + .allow-interactivity-`).concat(r,` {pointer-events: all;} +`)},Ox=0,Xr=[];function Tx(r){var s=g.useRef([]),o=g.useRef([0,0]),a=g.useRef(),u=g.useState(Ox++)[0],f=g.useState($p)[0],m=g.useRef(r);g.useEffect(function(){m.current=r},[r]),g.useEffect(function(){if(r.inert){document.body.classList.add("block-interactivity-".concat(u));var b=ex([r.lockRef.current],(r.shards||[]).map(Hh),!0).filter(Boolean);return b.forEach(function(R){return R.classList.add("allow-interactivity-".concat(u))}),function(){document.body.classList.remove("block-interactivity-".concat(u)),b.forEach(function(R){return R.classList.remove("allow-interactivity-".concat(u))})}}},[r.inert,r.lockRef.current,r.shards]);var h=g.useCallback(function(b,R){if("touches"in b&&b.touches.length===2||b.type==="wheel"&&b.ctrlKey)return!m.current.allowPinchZoom;var A=el(b),I=o.current,V="deltaX"in b?b.deltaX:I[0]-A[0],z="deltaY"in b?b.deltaY:I[1]-A[1],K,G=b.target,ue=Math.abs(V)>Math.abs(z)?"h":"v";if("touches"in b&&ue==="h"&&G.type==="range")return!1;var oe=window.getSelection(),ee=oe&&oe.anchorNode,me=ee?ee===G||ee.contains(G):!1;if(me)return!1;var ke=Bh(ue,G);if(!ke)return!0;if(ke?K=ue:(K=ue==="v"?"h":"v",ke=Bh(ue,G)),!ke)return!1;if(!a.current&&"changedTouches"in b&&(V||z)&&(a.current=K),!K)return!0;var le=a.current||K;return Px(le,R,b,le==="h"?V:z)},[]),y=g.useCallback(function(b){var R=b;if(!(!Xr.length||Xr[Xr.length-1]!==f)){var A="deltaY"in R?Vh(R):el(R),I=s.current.filter(function(K){return K.name===R.type&&(K.target===R.target||R.target===K.shadowParent)&&Rx(K.delta,A)})[0];if(I&&I.should){R.cancelable&&R.preventDefault();return}if(!I){var V=(m.current.shards||[]).map(Hh).filter(Boolean).filter(function(K){return K.contains(R.target)}),z=V.length>0?h(R,V[0]):!m.current.noIsolation;z&&R.cancelable&&R.preventDefault()}}},[]),k=g.useCallback(function(b,R,A,I){var V={name:b,delta:R,target:A,should:I,shadowParent:Lx(A)};s.current.push(V),setTimeout(function(){s.current=s.current.filter(function(z){return z!==V})},1)},[]),w=g.useCallback(function(b){o.current=el(b),a.current=void 0},[]),x=g.useCallback(function(b){k(b.type,Vh(b),b.target,h(b,r.lockRef.current))},[]),P=g.useCallback(function(b){k(b.type,el(b),b.target,h(b,r.lockRef.current))},[]);g.useEffect(function(){return Xr.push(f),r.setCallbacks({onScrollCapture:x,onWheelCapture:x,onTouchMoveCapture:P}),document.addEventListener("wheel",y,Yr),document.addEventListener("touchmove",y,Yr),document.addEventListener("touchstart",w,Yr),function(){Xr=Xr.filter(function(b){return b!==f}),document.removeEventListener("wheel",y,Yr),document.removeEventListener("touchmove",y,Yr),document.removeEventListener("touchstart",w,Yr)}},[]);var _=r.removeScrollBar,D=r.inert;return g.createElement(g.Fragment,null,D?g.createElement(f,{styles:Mx(u)}):null,_?g.createElement(bx,{noRelative:r.noRelative,gapMode:r.gapMode}):null)}function Lx(r){for(var s=null;r!==null;)r instanceof ShadowRoot&&(s=r.host,r=r.host),r=r.parentNode;return s}const Dx=ux(Up,Tx);var Wp=g.forwardRef(function(r,s){return g.createElement(hl,nn({},r,{ref:s,sideCar:Dx}))});Wp.classNames=hl.classNames;var Ax=function(r){if(typeof document>"u")return null;var s=Array.isArray(r)?r[0]:r;return s.ownerDocument.body},Jr=new WeakMap,tl=new WeakMap,nl={},ku=0,Qp=function(r){return r&&(r.host||Qp(r.parentNode))},zx=function(r,s){return s.map(function(o){if(r.contains(o))return o;var a=Qp(o);return a&&r.contains(a)?a:(console.error("aria-hidden",o,"in not contained inside",r,". Doing nothing"),null)}).filter(function(o){return!!o})},Fx=function(r,s,o,a){var u=zx(s,Array.isArray(r)?r:[r]);nl[o]||(nl[o]=new WeakMap);var f=nl[o],m=[],h=new Set,y=new Set(u),k=function(x){!x||h.has(x)||(h.add(x),k(x.parentNode))};u.forEach(k);var w=function(x){!x||y.has(x)||Array.prototype.forEach.call(x.children,function(P){if(h.has(P))w(P);else try{var _=P.getAttribute(a),D=_!==null&&_!=="false",b=(Jr.get(P)||0)+1,R=(f.get(P)||0)+1;Jr.set(P,b),f.set(P,R),m.push(P),b===1&&D&&tl.set(P,!0),R===1&&P.setAttribute(o,"true"),D||P.setAttribute(a,"true")}catch(A){console.error("aria-hidden: cannot operate on ",P,A)}})};return w(s),h.clear(),ku++,function(){m.forEach(function(x){var P=Jr.get(x)-1,_=f.get(x)-1;Jr.set(x,P),f.set(x,_),P||(tl.has(x)||x.removeAttribute(a),tl.delete(x)),_||x.removeAttribute(o)}),ku--,ku||(Jr=new WeakMap,Jr=new WeakMap,tl=new WeakMap,nl={})}},Ix=function(r,s,o){o===void 0&&(o="data-aria-hidden");var a=Array.from(Array.isArray(r)?r:[r]),u=Ax(r);return u?(a.push.apply(a,Array.from(u.querySelectorAll("[aria-live], script"))),Fx(a,u,o,"aria-hidden")):function(){return null}},pl="Dialog",[Kp]=h0(pl),[Ux,Qt]=Kp(pl),qp=r=>{const{__scopeDialog:s,children:o,open:a,defaultOpen:u,onOpenChange:f,modal:m=!0}=r,h=g.useRef(null),y=g.useRef(null),[k,w]=y0({prop:a,defaultProp:u??!1,onChange:f,caller:pl});return d.jsx(Ux,{scope:s,triggerRef:h,contentRef:y,contentId:vn(),titleId:vn(),descriptionId:vn(),open:k,onOpenChange:w,onOpenToggle:g.useCallback(()=>w(x=>!x),[w]),modal:m,children:o})};qp.displayName=pl;var Gp="DialogTrigger",$x=g.forwardRef((r,s)=>{const{__scopeDialog:o,...a}=r,u=Qt(Gp,o),f=br(s,u.triggerRef);return d.jsx(ot.button,{type:"button","aria-haspopup":"dialog","aria-expanded":u.open,"aria-controls":u.open?u.contentId:void 0,"data-state":cc(u.open),...a,ref:f,onClick:Zn(r.onClick,u.onOpenToggle)})});$x.displayName=Gp;var uc="DialogPortal",[Bx,Zp]=Kp(uc,{forceMount:void 0}),Yp=r=>{const{__scopeDialog:s,forceMount:o,children:a,container:u}=r,f=Qt(uc,s);return d.jsx(Bx,{scope:s,forceMount:o,children:g.Children.map(a,m=>d.jsx(fl,{present:o||f.open,children:d.jsx(zp,{asChild:!0,container:u,children:m})}))})};Yp.displayName=uc;var ll="DialogOverlay",Xp=g.forwardRef((r,s)=>{const o=Zp(ll,r.__scopeDialog),{forceMount:a=o.forceMount,...u}=r,f=Qt(ll,r.__scopeDialog);return f.modal?d.jsx(fl,{present:a||f.open,children:d.jsx(Hx,{...u,ref:s})}):null});Xp.displayName=ll;var Vx=Op("DialogOverlay.RemoveScroll"),Hx=g.forwardRef((r,s)=>{const{__scopeDialog:o,...a}=r,u=Qt(ll,o),f=F0(),m=br(s,f);return d.jsx(Wp,{as:Vx,allowPinchZoom:!0,shards:[u.contentRef],children:d.jsx(ot.div,{"data-state":cc(u.open),...a,ref:m,style:{pointerEvents:"auto",...a.style}})})}),bs="DialogContent",Jp=g.forwardRef((r,s)=>{const o=Zp(bs,r.__scopeDialog),{forceMount:a=o.forceMount,...u}=r,f=Qt(bs,r.__scopeDialog);return d.jsx(fl,{present:a||f.open,children:f.modal?d.jsx(Wx,{...u,ref:s}):d.jsx(Qx,{...u,ref:s})})});Jp.displayName=bs;var Wx=g.forwardRef((r,s)=>{const o=Qt(bs,r.__scopeDialog),a=g.useRef(null),u=br(s,o.contentRef,a);return g.useEffect(()=>{const f=a.current;if(f)return Ix(f)},[]),d.jsx(em,{...r,ref:u,trapFocus:o.open,disableOutsidePointerEvents:o.open,onCloseAutoFocus:Zn(r.onCloseAutoFocus,f=>{var m;f.preventDefault(),(m=o.triggerRef.current)==null||m.focus()}),onPointerDownOutside:Zn(r.onPointerDownOutside,f=>{const m=f.detail.originalEvent,h=m.button===0&&m.ctrlKey===!0;(m.button===2||h)&&f.preventDefault()}),onFocusOutside:Zn(r.onFocusOutside,f=>f.preventDefault())})}),Qx=g.forwardRef((r,s)=>{const o=Qt(bs,r.__scopeDialog),a=g.useRef(!1),u=g.useRef(!1);return d.jsx(em,{...r,ref:s,trapFocus:!1,disableOutsidePointerEvents:!1,onCloseAutoFocus:f=>{var m,h;(m=r.onCloseAutoFocus)==null||m.call(r,f),f.defaultPrevented||(a.current||(h=o.triggerRef.current)==null||h.focus(),f.preventDefault()),a.current=!1,u.current=!1},onInteractOutside:f=>{var y,k;(y=r.onInteractOutside)==null||y.call(r,f),f.defaultPrevented||(a.current=!0,f.detail.originalEvent.type==="pointerdown"&&(u.current=!0));const m=f.target;((k=o.triggerRef.current)==null?void 0:k.contains(m))&&f.preventDefault(),f.detail.originalEvent.type==="focusin"&&u.current&&f.preventDefault()}})}),em=g.forwardRef((r,s)=>{const{__scopeDialog:o,trapFocus:a,onOpenAutoFocus:u,onCloseAutoFocus:f,...m}=r,h=Qt(bs,o);return J0(),d.jsx(d.Fragment,{children:d.jsx(Dp,{asChild:!0,loop:!0,trapped:a,onMountAutoFocus:u,onUnmountAutoFocus:f,children:d.jsx(Tp,{role:"dialog",id:h.contentId,"aria-describedby":h.descriptionId,"aria-labelledby":h.titleId,"data-state":cc(h.open),...m,ref:s,deferPointerDownOutside:!0,onDismiss:()=>h.onOpenChange(!1)})})})}),tm="DialogTitle",Kx=g.forwardRef((r,s)=>{const{__scopeDialog:o,...a}=r,u=Qt(tm,o);return d.jsx(ot.h2,{id:u.titleId,...a,ref:s})});Kx.displayName=tm;var nm="DialogDescription",qx=g.forwardRef((r,s)=>{const{__scopeDialog:o,...a}=r,u=Qt(nm,o);return d.jsx(ot.p,{id:u.descriptionId,...a,ref:s})});qx.displayName=nm;var rm="DialogClose",Gx=g.forwardRef((r,s)=>{const{__scopeDialog:o,...a}=r,u=Qt(rm,o);return d.jsx(ot.button,{type:"button",...a,ref:s,onClick:Zn(r.onClick,()=>u.onOpenChange(!1))})});Gx.displayName=rm;function cc(r){return r?"open":"closed"}var hi='[cmdk-group=""]',bu='[cmdk-group-items=""]',Zx='[cmdk-group-heading=""]',sm='[cmdk-item=""]',Wh=`${sm}:not([aria-disabled="true"])`,Hu="cmdk-item-select",ns="data-value",Yx=(r,s,o)=>f0(r,s,o),im=g.createContext(void 0),Ai=()=>g.useContext(im),om=g.createContext(void 0),dc=()=>g.useContext(om),lm=g.createContext(void 0),am=g.forwardRef((r,s)=>{let o=rs(()=>{var N,q;return{search:"",value:(q=(N=r.value)!=null?N:r.defaultValue)!=null?q:"",selectedItemId:void 0,filtered:{count:0,items:new Map,groups:new Set}}}),a=rs(()=>new Set),u=rs(()=>new Map),f=rs(()=>new Map),m=rs(()=>new Set),h=um(r),{label:y,children:k,value:w,onValueChange:x,filter:P,shouldFilter:_,loop:D,disablePointerSelection:b=!1,vimBindings:R=!0,...A}=r,I=vn(),V=vn(),z=vn(),K=g.useRef(null),G=a1();kr(()=>{if(w!==void 0){let N=w.trim();o.current.value=N,ue.emit()}},[w]),kr(()=>{G(6,Le)},[]);let ue=g.useMemo(()=>({subscribe:N=>(m.current.add(N),()=>m.current.delete(N)),snapshot:()=>o.current,setState:(N,q,Y)=>{var W,se,de,ye;if(!Object.is(o.current[N],q)){if(o.current[N]=q,N==="search")le(),me(),G(1,ke);else if(N==="value"){if(document.activeElement.hasAttribute("cmdk-input")||document.activeElement.hasAttribute("cmdk-root")){let we=document.getElementById(z);we?we.focus():(W=document.getElementById(I))==null||W.focus()}if(G(7,()=>{var we;o.current.selectedItemId=(we=Z())==null?void 0:we.id,ue.emit()}),Y||G(5,Le),((se=h.current)==null?void 0:se.value)!==void 0){let we=q??"";(ye=(de=h.current).onValueChange)==null||ye.call(de,we);return}}ue.emit()}},emit:()=>{m.current.forEach(N=>N())}}),[]),oe=g.useMemo(()=>({value:(N,q,Y)=>{var W;q!==((W=f.current.get(N))==null?void 0:W.value)&&(f.current.set(N,{value:q,keywords:Y}),o.current.filtered.items.set(N,ee(q,Y)),G(2,()=>{me(),ue.emit()}))},item:(N,q)=>(a.current.add(N),q&&(u.current.has(q)?u.current.get(q).add(N):u.current.set(q,new Set([N]))),G(3,()=>{le(),me(),o.current.value||ke(),ue.emit()}),()=>{f.current.delete(N),a.current.delete(N),o.current.filtered.items.delete(N);let Y=Z();G(4,()=>{le(),(Y==null?void 0:Y.getAttribute("id"))===N&&ke(),ue.emit()})}),group:N=>(u.current.has(N)||u.current.set(N,new Set),()=>{f.current.delete(N),u.current.delete(N)}),filter:()=>h.current.shouldFilter,label:y||r["aria-label"],getDisablePointerSelection:()=>h.current.disablePointerSelection,listId:I,inputId:z,labelId:V,listInnerRef:K}),[]);function ee(N,q){var Y,W;let se=(W=(Y=h.current)==null?void 0:Y.filter)!=null?W:Yx;return N?se(N,o.current.search,q):0}function me(){if(!o.current.search||h.current.shouldFilter===!1)return;let N=o.current.filtered.items,q=[];o.current.filtered.groups.forEach(W=>{let se=u.current.get(W),de=0;se.forEach(ye=>{let we=N.get(ye);de=Math.max(we,de)}),q.push([W,de])});let Y=K.current;ce().sort((W,se)=>{var de,ye;let we=W.getAttribute("id"),Ge=se.getAttribute("id");return((de=N.get(Ge))!=null?de:0)-((ye=N.get(we))!=null?ye:0)}).forEach(W=>{let se=W.closest(bu);se?se.appendChild(W.parentElement===se?W:W.closest(`${bu} > *`)):Y.appendChild(W.parentElement===Y?W:W.closest(`${bu} > *`))}),q.sort((W,se)=>se[1]-W[1]).forEach(W=>{var se;let de=(se=K.current)==null?void 0:se.querySelector(`${hi}[${ns}="${encodeURIComponent(W[0])}"]`);de==null||de.parentElement.appendChild(de)})}function ke(){let N=ce().find(Y=>Y.getAttribute("aria-disabled")!=="true"),q=N==null?void 0:N.getAttribute(ns);ue.setState("value",q||void 0)}function le(){var N,q,Y,W;if(!o.current.search||h.current.shouldFilter===!1){o.current.filtered.count=a.current.size;return}o.current.filtered.groups=new Set;let se=0;for(let de of a.current){let ye=(q=(N=f.current.get(de))==null?void 0:N.value)!=null?q:"",we=(W=(Y=f.current.get(de))==null?void 0:Y.keywords)!=null?W:[],Ge=ee(ye,we);o.current.filtered.items.set(de,Ge),Ge>0&&se++}for(let[de,ye]of u.current)for(let we of ye)if(o.current.filtered.items.get(we)>0){o.current.filtered.groups.add(de);break}o.current.filtered.count=se}function Le(){var N,q,Y;let W=Z();W&&(((N=W.parentElement)==null?void 0:N.firstChild)===W&&((Y=(q=W.closest(hi))==null?void 0:q.querySelector(Zx))==null||Y.scrollIntoView({block:"nearest"})),W.scrollIntoView({block:"nearest"}))}function Z(){var N;return(N=K.current)==null?void 0:N.querySelector(`${sm}[aria-selected="true"]`)}function ce(){var N;return Array.from(((N=K.current)==null?void 0:N.querySelectorAll(Wh))||[])}function Ce(N){let q=ce()[N];q&&ue.setState("value",q.getAttribute(ns))}function Ne(N){var q;let Y=Z(),W=ce(),se=W.findIndex(ye=>ye===Y),de=W[se+N];(q=h.current)!=null&&q.loop&&(de=se+N<0?W[W.length-1]:se+N===W.length?W[0]:W[se+N]),de&&ue.setState("value",de.getAttribute(ns))}function F(N){let q=Z(),Y=q==null?void 0:q.closest(hi),W;for(;Y&&!W;)Y=N>0?o1(Y,hi):l1(Y,hi),W=Y==null?void 0:Y.querySelector(Wh);W?ue.setState("value",W.getAttribute(ns)):Ne(N)}let ne=()=>Ce(ce().length-1),Q=N=>{N.preventDefault(),N.metaKey?ne():N.altKey?F(1):Ne(1)},C=N=>{N.preventDefault(),N.metaKey?Ce(0):N.altKey?F(-1):Ne(-1)};return g.createElement(ot.div,{ref:s,tabIndex:-1,...A,"cmdk-root":"",onKeyDown:N=>{var q;(q=A.onKeyDown)==null||q.call(A,N);let Y=N.nativeEvent.isComposing||N.keyCode===229;if(!(N.defaultPrevented||Y))switch(N.key){case"n":case"j":{R&&N.ctrlKey&&Q(N);break}case"ArrowDown":{Q(N);break}case"p":case"k":{R&&N.ctrlKey&&C(N);break}case"ArrowUp":{C(N);break}case"Home":{N.preventDefault(),Ce(0);break}case"End":{N.preventDefault(),ne();break}case"Enter":{N.preventDefault();let W=Z();if(W){let se=new Event(Hu);W.dispatchEvent(se)}}}}},g.createElement("label",{"cmdk-label":"",htmlFor:oe.inputId,id:oe.labelId,style:c1},y),ml(r,N=>g.createElement(om.Provider,{value:ue},g.createElement(im.Provider,{value:oe},N))))}),Xx=g.forwardRef((r,s)=>{var o,a;let u=vn(),f=g.useRef(null),m=g.useContext(lm),h=Ai(),y=um(r),k=(a=(o=y.current)==null?void 0:o.forceMount)!=null?a:m==null?void 0:m.forceMount;kr(()=>{if(!k)return h.item(u,m==null?void 0:m.id)},[k]);let w=cm(u,f,[r.value,r.children,f],r.keywords),x=dc(),P=Yn(G=>G.value&&G.value===w.current),_=Yn(G=>k||h.filter()===!1?!0:G.search?G.filtered.items.get(u)>0:!0);g.useEffect(()=>{let G=f.current;if(!(!G||r.disabled))return G.addEventListener(Hu,D),()=>G.removeEventListener(Hu,D)},[_,r.onSelect,r.disabled]);function D(){var G,ue;b(),(ue=(G=y.current).onSelect)==null||ue.call(G,w.current)}function b(){x.setState("value",w.current,!0)}if(!_)return null;let{disabled:R,value:A,onSelect:I,forceMount:V,keywords:z,...K}=r;return g.createElement(ot.div,{ref:ks(f,s),...K,id:u,"cmdk-item":"",role:"option","aria-disabled":!!R,"aria-selected":!!P,"data-disabled":!!R,"data-selected":!!P,onPointerMove:R||h.getDisablePointerSelection()?void 0:b,onClick:R?void 0:D},r.children)}),Jx=g.forwardRef((r,s)=>{let{heading:o,children:a,forceMount:u,...f}=r,m=vn(),h=g.useRef(null),y=g.useRef(null),k=vn(),w=Ai(),x=Yn(_=>u||w.filter()===!1?!0:_.search?_.filtered.groups.has(m):!0);kr(()=>w.group(m),[]),cm(m,h,[r.value,r.heading,y]);let P=g.useMemo(()=>({id:m,forceMount:u}),[u]);return g.createElement(ot.div,{ref:ks(h,s),...f,"cmdk-group":"",role:"presentation",hidden:x?void 0:!0},o&&g.createElement("div",{ref:y,"cmdk-group-heading":"","aria-hidden":!0,id:k},o),ml(r,_=>g.createElement("div",{"cmdk-group-items":"",role:"group","aria-labelledby":o?k:void 0},g.createElement(lm.Provider,{value:P},_))))}),e1=g.forwardRef((r,s)=>{let{alwaysRender:o,...a}=r,u=g.useRef(null),f=Yn(m=>!m.search);return!o&&!f?null:g.createElement(ot.div,{ref:ks(u,s),...a,"cmdk-separator":"",role:"separator"})}),t1=g.forwardRef((r,s)=>{let{onValueChange:o,...a}=r,u=r.value!=null,f=dc(),m=Yn(k=>k.search),h=Yn(k=>k.selectedItemId),y=Ai();return g.useEffect(()=>{r.value!=null&&f.setState("search",r.value)},[r.value]),g.createElement(ot.input,{ref:s,...a,"cmdk-input":"",autoComplete:"off",autoCorrect:"off",spellCheck:!1,"aria-autocomplete":"list",role:"combobox","aria-expanded":!0,"aria-controls":y.listId,"aria-labelledby":y.labelId,"aria-activedescendant":h,id:y.inputId,type:"text",value:u?r.value:m,onChange:k=>{u||f.setState("search",k.target.value),o==null||o(k.target.value)}})}),n1=g.forwardRef((r,s)=>{let{children:o,label:a="Suggestions",...u}=r,f=g.useRef(null),m=g.useRef(null),h=Yn(k=>k.selectedItemId),y=Ai();return g.useEffect(()=>{if(m.current&&f.current){let k=m.current,w=f.current,x,P=new ResizeObserver(()=>{x=requestAnimationFrame(()=>{let _=k.offsetHeight;w.style.setProperty("--cmdk-list-height",_.toFixed(1)+"px")})});return P.observe(k),()=>{cancelAnimationFrame(x),P.unobserve(k)}}},[]),g.createElement(ot.div,{ref:ks(f,s),...u,"cmdk-list":"",role:"listbox",tabIndex:-1,"aria-activedescendant":h,"aria-label":a,id:y.listId},ml(r,k=>g.createElement("div",{ref:ks(m,y.listInnerRef),"cmdk-list-sizer":""},k)))}),r1=g.forwardRef((r,s)=>{let{open:o,onOpenChange:a,overlayClassName:u,contentClassName:f,container:m,...h}=r;return g.createElement(qp,{open:o,onOpenChange:a},g.createElement(Yp,{container:m},g.createElement(Xp,{"cmdk-overlay":"",className:u}),g.createElement(Jp,{"aria-label":r.label,"cmdk-dialog":"",className:f},g.createElement(am,{ref:s,...h}))))}),s1=g.forwardRef((r,s)=>Yn(o=>o.filtered.count===0)?g.createElement(ot.div,{ref:s,...r,"cmdk-empty":"",role:"presentation"}):null),i1=g.forwardRef((r,s)=>{let{progress:o,children:a,label:u="Loading...",...f}=r;return g.createElement(ot.div,{ref:s,...f,"cmdk-loading":"",role:"progressbar","aria-valuenow":o,"aria-valuemin":0,"aria-valuemax":100,"aria-label":u},ml(r,m=>g.createElement("div",{"aria-hidden":!0},m)))}),es=Object.assign(am,{List:n1,Item:Xx,Input:t1,Group:Jx,Separator:e1,Dialog:r1,Empty:s1,Loading:i1});function o1(r,s){let o=r.nextElementSibling;for(;o;){if(o.matches(s))return o;o=o.nextElementSibling}}function l1(r,s){let o=r.previousElementSibling;for(;o;){if(o.matches(s))return o;o=o.previousElementSibling}}function um(r){let s=g.useRef(r);return kr(()=>{s.current=r}),s}var kr=typeof window>"u"?g.useEffect:g.useLayoutEffect;function rs(r){let s=g.useRef();return s.current===void 0&&(s.current=r()),s}function Yn(r){let s=dc(),o=()=>r(s.snapshot());return g.useSyncExternalStore(s.subscribe,o,o)}function cm(r,s,o,a=[]){let u=g.useRef(),f=Ai();return kr(()=>{var m;let h=(()=>{var k;for(let w of o){if(typeof w=="string")return w.trim();if(typeof w=="object"&&"current"in w)return w.current?(k=w.current.textContent)==null?void 0:k.trim():u.current}})(),y=a.map(k=>k.trim());f.value(r,h,y),(m=s.current)==null||m.setAttribute(ns,h),u.current=h}),u}var a1=()=>{let[r,s]=g.useState(),o=rs(()=>new Map);return kr(()=>{o.current.forEach(a=>a()),o.current=new Map},[r]),(a,u)=>{o.current.set(a,u),s({})}};function u1(r){let s=r.type;return typeof s=="function"?s(r.props):"render"in s?s.render(r.props):r}function ml({asChild:r,children:s},o){return r&&g.isValidElement(s)?g.cloneElement(u1(s),{ref:s.ref},o(s.props.children)):o(s)}var c1={position:"absolute",width:"1px",height:"1px",padding:"0",margin:"-1px",overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",borderWidth:"0"};function d1({onNavigate:r}){const[s,o]=g.useState(!1);return g.useEffect(()=>{const a=u=>{(u.metaKey||u.ctrlKey)&&u.key.toLowerCase()==="k"&&(u.preventDefault(),o(f=>!f))};return document.addEventListener("keydown",a),()=>document.removeEventListener("keydown",a)},[]),d.jsx(es.Dialog,{open:s,onOpenChange:o,label:"Befehlspalette",className:"fixed inset-0 z-50 flex items-start justify-center bg-black/50 p-4 pt-[12vh] overscroll-contain",onClick:()=>o(!1),children:d.jsxs("div",{className:"w-full max-w-lg overflow-hidden rounded-xl border border-border bg-popover text-popover-foreground shadow-2xl",onClick:a=>a.stopPropagation(),children:[d.jsx(es.Input,{autoFocus:!0,placeholder:"Springe zu… (Modelle, Routing, System …)",className:"w-full border-b border-border bg-transparent px-4 py-3 text-sm outline-none placeholder:text-muted-foreground"}),d.jsxs(es.List,{className:"max-h-80 overflow-y-auto p-2",children:[d.jsx(es.Empty,{className:"px-3 py-6 text-center text-sm text-muted-foreground",children:"Nichts gefunden."}),d.jsx(es.Group,{heading:"Bereiche",className:"px-1 py-1 text-xs text-muted-foreground",children:is.map(a=>d.jsxs(es.Item,{value:`${a.label} ${a.hint}`,onSelect:()=>{r(a.id),o(!1)},className:"flex cursor-pointer items-center gap-3 rounded-md px-3 py-2 text-sm text-foreground aria-selected:bg-accent aria-selected:text-accent-foreground",children:[d.jsx(a.icon,{className:"h-4 w-4 text-primary"}),d.jsx("span",{children:a.label}),d.jsx("span",{className:"ml-auto truncate text-xs text-muted-foreground",children:a.hint})]},a.id))})]})]})})}const dm="mc_expert_mode",Wu="mc-expert-mode-change",f1=()=>{try{return localStorage.getItem(dm)==="true"}catch{return!1}};function h1(r){return window.addEventListener(Wu,r),window.addEventListener("storage",r),()=>{window.removeEventListener(Wu,r),window.removeEventListener("storage",r)}}function Qh(r){localStorage.setItem(dm,String(r)),window.dispatchEvent(new Event(Wu))}function p1(){return g.useSyncExternalStore(h1,f1,()=>!1)}function fm(r){var s,o,a="";if(typeof r=="string"||typeof r=="number")a+=r;else if(typeof r=="object")if(Array.isArray(r)){var u=r.length;for(s=0;s{const s=y1(r),{conflictingClassGroups:o,conflictingClassGroupModifiers:a}=r;return{getClassGroupId:m=>{const h=m.split(fc);return h[0]===""&&h.length!==1&&h.shift(),hm(h,s)||v1(m)},getConflictingClassGroupIds:(m,h)=>{const y=o[m]||[];return h&&a[m]?[...y,...a[m]]:y}}},hm=(r,s)=>{var m;if(r.length===0)return s.classGroupId;const o=r[0],a=s.nextPart.get(o),u=a?hm(r.slice(1),a):void 0;if(u)return u;if(s.validators.length===0)return;const f=r.join(fc);return(m=s.validators.find(({validator:h})=>h(f)))==null?void 0:m.classGroupId},Kh=/^\[(.+)\]$/,v1=r=>{if(Kh.test(r)){const s=Kh.exec(r)[1],o=s==null?void 0:s.substring(0,s.indexOf(":"));if(o)return"arbitrary.."+o}},y1=r=>{const{theme:s,prefix:o}=r,a={nextPart:new Map,validators:[]};return w1(Object.entries(r.classGroups),o).forEach(([f,m])=>{Qu(m,a,f,s)}),a},Qu=(r,s,o,a)=>{r.forEach(u=>{if(typeof u=="string"){const f=u===""?s:qh(s,u);f.classGroupId=o;return}if(typeof u=="function"){if(x1(u)){Qu(u(a),s,o,a);return}s.validators.push({validator:u,classGroupId:o});return}Object.entries(u).forEach(([f,m])=>{Qu(m,qh(s,f),o,a)})})},qh=(r,s)=>{let o=r;return s.split(fc).forEach(a=>{o.nextPart.has(a)||o.nextPart.set(a,{nextPart:new Map,validators:[]}),o=o.nextPart.get(a)}),o},x1=r=>r.isThemeGetter,w1=(r,s)=>s?r.map(([o,a])=>{const u=a.map(f=>typeof f=="string"?s+f:typeof f=="object"?Object.fromEntries(Object.entries(f).map(([m,h])=>[s+m,h])):f);return[o,u]}):r,k1=r=>{if(r<1)return{get:()=>{},set:()=>{}};let s=0,o=new Map,a=new Map;const u=(f,m)=>{o.set(f,m),s++,s>r&&(s=0,a=o,o=new Map)};return{get(f){let m=o.get(f);if(m!==void 0)return m;if((m=a.get(f))!==void 0)return u(f,m),m},set(f,m){o.has(f)?o.set(f,m):u(f,m)}}},pm="!",b1=r=>{const{separator:s,experimentalParseClassName:o}=r,a=s.length===1,u=s[0],f=s.length,m=h=>{const y=[];let k=0,w=0,x;for(let R=0;Rw?x-w:void 0;return{modifiers:y,hasImportantModifier:_,baseClassName:D,maybePostfixModifierPosition:b}};return o?h=>o({className:h,parseClassName:m}):m},S1=r=>{if(r.length<=1)return r;const s=[];let o=[];return r.forEach(a=>{a[0]==="["?(s.push(...o.sort(),a),o=[]):o.push(a)}),s.push(...o.sort()),s},E1=r=>({cache:k1(r.cacheSize),parseClassName:b1(r),...g1(r)}),N1=/\s+/,j1=(r,s)=>{const{parseClassName:o,getClassGroupId:a,getConflictingClassGroupIds:u}=s,f=[],m=r.trim().split(N1);let h="";for(let y=m.length-1;y>=0;y-=1){const k=m[y],{modifiers:w,hasImportantModifier:x,baseClassName:P,maybePostfixModifierPosition:_}=o(k);let D=!!_,b=a(D?P.substring(0,_):P);if(!b){if(!D){h=k+(h.length>0?" "+h:h);continue}if(b=a(P),!b){h=k+(h.length>0?" "+h:h);continue}D=!1}const R=S1(w).join(":"),A=x?R+pm:R,I=A+b;if(f.includes(I))continue;f.push(I);const V=u(b,D);for(let z=0;z0?" "+h:h)}return h};function C1(){let r=0,s,o,a="";for(;r{if(typeof r=="string")return r;let s,o="";for(let a=0;ax(w),r());return o=E1(k),a=o.cache.get,u=o.cache.set,f=h,h(y)}function h(y){const k=a(y);if(k)return k;const w=j1(y,o);return u(y,w),w}return function(){return f(C1.apply(null,arguments))}}const Ue=r=>{const s=o=>o[r]||[];return s.isThemeGetter=!0,s},gm=/^\[(?:([a-z-]+):)?(.+)\]$/i,P1=/^\d+\/\d+$/,R1=new Set(["px","full","screen"]),M1=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,O1=/\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/,T1=/^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\(.+\)$/,L1=/^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,D1=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/,hn=r=>ls(r)||R1.has(r)||P1.test(r),zn=r=>Es(r,"length",V1),ls=r=>!!r&&!Number.isNaN(Number(r)),Su=r=>Es(r,"number",ls),pi=r=>!!r&&Number.isInteger(Number(r)),A1=r=>r.endsWith("%")&&ls(r.slice(0,-1)),be=r=>gm.test(r),Fn=r=>M1.test(r),z1=new Set(["length","size","percentage"]),F1=r=>Es(r,z1,vm),I1=r=>Es(r,"position",vm),U1=new Set(["image","url"]),$1=r=>Es(r,U1,W1),B1=r=>Es(r,"",H1),mi=()=>!0,Es=(r,s,o)=>{const a=gm.exec(r);return a?a[1]?typeof s=="string"?a[1]===s:s.has(a[1]):o(a[2]):!1},V1=r=>O1.test(r)&&!T1.test(r),vm=()=>!1,H1=r=>L1.test(r),W1=r=>D1.test(r),Q1=()=>{const r=Ue("colors"),s=Ue("spacing"),o=Ue("blur"),a=Ue("brightness"),u=Ue("borderColor"),f=Ue("borderRadius"),m=Ue("borderSpacing"),h=Ue("borderWidth"),y=Ue("contrast"),k=Ue("grayscale"),w=Ue("hueRotate"),x=Ue("invert"),P=Ue("gap"),_=Ue("gradientColorStops"),D=Ue("gradientColorStopPositions"),b=Ue("inset"),R=Ue("margin"),A=Ue("opacity"),I=Ue("padding"),V=Ue("saturate"),z=Ue("scale"),K=Ue("sepia"),G=Ue("skew"),ue=Ue("space"),oe=Ue("translate"),ee=()=>["auto","contain","none"],me=()=>["auto","hidden","clip","visible","scroll"],ke=()=>["auto",be,s],le=()=>[be,s],Le=()=>["",hn,zn],Z=()=>["auto",ls,be],ce=()=>["bottom","center","left","left-bottom","left-top","right","right-bottom","right-top","top"],Ce=()=>["solid","dashed","dotted","double","none"],Ne=()=>["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity"],F=()=>["start","end","center","between","around","evenly","stretch"],ne=()=>["","0",be],Q=()=>["auto","avoid","all","avoid-page","page","left","right","column"],C=()=>[ls,be];return{cacheSize:500,separator:":",theme:{colors:[mi],spacing:[hn,zn],blur:["none","",Fn,be],brightness:C(),borderColor:[r],borderRadius:["none","","full",Fn,be],borderSpacing:le(),borderWidth:Le(),contrast:C(),grayscale:ne(),hueRotate:C(),invert:ne(),gap:le(),gradientColorStops:[r],gradientColorStopPositions:[A1,zn],inset:ke(),margin:ke(),opacity:C(),padding:le(),saturate:C(),scale:C(),sepia:ne(),skew:C(),space:le(),translate:le()},classGroups:{aspect:[{aspect:["auto","square","video",be]}],container:["container"],columns:[{columns:[Fn]}],"break-after":[{"break-after":Q()}],"break-before":[{"break-before":Q()}],"break-inside":[{"break-inside":["auto","avoid","avoid-page","avoid-column"]}],"box-decoration":[{"box-decoration":["slice","clone"]}],box:[{box:["border","content"]}],display:["block","inline-block","inline","flex","inline-flex","table","inline-table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row-group","table-row","flow-root","grid","inline-grid","contents","list-item","hidden"],float:[{float:["right","left","none","start","end"]}],clear:[{clear:["left","right","both","none","start","end"]}],isolation:["isolate","isolation-auto"],"object-fit":[{object:["contain","cover","fill","none","scale-down"]}],"object-position":[{object:[...ce(),be]}],overflow:[{overflow:me()}],"overflow-x":[{"overflow-x":me()}],"overflow-y":[{"overflow-y":me()}],overscroll:[{overscroll:ee()}],"overscroll-x":[{"overscroll-x":ee()}],"overscroll-y":[{"overscroll-y":ee()}],position:["static","fixed","absolute","relative","sticky"],inset:[{inset:[b]}],"inset-x":[{"inset-x":[b]}],"inset-y":[{"inset-y":[b]}],start:[{start:[b]}],end:[{end:[b]}],top:[{top:[b]}],right:[{right:[b]}],bottom:[{bottom:[b]}],left:[{left:[b]}],visibility:["visible","invisible","collapse"],z:[{z:["auto",pi,be]}],basis:[{basis:ke()}],"flex-direction":[{flex:["row","row-reverse","col","col-reverse"]}],"flex-wrap":[{flex:["wrap","wrap-reverse","nowrap"]}],flex:[{flex:["1","auto","initial","none",be]}],grow:[{grow:ne()}],shrink:[{shrink:ne()}],order:[{order:["first","last","none",pi,be]}],"grid-cols":[{"grid-cols":[mi]}],"col-start-end":[{col:["auto",{span:["full",pi,be]},be]}],"col-start":[{"col-start":Z()}],"col-end":[{"col-end":Z()}],"grid-rows":[{"grid-rows":[mi]}],"row-start-end":[{row:["auto",{span:[pi,be]},be]}],"row-start":[{"row-start":Z()}],"row-end":[{"row-end":Z()}],"grid-flow":[{"grid-flow":["row","col","dense","row-dense","col-dense"]}],"auto-cols":[{"auto-cols":["auto","min","max","fr",be]}],"auto-rows":[{"auto-rows":["auto","min","max","fr",be]}],gap:[{gap:[P]}],"gap-x":[{"gap-x":[P]}],"gap-y":[{"gap-y":[P]}],"justify-content":[{justify:["normal",...F()]}],"justify-items":[{"justify-items":["start","end","center","stretch"]}],"justify-self":[{"justify-self":["auto","start","end","center","stretch"]}],"align-content":[{content:["normal",...F(),"baseline"]}],"align-items":[{items:["start","end","center","baseline","stretch"]}],"align-self":[{self:["auto","start","end","center","stretch","baseline"]}],"place-content":[{"place-content":[...F(),"baseline"]}],"place-items":[{"place-items":["start","end","center","baseline","stretch"]}],"place-self":[{"place-self":["auto","start","end","center","stretch"]}],p:[{p:[I]}],px:[{px:[I]}],py:[{py:[I]}],ps:[{ps:[I]}],pe:[{pe:[I]}],pt:[{pt:[I]}],pr:[{pr:[I]}],pb:[{pb:[I]}],pl:[{pl:[I]}],m:[{m:[R]}],mx:[{mx:[R]}],my:[{my:[R]}],ms:[{ms:[R]}],me:[{me:[R]}],mt:[{mt:[R]}],mr:[{mr:[R]}],mb:[{mb:[R]}],ml:[{ml:[R]}],"space-x":[{"space-x":[ue]}],"space-x-reverse":["space-x-reverse"],"space-y":[{"space-y":[ue]}],"space-y-reverse":["space-y-reverse"],w:[{w:["auto","min","max","fit","svw","lvw","dvw",be,s]}],"min-w":[{"min-w":[be,s,"min","max","fit"]}],"max-w":[{"max-w":[be,s,"none","full","min","max","fit","prose",{screen:[Fn]},Fn]}],h:[{h:[be,s,"auto","min","max","fit","svh","lvh","dvh"]}],"min-h":[{"min-h":[be,s,"min","max","fit","svh","lvh","dvh"]}],"max-h":[{"max-h":[be,s,"min","max","fit","svh","lvh","dvh"]}],size:[{size:[be,s,"auto","min","max","fit"]}],"font-size":[{text:["base",Fn,zn]}],"font-smoothing":["antialiased","subpixel-antialiased"],"font-style":["italic","not-italic"],"font-weight":[{font:["thin","extralight","light","normal","medium","semibold","bold","extrabold","black",Su]}],"font-family":[{font:[mi]}],"fvn-normal":["normal-nums"],"fvn-ordinal":["ordinal"],"fvn-slashed-zero":["slashed-zero"],"fvn-figure":["lining-nums","oldstyle-nums"],"fvn-spacing":["proportional-nums","tabular-nums"],"fvn-fraction":["diagonal-fractions","stacked-fractions"],tracking:[{tracking:["tighter","tight","normal","wide","wider","widest",be]}],"line-clamp":[{"line-clamp":["none",ls,Su]}],leading:[{leading:["none","tight","snug","normal","relaxed","loose",hn,be]}],"list-image":[{"list-image":["none",be]}],"list-style-type":[{list:["none","disc","decimal",be]}],"list-style-position":[{list:["inside","outside"]}],"placeholder-color":[{placeholder:[r]}],"placeholder-opacity":[{"placeholder-opacity":[A]}],"text-alignment":[{text:["left","center","right","justify","start","end"]}],"text-color":[{text:[r]}],"text-opacity":[{"text-opacity":[A]}],"text-decoration":["underline","overline","line-through","no-underline"],"text-decoration-style":[{decoration:[...Ce(),"wavy"]}],"text-decoration-thickness":[{decoration:["auto","from-font",hn,zn]}],"underline-offset":[{"underline-offset":["auto",hn,be]}],"text-decoration-color":[{decoration:[r]}],"text-transform":["uppercase","lowercase","capitalize","normal-case"],"text-overflow":["truncate","text-ellipsis","text-clip"],"text-wrap":[{text:["wrap","nowrap","balance","pretty"]}],indent:[{indent:le()}],"vertical-align":[{align:["baseline","top","middle","bottom","text-top","text-bottom","sub","super",be]}],whitespace:[{whitespace:["normal","nowrap","pre","pre-line","pre-wrap","break-spaces"]}],break:[{break:["normal","words","all","keep"]}],hyphens:[{hyphens:["none","manual","auto"]}],content:[{content:["none",be]}],"bg-attachment":[{bg:["fixed","local","scroll"]}],"bg-clip":[{"bg-clip":["border","padding","content","text"]}],"bg-opacity":[{"bg-opacity":[A]}],"bg-origin":[{"bg-origin":["border","padding","content"]}],"bg-position":[{bg:[...ce(),I1]}],"bg-repeat":[{bg:["no-repeat",{repeat:["","x","y","round","space"]}]}],"bg-size":[{bg:["auto","cover","contain",F1]}],"bg-image":[{bg:["none",{"gradient-to":["t","tr","r","br","b","bl","l","tl"]},$1]}],"bg-color":[{bg:[r]}],"gradient-from-pos":[{from:[D]}],"gradient-via-pos":[{via:[D]}],"gradient-to-pos":[{to:[D]}],"gradient-from":[{from:[_]}],"gradient-via":[{via:[_]}],"gradient-to":[{to:[_]}],rounded:[{rounded:[f]}],"rounded-s":[{"rounded-s":[f]}],"rounded-e":[{"rounded-e":[f]}],"rounded-t":[{"rounded-t":[f]}],"rounded-r":[{"rounded-r":[f]}],"rounded-b":[{"rounded-b":[f]}],"rounded-l":[{"rounded-l":[f]}],"rounded-ss":[{"rounded-ss":[f]}],"rounded-se":[{"rounded-se":[f]}],"rounded-ee":[{"rounded-ee":[f]}],"rounded-es":[{"rounded-es":[f]}],"rounded-tl":[{"rounded-tl":[f]}],"rounded-tr":[{"rounded-tr":[f]}],"rounded-br":[{"rounded-br":[f]}],"rounded-bl":[{"rounded-bl":[f]}],"border-w":[{border:[h]}],"border-w-x":[{"border-x":[h]}],"border-w-y":[{"border-y":[h]}],"border-w-s":[{"border-s":[h]}],"border-w-e":[{"border-e":[h]}],"border-w-t":[{"border-t":[h]}],"border-w-r":[{"border-r":[h]}],"border-w-b":[{"border-b":[h]}],"border-w-l":[{"border-l":[h]}],"border-opacity":[{"border-opacity":[A]}],"border-style":[{border:[...Ce(),"hidden"]}],"divide-x":[{"divide-x":[h]}],"divide-x-reverse":["divide-x-reverse"],"divide-y":[{"divide-y":[h]}],"divide-y-reverse":["divide-y-reverse"],"divide-opacity":[{"divide-opacity":[A]}],"divide-style":[{divide:Ce()}],"border-color":[{border:[u]}],"border-color-x":[{"border-x":[u]}],"border-color-y":[{"border-y":[u]}],"border-color-s":[{"border-s":[u]}],"border-color-e":[{"border-e":[u]}],"border-color-t":[{"border-t":[u]}],"border-color-r":[{"border-r":[u]}],"border-color-b":[{"border-b":[u]}],"border-color-l":[{"border-l":[u]}],"divide-color":[{divide:[u]}],"outline-style":[{outline:["",...Ce()]}],"outline-offset":[{"outline-offset":[hn,be]}],"outline-w":[{outline:[hn,zn]}],"outline-color":[{outline:[r]}],"ring-w":[{ring:Le()}],"ring-w-inset":["ring-inset"],"ring-color":[{ring:[r]}],"ring-opacity":[{"ring-opacity":[A]}],"ring-offset-w":[{"ring-offset":[hn,zn]}],"ring-offset-color":[{"ring-offset":[r]}],shadow:[{shadow:["","inner","none",Fn,B1]}],"shadow-color":[{shadow:[mi]}],opacity:[{opacity:[A]}],"mix-blend":[{"mix-blend":[...Ne(),"plus-lighter","plus-darker"]}],"bg-blend":[{"bg-blend":Ne()}],filter:[{filter:["","none"]}],blur:[{blur:[o]}],brightness:[{brightness:[a]}],contrast:[{contrast:[y]}],"drop-shadow":[{"drop-shadow":["","none",Fn,be]}],grayscale:[{grayscale:[k]}],"hue-rotate":[{"hue-rotate":[w]}],invert:[{invert:[x]}],saturate:[{saturate:[V]}],sepia:[{sepia:[K]}],"backdrop-filter":[{"backdrop-filter":["","none"]}],"backdrop-blur":[{"backdrop-blur":[o]}],"backdrop-brightness":[{"backdrop-brightness":[a]}],"backdrop-contrast":[{"backdrop-contrast":[y]}],"backdrop-grayscale":[{"backdrop-grayscale":[k]}],"backdrop-hue-rotate":[{"backdrop-hue-rotate":[w]}],"backdrop-invert":[{"backdrop-invert":[x]}],"backdrop-opacity":[{"backdrop-opacity":[A]}],"backdrop-saturate":[{"backdrop-saturate":[V]}],"backdrop-sepia":[{"backdrop-sepia":[K]}],"border-collapse":[{border:["collapse","separate"]}],"border-spacing":[{"border-spacing":[m]}],"border-spacing-x":[{"border-spacing-x":[m]}],"border-spacing-y":[{"border-spacing-y":[m]}],"table-layout":[{table:["auto","fixed"]}],caption:[{caption:["top","bottom"]}],transition:[{transition:["none","all","","colors","opacity","shadow","transform",be]}],duration:[{duration:C()}],ease:[{ease:["linear","in","out","in-out",be]}],delay:[{delay:C()}],animate:[{animate:["none","spin","ping","pulse","bounce",be]}],transform:[{transform:["","gpu","none"]}],scale:[{scale:[z]}],"scale-x":[{"scale-x":[z]}],"scale-y":[{"scale-y":[z]}],rotate:[{rotate:[pi,be]}],"translate-x":[{"translate-x":[oe]}],"translate-y":[{"translate-y":[oe]}],"skew-x":[{"skew-x":[G]}],"skew-y":[{"skew-y":[G]}],"transform-origin":[{origin:["center","top","top-right","right","bottom-right","bottom","bottom-left","left","top-left",be]}],accent:[{accent:["auto",r]}],appearance:[{appearance:["none","auto"]}],cursor:[{cursor:["auto","default","pointer","wait","text","move","help","not-allowed","none","context-menu","progress","cell","crosshair","vertical-text","alias","copy","no-drop","grab","grabbing","all-scroll","col-resize","row-resize","n-resize","e-resize","s-resize","w-resize","ne-resize","nw-resize","se-resize","sw-resize","ew-resize","ns-resize","nesw-resize","nwse-resize","zoom-in","zoom-out",be]}],"caret-color":[{caret:[r]}],"pointer-events":[{"pointer-events":["none","auto"]}],resize:[{resize:["none","y","x",""]}],"scroll-behavior":[{scroll:["auto","smooth"]}],"scroll-m":[{"scroll-m":le()}],"scroll-mx":[{"scroll-mx":le()}],"scroll-my":[{"scroll-my":le()}],"scroll-ms":[{"scroll-ms":le()}],"scroll-me":[{"scroll-me":le()}],"scroll-mt":[{"scroll-mt":le()}],"scroll-mr":[{"scroll-mr":le()}],"scroll-mb":[{"scroll-mb":le()}],"scroll-ml":[{"scroll-ml":le()}],"scroll-p":[{"scroll-p":le()}],"scroll-px":[{"scroll-px":le()}],"scroll-py":[{"scroll-py":le()}],"scroll-ps":[{"scroll-ps":le()}],"scroll-pe":[{"scroll-pe":le()}],"scroll-pt":[{"scroll-pt":le()}],"scroll-pr":[{"scroll-pr":le()}],"scroll-pb":[{"scroll-pb":le()}],"scroll-pl":[{"scroll-pl":le()}],"snap-align":[{snap:["start","end","center","align-none"]}],"snap-stop":[{snap:["normal","always"]}],"snap-type":[{snap:["none","x","y","both"]}],"snap-strictness":[{snap:["mandatory","proximity"]}],touch:[{touch:["auto","none","manipulation"]}],"touch-x":[{"touch-pan":["x","left","right"]}],"touch-y":[{"touch-pan":["y","up","down"]}],"touch-pz":["touch-pinch-zoom"],select:[{select:["none","text","all","auto"]}],"will-change":[{"will-change":["auto","scroll","contents","transform",be]}],fill:[{fill:[r,"none"]}],"stroke-w":[{stroke:[hn,zn,Su]}],stroke:[{stroke:[r,"none"]}],sr:["sr-only","not-sr-only"],"forced-color-adjust":[{"forced-color-adjust":["auto","none"]}]},conflictingClassGroups:{overflow:["overflow-x","overflow-y"],overscroll:["overscroll-x","overscroll-y"],inset:["inset-x","inset-y","start","end","top","right","bottom","left"],"inset-x":["right","left"],"inset-y":["top","bottom"],flex:["basis","grow","shrink"],gap:["gap-x","gap-y"],p:["px","py","ps","pe","pt","pr","pb","pl"],px:["pr","pl"],py:["pt","pb"],m:["mx","my","ms","me","mt","mr","mb","ml"],mx:["mr","ml"],my:["mt","mb"],size:["w","h"],"font-size":["leading"],"fvn-normal":["fvn-ordinal","fvn-slashed-zero","fvn-figure","fvn-spacing","fvn-fraction"],"fvn-ordinal":["fvn-normal"],"fvn-slashed-zero":["fvn-normal"],"fvn-figure":["fvn-normal"],"fvn-spacing":["fvn-normal"],"fvn-fraction":["fvn-normal"],"line-clamp":["display","overflow"],rounded:["rounded-s","rounded-e","rounded-t","rounded-r","rounded-b","rounded-l","rounded-ss","rounded-se","rounded-ee","rounded-es","rounded-tl","rounded-tr","rounded-br","rounded-bl"],"rounded-s":["rounded-ss","rounded-es"],"rounded-e":["rounded-se","rounded-ee"],"rounded-t":["rounded-tl","rounded-tr"],"rounded-r":["rounded-tr","rounded-br"],"rounded-b":["rounded-br","rounded-bl"],"rounded-l":["rounded-tl","rounded-bl"],"border-spacing":["border-spacing-x","border-spacing-y"],"border-w":["border-w-s","border-w-e","border-w-t","border-w-r","border-w-b","border-w-l"],"border-w-x":["border-w-r","border-w-l"],"border-w-y":["border-w-t","border-w-b"],"border-color":["border-color-s","border-color-e","border-color-t","border-color-r","border-color-b","border-color-l"],"border-color-x":["border-color-r","border-color-l"],"border-color-y":["border-color-t","border-color-b"],"scroll-m":["scroll-mx","scroll-my","scroll-ms","scroll-me","scroll-mt","scroll-mr","scroll-mb","scroll-ml"],"scroll-mx":["scroll-mr","scroll-ml"],"scroll-my":["scroll-mt","scroll-mb"],"scroll-p":["scroll-px","scroll-py","scroll-ps","scroll-pe","scroll-pt","scroll-pr","scroll-pb","scroll-pl"],"scroll-px":["scroll-pr","scroll-pl"],"scroll-py":["scroll-pt","scroll-pb"],touch:["touch-x","touch-y","touch-pz"],"touch-x":["touch"],"touch-y":["touch"],"touch-pz":["touch"]},conflictingClassGroupModifiers:{"font-size":["leading"]}}},K1=_1(Q1);function Ee(...r){return K1(m1(r))}function tk(r){return r?r.replace(/127\.0\.0\.1|localhost/g,"192.168.178.151"):""}function q1(){const r=p1();return d.jsxs("div",{className:"flex items-center rounded-md border border-border/40 bg-background/40 p-0.5",role:"group","aria-label":"Ansichtsmodus",title:"Einfach zeigt nur das Wichtigste. Experte zeigt alle technischen Details.",children:[d.jsxs("button",{onClick:()=>Qh(!1),"aria-pressed":!r,className:Ee("flex items-center gap-1 rounded px-2 py-1 text-xs font-semibold transition-all cursor-pointer",r?"text-muted-foreground hover:text-foreground":"bg-primary/15 text-primary shadow-sm"),children:[d.jsx(e0,{className:"h-3.5 w-3.5"})," Einfach"]}),d.jsxs("button",{onClick:()=>Qh(!0),"aria-pressed":r,className:Ee("flex items-center gap-1 rounded px-2 py-1 text-xs font-semibold transition-all cursor-pointer",r?"bg-primary/15 text-primary shadow-sm":"text-muted-foreground hover:text-foreground"),children:[d.jsx(Jy,{className:"h-3.5 w-3.5"})," Experte"]})]})}class G1 extends Error{constructor(o,a,u){super(u||`${o} ${a}`);Qo(this,"status");Qo(this,"detail");this.name="ApiError",this.status=o,this.detail=u}}async function Z1(r){try{const s=await r.text();if(!s)return null;try{const o=JSON.parse(s),a=(o==null?void 0:o.detail)??(o==null?void 0:o.err)??(o==null?void 0:o.message);return typeof a=="string"&&a.trim()?a.trim():Array.isArray(a)&&a.length&&a.map(u=>u==null?void 0:u.msg).filter(Boolean).join("; ")||null}catch{return s.slice(0,200).split(` +`)[0].trim()||null}}catch{return null}}async function Se(r,s){const o=await fetch(r,{...s,headers:{"Content-Type":"application/json",...s==null?void 0:s.headers}});if(!o.ok)throw new G1(o.status,o.statusText,await Z1(o));return o.json()}const nk=(r,s,o=!1,a=!0)=>Se("/api/groups",{method:"PUT",body:JSON.stringify({group:r,members:s,swap:o,persist:a})}),rk=r=>Se("/api/routing/policy",{method:"PUT",body:JSON.stringify(r)});function Y1({type:r,title:s,message:o,defaultValue:a,autoValue:u,autoLabel:f,onConfirm:m,onCancel:h}){const y=g.useRef(null);return d.jsx("div",{className:"fixed inset-0 z-[99] bg-black/60 backdrop-blur-sm flex items-center justify-center p-4 overscroll-contain",role:"dialog","aria-modal":"true","aria-label":s,children:d.jsxs("div",{className:"w-full max-w-sm rounded-2xl border border-border/80 bg-card p-6 shadow-2xl space-y-4 animate-in fade-in zoom-in-95 duration-200",children:[d.jsxs("div",{className:"flex items-center justify-between border-b border-border/20 pb-2",children:[d.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-primary",children:s}),d.jsx("button",{onClick:h||(()=>m()),"aria-label":"Schließen",className:"p-1 rounded hover:bg-accent text-muted-foreground hover:text-foreground cursor-pointer",children:d.jsx(dl,{className:"h-4 w-4","aria-hidden":"true"})})]}),d.jsx("p",{className:"max-h-72 overflow-y-auto whitespace-pre-line text-xs text-muted-foreground leading-relaxed scrollbar-thin",children:o}),r==="prompt"&&d.jsxs("div",{className:"flex gap-2",children:[d.jsx("input",{ref:y,type:"text",defaultValue:a,"aria-label":s,className:"flex-1 h-9 px-3 text-xs bg-background/40 border border-border/60 rounded-lg outline-none focus:border-primary transition-colors text-foreground",autoFocus:!0,onKeyDown:k=>{var w;k.key==="Enter"&&m((w=y.current)==null?void 0:w.value)}}),u!==void 0&&d.jsx("button",{type:"button",onClick:()=>{y.current&&(y.current.value=u)},title:"Setup-bewussten Optimalwert eintragen",className:"h-9 px-3 shrink-0 text-xs font-semibold text-primary border border-primary/50 bg-primary/10 hover:bg-primary/20 rounded-lg transition-colors cursor-pointer",children:f||"Auto"})]}),d.jsxs("div",{className:"flex justify-end gap-3 pt-2",children:[(r==="confirm"||r==="prompt")&&d.jsx("button",{onClick:h,className:"h-8 px-4 flex items-center justify-center text-xs font-semibold text-muted-foreground border border-border/60 bg-background/20 hover:bg-accent rounded-lg transition-colors cursor-pointer",children:"Abbrechen"}),d.jsx("button",{onClick:()=>{var w;const k=r==="prompt"?(w=y.current)==null?void 0:w.value:void 0;m(k)},className:"h-8 px-4 flex items-center justify-center text-xs font-semibold text-primary-foreground bg-primary hover:bg-primary/95 rounded-lg transition-colors cursor-pointer",children:r==="confirm"?"Ja, fortfahren":r==="prompt"?"Übernehmen":"OK"})]})]})})}function ym(){const[r,s]=g.useState(null),o=g.useCallback(()=>s(null),[]),a=g.useCallback((h,y,k)=>{s({type:"alert",title:h,message:y,onConfirm:()=>{s(null),k==null||k()}})},[]),u=g.useCallback((h,y,k,w)=>{s({type:"confirm",title:h,message:y,onConfirm:()=>{s(null),k()},onCancel:()=>{s(null),w==null||w()}})},[]),f=g.useCallback((h,y,k,w,x,P)=>{s({type:"prompt",title:h,message:y,defaultValue:k,autoValue:P==null?void 0:P.autoValue,autoLabel:P==null?void 0:P.autoLabel,onConfirm:_=>{s(null),w(_)},onCancel:()=>{s(null),x==null||x()}})},[]),m=r?d.jsx(Y1,{...r}):null;return{showAlert:a,showConfirm:u,showPrompt:f,close:o,dialogElement:m}}let il=!1;const X1=()=>il;function J1(){const r=ul();g.useEffect(()=>{const s=new EventSource("/api/events");return s.onopen=()=>{il=!0},s.onerror=()=>{il=!1},s.addEventListener("invalidate",o=>{var a;try{const u=((a=JSON.parse(o.data))==null?void 0:a.keys)??[];for(const f of u)r.invalidateQueries({queryKey:[f]})}catch{}}),()=>{il=!1,s.close()}},[r])}const Pe={health:["health"],systemStatus:["system-status"],services:["services"],models:["models"],groups:["groups"],routing:["routing"],routingPolicy:["routing-policy"],jobs:["jobs"],tokenStats:["token-stats"],agentStatus:["agent-status"],hermesBrain:["hermes-brain"],updates:["updates"],discover:["discover"],drafts:r=>["drafts",r??""],connect:r=>["connect",r??""],connectHealth:["connect-health"],memoryGraph:["memory-graph"],voiceTrace:["voice-trace"],auftragsbuch:["auftragsbuch"],ideen:["ideen"],chronik:["chronik"],wissen:["wissen"],zeitmaschine:["zeitmaschine"],reminders:["reminders"]},St={graph:3e3,schnell:8e3,normal:1e4,gemuetlich:3e4,traege:6e4},gl=r=>()=>X1()?r*5:r,ew=(r=St.schnell)=>Be({queryKey:Pe.auftragsbuch,queryFn:()=>Se("/api/auftragsbuch"),refetchInterval:gl(r)}),tw=(r=St.gemuetlich)=>Be({queryKey:Pe.ideen,queryFn:()=>Se("/api/ideen"),refetchInterval:gl(r)}),sk=(r,s=!1)=>Be({queryKey:["ideen-log",r],queryFn:()=>Se(`/api/ideen/${r}/log`),enabled:s,refetchInterval:4e3,staleTime:0}),ik=(r=150,s=St.gemuetlich)=>Be({queryKey:[...Pe.chronik,r],queryFn:()=>Se(`/api/chronik?limit=${r}`),refetchInterval:gl(s),select:o=>o.items??[]}),ok=()=>Be({queryKey:Pe.wissen,queryFn:()=>Se("/api/wissen")}),nw=(r=St.traege,s=!0)=>Be({queryKey:Pe.zeitmaschine,queryFn:()=>Se("/api/zeitmaschine"),refetchInterval:r,enabled:s}),rw=(r=12,s=St.schnell)=>Be({queryKey:Pe.voiceTrace,queryFn:()=>Se(`/api/voice/trace?limit=${r}`),refetchInterval:s,select:o=>o.turns??[]}),lk=(r=!0)=>Be({queryKey:Pe.memoryGraph,queryFn:()=>Se("/api/wissen/graph"),enabled:r,staleTime:60*1e3}),xm=()=>Be({queryKey:Pe.health,queryFn:()=>Se("/api/health"),refetchInterval:St.normal}),vl=(r=St.graph)=>Be({queryKey:Pe.systemStatus,queryFn:()=>Se("/api/system/status"),refetchInterval:r}),wm=(r,s=!0)=>Be({queryKey:["metrics-history",r],queryFn:()=>Se(`/api/system/history?minutes=${r}`),enabled:s,refetchInterval:6e4}),hc=(r=St.normal)=>Be({queryKey:Pe.services,queryFn:()=>Se("/api/system/services"),refetchInterval:r}),km=(r=St.schnell)=>Be({queryKey:Pe.models,queryFn:()=>Se("/api/models"),refetchInterval:gl(r)}),ak=(r=St.normal)=>Be({queryKey:Pe.groups,queryFn:()=>Se("/api/groups"),refetchInterval:r}),uk=()=>Be({queryKey:Pe.routingPolicy,queryFn:()=>Se("/api/routing/policy")}),sw=(r=3e3,s=!0)=>Be({queryKey:Pe.jobs,queryFn:()=>Se("/api/jobs"),refetchInterval:r,enabled:s,select:o=>o.jobs??[]}),bm=(r=St.graph)=>Be({queryKey:Pe.tokenStats,queryFn:()=>Se("/api/system/token-stats"),refetchInterval:r}),iw=(r=St.normal)=>Be({queryKey:Pe.agentStatus,queryFn:()=>Se("/api/agent/status"),refetchInterval:r}),ck=(r=St.traege)=>Be({queryKey:Pe.hermesBrain,queryFn:()=>Se("/api/agent/brain"),refetchInterval:r}),Sm=(r=St.traege)=>Be({queryKey:Pe.updates,queryFn:()=>Se("/api/maintenance/updates"),refetchInterval:r}),dk=()=>Be({queryKey:Pe.discover,queryFn:()=>Se("/api/discover")}),fk=r=>Be({queryKey:Pe.drafts(r),queryFn:()=>Se(`/api/models/drafts?target=${encodeURIComponent(r??"")}`),enabled:!!r}),hk=r=>Be({queryKey:Pe.connect(r),queryFn:()=>Se(r?`/api/connect?${r}`:"/api/connect")}),ow=()=>Be({queryKey:Pe.connectHealth,queryFn:()=>Se("/api/connect/health"),refetchInterval:15e3});function gi(r,...s){for(const o of s)r.invalidateQueries({queryKey:o})}function ts(r){return(r/1024**3).toFixed(1)}function Eu(r){return r?r>1024**3?`${(r/1024**3).toFixed(1)} GB`:`${(r/1024**2).toFixed(0)} MB`:""}function pk(r){if(!r)return"—";const s=r/1024**3;return s>=1?`${s.toFixed(1)} GB`:`${(r/1024**2).toFixed(0)} MB`}function mk(r){if(!r)return"";const s=Math.floor(r/60);return s>0?`${s} min`:`${r} s`}function gk(r){return r?`${Math.round(r/1024)}k`:"—"}function vk(r){return r?new Date(r*1e3).toLocaleString("de-DE",{day:"2-digit",month:"2-digit",hour:"2-digit",minute:"2-digit"}):"—"}function vi({icon:r,iconClass:s,name:o,status:a,available:u,busy:f,actionLabel:m,onAction:h}){return d.jsxs("div",{className:Ee("flex items-center gap-3 rounded-lg border px-3 py-2",u?"border-amber-500/30 bg-amber-500/5":"border-border/50 bg-background/20"),children:[d.jsx(r,{className:Ee("h-4 w-4 shrink-0",s)}),d.jsxs("div",{className:"flex-1 min-w-0",children:[d.jsx("div",{className:"text-xs text-foreground truncate",children:o}),d.jsx("div",{className:Ee("text-[10px] truncate",u?"text-amber-400/90":"text-muted-foreground"),children:a})]}),d.jsx("button",{onClick:h,disabled:!u||f,className:Ee("text-[11px] font-semibold rounded-lg px-2.5 py-1 transition-colors shrink-0",u?"bg-primary text-primary-foreground hover:opacity-90 cursor-pointer":"border border-border/50 text-muted-foreground/40 cursor-default"),children:f?"…":m})]})}function lw({label:r,ok:s,system:o,busy:a,onRestart:u,onLogs:f}){return d.jsxs("div",{className:"flex items-center gap-2.5 rounded-lg border border-border/50 bg-background/20 px-3 py-2",children:[d.jsx("span",{className:Ee("w-1.5 h-1.5 rounded-full shrink-0",s===!0?"bg-emerald-500":s===!1?"bg-red-500":"bg-muted-foreground/40")}),d.jsxs("span",{className:"flex-1 text-xs text-foreground truncate",children:[r,o&&d.jsx("span",{className:"text-[9px] text-muted-foreground",children:" (root)"})]}),d.jsx("button",{onClick:u,disabled:a,title:"Neu starten",className:"text-muted-foreground hover:text-primary transition-colors disabled:opacity-50",children:d.jsx(ss,{className:Ee("h-3.5 w-3.5",a&&"animate-spin")})}),d.jsx("button",{onClick:f,title:"Logs ansehen",className:"text-muted-foreground hover:text-primary transition-colors",children:d.jsx(Iy,{className:"h-3.5 w-3.5"})})]})}const aw=/\b(error|fehler|fail(ed|ure)?|fatal|critical|crit|panic|traceback|exception|denied|refused|unable|emerg|alert|oom|killed)\b/i,uw=/\b(warn(ing)?|deprecat\w*|retry(ing)?|timeout|timed out|degraded|missing|not found|nicht gefunden)\b/i;function cw(r){return aw.test(r)?"error":uw.test(r)?"warn":"info"}const dw={error:"text-red-400",warn:"text-amber-300",info:"text-cyan-300/80"};function fw({service:r,text:s,loading:o,logStatus:a,onRefresh:u,onOpenSettings:f}){const[m,h]=g.useState(!1),[y,k]=g.useState(""),w=g.useRef(null),x=g.useMemo(()=>s?s.split(` +`).map(R=>({t:R,level:cw(R)})):[],[s]),P=g.useMemo(()=>x.filter(R=>R.level!=="info").length,[x]),_=y.trim().toLowerCase(),D=x.filter(R=>(!m||R.level!=="info")&&(!_||R.t.toLowerCase().includes(_))),b=a==="password_required"||a==="incorrect_password";return d.jsxs("div",{className:"flex-1 flex flex-col min-h-[300px] border border-border/60 bg-black/50 rounded-xl overflow-hidden shadow-inner",children:[d.jsxs("div",{className:"flex h-10 items-center justify-between gap-2 px-3 border-b border-border/40 bg-black/30 shrink-0",children:[d.jsxs("div",{className:"flex items-center gap-1.5 text-[10px] font-mono text-muted-foreground shrink-0",children:[d.jsx(n0,{className:"h-3 w-3 text-primary"}),d.jsx("span",{className:"hidden sm:inline",children:"stdout/stderr —"})," ",r]}),d.jsxs("div",{className:"flex items-center gap-1.5",children:[d.jsxs("div",{className:"relative",children:[d.jsx(Xy,{className:"pointer-events-none absolute left-2 top-1/2 h-3 w-3 -translate-y-1/2 text-muted-foreground"}),d.jsx("input",{value:y,onChange:R=>k(R.target.value),placeholder:"filtern…",className:"h-7 w-24 sm:w-36 rounded-md border border-border/50 bg-background/40 pl-6 pr-2 text-[10px] text-foreground outline-none focus:border-primary/50"})]}),d.jsxs("button",{onClick:()=>h(R=>!R),title:"Nur Fehler und Warnungen zeigen",className:Ee("flex h-7 items-center gap-1 rounded-md border px-2 text-[10px] font-semibold transition-colors",m?"border-amber-500/50 bg-amber-500/15 text-amber-300":"border-border/50 bg-background/20 text-muted-foreground hover:text-foreground"),children:[d.jsx(Ci,{className:"h-3 w-3"}),"Nur Probleme",P>0?` (${P})`:""]}),d.jsx("button",{onClick:u,disabled:o,title:"Neu laden",className:"flex h-7 w-7 items-center justify-center rounded-md border border-border/50 bg-background/20 text-muted-foreground hover:text-foreground transition-colors disabled:opacity-50",children:d.jsx(ss,{className:Ee("h-3 w-3",o&&"animate-spin")})})]})]}),d.jsx("div",{ref:w,className:"flex-1 overflow-y-auto p-3 text-[10px] font-mono leading-relaxed scrollbar-thin select-text",children:b?d.jsxs("div",{className:"flex h-full flex-col items-center justify-center space-y-3 p-6 text-center",children:[d.jsx(Ci,{className:"h-8 w-8 text-amber-400 animate-pulse animate-duration-1000"}),d.jsx("div",{className:"text-xs font-semibold text-amber-300",children:a==="incorrect_password"?"Falsches Sudo-Passwort hinterlegt.":"Sudo-Passwort für systemd-Dienste erforderlich."}),d.jsxs("p",{className:"max-w-xs text-[10px] leading-normal text-muted-foreground",children:["Für das Auslesen der systemd-Logs von ",r," werden Root-Rechte benötigt. Hinterlege dein Passwort in den Einstellungen."]}),d.jsx("button",{onClick:f,className:"mt-2 rounded-md bg-primary px-3 py-1.5 text-[10px] font-semibold text-primary-foreground transition-colors hover:bg-primary/95",children:"Sudo-Passwort eintragen"})]}):o&&!s?d.jsx("span",{className:"text-muted-foreground",children:"Lade Logs…"}):x.length===0?d.jsx("span",{className:"text-muted-foreground",children:"Keine Logeinträge vorhanden."}):D.length===0?d.jsx("span",{className:"text-muted-foreground",children:m?"Keine Fehler oder Warnungen — der Dienst läuft sauber. ✓":"Kein Treffer für den Filter."}):D.map((R,A)=>d.jsx("div",{className:Ee("whitespace-pre-wrap",dw[R.level]),children:R.t||" "},A))})]})}function hw({open:r,showAlert:s}){const[o,a]=g.useState(null),[u,f]=g.useState(""),[m,h]=g.useState(!1),[y,k]=g.useState(!1),[w,x]=g.useState(!1);async function P(){k(!0);try{a(await Se("/api/maintenance/geheimnisse"))}catch(D){s("Nicht erreichbar",`Der Geheimnis-Zustand konnte nicht geladen werden: ${(D==null?void 0:D.message)||D}`)}finally{k(!1)}}g.useEffect(()=>{r&&(f(""),h(!1),P())},[r]);async function _(D){x(!0);try{const b=await Se("/api/maintenance/geheimnisse",{method:"POST",body:JSON.stringify({schluessel:"hf_token",wert:D})});a(b),f(""),s(D?"Gespeichert":"Gelöscht",D?"Der Token liegt jetzt auf der Box — der Browser behält ihn nicht.":"Der Token wurde von der Box entfernt.")}catch(b){s("Fehlgeschlagen",(b==null?void 0:b.message)||String(b))}finally{x(!1)}}return d.jsxs("div",{className:"space-y-6",children:[d.jsxs("div",{className:"space-y-2",children:[d.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground",children:"Zugangsdaten & Schlüssel"}),d.jsx("p",{className:"text-[10px] leading-normal text-muted-foreground",children:"Geheimnisse liegen auf der Box (Datei mit Rechten 0600), nicht im Browser. Diese Seite zeigt nur, ob etwas gesetzt ist — den Wert bekommt sie nie zurück."})]}),d.jsxs("div",{className:"mc-card-sm space-y-1.5 p-3",children:[d.jsxs("div",{className:"flex items-center gap-1.5 text-xs font-semibold",children:[d.jsx(Cp,{className:"h-4 w-4 text-emerald-400","aria-hidden":"true"}),"Box-Sudo-Passwort — nicht mehr nötig"]}),d.jsxs("p",{className:"text-[10px] leading-normal text-muted-foreground",children:["Systemdienste, OS-Update und Neustart laufen passwortlos (",d.jsx("code",{className:"font-mono text-primary",children:"NOPASSWD"})," in",d.jsx("code",{className:"font-mono",children:" /etc/sudoers"}),"). Das frühere Feld hat nie etwas bewirkt und lag dabei im Browser-Speicher — es ist am 28.08.2026 ersatzlos entfallen. Verlangt ",d.jsx("code",{className:"font-mono",children:"sudo"})," auf der Box je doch ein Passwort, sagt die Wartung das im Klartext; das ist dann dort zu lösen."]})]}),d.jsxs("div",{className:"space-y-2",children:[d.jsxs("label",{htmlFor:"hf-token",className:"flex items-center gap-1.5 text-xs font-semibold",children:[d.jsx(Wy,{className:"h-4 w-4 text-violet-400","aria-hidden":"true"}),"HuggingFace-Token"]}),d.jsx("div",{className:"flex items-center gap-2 text-[11px]",children:y?d.jsxs("span",{className:"flex items-center gap-1.5 text-muted-foreground",children:[d.jsx(ji,{className:"h-3 w-3 animate-spin","aria-hidden":"true"})," Zustand wird geladen …"]}):o!=null&&o.hf_token_gesetzt?d.jsxs("span",{className:"flex items-center gap-1.5 font-semibold text-emerald-400",children:[d.jsx("span",{className:"h-2 w-2 rounded-full bg-emerald-500","aria-hidden":"true"}),"Gesetzt",o.hf_token_aus_env?" (aus der Dienst-Umgebung)":""]}):d.jsxs("span",{className:"flex items-center gap-1.5 text-muted-foreground",children:[d.jsx("span",{className:"h-2 w-2 rounded-full bg-muted-foreground/50","aria-hidden":"true"}),"Nicht gesetzt"]})}),(o==null?void 0:o.hf_token_aus_env)&&d.jsxs("p",{className:"text-[9px] leading-normal text-amber-400/90",children:["Der Token kommt aus der Umgebung des Dienstes und hat Vorrang. Hier gespeicherte Werte bleiben wirkungslos, solange ",d.jsx("code",{className:"font-mono",children:"HF_TOKEN"})," gesetzt ist."]}),o&&!o.schreibbar&&d.jsx("p",{className:"text-[9px] leading-normal text-amber-400/90",children:"Die Ablage ist nicht beschreibbar — auf einem Entwicklungsrechner ohne den Modell-Ordner der Box ist das normal. Speichern würde hier ins Leere laufen."}),d.jsxs("div",{className:"relative",children:[d.jsx("input",{id:"hf-token",type:m?"text":"password",value:u,onChange:D=>f(D.target.value),autoComplete:"off",spellCheck:!1,placeholder:o!=null&&o.hf_token_gesetzt?"Neuen Token eingeben, um zu ersetzen":"hf_…",className:"h-10 w-full rounded-lg border border-border/60 bg-background/40 pl-3 pr-10 text-xs text-foreground outline-none transition-colors focus:border-primary"}),d.jsx("button",{type:"button",onClick:()=>h(!m),"aria-label":m?"Token verbergen":"Token anzeigen",className:"absolute inset-y-0 right-0 flex items-center pr-3 text-muted-foreground transition-colors hover:text-foreground",children:m?d.jsx(Fy,{className:"h-4 w-4","aria-hidden":"true"}):d.jsx(jp,{className:"h-4 w-4","aria-hidden":"true"})})]}),d.jsxs("p",{className:"text-[9px] leading-normal text-muted-foreground",children:["Nötig für Modelle mit Zugangsschranke. Wird beim Download als",d.jsx("code",{className:"font-mono",children:" HF_TOKEN"})," an den Job gereicht und verlässt die Box nicht."]})]}),d.jsxs("div",{className:"flex gap-3 pt-2",children:[d.jsxs("button",{onClick:()=>_(u.trim()),disabled:w||!u.trim(),className:"flex h-9 flex-1 cursor-pointer items-center justify-center gap-1.5 rounded-lg bg-primary text-xs font-semibold text-primary-foreground shadow shadow-primary/10 transition-colors hover:bg-primary/90 disabled:cursor-not-allowed disabled:opacity-40",children:[w&&d.jsx(ji,{className:"h-3.5 w-3.5 animate-spin","aria-hidden":"true"}),"Auf der Box speichern"]}),d.jsx("button",{onClick:()=>_(null),disabled:w||!(o!=null&&o.hf_token_gesetzt),className:"flex h-9 cursor-pointer items-center justify-center rounded-lg border border-border/60 bg-background/20 px-4 text-xs font-semibold text-muted-foreground transition-colors hover:bg-accent disabled:cursor-not-allowed disabled:opacity-40",children:"Löschen"})]})]})}function pw({detail:r,maintenanceJob:s,onClose:o,onApply:a}){var y,k;const u=r.data,f={os:{icon:_p,cls:"text-cyan-400",title:"OS-Pakete (apt)"},engine:{icon:cl,cls:"text-violet-400",title:"Inferenz-Engine (llama.cpp)"},swap:{icon:Pp,cls:"text-fuchsia-400",title:"Router (llama-swap)"},hermes:{icon:Ni,cls:"text-amber-400",title:"Hermes-Agent"}}[r.kind],m=f.icon,h=u?r.kind==="os"?(u.count??0)===0:r.kind==="hermes"?(u.behind??0)===0:u.installed_build!=null&&u.latest_build!=null&&u.latest_build<=u.installed_build:!0;return d.jsxs("div",{className:"fixed inset-0 z-[60] flex items-center justify-center p-4",children:[d.jsx("div",{className:"absolute inset-0 bg-black/70 backdrop-blur-sm",onClick:o}),d.jsxs("div",{className:"relative w-full max-w-lg max-h-[80vh] flex flex-col rounded-2xl border border-border/60 bg-card shadow-2xl font-sans text-foreground",children:[d.jsxs("div",{className:"flex h-14 shrink-0 items-center justify-between border-b border-border/40 px-5",children:[d.jsxs("div",{className:"flex items-center gap-2",children:[d.jsx(m,{className:Ee("h-4.5 w-4.5",f.cls)}),d.jsx("h3",{className:"text-sm font-semibold",children:f.title})]}),d.jsx("button",{onClick:o,className:"flex h-7 w-7 items-center justify-center rounded-lg border border-border/40 text-muted-foreground hover:bg-accent transition-colors",children:d.jsx(dl,{className:"h-4 w-4"})})]}),d.jsx("div",{className:"flex-1 overflow-y-auto p-5 text-xs space-y-3 scrollbar-thin",children:r.loading?d.jsxs("div",{className:"flex h-24 items-center justify-center gap-2 text-muted-foreground",children:[d.jsx(ss,{className:"h-4 w-4 animate-spin"})," Details werden geladen…"]}):u!=null&&u.error?d.jsx("div",{className:"rounded-lg border border-red-500/30 bg-red-500/5 p-3 text-red-400",children:u.error}):d.jsxs(d.Fragment,{children:[(u==null?void 0:u.action_needed)!=null&&d.jsxs("div",{className:Ee("flex items-start gap-2 rounded-lg border p-3",u.action_needed?"border-amber-500/40 bg-amber-500/10":"border-emerald-500/40 bg-emerald-500/10"),children:[u.action_needed?d.jsx(Ci,{className:"h-4 w-4 text-amber-400 shrink-0 mt-0.5"}):d.jsx(Ty,{className:"h-4 w-4 text-emerald-400 shrink-0 mt-0.5"}),d.jsxs("div",{className:"min-w-0",children:[d.jsxs("div",{className:Ee("text-xs font-semibold",u.action_needed?"text-amber-300":"text-emerald-300"),children:["Musst du etwas tun? ",u.action_needed?"Ja":"Nein — die Box regelt das (Fangnetz)"]}),u.action_needed&&u.action_text&&d.jsx("div",{className:"mt-0.5 text-[11px] text-foreground/90",children:u.action_text})]})]}),(u==null?void 0:u.summary)&&d.jsxs("div",{className:"rounded-lg border border-primary/25 bg-primary/5 p-3 space-y-1",children:[d.jsx("div",{className:"text-[10px] font-bold uppercase tracking-wider text-primary",children:"Was dieses Update bedeutet (Zusammenfassung der Box)"}),d.jsx("pre",{className:"whitespace-pre-wrap text-[11px] leading-relaxed text-foreground/90 font-sans",children:u.summary})]}),r.kind==="os"?d.jsxs(d.Fragment,{children:[((u==null?void 0:u.count)??0)===0?d.jsx("div",{className:"text-muted-foreground",children:"Keine Pakete zu aktualisieren — System ist aktuell."}):d.jsxs(d.Fragment,{children:[d.jsxs("div",{className:"text-muted-foreground",children:[u.count," Paket(e) werden aktualisiert:"]}),d.jsx("div",{className:"space-y-1",children:u.packages.map(w=>d.jsxs("div",{className:"flex items-center justify-between gap-2 rounded-md border border-border/40 bg-background/30 px-2.5 py-1.5",children:[d.jsxs("span",{className:"flex items-center gap-1.5 font-mono text-[11px] truncate",children:[d.jsx(Ch,{className:"h-3 w-3 text-cyan-400 shrink-0"}),w.name]}),d.jsxs("span",{className:"flex items-center gap-1 font-mono text-[10px] text-muted-foreground shrink-0",children:[d.jsx("span",{children:w.current}),d.jsx(jh,{className:"h-3 w-3"}),d.jsx("span",{className:"text-emerald-400",children:w.candidate})]})]},w.name))})]}),(((y=u==null?void 0:u.held_back)==null?void 0:y.length)??0)>0&&d.jsxs("div",{className:"space-y-1.5 rounded-lg border border-border/40 bg-background/20 p-3",children:[d.jsxs("div",{className:"flex items-center gap-1.5 text-[11px] font-semibold text-muted-foreground",children:[d.jsx(Ly,{className:"h-3.5 w-3.5"})," Vom Hersteller zurückgestellt — kein Handeln nötig"]}),d.jsx("p",{className:"text-[10px] text-muted-foreground leading-normal",children:"Diese Pakete gäbe es bereits, Ubuntu spielt sie aber gestaffelt aus (Phasen-Rollout) bzw. hält sie kurz zurück. Sie kommen bei einem der nächsten automatischen Läufe von selbst — das ist kein Fehler und nichts hängt fest."}),d.jsx("div",{className:"space-y-1",children:u.held_back.map(w=>d.jsxs("div",{className:"flex items-center justify-between gap-2 rounded-md border border-border/30 bg-background/30 px-2.5 py-1.5",children:[d.jsxs("span",{className:"flex items-center gap-1.5 font-mono text-[11px] truncate",children:[d.jsx(Ch,{className:"h-3 w-3 text-muted-foreground shrink-0"}),w.name]}),d.jsx("span",{className:"text-[9px] text-muted-foreground shrink-0",children:w.reason==="phasing"?"Phasen-Rollout":"vorerst zurückgehalten"})]},w.name))})]})]}):r.kind==="engine"||r.kind==="swap"?d.jsxs(d.Fragment,{children:[d.jsxs("div",{className:"flex items-center gap-2 font-mono text-[11px]",children:[d.jsxs("span",{className:"rounded-md border border-border/40 bg-background/30 px-2 py-1",children:["Build ",(u==null?void 0:u.installed_build)??"?"]}),d.jsx(jh,{className:"h-3.5 w-3.5 text-muted-foreground"}),d.jsxs("span",{className:"rounded-md border border-emerald-500/30 bg-emerald-500/5 px-2 py-1 text-emerald-400",children:["Build ",(u==null?void 0:u.latest_build)??"?"]})]}),((u==null?void 0:u.name)||(u==null?void 0:u.latest_tag))&&d.jsxs("div",{className:"text-muted-foreground",children:["Release: ",d.jsx("span",{className:"text-foreground",children:u==null?void 0:u.name}),u!=null&&u.latest_tag?` (${u.latest_tag})`:""]}),(u==null?void 0:u.url)&&d.jsxs("a",{href:u.url,target:"_blank",rel:"noreferrer",className:"inline-flex items-center gap-1 text-primary hover:underline",children:["Original-Release-Notes auf GitHub ",d.jsx(zy,{className:"h-3 w-3"})]}),(u==null?void 0:u.body)&&d.jsxs("details",{className:"group",children:[d.jsx("summary",{className:"cursor-pointer text-[10px] text-muted-foreground hover:text-foreground",children:"Original-Notizen (englisch) anzeigen"}),d.jsx("pre",{className:"mt-1.5 whitespace-pre-wrap rounded-lg border border-border/40 bg-background/30 p-3 text-[10px] leading-relaxed text-muted-foreground max-h-60 overflow-y-auto scrollbar-thin",children:u.body})]})]}):(((k=u==null?void 0:u.commits)==null?void 0:k.length)??0)===0?d.jsx("div",{className:"text-muted-foreground",children:"Keine neuen Commits — Hermes-Agent ist bereits aktuell."}):d.jsxs(d.Fragment,{children:[d.jsxs("div",{className:"text-muted-foreground",children:[u.behind," neue Commit(s) auf ",d.jsxs("span",{className:"font-mono text-foreground",children:["origin/",u.branch]}),":"]}),d.jsx("div",{className:"space-y-1",children:u.commits.map(w=>d.jsxs("div",{className:"flex items-start gap-2 rounded-md border border-border/40 bg-background/30 px-2.5 py-1.5",children:[d.jsx($y,{className:"h-3.5 w-3.5 text-primary shrink-0 mt-0.5"}),d.jsxs("div",{className:"min-w-0",children:[d.jsx("div",{className:"text-[11px] truncate",children:w.subject}),d.jsxs("div",{className:"font-mono text-[9px] text-muted-foreground",children:[w.hash," · ",w.when]})]})]},w.hash))})]}),r.kind!=="os"&&!h&&d.jsxs("div",{className:"flex items-start gap-2 rounded-lg border border-border/40 bg-background/20 p-2.5",children:[d.jsx(Cp,{className:"h-3.5 w-3.5 text-emerald-400 shrink-0 mt-0.5"}),d.jsxs("p",{className:"text-[10px] text-muted-foreground leading-normal",children:["Vor dem Update sichert die Box automatisch den alten Stand. Danach prüft sie den ganzen Stack per echter Anfrage — läuft etwas nicht, rollt sie von selbst zurück",r.kind==="hermes"?" und startet den Gateway neu":"","."]})]})]})}),d.jsxs("div",{className:"flex gap-3 border-t border-border/40 p-4 shrink-0",children:[d.jsx("button",{onClick:o,className:"h-9 flex-1 rounded-lg border border-border/60 bg-background/20 text-xs font-semibold text-muted-foreground hover:bg-accent transition-colors cursor-pointer",children:"Schließen"}),d.jsx("button",{onClick:a,disabled:r.loading||h||!!s,title:s?`Update läuft bereits: ${s.label}`:void 0,className:"h-9 flex-1 rounded-lg bg-primary text-xs font-semibold text-primary-foreground hover:opacity-90 transition-all cursor-pointer disabled:opacity-40 disabled:cursor-default",children:s?"Update läuft…":"Jetzt aktualisieren"})]})]})]})}function mw({open:r,onClose:s,defaultTab:o="maintenance"}){var jr,Cs;const a=ul(),{showAlert:u,showConfirm:f,dialogElement:m}=ym(),{data:h}=Sm(),{data:y}=hc(),k=sw(3e3,r).data??[],{data:w}=nw(void 0,r),[x,P]=g.useState("llama-swap"),[_,D]=g.useState(""),[b,R]=g.useState(!1),[A,I]=g.useState(null),[V,z]=g.useState({}),[K,G]=g.useState("maintenance"),[ue,oe]=g.useState(!1),[ee,me]=g.useState(""),[ke,le]=g.useState(!1),[Le,Z]=g.useState(!1),[ce,Ce]=g.useState(null),Ne=(y==null?void 0:y.services)??[],F=()=>gi(a,Pe.jobs);function ne(L){return L?new Date(L*1e3).toLocaleString("de-DE",{day:"2-digit",month:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"}):"Nie"}g.useEffect(()=>{r&&o&&G(o)},[r,o]),g.useEffect(()=>{r&&gi(a,Pe.updates,Pe.services,Pe.jobs,Pe.zeitmaschine)},[r]);function Q(L){R(!0),I(null),Se(`/api/maintenance/logs?service=${L}&lines=150`).then(xe=>{xe.ok?D(xe.text):(D(`Fehler beim Laden der Logs: ${xe.err||"Unbekannter Fehler"}`),(xe.status==="incorrect_password"||xe.status==="password_required")&&I(xe.status))}).catch(xe=>D(`Fehler: ${xe.message}`)).finally(()=>R(!1))}g.useEffect(()=>{!r||K!=="logs"||Q(x)},[r,K,x]);function C(L){return(L==null?void 0:L.status)==="busy"?(u("Update läuft bereits",`Es läuft gerade „${L.running}". Bitte warte, bis es fertig ist.`),F(),!0):!1}function N(L){return(L==null?void 0:L.status)==="password_required"||(L==null?void 0:L.status)==="incorrect_password"?(u("Box-Passwort nötig",(L.status==="incorrect_password"?"Das gespeicherte Box-Passwort stimmt nicht. ":"Für dieses Update braucht die Box dein Passwort. ")+"Bitte oben im Reiter „Einstellungen“ setzen bzw. korrigieren."),!0):L&&L.ok===!1?(u("Update fehlgeschlagen",L.err||"Unbekannter Fehler."),!0):!1}async function q(L){const xe={os:"os-update",engine:"engine-update",swap:"swap-update"}[L];try{const ze=await Se(`/api/maintenance/${xe}`,{method:"POST"});if(C(ze)||N(ze))return;F(),G("maintenance")}catch(ze){u("Fehler",`Update konnte nicht starten: ${ze.message}`)}}async function Y(){Z(!0);try{const L=await Se("/api/maintenance/hermes-update",{method:"POST"});if(C(L))return;F()}catch(L){u("Fehler",`Hermes-Update fehlgeschlagen: ${L.message}`)}finally{Z(!1)}}async function W(L){Ce({kind:L,loading:!0,data:null});try{const xe=await Se(`/api/maintenance/update-details?kind=${L}`);Ce({kind:L,loading:!1,data:xe})}catch(xe){Ce({kind:L,loading:!1,data:{kind:L,error:xe.message}})}}function se(){const L=ce==null?void 0:ce.kind;Ce(null),L==="os"||L==="engine"||L==="swap"?q(L):L==="hermes"&&Y()}function de(){var xe;const L=[h!=null&&h.engine?"Engine":null,h!=null&&h.swap?"Router":null,(xe=h==null?void 0:h.components)!=null&&xe.some(ze=>ze.update===!0)?"Hermes-Agent":null,h!=null&&h.os?`OS (${h.os} Pakete)`:null].filter(Boolean);f("Alle Updates einspielen?",`Nacheinander in einem Job: ${L.join(" → ")}. Jeder Schritt sichert und prüft sich selbst; schlägt einer fehl, stoppt der Rest. (OS braucht das Box-Passwort aus den Einstellungen — fehlt es, wird OS übersprungen.)`,async()=>{try{const ze=await Se("/api/maintenance/update-all",{method:"POST"});if(C(ze)||N(ze))return;if((ze==null?void 0:ze.status)==="nothing"){u("Nichts zu tun","Es stehen keine Updates aus.");return}F(),G("maintenance")}catch(ze){u("Fehler",`„Alle aktualisieren" konnte nicht starten: ${ze.message}`)}})}async function ye(){oe(!0);try{await Se("/api/maintenance/check-updates",{method:"POST"}),gi(a,Pe.jobs,Pe.updates),G("maintenance")}catch(L){u("Fehler",`Fehler bei der Update-Suche: ${L.message}`)}finally{oe(!1)}}async function we(L,xe){try{await Se("/api/models/install",{method:"POST",body:JSON.stringify({repo:L,role:xe})}),u("Gestartet",`Modell-Upgrade für '${xe}' (${L}) gestartet.`),F(),G("maintenance")}catch(ze){u("Fehler",`Fehler beim Starten des Modell-Upgrades: ${ze.message}`)}}async function Ge(){f("Reboot bestätigen","Bist du sicher, dass du das gesamte Host-System neu starten willst?",async()=>{try{await Se("/api/maintenance/reboot",{method:"POST"}),u("Reboot","Reboot ausgelöst. System startet neu...",()=>s())}catch(L){u("Fehler",`Fehler beim Reboot: ${L.message}`)}})}async function Sr(){le(!0),me("Snapshot wird erzeugt...");try{const L=await Se("/api/system/backup",{method:"POST"});me(L.ok?`Snapshot erzeugt: ${L.snapshot} (${L.files.length} Komponenten)`:"Backup fehlgeschlagen."),gi(a,Pe.zeitmaschine)}catch(L){me(`Fehler: ${L.message}`)}finally{le(!1)}}async function Ns(L){z(xe=>({...xe,[L]:!0}));try{const xe=await Se("/api/maintenance/restart",{method:"POST",body:JSON.stringify({service:L})});xe.ok?(u("Dienst neu gestartet",`Dienst ${L} wurde erfolgreich neu gestartet.`,()=>{K==="logs"&&x===L&&Q(L)}),gi(a,Pe.services,Pe.health,Pe.models)):u("Fehler",`Fehler beim Neustart: ${xe.err||"Unbekannter Fehler"}`)}catch(xe){u("Fehler",`Fehler beim Neustart: ${xe.message}`)}finally{z(xe=>({...xe,[L]:!1}))}}async function Er(L){try{await Se(`/api/jobs/${L}/cancel`,{method:"POST"}),F()}catch(xe){u("Fehler",`Fehler beim Abbrechen: ${xe.message}`)}}const rn=k.find(L=>(L.state==="running"||L.state==="queued")&&L.group==="maintenance"),js=(h?(h.os>0?1:0)+(h.engine?1:0)+(h.swap?1:0):0)+(((jr=h==null?void 0:h.components)==null?void 0:jr.filter(L=>L.update===!0).length)??0),Nr=(w==null?void 0:w.backups)??[];return d.jsxs(d.Fragment,{children:[d.jsx("div",{className:Ee("fixed inset-0 bg-black/60 backdrop-blur-sm z-50 transition-opacity duration-300",r?"opacity-100 pointer-events-auto":"opacity-0 pointer-events-none"),onClick:s}),d.jsxs("div",{className:Ee("fixed inset-y-0 right-0 w-full sm:w-[640px] bg-card/85 backdrop-blur-xl border-l border-border/60 shadow-2xl z-50 flex flex-col transform transition-transform duration-300 ease-in-out font-sans text-foreground",r?"translate-x-0":"translate-x-full"),children:[d.jsxs("div",{className:"flex h-16 shrink-0 items-center justify-between border-b border-border/40 px-6",children:[d.jsxs("div",{className:"flex items-center gap-2",children:[d.jsx(Np,{className:"h-4.5 w-4.5 text-primary"}),d.jsx("h2",{className:"text-sm font-semibold tracking-wide uppercase font-space",children:"OS-Zentrale & Pflege"})]}),d.jsx("button",{onClick:s,className:"flex h-8 w-8 items-center justify-center rounded-lg border border-border/40 text-muted-foreground hover:bg-accent transition-colors",children:d.jsx(dl,{className:"h-4 w-4"})})]}),d.jsx("div",{className:"flex border-b border-border/40 px-6",children:["maintenance","logs","settings"].map(L=>d.jsx("button",{onClick:()=>G(L),className:Ee("flex-1 py-3 text-xs font-semibold uppercase tracking-wider border-b-2 text-center transition-all",K===L?"border-primary text-primary":"border-transparent text-muted-foreground hover:text-foreground"),children:L==="maintenance"?"System-Wartung":L==="logs"?"System-Logs":"Einstellungen"},L))}),d.jsxs("div",{className:"flex-1 overflow-y-auto p-6 space-y-6",children:[K==="maintenance"&&d.jsxs(d.Fragment,{children:[d.jsxs("div",{className:"space-y-2.5",children:[d.jsxs("div",{className:"flex items-center justify-between",children:[d.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground",children:"Updates"}),d.jsxs("div",{className:"flex items-center gap-3",children:[js>0&&d.jsxs("button",{onClick:de,disabled:!!rn,className:"flex items-center gap-1 rounded-md border border-primary/40 bg-primary/10 px-2 py-1 text-[10px] font-bold text-primary transition-colors hover:bg-primary/20 disabled:opacity-50",children:[d.jsx(Dy,{className:"h-3 w-3"})," Alle aktualisieren (",js,")"]}),d.jsxs("button",{onClick:ye,disabled:ue||!!rn,className:"flex items-center gap-1 text-[10px] font-semibold text-primary hover:text-primary/80 transition-colors disabled:opacity-50",children:[d.jsx(ss,{className:Ee("h-3 w-3",ue&&"animate-spin")})," Nach Updates suchen"]})]})]}),(h==null?void 0:h.last_check)&&d.jsxs("div",{className:"text-[9px] text-muted-foreground -mt-1",children:["Zuletzt gesucht: ",ne(h.last_check)]}),rn&&d.jsxs("div",{className:"flex items-center gap-2 rounded-lg border border-amber-500/30 bg-amber-500/10 px-3 py-2 text-[11px] text-amber-300",children:[d.jsx(ss,{className:"h-3.5 w-3.5 shrink-0 animate-spin"}),d.jsxs("span",{children:["Update läuft: ",d.jsx("span",{className:"font-semibold",children:rn.label})," — bitte warten. Weitere Updates sind solange gesperrt."]})]}),d.jsxs("div",{className:"space-y-1.5",children:[d.jsx(vi,{icon:_p,iconClass:"text-cyan-400",name:"OS-Pakete (apt)",available:!!(h!=null&&h.os),status:h!=null&&h.os?`${h.os} verfügbar`:"aktuell",actionLabel:"Anzeigen",onAction:()=>W("os")}),d.jsx(vi,{icon:cl,iconClass:"text-violet-400",name:"Inferenz-Engine (llama.cpp)",available:!!(h!=null&&h.engine),status:h!=null&&h.engine?"Update verfügbar":"aktuell",actionLabel:"Anzeigen",onAction:()=>W("engine")}),d.jsx(vi,{icon:Pp,iconClass:"text-fuchsia-400",name:"Router (llama-swap)",available:!!(h!=null&&h.swap),status:h!=null&&h.swap?"Update verfügbar":"aktuell",actionLabel:"Anzeigen",onAction:()=>W("swap")}),(()=>{var xe;const L=(xe=h==null?void 0:h.components)==null?void 0:xe.find(ze=>ze.key==="hermes_agent");return d.jsx(vi,{icon:Ni,iconClass:"text-amber-400",name:"Hermes-Agent",available:(L==null?void 0:L.update)===!0,busy:Le,status:(L==null?void 0:L.update)===!0?`Update: ${L.latest}`:(L==null?void 0:L.reachable)===!1?"offline":"aktuell",actionLabel:"Anzeigen",onAction:()=>W("hermes")})})(),(Cs=h==null?void 0:h.model_list)==null?void 0:Cs.map(L=>d.jsx(vi,{icon:_y,iconClass:"text-emerald-400",name:`Modell · ${L.role}`,available:!0,status:L.title,actionLabel:"Upgrade",onAction:()=>we(L.repo,L.role)},L.role))]})]}),d.jsxs("div",{className:"space-y-2.5",children:[d.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground",children:"Dienste"}),d.jsxs("div",{className:"space-y-1.5",children:[Ne.length===0&&d.jsx("div",{className:"rounded-lg border border-dashed border-border/50 p-4 text-center text-xs text-muted-foreground",children:"Dienste-Liste wird geladen …"}),Ne.map(L=>d.jsx(lw,{label:L.name,system:L.scope==="system",ok:L.ok,busy:V[L.unit],onRestart:()=>Ns(L.unit),onLogs:()=>{P(L.unit),G("logs")}},L.unit))]})]}),d.jsxs("div",{className:"space-y-2.5",children:[d.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground",children:"Backup"}),d.jsxs("div",{className:"rounded-lg border border-border/50 bg-background/20 px-3 py-2.5 flex items-center gap-3",children:[d.jsxs("div",{className:"flex-1 min-w-0",children:[d.jsx("div",{className:"text-xs text-foreground truncate",children:Nr[0]?`Letztes: ${Nr[0].snapshot}`:"Noch kein Backup"}),d.jsxs("div",{className:"text-[10px] text-muted-foreground",children:[Nr.length," Snapshots · Wiederherstellen: Chronik → Zeitmaschine"]})]}),d.jsxs("button",{onClick:Sr,disabled:ke,className:"flex items-center gap-1.5 text-[11px] font-semibold rounded-lg px-2.5 py-1 bg-primary text-primary-foreground hover:opacity-90 transition-all cursor-pointer disabled:opacity-50 shrink-0",children:[d.jsx(Ry,{className:Ee("h-3.5 w-3.5",ke&&"animate-pulse")})," Snapshot"]})]}),ee&&d.jsx("div",{className:"text-[10px] font-mono text-primary bg-primary/5 p-2 rounded-lg border border-primary/20 break-all leading-normal",children:ee})]}),d.jsxs("div",{className:"space-y-2.5",children:[d.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-red-400/80",children:"Gefahrenzone"}),d.jsxs("button",{onClick:Ge,className:"flex w-full items-center gap-3 p-3 rounded-lg border border-red-500/20 bg-red-500/5 hover:bg-red-500/10 text-red-400 transition-all text-left text-xs font-semibold",children:[d.jsx(Yy,{className:"h-4.5 w-4.5"}),d.jsxs("div",{children:[d.jsx("div",{children:"Host-System neu starten"}),d.jsx("div",{className:"text-[10px] text-red-400/80 font-normal",children:"Startet die ganze Box neu"})]})]})]}),d.jsxs("div",{className:"space-y-3",children:[d.jsxs("div",{className:"flex items-center justify-between",children:[d.jsx("h3",{className:"text-xs font-bold uppercase tracking-wider text-muted-foreground",children:"Hintergrund-Aufgaben"}),d.jsxs("span",{className:"text-[10px] font-mono bg-primary/10 text-primary px-1.5 py-0.5 rounded-full",children:[k.filter(L=>L.state==="running"||L.state==="queued").length," Aktiv"]})]}),d.jsx("div",{className:"space-y-3",children:k.length===0?d.jsx("div",{className:"text-xs text-muted-foreground border border-dashed border-border/60 rounded-xl p-6 text-center",children:"Aktuell keine aktiven Hintergrund-Jobs."}):k.map(L=>{const xe=L.state==="running"||L.state==="queued";return d.jsxs("div",{className:Ee("p-3 rounded-xl border transition-all duration-300",xe?"border-primary/40 bg-primary/5 shadow-md shadow-primary/5":"border-border/40 bg-background/20 opacity-80"),children:[d.jsxs("div",{className:"flex items-start justify-between gap-3",children:[d.jsxs("div",{className:"space-y-1",children:[d.jsxs("div",{className:"text-xs font-semibold flex items-center gap-1.5",children:[xe&&d.jsxs("span",{className:"flex h-2 w-2 relative",children:[d.jsx("span",{className:"animate-ping absolute inline-flex h-full w-full rounded-full bg-primary opacity-75"}),d.jsx("span",{className:"relative inline-flex rounded-full h-2 w-2 bg-primary"})]}),L.label]}),d.jsxs("div",{className:"text-[10px] font-mono text-muted-foreground uppercase flex items-center gap-2",children:[d.jsxs("span",{children:["ID: ",L.id]}),d.jsx("span",{children:"•"}),d.jsx("span",{className:Ee(L.state==="done"&&"text-emerald-400",L.state==="failed"&&"text-red-400",L.state==="running"&&"text-primary",L.state==="queued"&&"text-amber-400",L.state==="canceled"&&"text-muted-foreground"),children:L.state})]})]}),xe&&d.jsx("button",{onClick:()=>Er(L.id),className:"text-[10px] font-semibold text-red-400 hover:text-red-300 border border-red-500/20 bg-red-500/5 hover:bg-red-500/10 px-2 py-0.5 rounded transition-colors",children:"Abbrechen"})]}),L.state==="running"&&d.jsxs("div",{className:"mt-3 space-y-1",children:[d.jsx("div",{className:"w-full h-1.5 bg-muted rounded-full overflow-hidden",children:d.jsx("div",{className:"h-full bg-primary transition-all duration-500",style:{width:`${L.progress??0}%`}})}),d.jsxs("div",{className:"flex justify-between items-center text-[9px] font-mono text-muted-foreground",children:[d.jsxs("span",{children:[L.progress??0,"%"]}),L.done_bytes!=null&&L.total_bytes!=null&&d.jsxs("span",{children:[Eu(L.done_bytes)," / ",Eu(L.total_bytes),L.rate_bps!=null&&` (${Eu(L.rate_bps)}/s)`]}),L.eta_s!=null&&d.jsxs("span",{children:["ETA: ",L.eta_s,"s"]})]})]})]},L.id)})})]})]}),K==="logs"&&d.jsxs("div",{className:"flex flex-col h-full space-y-4",children:[d.jsxs("div",{className:"flex items-center gap-2",children:[d.jsx("select",{value:x,onChange:L=>P(L.target.value),className:"flex-1 h-9 px-3 text-xs bg-background/40 border border-border/60 rounded-lg outline-none text-foreground font-semibold",children:Ne.map(L=>d.jsxs("option",{value:L.unit,children:[L.name," (",L.scope==="system"?"systemd-root":"user",")"]},L.unit))}),d.jsxs("button",{onClick:()=>Ns(x),disabled:V[x],className:"flex h-9 px-3 items-center gap-1.5 text-xs font-semibold rounded-lg border border-border/60 bg-background/20 hover:border-primary/50 transition-colors disabled:opacity-50",title:"Dienst neu starten",children:[d.jsx(ss,{className:Ee("h-3.5 w-3.5",V[x]&&"animate-spin")}),"Restart"]})]}),d.jsx(fw,{service:x,text:_,loading:b,logStatus:A,onRefresh:()=>Q(x),onOpenSettings:()=>G("settings")})]}),K==="settings"&&d.jsx(hw,{open:r,showAlert:u})]})]}),ce&&d.jsx(pw,{detail:ce,maintenanceJob:rn,onClose:()=>Ce(null),onApply:se}),m]})}let Ku=[],qu=[];const Gu=new Set,Em=()=>Gu.forEach(r=>r());function Nm(r){return Gu.add(r),()=>{Gu.delete(r)}}function gw(r){Ku=[...Ku,r].slice(-40),Em()}function vw(r){qu=[...qu,r].slice(-40),Em()}const yw=()=>g.useSyncExternalStore(Nm,()=>Ku),xw=()=>g.useSyncExternalStore(Nm,()=>qu);function ww(){const{data:r,dataUpdatedAt:s}=vl(),{data:o,dataUpdatedAt:a}=bm(),u=g.useRef(null);g.useEffect(()=>{var f,m,h,y;r&&gw({t:Date.now(),cpu:((f=r.cpu)==null?void 0:f.percent)??0,ram:((m=r.ram)==null?void 0:m.percent)??0,gpu:((h=r.gpu)==null?void 0:h.busy_percent)??null,disk:((y=r.disk)==null?void 0:y.percent)??null})},[s]),g.useEffect(()=>{if(!o)return;const f=Date.now(),m=o.prompt_tokens,h=o.completion_tokens;if(u.current){const y=Math.max((f-u.current.t)/1e3,.001);vw({t:f,prompt:Math.max(0,(m-u.current.p)/y),completion:Math.max(0,(h-u.current.c)/y)})}u.current={p:m,c:h,t:f}},[a])}function kw(){var oe,ee,me,ke,le,Le;const{data:r,isError:s}=xm(),{data:o,isError:a}=hc(),{data:u}=km(),{data:f}=vl(),m=s||a,h=!!r&&!!o,y=Z=>{var ce;return(ce=o==null?void 0:o.services.find(Ce=>Ce.unit===Z))==null?void 0:ce.ok},k=Z=>!!(o!=null&&o.services.some(ce=>ce.unit===Z)),w=r==null?void 0:r.engine_reachable,x=(oe=r==null?void 0:r.brain)==null?void 0:oe.ready,P=((ee=r==null?void 0:r.brain)==null?void 0:ee.model)||((me=u==null?void 0:u.models.find(Z=>Z.role==="hermes"))==null?void 0:me.name)||"",_=[];m&&_.push({id:"mc2",label:"Steuerpult (MC2)",icon:cl,critical:!0,status:"down",detail:"Die Zentrale antwortet nicht — alle Anzeigen hier können veraltet sein. Läuft die Box? Deploy aktiv?"}),_.push((()=>{const Z={id:"brain",label:"Lucys Hirn",icon:Py,critical:!0};return h?w===!1?{...Z,status:"down",detail:"Die Motor-Maschine (Engine) läuft nicht — Lucy kann gerade gar nicht denken.",repair:{kind:"restart",service:"llama-swap",label:"Motor neu starten",needsSudo:!0}}:x===!1?{...Z,status:"down",detail:"Lucys Hirn ist gerade eingeschlafen — einmal aufwecken.",repair:P?{kind:"loadModel",model:P,label:"Hirn aufwecken"}:void 0}:{...Z,status:"ok",detail:"Wach und ansprechbar."}:{...Z,status:"loading",detail:"Wird geprüft …"}})()),_.push((()=>{const Z={id:"vision",label:"Lucys Augen",icon:jp,critical:!1};if(!h||!u)return{...Z,status:"loading",detail:"Wird geprüft …"};const ce=u.models.find(Ne=>Ne.role==="vision");return ce?(u.running??[]).includes(ce.name)?{...Z,status:"ok",detail:"Sieht gerade zu (geladen, solange Lucy sie nutzt)."}:{...Z,status:"ok",detail:"Augen ruhen — sie laden von selbst, sobald Lucy startet oder ein Bild kommt.",repair:{kind:"loadModel",model:ce.name,label:"Augen wecken"}}:{...Z,status:"warn",detail:"Kein Augen-Modell eingerichtet — Lucy kann keine Bilder ansehen."}})()),_.push((()=>{const Z={id:"memory",label:"Lucys Gedächtnis",icon:Cy,critical:!0},ce=y("hermes-gateway");return!h||ce===void 0?{...Z,status:"loading",detail:"Wird geprüft …"}:ce?{...Z,status:"ok",detail:"Hermes-Natives Gedächtnis aktiv (SQLite & Embeddings)."}:{...Z,status:"down",detail:"Lucy kann sich gerade nichts merken — das Gateway antwortet nicht.",repair:{kind:"restart",service:"hermes-gateway",label:"Gateway neu starten"}}})()),_.push((()=>{const Z={id:"gateway",label:"Verbindung (Gateway)",icon:oc,critical:!0},ce=r?r.gateway_reachable:y("mc2-gateway");if(!h||ce===void 0)return{...Z,status:"loading",detail:"Wird geprüft …"};const Ce=k("mc2-gateway")?"mc2-gateway":"mission-control-2";return ce?{...Z,status:"ok",detail:"Apps und IDEs können Lucy erreichen."}:{...Z,status:"down",detail:"Der Modell-Gateway antwortet nicht — Lucy und die IDEs erreichen kein Modell.",repair:{kind:"restart",service:Ce,label:"Gateway neu starten"}}})()),_.push((()=>{const Z={id:"steward",label:"Wächter (Steward)",icon:lc,critical:!1};return h?k("mc2-steward")?y("mc2-steward")?{...Z,status:"ok",detail:"Wacht über Warm-Set, Dienste und Gedächtnis."}:{...Z,status:"warn",detail:"Der Wächter schläft — niemand meldet gerade Ausfälle oder wärmt Modelle nach.",repair:{kind:"restart",service:"mc2-steward",label:"Wächter neu starten"}}:{...Z,status:"ok",detail:"Auf dieser Installation nicht eingerichtet."}:{...Z,status:"loading",detail:"Wird geprüft …"}})()),_.push((()=>{const Z={id:"agent",label:"Lucys Agent (Hermes)",icon:Ni,critical:!0},ce=y("hermes-gateway");return!h||ce===void 0?{...Z,status:"loading",detail:"Wird geprüft …"}:ce?{...Z,status:"ok",detail:"Lucy ist bereit zu reden und zu handeln."}:{...Z,status:"down",detail:"Lucys Agent ist offline — sie reagiert gerade nicht.",repair:{kind:"restart",service:"hermes-gateway",label:"Agent neu starten"}}})()),_.push((()=>{const Z={id:"voice",label:"Lucys Stimme",icon:Zy,critical:!1},ce=y("voice-service");return!h||ce===void 0?{...Z,status:"loading",detail:"Wird geprüft …"}:ce?{...Z,status:"ok",detail:"Lucy kann hören und sprechen."}:{...Z,status:"warn",detail:"Sprechen ist gerade aus — Tippen geht weiter normal.",repair:{kind:"restart",service:"voice-service",label:"Stimme neu starten"}}})());const D=((ke=f==null?void 0:f.ram)==null?void 0:ke.total)??0,b=((le=f==null?void 0:f.ram)==null?void 0:le.used)??0,R=((Le=f==null?void 0:f.ram)==null?void 0:Le.percent)??(D>0?Math.min(100,b/D*100):0),A=1024**3,I=D?R>=93?{status:"full",usedGb:b/A,totalGb:D/A,pct:R,text:"Speicher fast voll — Lucy könnte langsamer werden."}:R>=85?{status:"warn",usedGb:b/A,totalGb:D/A,pct:R,text:"Speicher gut gefüllt — noch okay."}:{status:"ok",usedGb:b/A,totalGb:D/A,pct:R,text:"Genug Speicher frei."}:{status:"unknown",usedGb:0,totalGb:0,pct:0,text:"Speicher-Auslastung unbekannt."},V=_.some(Z=>Z.status==="loading"),z=_.filter(Z=>Z.critical&&Z.status==="down"),K=_.filter(Z=>Z.status==="warn"||!Z.critical&&Z.status==="down"),G=I.status==="full";return{verdict:V&&!z.length?"loading":z.length?"problem":K.length||G?"warn":"gut",checks:_,memory:I,problems:z,warns:K,unreachable:m}}const bw={ok:"bg-emerald-500",warn:"bg-amber-500",alert:"bg-red-500",muted:"bg-muted-foreground/40",loading:"bg-muted-foreground/40 animate-pulse"},Sw={ok:"hover:border-emerald-500/40",warn:"hover:border-amber-500/50",alert:"hover:border-red-500/50",muted:"hover:border-primary/40",loading:"hover:border-border/60"};function yi({icon:r,title:s,value:o,unit:a,tone:u="muted",hint:f,onClick:m}){return d.jsxs("button",{onClick:m,className:Ee("group relative flex flex-col items-start mc-card p-5 text-left cursor-pointer",Sw[u]),children:[d.jsxs("div",{className:"mb-4 flex w-full items-center justify-between",children:[d.jsx("span",{className:"flex h-10 w-10 items-center justify-center rounded-xl border border-border/40 bg-background/30 text-foreground/80 transition-colors group-hover:text-primary",children:d.jsx(r,{className:"h-5 w-5"})}),d.jsx("span",{className:Ee("h-2.5 w-2.5 rounded-full ring-2 ring-black/40",bw[u]),title:f})]}),d.jsxs("div",{className:"flex items-baseline gap-1.5",children:[d.jsx("span",{className:"text-2xl font-bold tracking-tight text-foreground font-space tabular-nums",children:o}),a&&d.jsx("span",{className:"text-xs font-medium text-muted-foreground",children:a})]}),d.jsxs("div",{className:"mt-1 flex w-full items-center justify-between",children:[d.jsx("span",{className:"text-sm font-semibold text-foreground/90",children:s}),d.jsx(wi,{className:"h-4 w-4 text-muted-foreground/40 transition-all group-hover:translate-x-0.5 group-hover:text-primary"})]}),f&&d.jsx("span",{className:"mt-0.5 text-[11px] text-muted-foreground",children:f})]})}function Ew(){const{data:r,error:s}=vl(),o=yw();return{sys:r,hist:o,error:s}}const Nw=g.lazy(()=>Wt(()=>import("./LiveAreaChartImpl-Bb72EW29.js"),__vite__mapDeps([0,1])));function jm(r){return d.jsx(g.Suspense,{fallback:d.jsx(jw,{height:r.height??176}),children:d.jsx(Nw,{...r})})}function jw({height:r}){return d.jsx("div",{style:{height:r},className:"flex w-full items-end","aria-hidden":"true",children:d.jsx("div",{className:"h-px w-full bg-border/40"})})}const Cm={"1h":60,"24h":1440},Gh={live:"Live","1h":"1 h","24h":"24 h"};function _m({value:r,onChange:s}){return d.jsx("div",{className:"flex rounded-lg border border-border/40 bg-background/30 p-0.5",children:Object.keys(Gh).map(o=>d.jsx("button",{onClick:()=>s(o),className:Ee("rounded-md px-2 py-0.5 text-[9px] font-bold uppercase tracking-wide transition-all cursor-pointer",r===o?"bg-primary text-primary-foreground":"text-muted-foreground hover:text-foreground"),children:Gh[o]},o))})}const Cw=[{key:"cpu",label:"CPU",color:"#2dd4bf"},{key:"ram",label:"RAM",color:"#38bdf8"},{key:"gpu",label:"GPU",color:"#a78bfa"},{key:"disk",label:"Disk",color:"#fbbf24"}];function _w(){var w,x,P,_;const{sys:r,hist:s}=Ew(),[o,a]=g.useState("live"),u=wm(o==="live"?60:Cm[o],o!=="live"),f=g.useMemo(()=>{var D;return o==="live"?s:(((D=u.data)==null?void 0:D.points)??[]).map(b=>({t:b.t*1e3,cpu:b.cpu,ram:b.ram,gpu:b.gpu,disk:b.disk}))},[o,s,u.data]),m=!!(r!=null&&r.gpu&&r.gpu.busy_percent!=null&&r.gpu.gtt_used!=null&&r.gpu.gtt_total!=null),h=Cw.filter(D=>D.key!=="gpu"||m),y={cpu:(w=r==null?void 0:r.cpu)==null?void 0:w.percent,ram:(x=r==null?void 0:r.ram)==null?void 0:x.percent,gpu:m?r.gpu.busy_percent:null,disk:(P=r==null?void 0:r.disk)==null?void 0:P.percent},k={cpu:(_=r==null?void 0:r.cpu)!=null&&_.cores?`${r.cpu.cores} Cores`:"",ram:r?`${ts(r.ram.used)}/${ts(r.ram.total)} GB`:"",gpu:m?`${ts(r.gpu.gtt_used)}/${ts(r.gpu.gtt_total)} GB`:"",disk:r!=null&&r.disk?`${ts(r.disk.used)}/${ts(r.disk.total)} GB`:""};return d.jsxs("div",{className:"flex flex-col justify-between mc-card p-5",children:[d.jsxs("div",{children:[d.jsxs("div",{className:"mb-3 flex items-center gap-2",children:[d.jsx(Np,{className:"h-4.5 w-4.5 text-primary"}),d.jsx("h2",{className:"text-sm font-semibold uppercase tracking-wide text-foreground",children:"System-Status"}),o==="live"&&d.jsxs("span",{className:"ml-1 inline-flex items-center gap-1 text-[10px] font-medium text-muted-foreground/70",children:[d.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-emerald-500 animate-pulse"})," live"]}),d.jsx("div",{className:"ml-auto",children:d.jsx(_m,{value:o,onChange:a})})]}),r?d.jsxs(d.Fragment,{children:[d.jsx("div",{className:"mb-2 grid grid-cols-2 gap-x-4 gap-y-1.5",children:h.map(D=>d.jsxs("div",{className:"flex min-w-0 items-center gap-1.5",children:[d.jsx("span",{className:"h-2 w-2 shrink-0 rounded-full",style:{background:D.color}}),d.jsx("span",{className:"shrink-0 text-[11px] font-semibold uppercase tracking-wider text-muted-foreground",children:D.label}),d.jsxs("span",{className:"shrink-0 font-mono text-xs font-bold tabular-nums text-foreground",children:[Math.round(y[D.key]??0),"%"]}),k[D.key]&&d.jsx("span",{className:"truncate font-mono text-[10px] text-muted-foreground/60",children:k[D.key]})]},D.key))}),o!=="live"&&f.length===0&&d.jsx("div",{className:"flex h-44 items-center justify-center text-xs text-muted-foreground",children:u.isLoading?"Verlauf wird geladen …":"Noch kein Verlauf — der Sammler baut die Historie gerade erst auf."}),(o==="live"||f.length>0)&&d.jsx(jm,{data:f,series:h,unit:"%",yMode:"percent",height:176,showTime:!0})]}):d.jsx("div",{className:"flex h-44 items-center justify-center text-xs text-muted-foreground",children:"Lade Systemdaten…"})]}),(r==null?void 0:r.temp)&&(r.temp.cpu||r.temp.gpu)&&d.jsxs("div",{className:"mt-3 flex gap-4 border-t border-border/30 pt-3 font-mono text-xs text-muted-foreground/80",children:[r.temp.cpu!=null&&d.jsxs("span",{children:["CPU Temp: ",r.temp.cpu," °C"]}),r.temp.gpu!=null&&d.jsxs("span",{children:["GPU Temp: ",r.temp.gpu," °C"]})]})]})}const Ss=[{key:"stt_ms",label:"STT",color:"#f59e0b"},{key:"vision_ms",label:"Sehen",color:"#a78bfa"},{key:"hirn_ms",label:"Hirn",color:"#2dd4bf"},{key:"gen_ms",label:"Antwort",color:"#60a5fa"}],ki=r=>r==null?"–":`${(r/1e3).toLocaleString("de-DE",{minimumFractionDigits:1,maximumFractionDigits:1})} s`;function Pw(r){const s=Math.max(0,Date.now()/1e3-r);return s<60?`vor ${Math.round(s)} s`:s<3600?`vor ${Math.round(s/60)} min`:`vor ${Math.round(s/3600)} h`}function Zu(r){return Ss.reduce((s,o)=>s+(r[o.key]??0),0)}function Rw(r){let s=null;for(const o of Ss){const a=r[o.key];a!=null&&(s==null||a>s.ms)&&(s={label:o.label,color:o.color,ms:a})}return s}function Mw({t:r,scale:s}){const o=Ss.map(a=>`${a.label} ${ki(r[a.key])}`).join(" · ");return d.jsxs("div",{className:"flex items-center gap-2.5",children:[d.jsx("span",{className:"w-14 shrink-0 text-right font-mono text-[10px] text-muted-foreground/60",children:Pw(r.ts)}),d.jsxs("div",{className:"relative h-4 flex-1 overflow-hidden rounded-sm bg-muted/25",title:o,children:[d.jsx("div",{className:"absolute inset-0 flex",children:Ss.map(a=>{const u=r[a.key];return!u||u<=0?null:d.jsx("div",{style:{width:`${u/s*100}%`,background:a.color},className:"h-full first:rounded-l-sm"},a.key)})}),r.error&&d.jsx("div",{className:"absolute inset-0 flex items-center justify-center bg-rose-500/15 text-[10px] font-semibold text-rose-300",children:"Fehler"})]}),d.jsx("span",{className:"w-12 shrink-0 text-right font-mono text-[11px] font-semibold tabular-nums text-foreground",children:r.error?"–":ki(Zu(r))})]})}function Ow(){const{data:r}=rw(12),s=r??[],o=Math.max(1,...s.map(f=>Zu(f))),a=s[0],u=a?Rw(a):null;return d.jsxs("div",{className:"mc-card p-5",children:[d.jsxs("div",{className:"mb-3 flex items-start justify-between gap-3",children:[d.jsxs("div",{children:[d.jsxs("div",{className:"flex items-center gap-2",children:[d.jsx(Uy,{className:"h-4.5 w-4.5 text-primary"}),d.jsx("h2",{className:"text-sm font-semibold uppercase tracking-wide text-foreground",children:"Latenz je Turn"}),d.jsxs("span",{className:"ml-1 inline-flex items-center gap-1 text-[10px] font-medium text-muted-foreground/70",children:[d.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-emerald-500 animate-pulse"})," live"]})]}),a?d.jsxs("div",{className:"mt-2 flex items-baseline gap-2",children:[d.jsx("span",{className:`font-space text-3xl font-bold tracking-tight tabular-nums ${a.error?"text-rose-400":"text-foreground"}`,children:a.error?"Fehler":ki(Zu(a))}),d.jsxs("span",{className:"text-xs text-muted-foreground",children:["letzter Turn",!a.error&&u&&d.jsxs(d.Fragment,{children:[" · Täter: ",d.jsx("span",{style:{color:u.color},className:"font-semibold",children:u.label})," ",ki(u.ms)]})]})]}):d.jsx("div",{className:"mt-2 text-xs text-muted-foreground",children:"Noch kein Voice-Turn aufgezeichnet."}),a&&!a.error&&d.jsx("div",{className:"mt-0.5 font-mono text-[11px] text-muted-foreground/70",children:Ss.filter(f=>a[f.key]!=null).map(f=>`${f.label} ${ki(a[f.key])}`).join(" · ")})]}),d.jsx("div",{className:"flex shrink-0 flex-col items-end gap-1 pt-1",children:Ss.map(f=>d.jsxs("div",{className:"flex items-center gap-1.5",children:[d.jsx("span",{className:"h-2 w-2 rounded-full",style:{background:f.color}}),d.jsx("span",{className:"text-[11px] font-semibold uppercase tracking-wider text-muted-foreground",children:f.label})]},f.key))})]}),s.length>0?d.jsx("div",{className:"space-y-1.5",children:s.map(f=>d.jsx(Mw,{t:f,scale:o},f.id))}):d.jsx("div",{className:"flex h-[120px] items-center justify-center px-6 text-center text-xs text-muted-foreground",children:"Sprich einmal mit Lucy — dann erscheint hier der Zeit-Wasserfall pro Turn, damit man den einen Hänger sofort sieht."}),d.jsx("div",{className:"mt-3 border-t border-border/30 pt-2 text-[10px] leading-relaxed text-muted-foreground/70",children:'„Hirn" = Zeit bis zum ersten Wort (Agent + Gedächtnis-Suche + Modell); Tool-Runden stecken in „Antwort". Reine Telegram-Turns laufen an MC2 vorbei und erscheinen hier nicht.'})]})}const Zh=[{key:"prompt",label:"Prompt",color:"#f59e0b"},{key:"completion",label:"Antwort",color:"#2dd4bf"}];function Tw(){const{data:r}=bm(),s=xw(),[o,a]=g.useState("live"),u=wm(o==="live"?60:Cm[o],o!=="live"),f=g.useMemo(()=>{var w;if(o==="live")return s;const y=((w=u.data)==null?void 0:w.points)??[],k=[];for(let x=1;xd.jsxs("div",{className:"flex items-center gap-1.5",children:[d.jsx("span",{className:"h-2 w-2 rounded-full",style:{background:y.color}}),d.jsx("span",{className:"text-[11px] font-semibold uppercase tracking-wider text-muted-foreground",children:y.label}),d.jsx("span",{className:"font-mono text-xs font-bold tabular-nums text-foreground",children:Math.round((m==null?void 0:m[y.key])??0)})]},y.key))})]})]}),o!=="live"&&f.length===0?d.jsx("div",{className:"flex h-[150px] items-center justify-center text-xs text-muted-foreground",children:u.isLoading?"Verlauf wird geladen …":"Noch kein Verlauf — der Sammler baut die Historie gerade erst auf."}):r?d.jsx(jm,{data:f,series:Zh,unit:" tok/s",yMode:"auto",height:150,showTime:!0}):d.jsx("div",{className:"flex h-[150px] items-center justify-center text-xs text-muted-foreground",children:"Lade Durchsatz…"}),d.jsx("div",{className:"mt-2 border-t border-border/30 pt-2 text-[10px] text-muted-foreground/70",children:"Durchsatz aus dem Gateway abgeleitet (Prefill vs. Generierung). Flach bei Leerlauf."})]})}const al=r=>window.dispatchEvent(new CustomEvent("open-system-drawer",{detail:{tab:r}}));function Lw({onNavigate:r}){var Z,ce,Ce,Ne;const{data:s}=km(),{data:o}=hc(),{data:a}=Sm(),{data:u}=iw(),{data:f}=ow(),{data:m}=ew(),{data:h}=tw(),y=kw(),{showAlert:k,dialogElement:w}=ym(),x=ul(),[P,_]=g.useState({});async function D(F,ne){_(Q=>({...Q,[F]:!0}));try{if(ne.kind==="loadModel")await Se(`/api/models/${encodeURIComponent(ne.model)}/load`,{method:"POST"});else{const Q=await Se("/api/maintenance/restart",{method:"POST",body:JSON.stringify({service:ne.service})});Q.ok||k("Reparatur nicht ganz geklappt",(Q.err||"Unbekannter Fehler")+(ne.needsSudo?` + +Tipp: Dafür wird evtl. das Box-Passwort gebraucht (oben rechts hinterlegen).`:""))}x.invalidateQueries({queryKey:Pe.health}),x.invalidateQueries({queryKey:Pe.services}),x.invalidateQueries({queryKey:Pe.models})}catch(Q){k("Reparatur fehlgeschlagen",String((Q==null?void 0:Q.message)||Q))}finally{_(Q=>({...Q,[F]:!1}))}}const b=((Z=s==null?void 0:s.running)==null?void 0:Z.length)??0,R=(o==null?void 0:o.services.filter(F=>F.ok).length)??0,A=(o==null?void 0:o.services.length)??0,I=A-R,V=(a?(a.os>0?1:0)+(a.engine>0?1:0)+(a.swap>0?1:0)+(a.models>0?1:0):0)+(((ce=a==null?void 0:a.components)==null?void 0:ce.filter(F=>F.update===!0).length)??0),z=m!=null&&m.available?m.open_count:0,K=h!=null&&h.available?h.items.filter(F=>F.status==="blocked").length:0,G=f?[f.gateway,f.memory,f.desktop_gateway]:[],ue=G.filter(F=>F==null?void 0:F.ok).length,oe=f?f.gateway.ok?f.memory.ok?f.desktop_gateway.ok?"":"Desktop-Gateway":"Gedächtnis-Leitung":"Modell-Leitung":"",ee=(Ce=s==null?void 0:s.models)==null?void 0:Ce.find(F=>F.role==="hermes"),me=ee!=null&&ee.name?(Ne=ee.name.split("/").pop())==null?void 0:Ne.replace(/\.gguf$/i,""):"",ke=o==null?void 0:o.services.filter(F=>!F.ok).map(F=>F.name).join(", "),le=a?[a.os>0&&"OS",a.engine>0&&"Engine",a.swap>0&&"Swap",a.models>0&&"Modelle"].filter(Boolean):[],Le=le.length>0?le.join(" + "):"";return d.jsxs("div",{className:"space-y-6",children:[d.jsxs("div",{children:[d.jsx("h1",{className:"bg-gradient-to-r from-foreground via-foreground to-primary bg-clip-text font-space text-2xl font-bold tracking-tight text-transparent",children:"Cockpit"}),d.jsx("p",{className:"text-sm text-muted-foreground",children:"Deine Box auf einen Blick — Details hinter jeder Kachel."})]}),d.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-3 gap-6 items-start",children:[d.jsxs("div",{className:"lg:col-span-2 space-y-6",children:[d.jsx(Dw,{verdict:y.verdict,memory:y.memory,warns:y.warns,problems:y.problems}),d.jsxs("section",{children:[d.jsx(Nu,{children:"Leistung"}),d.jsx("div",{className:"grid gap-4 md:grid-cols-1",children:d.jsx(_w,{})}),d.jsx("div",{className:"mt-4",children:d.jsx(Ow,{})}),d.jsx("div",{className:"mt-4",children:d.jsx(Tw,{})})]}),d.jsxs("section",{children:[d.jsx(Nu,{children:"Bereiche"}),d.jsxs("div",{className:"grid gap-4 grid-cols-2 md:grid-cols-3",children:[d.jsx(yi,{icon:ic,title:"Auftragsbuch",value:m!=null&&m.available?z:"—",unit:z===1?"Vorschlag":"Vorschläge",tone:m?K>0||z>0?"warn":"ok":"loading",hint:K>0?`${K} Karte${K===1?"":"n"} wartet auf deine Antwort`:z>0?`${z} offene Patches`:"Keine ausstehenden Vorschläge",onClick:()=>r("auftraege")}),d.jsx(yi,{icon:Sp,title:"Modelle",value:b,unit:"warm",tone:b>0?"ok":"muted",hint:me?`Hirn: ${me}`:"Kein Hermes-Modell geladen",onClick:()=>r("models")}),d.jsx(yi,{icon:cl,title:"Dienste",value:o?`${R}/${A}`:"…",unit:"laufen",tone:o?I>0?"warn":"ok":"loading",hint:ke?`Ausfall: ${ke}`:"Alle Dienste online",onClick:()=>al("maintenance")}),d.jsx(yi,{icon:lc,title:"Updates",value:a?V>0?V:"0":"…",unit:V>0?"bereit":"aktuell",tone:a?V>0?"warn":"ok":"loading",hint:V>0?`Verfügbar: ${Le}`:"Alles auf dem neuesten Stand",onClick:()=>al("maintenance")}),d.jsx(yi,{icon:oc,title:"Verbinden",value:f?`${ue}/${G.length}`:"…",unit:"Leitungen",tone:f?ue===G.length?"ok":"warn":"loading",hint:oe?`Gestört: ${oe}`:"Hermes Desktop & IDEs bereit",onClick:()=>r("connect")})]})]})]}),d.jsxs("div",{className:"space-y-6",children:[d.jsx(Aw,{problems:y.problems,pendingCount:V,openAuftraege:z,blockedIdeen:K,busy:P,onRepair:D,onNavigate:r}),d.jsxs("section",{children:[d.jsx(Nu,{children:"Werkzeuge & Diagnose"}),d.jsx(zw,{agent:u,svcErrors:I,onNavigate:r})]})]})]}),w]})}function Nu({children:r}){return d.jsx("p",{className:"mb-2 ml-0.5 text-[11px] font-semibold uppercase tracking-wider text-muted-foreground/60",children:r})}function Dw({verdict:r,memory:s,warns:o,problems:a}){const u=o.length?`${o[0].label}: ${o[0].detail}${o.length>1?` (+${o.length-1} weitere)`:""}`:s.status==="full"?s.text:"Nichts Schlimmes — nur ein Hinweis.",f=a.length?`${a[0].label}: ${a[0].detail}${a.length>1?` (+${a.length-1} weitere)`:""}`:"Ein wichtiger Dienst hakt.",m={loading:{ring:"border-border/60 bg-card/45",icon:ji,iconCls:"text-muted-foreground animate-spin",title:"Box wird geprüft …",sub:"Einen Moment."},gut:{ring:"border-emerald-500/40 bg-emerald-500/5",icon:Vy,iconCls:"text-emerald-400",title:"Box gesund",sub:"Alle wichtigen Dienste laufen."},warn:{ring:"border-amber-500/40 bg-amber-500/5",icon:Ci,iconCls:"text-amber-400",title:"Kleinigkeit an der Box",sub:u},problem:{ring:"border-red-500/50 bg-red-500/5",icon:Ci,iconCls:"text-red-400",title:"Box braucht Hilfe",sub:f}}[r],h=m.icon,y={ok:"text-emerald-400",warn:"text-amber-400",full:"text-red-400",unknown:"text-muted-foreground"}[s.status],k={ok:"bg-emerald-500",warn:"bg-amber-500",full:"bg-red-500",unknown:"bg-muted-foreground/40"}[s.status];return d.jsxs("div",{className:Ee("flex flex-col gap-4 rounded-2xl border p-5 shadow-lg shadow-black/15 backdrop-blur-md transition-colors sm:flex-row sm:items-center sm:justify-between h-full",m.ring),children:[d.jsxs("div",{className:"flex items-center gap-3",children:[d.jsx("div",{className:"flex h-11 w-11 shrink-0 items-center justify-center rounded-xl border border-border/40 bg-background/30",children:d.jsx(h,{className:Ee("h-6 w-6",m.iconCls)})}),d.jsxs("div",{className:"min-w-0",children:[d.jsx("h2",{className:"text-base font-bold tracking-tight text-foreground",children:m.title}),d.jsx("p",{className:"text-xs text-muted-foreground",children:m.sub})]})]}),d.jsxs("div",{className:"w-full max-w-[16rem] rounded-xl border border-border/30 bg-background/20 p-3",children:[d.jsxs("div",{className:"mb-1.5 flex items-center justify-between text-[11px]",children:[d.jsxs("span",{className:"flex items-center gap-1.5 font-semibold uppercase tracking-wider text-muted-foreground",children:[d.jsx(By,{className:"h-3.5 w-3.5"})," Speicher"]}),d.jsx("span",{className:Ee("font-mono font-bold",y),children:s.status==="unknown"?"—":`${s.usedGb.toFixed(1)} / ${s.totalGb.toFixed(1)} GB`})]}),d.jsx("div",{className:"h-2 w-full overflow-hidden rounded-full border border-border/30 bg-background/50",children:d.jsx("div",{className:Ee("h-full rounded-full transition-all duration-500",k),style:{width:`${s.pct}%`}})})]})]})}function Aw({problems:r,pendingCount:s,openAuftraege:o,blockedIdeen:a,busy:u,onRepair:f,onNavigate:m}){const h=s>0,y=o>0,k=a>0,w=r.length===0&&!h&&!y&&!k;return d.jsx("div",{className:"h-full flex flex-col justify-between",children:w?d.jsxs("div",{className:"flex items-center gap-3 rounded-2xl border border-emerald-500/25 bg-emerald-500/5 p-4 h-full",children:[d.jsx(My,{className:"h-5 w-5 shrink-0 text-emerald-400"}),d.jsxs("div",{children:[d.jsx("p",{className:"text-sm font-semibold text-foreground",children:"Nichts zu tun"}),d.jsx("p",{className:"text-xs text-muted-foreground",children:"Alles läuft. Du musst gerade nichts abnicken."})]})]}):d.jsxs("div",{className:"space-y-2 h-full flex flex-col justify-center",children:[r.map(x=>d.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center justify-between gap-3 rounded-2xl border border-red-500/25 bg-red-500/5 p-4",children:[d.jsxs("div",{className:"flex min-w-0 items-center gap-3 w-full",children:[d.jsx("span",{className:"flex h-9 w-9 shrink-0 items-center justify-center rounded-lg border border-red-500/30 bg-background/30 text-red-300",children:d.jsx(x.icon,{className:"h-4.5 w-4.5"})}),d.jsxs("div",{className:"min-w-0 flex-1",children:[d.jsx("p",{className:"text-sm font-bold text-foreground",children:x.label}),d.jsx("p",{className:"truncate text-xs text-muted-foreground",children:x.detail})]})]}),x.repair&&d.jsxs("button",{onClick:()=>x.repair&&f(x.id,x.repair),disabled:!!u[x.id],className:"flex h-9 shrink-0 items-center gap-1.5 rounded-lg border border-red-500/40 bg-red-500/10 px-3 text-[11px] font-bold uppercase tracking-wide text-red-300 transition-all hover:bg-red-500/20 cursor-pointer disabled:opacity-60 w-full sm:w-auto justify-center",children:[u[x.id]?d.jsx(ji,{className:"h-3.5 w-3.5 animate-spin"}):d.jsx(r0,{className:"h-3.5 w-3.5"}),x.repair.label]})]},x.id)),k&&d.jsxs("button",{onClick:()=>m("auftraege"),className:"flex w-full items-center justify-between gap-3 rounded-2xl border border-red-500/30 bg-red-500/5 p-4 text-left transition-all hover:bg-red-500/10 cursor-pointer",children:[d.jsxs("div",{className:"flex items-center gap-3",children:[d.jsx("span",{className:"flex h-9 w-9 shrink-0 items-center justify-center rounded-lg border border-red-500/30 bg-background/30 text-red-300",children:d.jsx(Ep,{className:"h-4.5 w-4.5"})}),d.jsxs("div",{children:[d.jsxs("p",{className:"text-sm font-bold text-foreground",children:[a," Karte",a===1?"":"n"," braucht deine Antwort"]}),d.jsx("p",{className:"text-xs text-muted-foreground",children:"Die Box hängt an einer Frage und wartet auf dich."})]})]}),d.jsx(wi,{className:"h-4 w-4 shrink-0 text-red-300/70"})]}),y&&d.jsxs("button",{onClick:()=>m("auftraege"),className:"flex w-full items-center justify-between gap-3 rounded-2xl border border-primary/30 bg-primary/5 p-4 text-left transition-all hover:bg-primary/10 cursor-pointer",children:[d.jsxs("div",{className:"flex items-center gap-3",children:[d.jsx("span",{className:"flex h-9 w-9 shrink-0 items-center justify-center rounded-lg border border-primary/30 bg-background/30 text-primary",children:d.jsx(ic,{className:"h-4.5 w-4.5"})}),d.jsxs("div",{children:[d.jsxs("p",{className:"text-sm font-bold text-foreground",children:[o," Vorschl",o===1?"ag":"äge"," im Auftragsbuch"]}),d.jsx("p",{className:"text-xs text-muted-foreground",children:"Annehmen oder ablehnen."})]})]}),d.jsx(wi,{className:"h-4 w-4 shrink-0 text-primary/70"})]}),h&&d.jsxs("button",{onClick:()=>al("maintenance"),className:"flex w-full items-center justify-between gap-3 rounded-2xl border border-amber-500/30 bg-amber-500/5 p-4 text-left transition-all hover:bg-amber-500/10 cursor-pointer",children:[d.jsxs("div",{className:"flex items-center gap-3",children:[d.jsx("span",{className:"flex h-9 w-9 shrink-0 items-center justify-center rounded-lg border border-amber-500/30 bg-background/30 text-amber-300",children:d.jsx(lc,{className:"h-4.5 w-4.5"})}),d.jsxs("div",{children:[d.jsxs("p",{className:"text-sm font-bold text-foreground",children:[s," Update",s===1?"":"s"," bereit"]}),d.jsx("p",{className:"text-xs text-muted-foreground",children:"Ansehen und entscheiden."})]})]}),d.jsx(wi,{className:"h-4 w-4 shrink-0 text-amber-300/70"})]})]})})}function zw({agent:r,svcErrors:s,onNavigate:o}){const a=[{label:"Hermes Agent",status:r?r.gateway_reachable?"Bereit":"Offline":"…",tone:r?r.gateway_reachable?"ok":"alert":"loading",action:()=>o("agent")},{label:"Konsole (Box-Shell)",status:r?r.box_console_reachable?"Bereit":"Offline":"…",tone:r?r.box_console_reachable?"ok":"warn":"loading",action:()=>o("konsole")},{label:"Systemlogs & Diagnose",status:s>0?`${s} Fehler`:"Keine Fehler",tone:s>0?"alert":"ok",action:()=>al("logs")},{label:"Wissens-Vault",status:"Öffnen",tone:"muted",action:()=>o("wissen")},{label:"Chronik & Zeitmaschine",status:"Öffnen",tone:"muted",action:()=>o("chronik")}];return d.jsx("div",{className:"rounded-2xl border border-border/60 bg-card/30 p-4 space-y-3 shadow-sm",children:d.jsx("div",{className:"divide-y divide-border/20",children:a.map((u,f)=>{const m={loading:"bg-muted-foreground/45 animate-pulse",ok:"bg-emerald-500 shadow-[0_0_8px_rgba(16,185,129,0.4)]",warn:"bg-amber-500 shadow-[0_0_8px_rgba(245,158,11,0.4)]",alert:"bg-red-500 shadow-[0_0_8px_rgba(239,68,68,0.4)]",muted:"bg-muted-foreground/30"}[u.tone];return d.jsxs("button",{onClick:u.action,className:"w-full py-2.5 px-1.5 flex items-center justify-between text-left hover:bg-card/45 rounded-lg transition-all group cursor-pointer text-xs",children:[d.jsx("span",{className:"text-muted-foreground group-hover:text-foreground transition-colors font-medium",children:u.label}),d.jsxs("div",{className:"flex items-center gap-2",children:[d.jsx("span",{className:Ee("text-[10px] font-semibold font-mono",u.tone==="ok"?"text-emerald-400":u.tone==="warn"?"text-amber-400":u.tone==="alert"?"text-red-400":"text-muted-foreground/60"),children:u.status}),d.jsx("span",{className:Ee("h-1.5 w-1.5 rounded-full",m)})]})]},f)})})})}const Fw=g.lazy(()=>Wt(()=>import("./ModelsView-BYDzvdzC.js"),__vite__mapDeps([2,3,4,5,6,7,8])).then(r=>({default:r.ModelsView}))),Iw=g.lazy(()=>Wt(()=>import("./ConnectView-Cz-npKrg.js"),__vite__mapDeps([9,7])).then(r=>({default:r.ConnectView}))),Uw=g.lazy(()=>Wt(()=>import("./AgentView-BgTBq7Qa.js"),[]).then(r=>({default:r.AgentView}))),$w=g.lazy(()=>Wt(()=>import("./KonsoleView-pXiZKOZ7.js"),[]).then(r=>({default:r.KonsoleView}))),Bw=g.lazy(()=>Wt(()=>import("./GuideView-CP1Y1rbp.js"),__vite__mapDeps([10,6,8])).then(r=>({default:r.GuideView}))),Vw=g.lazy(()=>Wt(()=>import("./AuftragsbuchView-C0bzCKZ0.js"),__vite__mapDeps([11,12,7])).then(r=>({default:r.AuftragsbuchView}))),Hw=g.lazy(()=>Wt(()=>import("./IdeenView-wVxyfCCm.js"),__vite__mapDeps([13,12,4,8,7,5])).then(r=>({default:r.IdeenView}))),Ww=g.lazy(()=>Wt(()=>import("./SkillsView-C5MWeKc5.js"),__vite__mapDeps([14,3])).then(r=>({default:r.SkillsView}))),Qw=g.lazy(()=>Wt(()=>import("./ChronikView-Bz_yVFvS.js"),__vite__mapDeps([15,5])).then(r=>({default:r.ChronikView}))),Kw=g.lazy(()=>Wt(()=>import("./WissenView-DOJLqZxA.js"),__vite__mapDeps([16,1])).then(r=>({default:r.WissenView})));function qw(){return d.jsx("div",{className:"flex h-64 items-center justify-center text-muted-foreground",children:d.jsx(ji,{className:"h-5 w-5 animate-spin","aria-label":"Lädt …"})})}const Gw=/Mac|iPhone|iPad/.test(navigator.platform);function Zw(){ww(),J1();const[r,s]=g.useState(()=>{const b=window.location.hash.slice(1);return is.some(R=>R.id===b)?b:"dashboard"}),o=g.useCallback(b=>{window.location.hash.slice(1)===b?s(b):window.location.hash=b},[]),[a,u]=g.useState(()=>localStorage.getItem("mc_sidebar_collapsed")==="true"),[f,m]=g.useState(!1),[h,y]=g.useState(!1),[k,w]=g.useState("maintenance"),{data:x,isError:P}=xm(),{data:_}=vl();g.useEffect(()=>{document.documentElement.classList.add("dark")},[]),g.useEffect(()=>{const b=R=>{var I;w(((I=R.detail)==null?void 0:I.tab)||"maintenance"),y(!0)};return window.addEventListener("open-system-drawer",b),()=>window.removeEventListener("open-system-drawer",b)},[]),g.useEffect(()=>{const b=R=>{var I;const A=(I=R.detail)==null?void 0:I.view;A&&o(A)};return window.addEventListener("mc-navigate",b),()=>window.removeEventListener("mc-navigate",b)},[o]),g.useEffect(()=>{const b=()=>{const R=window.location.hash.slice(1);is.some(A=>A.id===R)&&s(R)};return window.addEventListener("hashchange",b),()=>window.removeEventListener("hashchange",b)},[]),g.useEffect(()=>{m(!1)},[r]);const D=is.find(b=>b.id===r);return d.jsxs("div",{className:"flex h-full relative",children:[d.jsx("div",{className:"fixed inset-0 -z-50 pointer-events-none",style:{backgroundColor:"hsl(224,30%,6%)",backgroundImage:["radial-gradient(45% 40% at 12% 8%, hsl(172 72% 50% / 0.10), transparent 70%)","radial-gradient(50% 45% at 88% 92%, hsl(270 70% 60% / 0.10), transparent 70%)","radial-gradient(40% 35% at 75% 30%, hsl(239 70% 62% / 0.07), transparent 70%)"].join(", ")}}),d.jsx(d1,{onNavigate:o}),d.jsx(mw,{open:h,onClose:()=>y(!1),defaultTab:k}),d.jsx("aside",{className:Ee("hidden md:flex shrink-0 flex-col border-r border-border/40 bg-card/45 backdrop-blur-md transition-all duration-300 ease-in-out",a?"w-16":"w-60"),children:d.jsx(Yh,{collapsed:a,onToggleCollapse:()=>{u(b=>{const R=!b;return localStorage.setItem("mc_sidebar_collapsed",R.toString()),R})},view:r,health:x,backendDown:P,sysStatus:_})}),d.jsxs("div",{className:Ee("md:hidden fixed inset-0 z-50 transition-opacity duration-200",f?"opacity-100":"pointer-events-none opacity-0"),"aria-hidden":!f,children:[d.jsx("div",{className:"absolute inset-0 bg-black/60",onClick:()=>m(!1)}),d.jsx("aside",{className:Ee("absolute inset-y-0 left-0 flex w-72 max-w-[85vw] flex-col border-r border-border/40 bg-[hsl(224,28%,8%)] transition-transform duration-300 ease-in-out",f?"translate-x-0":"-translate-x-full"),children:d.jsx(Yh,{collapsed:!1,onClose:()=>m(!1),view:r,health:x,backendDown:P,sysStatus:_})})]}),d.jsxs("div",{className:"flex min-w-0 flex-1 flex-col",children:[d.jsxs("header",{className:"flex h-14 shrink-0 items-center justify-between gap-3 border-b border-border/40 px-4 md:px-6 bg-card/20 backdrop-blur-sm",children:[d.jsxs("div",{className:"flex min-w-0 items-center gap-3",children:[d.jsx("button",{onClick:()=>m(!0),className:"md:hidden p-1.5 -ml-1 rounded-md hover:bg-accent text-muted-foreground transition-colors cursor-pointer","aria-label":"Navigation öffnen",children:d.jsx(Gy,{className:"h-5 w-5","aria-hidden":"true"})}),d.jsx("div",{className:"truncate text-xs font-medium text-muted-foreground tracking-wide uppercase font-sans",children:D.hint})]}),d.jsxs("div",{className:"flex shrink-0 items-center gap-2",children:[d.jsx(q1,{}),d.jsx("a",{href:"https://git.tobisniceshomelab.ddnsfree.com/Hitonabi/mission-control-v2/src/branch/main/docs/BEDIENUNG.md",target:"_blank",rel:"noopener",className:"hidden sm:flex h-8 items-center rounded-md border border-border/40 bg-background/40 px-2.5 text-xs text-muted-foreground hover:bg-accent hover:text-accent-foreground transition-all cursor-pointer font-semibold",title:"Bedien-Anleitung",children:"Hilfe"}),d.jsxs("button",{onClick:()=>{const b=new KeyboardEvent("keydown",{key:"k",metaKey:!0});document.dispatchEvent(b)},className:"flex items-center gap-2 rounded-md border border-border/40 bg-background/40 px-2.5 py-1.5 text-xs text-muted-foreground hover:bg-accent hover:text-accent-foreground transition-all cursor-pointer",children:[d.jsx(Ay,{className:"h-3.5 w-3.5"}),d.jsx("span",{className:"hidden sm:inline",children:"Suchen"}),d.jsx("kbd",{className:"hidden sm:inline rounded bg-muted px-1.5 py-0.5 font-mono text-[9px]",children:Gw?"⌘K":"Strg+K"})]})]})]}),d.jsx("main",{className:"flex-1 overflow-y-auto p-4 md:p-6 scrollbar-thin",children:d.jsxs(g.Suspense,{fallback:d.jsx(qw,{}),children:[r==="dashboard"&&d.jsx(Lw,{onNavigate:b=>o(b)}),r==="ideen"&&d.jsx(Hw,{}),r==="auftraege"&&d.jsx(Vw,{}),r==="skills"&&d.jsx(Ww,{}),r==="models"&&d.jsx(Fw,{}),r==="connect"&&d.jsx(Iw,{}),r==="wissen"&&d.jsx(Kw,{}),r==="chronik"&&d.jsx(Qw,{}),r==="agent"&&d.jsx(Uw,{}),r==="konsole"&&d.jsx($w,{}),r==="guide"&&d.jsx(Bw,{})]})})]})]})}function Yh({collapsed:r,onToggleCollapse:s,onClose:o,view:a,health:u,backendDown:f,sysStatus:m}){var h,y,k,w,x;return d.jsxs(d.Fragment,{children:[d.jsxs("div",{className:Ee("flex items-center py-4 border-b border-border/40 shrink-0",r?"flex-col gap-3 px-2":"justify-between px-5"),children:[d.jsxs("div",{className:"flex items-center gap-2 overflow-hidden",children:[d.jsx("div",{className:"h-7 w-7 rounded-lg bg-primary shadow-md shadow-primary/20 shrink-0"}),!r&&d.jsxs("div",{className:"leading-tight",children:[d.jsx("div",{className:"text-sm font-semibold tracking-wide font-space",children:"Mission Control"}),d.jsx("div",{className:"text-xs text-muted-foreground",children:"2.0"})]})]}),s&&d.jsx("button",{onClick:s,className:"p-1 rounded-md hover:bg-accent text-muted-foreground transition-colors cursor-pointer","aria-label":r?"Seitenleiste ausklappen":"Seitenleiste einklappen",title:r?"Maximieren":"Minimieren",children:r?d.jsx(wi,{className:"h-4 w-4","aria-hidden":"true"}):d.jsx(Oy,{className:"h-4 w-4","aria-hidden":"true"})}),o&&d.jsx("button",{onClick:o,className:"p-1 rounded-md hover:bg-accent text-muted-foreground transition-colors cursor-pointer","aria-label":"Navigation schließen",children:d.jsx(dl,{className:"h-4 w-4","aria-hidden":"true"})})]}),d.jsx("nav",{className:"flex-1 space-y-1 px-3 py-4 overflow-y-auto",children:(()=>{let P=null;return is.map(_=>{const D=_.group!==P;return P=_.group,d.jsxs("div",{className:"space-y-1",children:[D&&(r?P!==is[0].group&&d.jsx("div",{className:"my-3 border-t border-border/30"}):d.jsx("div",{className:"mt-5 mb-1.5 px-3 text-[10px] font-bold uppercase tracking-widest text-muted-foreground/40 first:mt-0 select-none",children:_.group})),d.jsxs("a",{href:`#${_.id}`,onClick:o,"aria-current":a===_.id?"page":void 0,className:Ee("flex w-full items-center rounded-md text-sm transition-all cursor-pointer",r?"justify-center p-2.5":"gap-3 px-3 py-2",a===_.id?r?"nav-active-collapsed":"nav-active":"text-muted-foreground hover:bg-accent hover:text-accent-foreground"),title:r?_.label:void 0,"aria-label":r?_.label:void 0,children:[d.jsx(_.icon,{className:"h-4.5 w-4.5 shrink-0","aria-hidden":"true"}),!r&&d.jsx("span",{className:"truncate",children:_.label})]})]},_.id)})})()}),d.jsx("div",{className:Ee("py-3 text-xs text-muted-foreground border-t border-border/40 shrink-0",r?"px-2 text-center":"px-5"),children:r?d.jsx("div",{className:"flex justify-center",children:d.jsx("span",{className:Ee("h-2.5 w-2.5 rounded-full ring-2 ring-black/40",f||!u?"bg-red-500":u.engine_reachable?u.brain&&!u.brain.ready?"bg-amber-500 animate-pulse":"bg-emerald-500 animate-pulse":"bg-amber-500"),title:f?"Zentrale antwortet nicht — Anzeigen evtl. veraltet":u?u.engine_reachable?u.brain&&!u.brain.ready?`Hirn offline (${u.brain.model??"fast"})`:"Engine + Hirn online":"Engine offline":"Backend offline"})}):d.jsxs("div",{className:"space-y-2 text-left",children:[f?d.jsxs("span",{className:"flex items-center gap-2 text-red-400",children:[d.jsx("span",{className:"h-2 w-2 rounded-full bg-red-500 animate-pulse"}),d.jsx("span",{className:"truncate",children:"Zentrale antwortet nicht"})]}):u?d.jsxs(d.Fragment,{children:[d.jsxs("span",{className:"flex items-center gap-2",children:[d.jsx("span",{className:Ee("h-2 w-2 rounded-full animate-pulse",u.engine_reachable?"bg-emerald-500":"bg-amber-500")}),d.jsxs("span",{className:"truncate",children:["Engine ",u.engine_reachable?"online":"offline"]})]}),u.brain&&!u.brain.ready&&d.jsxs("span",{className:"flex items-center gap-2 text-amber-400",title:`Agent-Hirn '${u.brain.model??"fast"}' lädt nicht/abgestürzt`,children:[d.jsx("span",{className:"h-2 w-2 rounded-full bg-amber-500 animate-pulse"}),d.jsxs("span",{className:"truncate",children:["Hirn offline",u.brain.model?` (${u.brain.model})`:""]})]})]}):d.jsxs("span",{className:"flex items-center gap-2",children:[d.jsx("span",{className:"h-2 w-2 rounded-full bg-red-500"})," ",d.jsx("span",{className:"truncate",children:"Backend offline"})]}),(m==null?void 0:m.versions)&&d.jsxs("div",{className:"space-y-1 text-[9px] text-muted-foreground/60 mt-2 pt-2 border-t border-border/30",children:[d.jsxs("div",{className:"truncate",title:m.versions.mc2?`${m.versions.mc2.branch}-${m.versions.mc2.hash}${m.versions.mc2.dirty?"*":""} (${m.versions.mc2.date})`:"nicht gefunden",children:[d.jsx("strong",{children:"MC2:"})," ",m.versions.mc2?`${m.versions.mc2.hash}${m.versions.mc2.dirty?"*":""}`:"—"]}),d.jsxs("div",{className:"truncate",title:((h=m.versions.engine)==null?void 0:h.type)==="git"?`${m.versions.engine.branch}-${m.versions.engine.hash}${m.versions.engine.dirty?"*":""} (${m.versions.engine.date})`:((y=m.versions.engine)==null?void 0:y.version_text)||"unbekannt",children:[d.jsx("strong",{children:"Engine:"})," ",((k=m.versions.engine)==null?void 0:k.type)==="git"?`${m.versions.engine.hash}${m.versions.engine.dirty?"*":""}`:((x=(w=m.versions.engine)==null?void 0:w.version_text)==null?void 0:x.split(" ").pop())||"—"]}),d.jsxs("div",{className:"truncate",title:m.versions.hermes_agent?`${m.versions.hermes_agent.branch}-${m.versions.hermes_agent.hash}${m.versions.hermes_agent.dirty?"*":""} (${m.versions.hermes_agent.date})`:"nicht gefunden",children:[d.jsx("strong",{children:"Hermes Agent:"})," ",m.versions.hermes_agent?`${m.versions.hermes_agent.hash}${m.versions.hermes_agent.dirty?"*":""}`:"—"]})]})]})})]})}class Yw extends Ju.Component{constructor(){super(...arguments);Qo(this,"state",{error:null})}static getDerivedStateFromError(o){return{error:o}}componentDidCatch(o,a){console.error("Unbehandelter UI-Fehler:",o,a.componentStack)}render(){return this.state.error?d.jsx("div",{className:"min-h-screen flex items-center justify-center bg-neutral-950 text-neutral-200 p-8",children:d.jsxs("div",{className:"max-w-lg space-y-4 text-center",children:[d.jsx("div",{className:"text-2xl",children:"Da ist etwas schiefgelaufen."}),d.jsx("div",{className:"text-sm text-neutral-400 break-all",children:this.state.error.message}),d.jsx("button",{className:"px-4 py-2 rounded-lg bg-neutral-800 hover:bg-neutral-700 border border-neutral-700",onClick:()=>window.location.reload(),children:"Neu laden"})]})}):this.props.children}}const ju="mc_neuladen_wegen_version";function Xw(){window.addEventListener("vite:preloadError",r=>{sessionStorage.getItem(ju)||(r.preventDefault(),sessionStorage.setItem(ju,"1"),window.location.reload())}),window.addEventListener("load",()=>{window.setTimeout(()=>sessionStorage.removeItem(ju),5e3)})}Xw();const Jw=new ay({defaultOptions:{queries:{retry:1,refetchOnWindowFocus:!1,staleTime:5e3}}});Av.createRoot(document.getElementById("root")).render(d.jsx(Ju.StrictMode,{children:d.jsx(Yw,{children:d.jsx(uy,{client:Jw,children:d.jsx(Zw,{})})})}));export{Uy as $,ow as A,Py as B,My as C,jh as D,jp as E,wi as F,Ty as G,By as H,iw as I,zy as J,tk as K,ji as L,Ni as M,jy as N,_p as O,Yy as P,t0 as Q,ss as R,Xy as S,Ci as T,gi as U,cl as V,r0 as W,dl as X,Sp as Y,oc as Z,qy as _,uk as a,e0 as a0,ew as a1,tw as a2,Ly as a3,vk as a4,ic as a5,sk as a6,Ep as a7,Iy as a8,Di as a9,_u as aa,bi as ab,iy as ac,it as ad,bt as ae,hp as af,Be as ag,sw as ah,mk as ai,ik as aj,Hy as ak,lc as al,Vy as am,nw as an,Ju as ao,ap,ok as aq,lk as ar,Ky as as,m1 as at,Xu as au,Mp as av,ec as aw,Ee as b,ge as c,rk as d,Cy as e,km as f,ak as g,vl as h,ck as i,d as j,ym as k,pk as l,fk as m,Se as n,ts as o,p1 as p,Pe as q,g as r,nk as s,Np as t,ul as u,gk as v,dk as w,Sm as x,Eu as y,hk as z}; diff --git a/frontend/dist/assets/index-qIFdAPfr.css b/frontend/dist/assets/index-qIFdAPfr.css deleted file mode 100644 index 12f3da8..0000000 --- a/frontend/dist/assets/index-qIFdAPfr.css +++ /dev/null @@ -1 +0,0 @@ -/*! tailwindcss v4.3.1 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-pan-x:initial;--tw-pan-y:initial;--tw-pinch-zoom:initial;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-divide-x-reverse:0;--tw-border-style:solid;--tw-divide-y-reverse:0;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial}}}@layer theme{:root,:host{--font-sans:"Inter", ui-sans-serif, system-ui, -apple-system, sans-serif;--color-red-200:oklch(88.5% .062 18.334);--color-red-300:oklch(80.8% .114 19.571);--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-orange-300:oklch(83.7% .128 66.29);--color-orange-500:oklch(70.5% .213 47.604);--color-amber-200:oklch(92.4% .12 95.746);--color-amber-300:oklch(87.9% .169 91.605);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-500:oklch(76.9% .188 70.08);--color-lime-400:oklch(84.1% .238 128.85);--color-lime-500:oklch(76.8% .233 130.85);--color-emerald-300:oklch(84.5% .143 164.978);--color-emerald-400:oklch(76.5% .177 163.223);--color-emerald-500:oklch(69.6% .17 162.48);--color-emerald-600:oklch(59.6% .145 163.225);--color-teal-300:oklch(85.5% .138 181.071);--color-teal-400:oklch(77.7% .152 181.912);--color-teal-500:oklch(70.4% .14 182.503);--color-cyan-200:oklch(91.7% .08 205.041);--color-cyan-300:oklch(86.5% .127 207.078);--color-cyan-400:oklch(78.9% .154 211.53);--color-cyan-500:oklch(71.5% .143 215.221);--color-sky-200:oklch(90.1% .058 230.902);--color-sky-300:oklch(82.8% .111 230.318);--color-sky-400:oklch(74.6% .16 232.661);--color-sky-500:oklch(68.5% .169 237.323);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-500:oklch(62.3% .214 259.815);--color-indigo-300:oklch(78.5% .115 274.713);--color-indigo-400:oklch(67.3% .182 276.935);--color-indigo-500:oklch(58.5% .233 277.117);--color-violet-200:oklch(89.4% .057 293.283);--color-violet-300:oklch(81.1% .111 293.571);--color-violet-400:oklch(70.2% .183 293.541);--color-violet-500:oklch(60.6% .25 292.717);--color-purple-300:oklch(82.7% .119 306.383);--color-purple-500:oklch(62.7% .265 303.9);--color-fuchsia-300:oklch(83.3% .145 321.434);--color-fuchsia-400:oklch(74% .238 322.16);--color-fuchsia-500:oklch(66.7% .295 322.15);--color-pink-300:oklch(82.3% .12 346.018);--color-pink-400:oklch(71.8% .202 349.761);--color-pink-500:oklch(65.6% .241 354.308);--color-rose-300:oklch(81% .117 11.638);--color-rose-400:oklch(71.2% .194 13.428);--color-rose-500:oklch(64.5% .246 16.439);--color-slate-300:oklch(86.9% .022 252.894);--color-slate-400:oklch(70.4% .04 256.788);--color-slate-500:oklch(55.4% .046 257.417);--color-neutral-200:oklch(92.2% 0 0);--color-neutral-400:oklch(70.8% 0 0);--color-neutral-700:oklch(37.1% 0 0);--color-neutral-800:oklch(26.9% 0 0);--color-neutral-950:oklch(14.5% 0 0);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-2xl:42rem;--container-3xl:48rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height: 1.2 ;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-normal:0em;--tracking-wide:.025em;--tracking-wider:.05em;--tracking-widest:.1em;--leading-tight:1.25;--leading-normal:1.5;--leading-relaxed:1.625;--radius-xl:.75rem;--radius-2xl:1rem;--ease-in:cubic-bezier(.4, 0, 1, 1);--ease-out:cubic-bezier(0, 0, .2, 1);--ease-in-out:cubic-bezier(.4, 0, .2, 1);--animate-spin:spin 1s linear infinite;--animate-ping:ping 1s cubic-bezier(0, 0, .2, 1) infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--blur-sm:8px;--blur-md:12px;--blur-xl:24px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:"Inter", ui-sans-serif, system-ui, -apple-system, sans-serif;--default-mono-font-family:"JetBrains Mono", ui-monospace, SFMono-Regular, monospace}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.not-sr-only{clip-path:none;white-space:normal;width:auto;height:auto;margin:0;padding:0;position:static;overflow:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.inset-y-0{inset-block:0}.top-0{top:0}.top-1\/2{top:50%}.top-2\.5{top:calc(var(--spacing) * 2.5)}.top-3{top:calc(var(--spacing) * 3)}.top-4{top:calc(var(--spacing) * 4)}.right-0{right:0}.right-3{right:calc(var(--spacing) * 3)}.bottom-3{bottom:calc(var(--spacing) * 3)}.-left-\[23px\]{left:-23px}.left-0{left:0}.left-2{left:calc(var(--spacing) * 2)}.left-2\.5{left:calc(var(--spacing) * 2.5)}.left-3{left:calc(var(--spacing) * 3)}.isolate{isolation:isolate}.isolation-auto{isolation:auto}.-z-50{z-index:-50}.z-10{z-index:10}.z-50{z-index:50}.z-\[60\]{z-index:60}.z-\[99\]{z-index:99}.col-span-full{grid-column:1/-1}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.-mx-1{margin-inline:calc(var(--spacing) * -1)}.mx-auto{margin-inline:auto}.my-3{margin-block:calc(var(--spacing) * 3)}.-mt-1{margin-top:calc(var(--spacing) * -1)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-2\.5{margin-top:calc(var(--spacing) * 2.5)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-3\.5{margin-top:calc(var(--spacing) * 3.5)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-5{margin-top:calc(var(--spacing) * 5)}.mt-auto{margin-top:auto}.mt-px{margin-top:1px}.mr-0\.5{margin-right:calc(var(--spacing) * .5)}.mr-2{margin-right:calc(var(--spacing) * 2)}.mb-1{margin-bottom:var(--spacing)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.-ml-1{margin-left:calc(var(--spacing) * -1)}.ml-0\.5{margin-left:calc(var(--spacing) * .5)}.ml-1{margin-left:var(--spacing)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-4{margin-left:calc(var(--spacing) * 4)}.ml-auto{margin-left:auto}.line-clamp-6{-webkit-line-clamp:6;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.contents{display:contents}.flex{display:flex}.flow-root{display:flow-root}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.inline-grid{display:inline-grid}.inline-table{display:inline-table}.list-item{display:list-item}.table{display:table}.table-caption{display:table-caption}.table-cell{display:table-cell}.table-column{display:table-column}.table-column-group{display:table-column-group}.table-footer-group{display:table-footer-group}.table-header-group{display:table-header-group}.table-row{display:table-row}.table-row-group{display:table-row-group}.h-1{height:var(--spacing)}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.h-3{height:calc(var(--spacing) * 3)}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-4\.5{height:calc(var(--spacing) * 4.5)}.h-5{height:calc(var(--spacing) * 5)}.h-5\.5{height:calc(var(--spacing) * 5.5)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-11{height:calc(var(--spacing) * 11)}.h-12{height:calc(var(--spacing) * 12)}.h-14{height:calc(var(--spacing) * 14)}.h-16{height:calc(var(--spacing) * 16)}.h-24{height:calc(var(--spacing) * 24)}.h-32{height:calc(var(--spacing) * 32)}.h-44{height:calc(var(--spacing) * 44)}.h-64{height:calc(var(--spacing) * 64)}.h-\[70vh\]{height:70vh}.h-\[120px\]{height:120px}.h-\[150px\]{height:150px}.h-\[480px\]{height:480px}.h-full{height:100%}.h-px{height:1px}.max-h-36{max-height:calc(var(--spacing) * 36)}.max-h-56{max-height:calc(var(--spacing) * 56)}.max-h-60{max-height:calc(var(--spacing) * 60)}.max-h-64{max-height:calc(var(--spacing) * 64)}.max-h-72{max-height:calc(var(--spacing) * 72)}.max-h-80{max-height:calc(var(--spacing) * 80)}.max-h-96{max-height:calc(var(--spacing) * 96)}.max-h-\[28rem\]{max-height:28rem}.max-h-\[60vh\]{max-height:60vh}.max-h-\[70vh\]{max-height:70vh}.max-h-\[80vh\]{max-height:80vh}.min-h-\[16rem\]{min-height:16rem}.min-h-\[58vh\]{min-height:58vh}.min-h-\[300px\]{min-height:300px}.min-h-screen{min-height:100vh}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-2{width:calc(var(--spacing) * 2)}.w-2\.5{width:calc(var(--spacing) * 2.5)}.w-3{width:calc(var(--spacing) * 3)}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-4{width:calc(var(--spacing) * 4)}.w-4\.5{width:calc(var(--spacing) * 4.5)}.w-5{width:calc(var(--spacing) * 5)}.w-5\.5{width:calc(var(--spacing) * 5.5)}.w-6{width:calc(var(--spacing) * 6)}.w-7{width:calc(var(--spacing) * 7)}.w-8{width:calc(var(--spacing) * 8)}.w-9{width:calc(var(--spacing) * 9)}.w-10{width:calc(var(--spacing) * 10)}.w-11{width:calc(var(--spacing) * 11)}.w-12{width:calc(var(--spacing) * 12)}.w-14{width:calc(var(--spacing) * 14)}.w-16{width:calc(var(--spacing) * 16)}.w-20{width:calc(var(--spacing) * 20)}.w-24{width:calc(var(--spacing) * 24)}.w-60{width:calc(var(--spacing) * 60)}.w-72{width:calc(var(--spacing) * 72)}.w-fit{width:fit-content}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-3xl{max-width:var(--container-3xl)}.max-w-\[16rem\]{max-width:16rem}.max-w-\[85vw\]{max-width:85vw}.max-w-\[250px\]{max-width:250px}.max-w-\[280px\]{max-width:280px}.max-w-lg{max-width:var(--container-lg)}.max-w-md{max-width:var(--container-md)}.max-w-sm{max-width:var(--container-sm)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:0}.min-w-\[2\.5rem\]{min-width:2.5rem}.min-w-\[2rem\]{min-width:2rem}.min-w-\[3ch\]{min-width:3ch}.min-w-\[680px\]{min-width:680px}.flex-1{flex:1}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.border-collapse{border-collapse:collapse}.-translate-x-full{--tw-translate-x:-100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-0{--tw-translate-x:0;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-full{--tw-translate-x:100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-ping{animation:var(--animate-ping)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.touch-pinch-zoom{--tw-pinch-zoom:pinch-zoom;touch-action:var(--tw-pan-x,) var(--tw-pan-y,) var(--tw-pinch-zoom,)}.resize{resize:both}.scroll-mt-20{scroll-margin-top:calc(var(--spacing) * 20)}.scrollbar-thin{scrollbar-width:thin}.list-disc{list-style-type:disc}.list-none{list-style-type:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-6{gap:calc(var(--spacing) * 6)}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-7>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 7) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 7) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 8) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 8) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-reverse>:not(:last-child)){--tw-space-y-reverse:1}.gap-x-2{column-gap:calc(var(--spacing) * 2)}.gap-x-3{column-gap:calc(var(--spacing) * 3)}.gap-x-4{column-gap:calc(var(--spacing) * 4)}:where(.space-x-reverse>:not(:last-child)){--tw-space-x-reverse:1}.gap-y-1{row-gap:var(--spacing)}.gap-y-1\.5{row-gap:calc(var(--spacing) * 1.5)}.gap-y-2{row-gap:calc(var(--spacing) * 2)}:where(.divide-x>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px * var(--tw-divide-x-reverse));border-inline-end-width:calc(1px * calc(1 - var(--tw-divide-x-reverse)))}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-y-reverse>:not(:last-child)){--tw-divide-y-reverse:1}:where(.divide-border\/20>:not(:last-child)){border-color:hsl(var(--border))}@supports (color:color-mix(in lab,red,red)){:where(.divide-border\/20>:not(:last-child)){border-color:color-mix(in oklab,hsl(var(--border)) 20%,transparent)}}.self-start{align-self:flex-start}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overscroll-contain{overscroll-behavior:contain}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-sm{border-radius:calc(var(--radius) - 4px)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-s{border-start-start-radius:.25rem;border-end-start-radius:.25rem}.rounded-ss{border-start-start-radius:.25rem}.rounded-e{border-start-end-radius:.25rem;border-end-end-radius:.25rem}.rounded-se{border-start-end-radius:.25rem}.rounded-ee{border-end-end-radius:.25rem}.rounded-es{border-end-start-radius:.25rem}.rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.rounded-l{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.rounded-tl{border-top-left-radius:.25rem}.rounded-r{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.rounded-tr{border-top-right-radius:.25rem}.rounded-b{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.rounded-br{border-bottom-right-radius:.25rem}.rounded-bl{border-bottom-left-radius:.25rem}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-x{border-inline-style:var(--tw-border-style);border-inline-width:1px}.border-y{border-block-style:var(--tw-border-style);border-block-width:1px}.border-s{border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.border-e{border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-t-2{border-top-style:var(--tw-border-style);border-top-width:2px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-amber-500\/20{border-color:#f99c0033}@supports (color:color-mix(in lab,red,red)){.border-amber-500\/20{border-color:color-mix(in oklab,var(--color-amber-500) 20%,transparent)}}.border-amber-500\/25{border-color:#f99c0040}@supports (color:color-mix(in lab,red,red)){.border-amber-500\/25{border-color:color-mix(in oklab,var(--color-amber-500) 25%,transparent)}}.border-amber-500\/30{border-color:#f99c004d}@supports (color:color-mix(in lab,red,red)){.border-amber-500\/30{border-color:color-mix(in oklab,var(--color-amber-500) 30%,transparent)}}.border-amber-500\/40{border-color:#f99c0066}@supports (color:color-mix(in lab,red,red)){.border-amber-500\/40{border-color:color-mix(in oklab,var(--color-amber-500) 40%,transparent)}}.border-amber-500\/50{border-color:#f99c0080}@supports (color:color-mix(in lab,red,red)){.border-amber-500\/50{border-color:color-mix(in oklab,var(--color-amber-500) 50%,transparent)}}.border-blue-500\/30{border-color:#3080ff4d}@supports (color:color-mix(in lab,red,red)){.border-blue-500\/30{border-color:color-mix(in oklab,var(--color-blue-500) 30%,transparent)}}.border-border,.border-border\/20{border-color:hsl(var(--border))}@supports (color:color-mix(in lab,red,red)){.border-border\/20{border-color:color-mix(in oklab,hsl(var(--border)) 20%,transparent)}}.border-border\/30{border-color:hsl(var(--border))}@supports (color:color-mix(in lab,red,red)){.border-border\/30{border-color:color-mix(in oklab,hsl(var(--border)) 30%,transparent)}}.border-border\/40{border-color:hsl(var(--border))}@supports (color:color-mix(in lab,red,red)){.border-border\/40{border-color:color-mix(in oklab,hsl(var(--border)) 40%,transparent)}}.border-border\/50{border-color:hsl(var(--border))}@supports (color:color-mix(in lab,red,red)){.border-border\/50{border-color:color-mix(in oklab,hsl(var(--border)) 50%,transparent)}}.border-border\/60{border-color:hsl(var(--border))}@supports (color:color-mix(in lab,red,red)){.border-border\/60{border-color:color-mix(in oklab,hsl(var(--border)) 60%,transparent)}}.border-border\/70{border-color:hsl(var(--border))}@supports (color:color-mix(in lab,red,red)){.border-border\/70{border-color:color-mix(in oklab,hsl(var(--border)) 70%,transparent)}}.border-border\/80{border-color:hsl(var(--border))}@supports (color:color-mix(in lab,red,red)){.border-border\/80{border-color:color-mix(in oklab,hsl(var(--border)) 80%,transparent)}}.border-cyan-500\/20{border-color:#00b7d733}@supports (color:color-mix(in lab,red,red)){.border-cyan-500\/20{border-color:color-mix(in oklab,var(--color-cyan-500) 20%,transparent)}}.border-cyan-500\/25{border-color:#00b7d740}@supports (color:color-mix(in lab,red,red)){.border-cyan-500\/25{border-color:color-mix(in oklab,var(--color-cyan-500) 25%,transparent)}}.border-cyan-500\/30{border-color:#00b7d74d}@supports (color:color-mix(in lab,red,red)){.border-cyan-500\/30{border-color:color-mix(in oklab,var(--color-cyan-500) 30%,transparent)}}.border-emerald-500\/10{border-color:#00bb7f1a}@supports (color:color-mix(in lab,red,red)){.border-emerald-500\/10{border-color:color-mix(in oklab,var(--color-emerald-500) 10%,transparent)}}.border-emerald-500\/20{border-color:#00bb7f33}@supports (color:color-mix(in lab,red,red)){.border-emerald-500\/20{border-color:color-mix(in oklab,var(--color-emerald-500) 20%,transparent)}}.border-emerald-500\/25{border-color:#00bb7f40}@supports (color:color-mix(in lab,red,red)){.border-emerald-500\/25{border-color:color-mix(in oklab,var(--color-emerald-500) 25%,transparent)}}.border-emerald-500\/30{border-color:#00bb7f4d}@supports (color:color-mix(in lab,red,red)){.border-emerald-500\/30{border-color:color-mix(in oklab,var(--color-emerald-500) 30%,transparent)}}.border-emerald-500\/40{border-color:#00bb7f66}@supports (color:color-mix(in lab,red,red)){.border-emerald-500\/40{border-color:color-mix(in oklab,var(--color-emerald-500) 40%,transparent)}}.border-fuchsia-500\/25{border-color:#e12afb40}@supports (color:color-mix(in lab,red,red)){.border-fuchsia-500\/25{border-color:color-mix(in oklab,var(--color-fuchsia-500) 25%,transparent)}}.border-fuchsia-500\/30{border-color:#e12afb4d}@supports (color:color-mix(in lab,red,red)){.border-fuchsia-500\/30{border-color:color-mix(in oklab,var(--color-fuchsia-500) 30%,transparent)}}.border-indigo-500\/25{border-color:#625fff40}@supports (color:color-mix(in lab,red,red)){.border-indigo-500\/25{border-color:color-mix(in oklab,var(--color-indigo-500) 25%,transparent)}}.border-indigo-500\/40{border-color:#625fff66}@supports (color:color-mix(in lab,red,red)){.border-indigo-500\/40{border-color:color-mix(in oklab,var(--color-indigo-500) 40%,transparent)}}.border-lime-500\/25{border-color:#80cd0040}@supports (color:color-mix(in lab,red,red)){.border-lime-500\/25{border-color:color-mix(in oklab,var(--color-lime-500) 25%,transparent)}}.border-neutral-700{border-color:var(--color-neutral-700)}.border-orange-500\/30{border-color:#fe6e004d}@supports (color:color-mix(in lab,red,red)){.border-orange-500\/30{border-color:color-mix(in oklab,var(--color-orange-500) 30%,transparent)}}.border-pink-500\/25{border-color:#f6339a40}@supports (color:color-mix(in lab,red,red)){.border-pink-500\/25{border-color:color-mix(in oklab,var(--color-pink-500) 25%,transparent)}}.border-pink-500\/40{border-color:#f6339a66}@supports (color:color-mix(in lab,red,red)){.border-pink-500\/40{border-color:color-mix(in oklab,var(--color-pink-500) 40%,transparent)}}.border-primary,.border-primary\/20{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.border-primary\/20{border-color:color-mix(in oklab,hsl(var(--primary)) 20%,transparent)}}.border-primary\/25{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.border-primary\/25{border-color:color-mix(in oklab,hsl(var(--primary)) 25%,transparent)}}.border-primary\/30{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.border-primary\/30{border-color:color-mix(in oklab,hsl(var(--primary)) 30%,transparent)}}.border-primary\/40{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.border-primary\/40{border-color:color-mix(in oklab,hsl(var(--primary)) 40%,transparent)}}.border-primary\/50{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.border-primary\/50{border-color:color-mix(in oklab,hsl(var(--primary)) 50%,transparent)}}.border-primary\/60{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.border-primary\/60{border-color:color-mix(in oklab,hsl(var(--primary)) 60%,transparent)}}.border-purple-500\/30{border-color:#ac4bff4d}@supports (color:color-mix(in lab,red,red)){.border-purple-500\/30{border-color:color-mix(in oklab,var(--color-purple-500) 30%,transparent)}}.border-red-500\/20{border-color:#fb2c3633}@supports (color:color-mix(in lab,red,red)){.border-red-500\/20{border-color:color-mix(in oklab,var(--color-red-500) 20%,transparent)}}.border-red-500\/25{border-color:#fb2c3640}@supports (color:color-mix(in lab,red,red)){.border-red-500\/25{border-color:color-mix(in oklab,var(--color-red-500) 25%,transparent)}}.border-red-500\/30{border-color:#fb2c364d}@supports (color:color-mix(in lab,red,red)){.border-red-500\/30{border-color:color-mix(in oklab,var(--color-red-500) 30%,transparent)}}.border-red-500\/40{border-color:#fb2c3666}@supports (color:color-mix(in lab,red,red)){.border-red-500\/40{border-color:color-mix(in oklab,var(--color-red-500) 40%,transparent)}}.border-red-500\/50{border-color:#fb2c3680}@supports (color:color-mix(in lab,red,red)){.border-red-500\/50{border-color:color-mix(in oklab,var(--color-red-500) 50%,transparent)}}.border-red-500\/60{border-color:#fb2c3699}@supports (color:color-mix(in lab,red,red)){.border-red-500\/60{border-color:color-mix(in oklab,var(--color-red-500) 60%,transparent)}}.border-sky-500\/25{border-color:#00a5ef40}@supports (color:color-mix(in lab,red,red)){.border-sky-500\/25{border-color:color-mix(in oklab,var(--color-sky-500) 25%,transparent)}}.border-sky-500\/30{border-color:#00a5ef4d}@supports (color:color-mix(in lab,red,red)){.border-sky-500\/30{border-color:color-mix(in oklab,var(--color-sky-500) 30%,transparent)}}.border-sky-500\/40{border-color:#00a5ef66}@supports (color:color-mix(in lab,red,red)){.border-sky-500\/40{border-color:color-mix(in oklab,var(--color-sky-500) 40%,transparent)}}.border-slate-500\/25{border-color:#62748e40}@supports (color:color-mix(in lab,red,red)){.border-slate-500\/25{border-color:color-mix(in oklab,var(--color-slate-500) 25%,transparent)}}.border-slate-500\/30{border-color:#62748e4d}@supports (color:color-mix(in lab,red,red)){.border-slate-500\/30{border-color:color-mix(in oklab,var(--color-slate-500) 30%,transparent)}}.border-teal-500\/25{border-color:#00baa740}@supports (color:color-mix(in lab,red,red)){.border-teal-500\/25{border-color:color-mix(in oklab,var(--color-teal-500) 25%,transparent)}}.border-transparent{border-color:#0000}.border-violet-500\/20{border-color:#8d54ff33}@supports (color:color-mix(in lab,red,red)){.border-violet-500\/20{border-color:color-mix(in oklab,var(--color-violet-500) 20%,transparent)}}.border-violet-500\/25{border-color:#8d54ff40}@supports (color:color-mix(in lab,red,red)){.border-violet-500\/25{border-color:color-mix(in oklab,var(--color-violet-500) 25%,transparent)}}.border-violet-500\/30{border-color:#8d54ff4d}@supports (color:color-mix(in lab,red,red)){.border-violet-500\/30{border-color:color-mix(in oklab,var(--color-violet-500) 30%,transparent)}}.border-violet-500\/40{border-color:#8d54ff66}@supports (color:color-mix(in lab,red,red)){.border-violet-500\/40{border-color:color-mix(in oklab,var(--color-violet-500) 40%,transparent)}}.border-t-emerald-500\/70{border-top-color:#00bb7fb3}@supports (color:color-mix(in lab,red,red)){.border-t-emerald-500\/70{border-top-color:color-mix(in oklab,var(--color-emerald-500) 70%,transparent)}}.border-t-primary\/70{border-top-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.border-t-primary\/70{border-top-color:color-mix(in oklab,hsl(var(--primary)) 70%,transparent)}}.bg-\[hsl\(224\,28\%\,8\%\)\]{background-color:#0f121a}.bg-amber-400{background-color:var(--color-amber-400)}.bg-amber-500{background-color:var(--color-amber-500)}.bg-amber-500\/5{background-color:#f99c000d}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/5{background-color:color-mix(in oklab,var(--color-amber-500) 5%,transparent)}}.bg-amber-500\/10{background-color:#f99c001a}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/10{background-color:color-mix(in oklab,var(--color-amber-500) 10%,transparent)}}.bg-amber-500\/15{background-color:#f99c0026}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/15{background-color:color-mix(in oklab,var(--color-amber-500) 15%,transparent)}}.bg-amber-500\/20{background-color:#f99c0033}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/20{background-color:color-mix(in oklab,var(--color-amber-500) 20%,transparent)}}.bg-amber-500\/80{background-color:#f99c00cc}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/80{background-color:color-mix(in oklab,var(--color-amber-500) 80%,transparent)}}.bg-amber-500\/\[0\.06\]{background-color:#f99c000f}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/\[0\.06\]{background-color:color-mix(in oklab,var(--color-amber-500) 6%,transparent)}}.bg-background\/10{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.bg-background\/10{background-color:color-mix(in oklab,hsl(var(--background)) 10%,transparent)}}.bg-background\/20{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.bg-background\/20{background-color:color-mix(in oklab,hsl(var(--background)) 20%,transparent)}}.bg-background\/25{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.bg-background\/25{background-color:color-mix(in oklab,hsl(var(--background)) 25%,transparent)}}.bg-background\/30{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.bg-background\/30{background-color:color-mix(in oklab,hsl(var(--background)) 30%,transparent)}}.bg-background\/35{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.bg-background\/35{background-color:color-mix(in oklab,hsl(var(--background)) 35%,transparent)}}.bg-background\/40{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.bg-background\/40{background-color:color-mix(in oklab,hsl(var(--background)) 40%,transparent)}}.bg-background\/50{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.bg-background\/50{background-color:color-mix(in oklab,hsl(var(--background)) 50%,transparent)}}.bg-background\/60{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.bg-background\/60{background-color:color-mix(in oklab,hsl(var(--background)) 60%,transparent)}}.bg-black\/10{background-color:#0000001a}@supports (color:color-mix(in lab,red,red)){.bg-black\/10{background-color:color-mix(in oklab,var(--color-black) 10%,transparent)}}.bg-black\/30{background-color:#0000004d}@supports (color:color-mix(in lab,red,red)){.bg-black\/30{background-color:color-mix(in oklab,var(--color-black) 30%,transparent)}}.bg-black\/40{background-color:#0006}@supports (color:color-mix(in lab,red,red)){.bg-black\/40{background-color:color-mix(in oklab,var(--color-black) 40%,transparent)}}.bg-black\/50{background-color:#00000080}@supports (color:color-mix(in lab,red,red)){.bg-black\/50{background-color:color-mix(in oklab,var(--color-black) 50%,transparent)}}.bg-black\/60{background-color:#0009}@supports (color:color-mix(in lab,red,red)){.bg-black\/60{background-color:color-mix(in oklab,var(--color-black) 60%,transparent)}}.bg-black\/70{background-color:#000000b3}@supports (color:color-mix(in lab,red,red)){.bg-black\/70{background-color:color-mix(in oklab,var(--color-black) 70%,transparent)}}.bg-blue-500\/20{background-color:#3080ff33}@supports (color:color-mix(in lab,red,red)){.bg-blue-500\/20{background-color:color-mix(in oklab,var(--color-blue-500) 20%,transparent)}}.bg-border,.bg-border\/40{background-color:hsl(var(--border))}@supports (color:color-mix(in lab,red,red)){.bg-border\/40{background-color:color-mix(in oklab,hsl(var(--border)) 40%,transparent)}}.bg-card,.bg-card\/20{background-color:hsl(var(--card))}@supports (color:color-mix(in lab,red,red)){.bg-card\/20{background-color:color-mix(in oklab,hsl(var(--card)) 20%,transparent)}}.bg-card\/30{background-color:hsl(var(--card))}@supports (color:color-mix(in lab,red,red)){.bg-card\/30{background-color:color-mix(in oklab,hsl(var(--card)) 30%,transparent)}}.bg-card\/40{background-color:hsl(var(--card))}@supports (color:color-mix(in lab,red,red)){.bg-card\/40{background-color:color-mix(in oklab,hsl(var(--card)) 40%,transparent)}}.bg-card\/45{background-color:hsl(var(--card))}@supports (color:color-mix(in lab,red,red)){.bg-card\/45{background-color:color-mix(in oklab,hsl(var(--card)) 45%,transparent)}}.bg-card\/70{background-color:hsl(var(--card))}@supports (color:color-mix(in lab,red,red)){.bg-card\/70{background-color:color-mix(in oklab,hsl(var(--card)) 70%,transparent)}}.bg-card\/85{background-color:hsl(var(--card))}@supports (color:color-mix(in lab,red,red)){.bg-card\/85{background-color:color-mix(in oklab,hsl(var(--card)) 85%,transparent)}}.bg-cyan-500{background-color:var(--color-cyan-500)}.bg-cyan-500\/10{background-color:#00b7d71a}@supports (color:color-mix(in lab,red,red)){.bg-cyan-500\/10{background-color:color-mix(in oklab,var(--color-cyan-500) 10%,transparent)}}.bg-cyan-500\/15{background-color:#00b7d726}@supports (color:color-mix(in lab,red,red)){.bg-cyan-500\/15{background-color:color-mix(in oklab,var(--color-cyan-500) 15%,transparent)}}.bg-cyan-500\/20{background-color:#00b7d733}@supports (color:color-mix(in lab,red,red)){.bg-cyan-500\/20{background-color:color-mix(in oklab,var(--color-cyan-500) 20%,transparent)}}.bg-emerald-400{background-color:var(--color-emerald-400)}.bg-emerald-500{background-color:var(--color-emerald-500)}.bg-emerald-500\/5{background-color:#00bb7f0d}@supports (color:color-mix(in lab,red,red)){.bg-emerald-500\/5{background-color:color-mix(in oklab,var(--color-emerald-500) 5%,transparent)}}.bg-emerald-500\/10{background-color:#00bb7f1a}@supports (color:color-mix(in lab,red,red)){.bg-emerald-500\/10{background-color:color-mix(in oklab,var(--color-emerald-500) 10%,transparent)}}.bg-emerald-500\/15{background-color:#00bb7f26}@supports (color:color-mix(in lab,red,red)){.bg-emerald-500\/15{background-color:color-mix(in oklab,var(--color-emerald-500) 15%,transparent)}}.bg-emerald-500\/20{background-color:#00bb7f33}@supports (color:color-mix(in lab,red,red)){.bg-emerald-500\/20{background-color:color-mix(in oklab,var(--color-emerald-500) 20%,transparent)}}.bg-emerald-500\/80{background-color:#00bb7fcc}@supports (color:color-mix(in lab,red,red)){.bg-emerald-500\/80{background-color:color-mix(in oklab,var(--color-emerald-500) 80%,transparent)}}.bg-foreground\/10{background-color:hsl(var(--foreground))}@supports (color:color-mix(in lab,red,red)){.bg-foreground\/10{background-color:color-mix(in oklab,hsl(var(--foreground)) 10%,transparent)}}.bg-fuchsia-500{background-color:var(--color-fuchsia-500)}.bg-fuchsia-500\/10{background-color:#e12afb1a}@supports (color:color-mix(in lab,red,red)){.bg-fuchsia-500\/10{background-color:color-mix(in oklab,var(--color-fuchsia-500) 10%,transparent)}}.bg-fuchsia-500\/15{background-color:#e12afb26}@supports (color:color-mix(in lab,red,red)){.bg-fuchsia-500\/15{background-color:color-mix(in oklab,var(--color-fuchsia-500) 15%,transparent)}}.bg-indigo-500{background-color:var(--color-indigo-500)}.bg-indigo-500\/10{background-color:#625fff1a}@supports (color:color-mix(in lab,red,red)){.bg-indigo-500\/10{background-color:color-mix(in oklab,var(--color-indigo-500) 10%,transparent)}}.bg-indigo-500\/15{background-color:#625fff26}@supports (color:color-mix(in lab,red,red)){.bg-indigo-500\/15{background-color:color-mix(in oklab,var(--color-indigo-500) 15%,transparent)}}.bg-lime-500{background-color:var(--color-lime-500)}.bg-lime-500\/15{background-color:#80cd0026}@supports (color:color-mix(in lab,red,red)){.bg-lime-500\/15{background-color:color-mix(in oklab,var(--color-lime-500) 15%,transparent)}}.bg-muted{background-color:hsl(var(--muted))}.bg-muted-foreground\/30{background-color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.bg-muted-foreground\/30{background-color:color-mix(in oklab,hsl(var(--muted-foreground)) 30%,transparent)}}.bg-muted-foreground\/40{background-color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.bg-muted-foreground\/40{background-color:color-mix(in oklab,hsl(var(--muted-foreground)) 40%,transparent)}}.bg-muted-foreground\/45{background-color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.bg-muted-foreground\/45{background-color:color-mix(in oklab,hsl(var(--muted-foreground)) 45%,transparent)}}.bg-muted\/25{background-color:hsl(var(--muted))}@supports (color:color-mix(in lab,red,red)){.bg-muted\/25{background-color:color-mix(in oklab,hsl(var(--muted)) 25%,transparent)}}.bg-muted\/40{background-color:hsl(var(--muted))}@supports (color:color-mix(in lab,red,red)){.bg-muted\/40{background-color:color-mix(in oklab,hsl(var(--muted)) 40%,transparent)}}.bg-neutral-800{background-color:var(--color-neutral-800)}.bg-neutral-950{background-color:var(--color-neutral-950)}.bg-orange-500\/20{background-color:#fe6e0033}@supports (color:color-mix(in lab,red,red)){.bg-orange-500\/20{background-color:color-mix(in oklab,var(--color-orange-500) 20%,transparent)}}.bg-pink-500{background-color:var(--color-pink-500)}.bg-pink-500\/10{background-color:#f6339a1a}@supports (color:color-mix(in lab,red,red)){.bg-pink-500\/10{background-color:color-mix(in oklab,var(--color-pink-500) 10%,transparent)}}.bg-pink-500\/15{background-color:#f6339a26}@supports (color:color-mix(in lab,red,red)){.bg-pink-500\/15{background-color:color-mix(in oklab,var(--color-pink-500) 15%,transparent)}}.bg-popover,.bg-popover\/95{background-color:hsl(var(--popover))}@supports (color:color-mix(in lab,red,red)){.bg-popover\/95{background-color:color-mix(in oklab,hsl(var(--popover)) 95%,transparent)}}.bg-primary,.bg-primary\/5{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.bg-primary\/5{background-color:color-mix(in oklab,hsl(var(--primary)) 5%,transparent)}}.bg-primary\/10{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.bg-primary\/10{background-color:color-mix(in oklab,hsl(var(--primary)) 10%,transparent)}}.bg-primary\/15{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.bg-primary\/15{background-color:color-mix(in oklab,hsl(var(--primary)) 15%,transparent)}}.bg-primary\/70{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.bg-primary\/70{background-color:color-mix(in oklab,hsl(var(--primary)) 70%,transparent)}}.bg-primary\/\[0\.06\]{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.bg-primary\/\[0\.06\]{background-color:color-mix(in oklab,hsl(var(--primary)) 6%,transparent)}}.bg-purple-500\/20{background-color:#ac4bff33}@supports (color:color-mix(in lab,red,red)){.bg-purple-500\/20{background-color:color-mix(in oklab,var(--color-purple-500) 20%,transparent)}}.bg-red-500{background-color:var(--color-red-500)}.bg-red-500\/5{background-color:#fb2c360d}@supports (color:color-mix(in lab,red,red)){.bg-red-500\/5{background-color:color-mix(in oklab,var(--color-red-500) 5%,transparent)}}.bg-red-500\/10{background-color:#fb2c361a}@supports (color:color-mix(in lab,red,red)){.bg-red-500\/10{background-color:color-mix(in oklab,var(--color-red-500) 10%,transparent)}}.bg-red-500\/15{background-color:#fb2c3626}@supports (color:color-mix(in lab,red,red)){.bg-red-500\/15{background-color:color-mix(in oklab,var(--color-red-500) 15%,transparent)}}.bg-red-500\/20{background-color:#fb2c3633}@supports (color:color-mix(in lab,red,red)){.bg-red-500\/20{background-color:color-mix(in oklab,var(--color-red-500) 20%,transparent)}}.bg-red-500\/80{background-color:#fb2c36cc}@supports (color:color-mix(in lab,red,red)){.bg-red-500\/80{background-color:color-mix(in oklab,var(--color-red-500) 80%,transparent)}}.bg-rose-500\/15{background-color:#ff235726}@supports (color:color-mix(in lab,red,red)){.bg-rose-500\/15{background-color:color-mix(in oklab,var(--color-rose-500) 15%,transparent)}}.bg-sky-500\/5{background-color:#00a5ef0d}@supports (color:color-mix(in lab,red,red)){.bg-sky-500\/5{background-color:color-mix(in oklab,var(--color-sky-500) 5%,transparent)}}.bg-sky-500\/10{background-color:#00a5ef1a}@supports (color:color-mix(in lab,red,red)){.bg-sky-500\/10{background-color:color-mix(in oklab,var(--color-sky-500) 10%,transparent)}}.bg-slate-400{background-color:var(--color-slate-400)}.bg-slate-500\/15{background-color:#62748e26}@supports (color:color-mix(in lab,red,red)){.bg-slate-500\/15{background-color:color-mix(in oklab,var(--color-slate-500) 15%,transparent)}}.bg-slate-500\/20{background-color:#62748e33}@supports (color:color-mix(in lab,red,red)){.bg-slate-500\/20{background-color:color-mix(in oklab,var(--color-slate-500) 20%,transparent)}}.bg-teal-500{background-color:var(--color-teal-500)}.bg-teal-500\/10{background-color:#00baa71a}@supports (color:color-mix(in lab,red,red)){.bg-teal-500\/10{background-color:color-mix(in oklab,var(--color-teal-500) 10%,transparent)}}.bg-teal-500\/15{background-color:#00baa726}@supports (color:color-mix(in lab,red,red)){.bg-teal-500\/15{background-color:color-mix(in oklab,var(--color-teal-500) 15%,transparent)}}.bg-transparent{background-color:#0000}.bg-violet-500{background-color:var(--color-violet-500)}.bg-violet-500\/5{background-color:#8d54ff0d}@supports (color:color-mix(in lab,red,red)){.bg-violet-500\/5{background-color:color-mix(in oklab,var(--color-violet-500) 5%,transparent)}}.bg-violet-500\/10{background-color:#8d54ff1a}@supports (color:color-mix(in lab,red,red)){.bg-violet-500\/10{background-color:color-mix(in oklab,var(--color-violet-500) 10%,transparent)}}.bg-violet-500\/15{background-color:#8d54ff26}@supports (color:color-mix(in lab,red,red)){.bg-violet-500\/15{background-color:color-mix(in oklab,var(--color-violet-500) 15%,transparent)}}.bg-violet-500\/\[0\.04\]{background-color:#8d54ff0a}@supports (color:color-mix(in lab,red,red)){.bg-violet-500\/\[0\.04\]{background-color:color-mix(in oklab,var(--color-violet-500) 4%,transparent)}}.bg-gradient-to-r{--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-foreground{--tw-gradient-from:hsl(var(--foreground));--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.via-foreground{--tw-gradient-via:hsl(var(--foreground));--tw-gradient-via-stops:var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.to-primary{--tw-gradient-to:hsl(var(--primary));--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.bg-clip-text{-webkit-background-clip:text;background-clip:text}.bg-repeat{background-repeat:repeat}.fill-primary\/20{fill:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.fill-primary\/20{fill:color-mix(in oklab,hsl(var(--primary)) 20%,transparent)}}.p-0{padding:0}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:var(--spacing)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-2\.5{padding:calc(var(--spacing) * 2.5)}.p-3{padding:calc(var(--spacing) * 3)}.p-3\.5{padding:calc(var(--spacing) * 3.5)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.p-8{padding:calc(var(--spacing) * 8)}.px-1{padding-inline:var(--spacing)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-3\.5{padding-inline:calc(var(--spacing) * 3.5)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-10{padding-block:calc(var(--spacing) * 10)}.py-12{padding-block:calc(var(--spacing) * 12)}.py-16{padding-block:calc(var(--spacing) * 16)}.pt-0{padding-top:0}.pt-0\.5{padding-top:calc(var(--spacing) * .5)}.pt-1{padding-top:var(--spacing)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-2\.5{padding-top:calc(var(--spacing) * 2.5)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-\[12vh\]{padding-top:12vh}.pr-1{padding-right:var(--spacing)}.pr-2{padding-right:calc(var(--spacing) * 2)}.pr-3{padding-right:calc(var(--spacing) * 3)}.pr-10{padding-right:calc(var(--spacing) * 10)}.pb-1{padding-bottom:var(--spacing)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pl-3{padding-left:calc(var(--spacing) * 3)}.pl-4{padding-left:calc(var(--spacing) * 4)}.pl-6{padding-left:calc(var(--spacing) * 6)}.pl-8{padding-left:calc(var(--spacing) * 8)}.pl-9{padding-left:calc(var(--spacing) * 9)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-mono{font-family:JetBrains Mono,ui-monospace,SFMono-Regular,monospace}.font-sans{font-family:Inter,ui-sans-serif,system-ui,-apple-system,sans-serif}.font-space{font-family:Space Grotesk,sans-serif}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[8px\]{font-size:8px}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.leading-normal{--tw-leading:var(--leading-normal);line-height:var(--leading-normal)}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-normal{--tw-tracking:var(--tracking-normal);letter-spacing:var(--tracking-normal)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.text-wrap{text-wrap:wrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.text-clip{text-overflow:clip}.text-ellipsis{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.whitespace-pre-line{white-space:pre-line}.whitespace-pre-wrap{white-space:pre-wrap}.text-amber-300{color:var(--color-amber-300)}.text-amber-300\/70{color:#ffd236b3}@supports (color:color-mix(in lab,red,red)){.text-amber-300\/70{color:color-mix(in oklab,var(--color-amber-300) 70%,transparent)}}.text-amber-400{color:var(--color-amber-400)}.text-amber-400\/80{color:#fcbb00cc}@supports (color:color-mix(in lab,red,red)){.text-amber-400\/80{color:color-mix(in oklab,var(--color-amber-400) 80%,transparent)}}.text-amber-400\/90{color:#fcbb00e6}@supports (color:color-mix(in lab,red,red)){.text-amber-400\/90{color:color-mix(in oklab,var(--color-amber-400) 90%,transparent)}}.text-amber-500{color:var(--color-amber-500)}.text-black{color:var(--color-black)}.text-blue-300{color:var(--color-blue-300)}.text-cyan-200\/90{color:#a2f4fde6}@supports (color:color-mix(in lab,red,red)){.text-cyan-200\/90{color:color-mix(in oklab,var(--color-cyan-200) 90%,transparent)}}.text-cyan-300{color:var(--color-cyan-300)}.text-cyan-300\/80{color:#53eafdcc}@supports (color:color-mix(in lab,red,red)){.text-cyan-300\/80{color:color-mix(in oklab,var(--color-cyan-300) 80%,transparent)}}.text-cyan-400{color:var(--color-cyan-400)}.text-emerald-300{color:var(--color-emerald-300)}.text-emerald-300\/70{color:#5ee9b5b3}@supports (color:color-mix(in lab,red,red)){.text-emerald-300\/70{color:color-mix(in oklab,var(--color-emerald-300) 70%,transparent)}}.text-emerald-300\/80{color:#5ee9b5cc}@supports (color:color-mix(in lab,red,red)){.text-emerald-300\/80{color:color-mix(in oklab,var(--color-emerald-300) 80%,transparent)}}.text-emerald-300\/90{color:#5ee9b5e6}@supports (color:color-mix(in lab,red,red)){.text-emerald-300\/90{color:color-mix(in oklab,var(--color-emerald-300) 90%,transparent)}}.text-emerald-400{color:var(--color-emerald-400)}.text-emerald-400\/70{color:#00d294b3}@supports (color:color-mix(in lab,red,red)){.text-emerald-400\/70{color:color-mix(in oklab,var(--color-emerald-400) 70%,transparent)}}.text-emerald-400\/90{color:#00d294e6}@supports (color:color-mix(in lab,red,red)){.text-emerald-400\/90{color:color-mix(in oklab,var(--color-emerald-400) 90%,transparent)}}.text-emerald-600{color:var(--color-emerald-600)}.text-foreground,.text-foreground\/70{color:hsl(var(--foreground))}@supports (color:color-mix(in lab,red,red)){.text-foreground\/70{color:color-mix(in oklab,hsl(var(--foreground)) 70%,transparent)}}.text-foreground\/80{color:hsl(var(--foreground))}@supports (color:color-mix(in lab,red,red)){.text-foreground\/80{color:color-mix(in oklab,hsl(var(--foreground)) 80%,transparent)}}.text-foreground\/85{color:hsl(var(--foreground))}@supports (color:color-mix(in lab,red,red)){.text-foreground\/85{color:color-mix(in oklab,hsl(var(--foreground)) 85%,transparent)}}.text-foreground\/90{color:hsl(var(--foreground))}@supports (color:color-mix(in lab,red,red)){.text-foreground\/90{color:color-mix(in oklab,hsl(var(--foreground)) 90%,transparent)}}.text-fuchsia-300{color:var(--color-fuchsia-300)}.text-fuchsia-400{color:var(--color-fuchsia-400)}.text-indigo-300{color:var(--color-indigo-300)}.text-indigo-400{color:var(--color-indigo-400)}.text-lime-400{color:var(--color-lime-400)}.text-muted-foreground,.text-muted-foreground\/40{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/40{color:color-mix(in oklab,hsl(var(--muted-foreground)) 40%,transparent)}}.text-muted-foreground\/50{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/50{color:color-mix(in oklab,hsl(var(--muted-foreground)) 50%,transparent)}}.text-muted-foreground\/55{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/55{color:color-mix(in oklab,hsl(var(--muted-foreground)) 55%,transparent)}}.text-muted-foreground\/60{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/60{color:color-mix(in oklab,hsl(var(--muted-foreground)) 60%,transparent)}}.text-muted-foreground\/70{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/70{color:color-mix(in oklab,hsl(var(--muted-foreground)) 70%,transparent)}}.text-muted-foreground\/75{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/75{color:color-mix(in oklab,hsl(var(--muted-foreground)) 75%,transparent)}}.text-muted-foreground\/80{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/80{color:color-mix(in oklab,hsl(var(--muted-foreground)) 80%,transparent)}}.text-neutral-200{color:var(--color-neutral-200)}.text-neutral-400{color:var(--color-neutral-400)}.text-orange-300{color:var(--color-orange-300)}.text-pink-300{color:var(--color-pink-300)}.text-pink-400{color:var(--color-pink-400)}.text-popover-foreground{color:hsl(var(--popover-foreground))}.text-primary{color:hsl(var(--primary))}.text-primary-foreground{color:hsl(var(--primary-foreground))}.text-primary\/70{color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.text-primary\/70{color:color-mix(in oklab,hsl(var(--primary)) 70%,transparent)}}.text-primary\/80{color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.text-primary\/80{color:color-mix(in oklab,hsl(var(--primary)) 80%,transparent)}}.text-purple-300{color:var(--color-purple-300)}.text-red-200{color:var(--color-red-200)}.text-red-200\/90{color:#ffcacae6}@supports (color:color-mix(in lab,red,red)){.text-red-200\/90{color:color-mix(in oklab,var(--color-red-200) 90%,transparent)}}.text-red-300{color:var(--color-red-300)}.text-red-300\/70{color:#ffa3a3b3}@supports (color:color-mix(in lab,red,red)){.text-red-300\/70{color:color-mix(in oklab,var(--color-red-300) 70%,transparent)}}.text-red-300\/90{color:#ffa3a3e6}@supports (color:color-mix(in lab,red,red)){.text-red-300\/90{color:color-mix(in oklab,var(--color-red-300) 90%,transparent)}}.text-red-400{color:var(--color-red-400)}.text-red-400\/80{color:#ff6568cc}@supports (color:color-mix(in lab,red,red)){.text-red-400\/80{color:color-mix(in oklab,var(--color-red-400) 80%,transparent)}}.text-red-500{color:var(--color-red-500)}.text-red-600{color:var(--color-red-600)}.text-rose-300{color:var(--color-rose-300)}.text-rose-400{color:var(--color-rose-400)}.text-sky-200\/80{color:#b8e6fecc}@supports (color:color-mix(in lab,red,red)){.text-sky-200\/80{color:color-mix(in oklab,var(--color-sky-200) 80%,transparent)}}.text-sky-300{color:var(--color-sky-300)}.text-sky-300\/80{color:#77d4ffcc}@supports (color:color-mix(in lab,red,red)){.text-sky-300\/80{color:color-mix(in oklab,var(--color-sky-300) 80%,transparent)}}.text-sky-300\/90{color:#77d4ffe6}@supports (color:color-mix(in lab,red,red)){.text-sky-300\/90{color:color-mix(in oklab,var(--color-sky-300) 90%,transparent)}}.text-sky-400{color:var(--color-sky-400)}.text-slate-300{color:var(--color-slate-300)}.text-teal-300{color:var(--color-teal-300)}.text-teal-400{color:var(--color-teal-400)}.text-transparent{color:#0000}.text-violet-200\/90{color:#ddd6ffe6}@supports (color:color-mix(in lab,red,red)){.text-violet-200\/90{color:color-mix(in oklab,var(--color-violet-200) 90%,transparent)}}.text-violet-300{color:var(--color-violet-300)}.text-violet-300\/70{color:#c4b4ffb3}@supports (color:color-mix(in lab,red,red)){.text-violet-300\/70{color:color-mix(in oklab,var(--color-violet-300) 70%,transparent)}}.text-violet-300\/80{color:#c4b4ffcc}@supports (color:color-mix(in lab,red,red)){.text-violet-300\/80{color:color-mix(in oklab,var(--color-violet-300) 80%,transparent)}}.text-violet-300\/90{color:#c4b4ffe6}@supports (color:color-mix(in lab,red,red)){.text-violet-300\/90{color:color-mix(in oklab,var(--color-violet-300) 90%,transparent)}}.text-violet-400{color:var(--color-violet-400)}.text-white{color:var(--color-white)}.capitalize{text-transform:capitalize}.lowercase{text-transform:lowercase}.normal-case{text-transform:none}.uppercase{text-transform:uppercase}.italic{font-style:italic}.not-italic{font-style:normal}.diagonal-fractions{--tw-numeric-fraction:diagonal-fractions;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.lining-nums{--tw-numeric-figure:lining-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.oldstyle-nums{--tw-numeric-figure:oldstyle-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.ordinal{--tw-ordinal:ordinal;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.proportional-nums{--tw-numeric-spacing:proportional-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.slashed-zero{--tw-slashed-zero:slashed-zero;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.stacked-fractions{--tw-numeric-fraction:stacked-fractions;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.normal-nums{font-variant-numeric:normal}.line-through{text-decoration-line:line-through}.no-underline{text-decoration-line:none}.overline{text-decoration-line:overline}.underline{text-decoration-line:underline}.decoration-primary\/40{-webkit-text-decoration-color:hsl(var(--primary));text-decoration-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.decoration-primary\/40{-webkit-text-decoration-color:color-mix(in oklab,hsl(var(--primary)) 40%,transparent);text-decoration-color:color-mix(in oklab,hsl(var(--primary)) 40%,transparent)}}.decoration-dotted{text-decoration-style:dotted}.underline-offset-2{text-underline-offset:2px}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.subpixel-antialiased{-webkit-font-smoothing:auto;-moz-osx-font-smoothing:auto}.accent-primary{accent-color:hsl(var(--primary))}.opacity-0{opacity:0}.opacity-40{opacity:.4}.opacity-60{opacity:.6}.opacity-75{opacity:.75}.opacity-80{opacity:.8}.opacity-85{opacity:.85}.opacity-90{opacity:.9}.opacity-100{opacity:1}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_0_8px_rgba\(16\,185\,129\,0\.4\)\]{--tw-shadow:0 0 8px var(--tw-shadow-color,#10b98166);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_0_8px_rgba\(239\,68\,68\,0\.4\)\]{--tw-shadow:0 0 8px var(--tw-shadow-color,#ef444466);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_0_8px_rgba\(245\,158\,11\,0\.4\)\]{--tw-shadow:0 0 8px var(--tw-shadow-color,#f59e0b66);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-inner{--tw-shadow:inset 0 2px 4px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-4{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-amber-500\/10{--tw-shadow-color:#f99c001a}@supports (color:color-mix(in lab,red,red)){.shadow-amber-500\/10{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-amber-500) 10%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-black\/15{--tw-shadow-color:#00000026}@supports (color:color-mix(in lab,red,red)){.shadow-black\/15{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-black) 15%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-black\/20{--tw-shadow-color:#0003}@supports (color:color-mix(in lab,red,red)){.shadow-black\/20{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-black) 20%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-black\/25{--tw-shadow-color:#00000040}@supports (color:color-mix(in lab,red,red)){.shadow-black\/25{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-black) 25%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-primary\/5{--tw-shadow-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.shadow-primary\/5{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, hsl(var(--primary)) 5%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-primary\/10{--tw-shadow-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.shadow-primary\/10{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, hsl(var(--primary)) 10%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-primary\/20{--tw-shadow-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.shadow-primary\/20{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, hsl(var(--primary)) 20%, transparent) var(--tw-shadow-alpha), transparent)}}.ring-background\/60{--tw-ring-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.ring-background\/60{--tw-ring-color:color-mix(in oklab, hsl(var(--background)) 60%, transparent)}}.ring-black\/40{--tw-ring-color:#0006}@supports (color:color-mix(in lab,red,red)){.ring-black\/40{--tw-ring-color:color-mix(in oklab, var(--color-black) 40%, transparent)}}.ring-white\/70{--tw-ring-color:#ffffffb3}@supports (color:color-mix(in lab,red,red)){.ring-white\/70{--tw-ring-color:color-mix(in oklab, var(--color-white) 70%, transparent)}}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.drop-shadow{--tw-drop-shadow-size:drop-shadow(0 1px 2px var(--tw-drop-shadow-color,#0000001a)) drop-shadow(0 1px 1px var(--tw-drop-shadow-color,#0000000f));--tw-drop-shadow:drop-shadow(0 1px 2px #0000001a) drop-shadow(0 1px 1px #0000000f);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.grayscale{--tw-grayscale:grayscale(100%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.invert{--tw-invert:invert(100%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.sepia{--tw-sepia:sepia(100%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur{--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-blur-md{--tw-backdrop-blur:blur(var(--blur-md));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-blur-xl{--tw-backdrop-blur:blur(var(--blur-xl));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-grayscale{--tw-backdrop-grayscale:grayscale(100%);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-invert{--tw-backdrop-invert:invert(100%);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-sepia{--tw-backdrop-sepia:sepia(100%);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition\!{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events!important;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))!important;transition-duration:var(--tw-duration,var(--default-transition-duration))!important}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.duration-500{--tw-duration:.5s;transition-duration:.5s}.ease-in{--tw-ease:var(--ease-in);transition-timing-function:var(--ease-in)}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.select-text{-webkit-user-select:text;user-select:text}:where(.divide-x-reverse>:not(:last-child)){--tw-divide-x-reverse:1}.ring-inset{--tw-ring-inset:inset}.group-open\:rotate-90:is(:where(.group):is([open],:popover-open,:open) *){rotate:90deg}@media(hover:hover){.group-hover\:translate-x-0\.5:is(:where(.group):hover *){--tw-translate-x:calc(var(--spacing) * .5);translate:var(--tw-translate-x) var(--tw-translate-y)}.group-hover\:text-foreground:is(:where(.group):hover *){color:hsl(var(--foreground))}.group-hover\:text-primary:is(:where(.group):hover *){color:hsl(var(--primary))}.group-hover\:shadow-md:is(:where(.group):hover *){--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.group-hover\:shadow-primary\/20:is(:where(.group):hover *){--tw-shadow-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.group-hover\:shadow-primary\/20:is(:where(.group):hover *){--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, hsl(var(--primary)) 20%, transparent) var(--tw-shadow-alpha), transparent)}}}.placeholder\:text-muted-foreground::placeholder,.placeholder\:text-muted-foreground\/50::placeholder{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.placeholder\:text-muted-foreground\/50::placeholder{color:color-mix(in oklab,hsl(var(--muted-foreground)) 50%,transparent)}}.first\:mt-0:first-child{margin-top:0}.first\:rounded-l-sm:first-child{border-top-left-radius:calc(var(--radius) - 4px);border-bottom-left-radius:calc(var(--radius) - 4px)}@media(hover:hover){.hover\:border-amber-500\/50:hover{border-color:#f99c0080}@supports (color:color-mix(in lab,red,red)){.hover\:border-amber-500\/50:hover{border-color:color-mix(in oklab,var(--color-amber-500) 50%,transparent)}}.hover\:border-border:hover,.hover\:border-border\/60:hover{border-color:hsl(var(--border))}@supports (color:color-mix(in lab,red,red)){.hover\:border-border\/60:hover{border-color:color-mix(in oklab,hsl(var(--border)) 60%,transparent)}}.hover\:border-emerald-500\/40:hover{border-color:#00bb7f66}@supports (color:color-mix(in lab,red,red)){.hover\:border-emerald-500\/40:hover{border-color:color-mix(in oklab,var(--color-emerald-500) 40%,transparent)}}.hover\:border-primary\/30:hover{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:border-primary\/30:hover{border-color:color-mix(in oklab,hsl(var(--primary)) 30%,transparent)}}.hover\:border-primary\/40:hover{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:border-primary\/40:hover{border-color:color-mix(in oklab,hsl(var(--primary)) 40%,transparent)}}.hover\:border-primary\/45:hover{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:border-primary\/45:hover{border-color:color-mix(in oklab,hsl(var(--primary)) 45%,transparent)}}.hover\:border-primary\/50:hover{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:border-primary\/50:hover{border-color:color-mix(in oklab,hsl(var(--primary)) 50%,transparent)}}.hover\:border-red-500\/50:hover{border-color:#fb2c3680}@supports (color:color-mix(in lab,red,red)){.hover\:border-red-500\/50:hover{border-color:color-mix(in oklab,var(--color-red-500) 50%,transparent)}}.hover\:bg-accent:hover{background-color:hsl(var(--accent))}.hover\:bg-amber-400:hover{background-color:var(--color-amber-400)}.hover\:bg-amber-500\/10:hover{background-color:#f99c001a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-amber-500\/10:hover{background-color:color-mix(in oklab,var(--color-amber-500) 10%,transparent)}}.hover\:bg-amber-500\/20:hover{background-color:#f99c0033}@supports (color:color-mix(in lab,red,red)){.hover\:bg-amber-500\/20:hover{background-color:color-mix(in oklab,var(--color-amber-500) 20%,transparent)}}.hover\:bg-background\/40:hover{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-background\/40:hover{background-color:color-mix(in oklab,hsl(var(--background)) 40%,transparent)}}.hover\:bg-background\/60:hover{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-background\/60:hover{background-color:color-mix(in oklab,hsl(var(--background)) 60%,transparent)}}.hover\:bg-background\/80:hover{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-background\/80:hover{background-color:color-mix(in oklab,hsl(var(--background)) 80%,transparent)}}.hover\:bg-card\/45:hover{background-color:hsl(var(--card))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-card\/45:hover{background-color:color-mix(in oklab,hsl(var(--card)) 45%,transparent)}}.hover\:bg-emerald-500\/10:hover{background-color:#00bb7f1a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-emerald-500\/10:hover{background-color:color-mix(in oklab,var(--color-emerald-500) 10%,transparent)}}.hover\:bg-emerald-500\/15:hover{background-color:#00bb7f26}@supports (color:color-mix(in lab,red,red)){.hover\:bg-emerald-500\/15:hover{background-color:color-mix(in oklab,var(--color-emerald-500) 15%,transparent)}}.hover\:bg-emerald-500\/20:hover{background-color:#00bb7f33}@supports (color:color-mix(in lab,red,red)){.hover\:bg-emerald-500\/20:hover{background-color:color-mix(in oklab,var(--color-emerald-500) 20%,transparent)}}.hover\:bg-muted:hover{background-color:hsl(var(--muted))}.hover\:bg-neutral-700:hover{background-color:var(--color-neutral-700)}.hover\:bg-primary:hover,.hover\:bg-primary\/10:hover{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/10:hover{background-color:color-mix(in oklab,hsl(var(--primary)) 10%,transparent)}}.hover\:bg-primary\/20:hover{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/20:hover{background-color:color-mix(in oklab,hsl(var(--primary)) 20%,transparent)}}.hover\:bg-primary\/90:hover{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab,hsl(var(--primary)) 90%,transparent)}}.hover\:bg-primary\/95:hover{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/95:hover{background-color:color-mix(in oklab,hsl(var(--primary)) 95%,transparent)}}.hover\:bg-red-500\/5:hover{background-color:#fb2c360d}@supports (color:color-mix(in lab,red,red)){.hover\:bg-red-500\/5:hover{background-color:color-mix(in oklab,var(--color-red-500) 5%,transparent)}}.hover\:bg-red-500\/10:hover{background-color:#fb2c361a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-red-500\/10:hover{background-color:color-mix(in oklab,var(--color-red-500) 10%,transparent)}}.hover\:bg-red-500\/15:hover{background-color:#fb2c3626}@supports (color:color-mix(in lab,red,red)){.hover\:bg-red-500\/15:hover{background-color:color-mix(in oklab,var(--color-red-500) 15%,transparent)}}.hover\:bg-red-500\/20:hover{background-color:#fb2c3633}@supports (color:color-mix(in lab,red,red)){.hover\:bg-red-500\/20:hover{background-color:color-mix(in oklab,var(--color-red-500) 20%,transparent)}}.hover\:bg-sky-500\/20:hover{background-color:#00a5ef33}@supports (color:color-mix(in lab,red,red)){.hover\:bg-sky-500\/20:hover{background-color:color-mix(in oklab,var(--color-sky-500) 20%,transparent)}}.hover\:bg-violet-500\/20:hover{background-color:#8d54ff33}@supports (color:color-mix(in lab,red,red)){.hover\:bg-violet-500\/20:hover{background-color:color-mix(in oklab,var(--color-violet-500) 20%,transparent)}}.hover\:text-accent-foreground:hover{color:hsl(var(--accent-foreground))}.hover\:text-amber-200:hover{color:var(--color-amber-200)}.hover\:text-emerald-300:hover{color:var(--color-emerald-300)}.hover\:text-foreground:hover,.hover\:text-foreground\/80:hover{color:hsl(var(--foreground))}@supports (color:color-mix(in lab,red,red)){.hover\:text-foreground\/80:hover{color:color-mix(in oklab,hsl(var(--foreground)) 80%,transparent)}}.hover\:text-primary:hover{color:hsl(var(--primary))}.hover\:text-primary-foreground:hover{color:hsl(var(--primary-foreground))}.hover\:text-primary\/80:hover{color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:text-primary\/80:hover{color:color-mix(in oklab,hsl(var(--primary)) 80%,transparent)}}.hover\:text-red-300:hover{color:var(--color-red-300)}.hover\:text-red-400:hover{color:var(--color-red-400)}.hover\:text-violet-200:hover{color:var(--color-violet-200)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-90:hover{opacity:.9}.hover\:opacity-100:hover{opacity:1}}.focus\:border-primary:focus,.focus\:border-primary\/50:focus{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.focus\:border-primary\/50:focus{border-color:color-mix(in oklab,hsl(var(--primary)) 50%,transparent)}}.focus\:border-red-400\/50:focus{border-color:#ff656880}@supports (color:color-mix(in lab,red,red)){.focus\:border-red-400\/50:focus{border-color:color-mix(in oklab,var(--color-red-400) 50%,transparent)}}.focus\:border-sky-400\/50:focus{border-color:#00bcfe80}@supports (color:color-mix(in lab,red,red)){.focus\:border-sky-400\/50:focus{border-color:color-mix(in oklab,var(--color-sky-400) 50%,transparent)}}.focus\:ring-1:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-primary\/50:focus{--tw-ring-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.focus\:ring-primary\/50:focus{--tw-ring-color:color-mix(in oklab, hsl(var(--primary)) 50%, transparent)}}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-ring:focus-visible{--tw-ring-color:hsl(var(--ring))}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.disabled\:cursor-default:disabled{cursor:default}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-60:disabled{opacity:.6}.aria-selected\:bg-accent[aria-selected=true]{background-color:hsl(var(--accent))}.aria-selected\:text-accent-foreground[aria-selected=true]{color:hsl(var(--accent-foreground))}@media(min-width:40rem){.sm\:flex{display:flex}.sm\:inline{display:inline}.sm\:w-36{width:calc(var(--spacing) * 36)}.sm\:w-\[640px\]{width:640px}.sm\:w-auto{width:auto}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:justify-between{justify-content:space-between}}@media(min-width:48rem){.md\:col-span-2{grid-column:span 2/span 2}.md\:flex{display:flex}.md\:hidden{display:none}.md\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-\[170px_1fr\]{grid-template-columns:170px 1fr}.md\:p-6{padding:calc(var(--spacing) * 6)}.md\:px-6{padding-inline:calc(var(--spacing) * 6)}}@media(min-width:64rem){.lg\:col-span-2{grid-column:span 2/span 2}.lg\:flex{display:flex}.lg\:w-40{width:calc(var(--spacing) * 40)}.lg\:w-72{width:calc(var(--spacing) * 72)}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-\[minmax\(0\,1fr\)_minmax\(0\,1\.3fr\)\]{grid-template-columns:minmax(0,1fr) minmax(0,1.3fr)}.lg\:flex-row{flex-direction:row}.lg\:items-stretch{align-items:stretch}}@media(min-width:80rem){.xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}@media(prefers-color-scheme:dark){.dark\:text-emerald-400{color:var(--color-emerald-400)}.dark\:text-red-400{color:var(--color-red-400)}}}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/inter-latin-400-normal-C38fXH4l.woff2)format("woff2")}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/inter-latin-500-normal-Cerq10X2.woff2)format("woff2")}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:600;src:url(/assets/inter-latin-600-normal-LgqL8muc.woff2)format("woff2")}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:700;src:url(/assets/inter-latin-700-normal-Yt3aPRUw.woff2)format("woff2")}@font-face{font-family:Space Grotesk;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/space-grotesk-latin-400-normal-CJ-V5oYT.woff2)format("woff2")}@font-face{font-family:Space Grotesk;font-style:normal;font-display:swap;font-weight:600;src:url(/assets/space-grotesk-latin-600-normal-DjKNqYRj.woff2)format("woff2")}@font-face{font-family:Space Grotesk;font-style:normal;font-display:swap;font-weight:700;src:url(/assets/space-grotesk-latin-700-normal-RjhwGPKo.woff2)format("woff2")}@font-face{font-family:JetBrains Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/jetbrains-mono-latin-400-normal-V6pRDFza.woff2)format("woff2")}@font-face{font-family:JetBrains Mono;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/jetbrains-mono-latin-500-normal-BWZEU5yA.woff2)format("woff2")}@font-face{font-family:JetBrains Mono;font-style:normal;font-display:swap;font-weight:600;src:url(/assets/jetbrains-mono-latin-600-normal-C8RAYTDA.woff2)format("woff2")}@font-face{font-family:JetBrains Mono;font-style:normal;font-display:swap;font-weight:700;src:url(/assets/jetbrains-mono-latin-700-normal-BYuf6tUa.woff2)format("woff2")}:root{--background:224 30% 6%;--foreground:210 20% 92%;--card:224 25% 10%;--card-foreground:210 20% 94%;--popover:224 28% 9%;--popover-foreground:210 20% 94%;--primary:172 72% 50%;--primary-foreground:224 47% 8%;--muted:220 16% 14%;--muted-foreground:215 14% 64%;--accent:220 16% 16%;--accent-foreground:210 20% 94%;--border:222 18% 23%;--input:222 18% 23%;--ring:172 72% 50%;--radius:.75rem;color-scheme:dark}html,body,#root{height:100dvh;overflow:hidden}body{background-color:hsl(var(--background));color:hsl(var(--foreground));font-family:var(--font-sans);-webkit-font-smoothing:antialiased;margin:0}*{border-color:hsl(var(--border) / .85);outline-color:hsl(var(--primary) / .5)}:focus-visible{outline:2px solid hsl(var(--primary) / .7);outline-offset:2px}input:focus,textarea:focus,select:focus{border-color:hsl(var(--primary));box-shadow:0 0 0 2px hsl(var(--primary) / .15);outline:none}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:hsl(var(--primary) / .25);border-radius:9999px}::-webkit-scrollbar-thumb:hover{background:hsl(var(--primary) / .5)}.mc-card{border:1px solid hsl(var(--border) / .95);background-color:hsl(var(--card) / .85);border-radius:1rem;transition:transform .3s cubic-bezier(.4,0,.2,1),background-color .3s cubic-bezier(.4,0,.2,1),border-color .3s cubic-bezier(.4,0,.2,1),box-shadow .3s cubic-bezier(.4,0,.2,1);position:relative;overflow:hidden;box-shadow:0 10px 30px -15px #00000073,inset 0 1px #ffffff0d}.mc-card:before{content:"";background:linear-gradient(90deg,hsl(var(--primary)),#6366f1,#a855f7);opacity:.75;height:3.5px;transition:opacity .3s;position:absolute;top:0;left:0;right:0}.mc-card:hover{background-color:hsl(var(--card) / .92);border-color:hsl(var(--primary) / .35);box-shadow:0 20px 40px -20px #000000a6,0 0 18px 2px hsl(var(--primary) / .05);transform:translateY(-3px)}.mc-card:hover:before{opacity:1}.mc-card-sm{border:1px solid hsl(var(--border) / .9);background-color:hsl(var(--card) / .88);border-radius:.75rem;transition:background-color .2s,border-color .2s}.mc-card-sm:hover{background-color:hsl(var(--card) / .95);border-color:hsl(var(--primary) / .3)}.nav-active{background:linear-gradient(90deg,hsl(var(--primary) / .18),#6366f11f);color:hsl(var(--primary));border-left:3.5px solid hsl(var(--primary));border-radius:0 var(--radius) var(--radius) 0;padding-left:calc(.75rem - 3.5px);box-shadow:inset 0 1px #ffffff05}.nav-active-collapsed{background:hsl(var(--primary) / .18);color:hsl(var(--primary));box-shadow:0 0 12px 1px hsl(var(--primary) / .1);border:1px solid hsl(var(--primary) / .3)}@keyframes flow-cyan{0%{stroke-dasharray:6 3;stroke-dashoffset:18px}to{stroke-dasharray:6 3;stroke-dashoffset:0}}.animate-flow-cyan{animation:1.2s linear infinite flow-cyan}@media(prefers-reduced-motion:reduce){*,:before,:after{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}}@media(min-width:1440px){html{font-size:16.5px}}@media(min-width:1920px){html{font-size:17.5px}}@media(min-width:2560px){html{font-size:19px}}@media(min-width:3440px){html{font-size:20px}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-pan-x{syntax:"*";inherits:false}@property --tw-pan-y{syntax:"*";inherits:false}@property --tw-pinch-zoom{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes ping{75%,to{opacity:0;transform:scale(2)}}@keyframes pulse{50%{opacity:.5}} diff --git a/frontend/dist/assets/layers-BVbGNbDq.js b/frontend/dist/assets/layers-DCwnbkXd.js similarity index 91% rename from frontend/dist/assets/layers-BVbGNbDq.js rename to frontend/dist/assets/layers-DCwnbkXd.js index 0591c36..41baafa 100644 --- a/frontend/dist/assets/layers-BVbGNbDq.js +++ b/frontend/dist/assets/layers-DCwnbkXd.js @@ -1,4 +1,4 @@ -import{c as a}from"./index-B57enqf6.js";/** +import{c as a}from"./index-BYlMs6Dj.js";/** * @license lucide-react v0.460.0 - ISC * * This source code is licensed under the ISC license. diff --git a/frontend/dist/assets/rotate-ccw-Bz6oQ3_7.js b/frontend/dist/assets/rotate-ccw-Dx0bZ_kA.js similarity index 88% rename from frontend/dist/assets/rotate-ccw-Bz6oQ3_7.js rename to frontend/dist/assets/rotate-ccw-Dx0bZ_kA.js index 3cdad66..5c1e8de 100644 --- a/frontend/dist/assets/rotate-ccw-Bz6oQ3_7.js +++ b/frontend/dist/assets/rotate-ccw-Dx0bZ_kA.js @@ -1,4 +1,4 @@ -import{c as t}from"./index-B57enqf6.js";/** +import{c as t}from"./index-BYlMs6Dj.js";/** * @license lucide-react v0.460.0 - ISC * * This source code is licensed under the ISC license. diff --git a/frontend/dist/assets/zap-0IkDqAhv.js b/frontend/dist/assets/zap-B_VSdjfC.js similarity index 96% rename from frontend/dist/assets/zap-0IkDqAhv.js rename to frontend/dist/assets/zap-B_VSdjfC.js index 479fa98..94aebfc 100644 --- a/frontend/dist/assets/zap-0IkDqAhv.js +++ b/frontend/dist/assets/zap-B_VSdjfC.js @@ -1,4 +1,4 @@ -import{c as a}from"./index-B57enqf6.js";/** +import{c as a}from"./index-BYlMs6Dj.js";/** * @license lucide-react v0.460.0 - ISC * * This source code is licensed under the ISC license. diff --git a/frontend/dist/index.html b/frontend/dist/index.html index 7f8fa3d..d0ff2fa 100644 --- a/frontend/dist/index.html +++ b/frontend/dist/index.html @@ -7,8 +7,8 @@ Mission Control 2.0 - - + +
diff --git a/frontend/eslint.config.js b/frontend/eslint.config.js new file mode 100644 index 0000000..3b9260b --- /dev/null +++ b/frontend/eslint.config.js @@ -0,0 +1,84 @@ +// ESLint (flat config) — v3-Umbau P1. +// +// Warum ueberhaupt: In dieses Repo schreiben nachts auch Agenten. Ohne Waechter laeuft +// der Stil auseinander, und typische React-Fehler (fehlende Hook-Abhaengigkeiten, +// bedingt aufgerufene Hooks) fallen erst im Betrieb auf. +// +// Bewusst streng bei Korrektheit, bewusst still bei Geschmack: Formatierung macht +// Prettier, nicht der Linter. Regeln, die nur Meinung sind, stehen hier nicht. + +import js from "@eslint/js" +import globals from "globals" +import reactHooks from "eslint-plugin-react-hooks" +import reactRefresh from "eslint-plugin-react-refresh" +import tseslint from "typescript-eslint" + +export default tseslint.config( + { ignores: ["dist", "node_modules", "*.config.js"] }, + + { + extends: [js.configs.recommended, ...tseslint.configs.recommended], + files: ["src/**/*.{ts,tsx}"], + languageOptions: { + ecmaVersion: 2022, + globals: globals.browser, + }, + plugins: { + "react-hooks": reactHooks, + "react-refresh": reactRefresh, + }, + rules: { + ...reactHooks.configs.recommended.rules, + "react-refresh/only-export-components": ["warn", { allowConstantExport: true }], + + // Die Regeln aus der React-Compiler-Generation (Plugin v7) finden im Bestand + // 18 echte Stellen: setState direkt im Effekt, Ref-Zugriff waehrend des Renderns, + // Komponenten im Render erzeugt. Das sind keine Fehlalarme — aber sie quer durch + // 10 000 Zeilen zu beheben ist die Arbeit von Etappe P5 (Feature-Slices), nicht + // von P1. Als Fehler waere das Gate ab Tag eins rot, und ein dauerhaft rotes Gate + // ist kein Gate mehr ("Rot ist ein Ergebnis, kein Aergernis"). + // Darum: sichtbare Warn-Liste statt stumm abgeschaltet. Beim Zerlegen eines + // Bereichs wird sein Anteil mit erledigt; ist der Zaehler bei 0, kommen sie + // hier auf "error" und der Rueckfall ist verbaut. + "react-hooks/set-state-in-effect": "warn", + "react-hooks/refs": "warn", + "react-hooks/immutability": "warn", + "react-hooks/static-components": "warn", + + // `any` ist in diesem Projekt an einigen Stellen bewusst gesetzt (Recharts-Rueckrufe, + // Fehlerobjekte in catch). Warnen statt blockieren — sonst wird die Regel abgeschaltet. + "@typescript-eslint/no-explicit-any": "warn", + + // Ungenutzte Variablen sind fast immer ein Rest von etwas Halbfertigem. + // Fuehrendes _ heisst "absichtlich ungenutzt" (Rueckrufe mit fester Signatur). + "@typescript-eslint/no-unused-vars": [ + "error", + { argsIgnorePattern: "^_", varsIgnorePattern: "^_", caughtErrorsIgnorePattern: "^_" }, + ], + + // Der Zaun um B-01: Geheimnisse gehoeren auf die Box, nicht in den Browser-Speicher. + // Wer localStorage fuer Bedienvorlieben nutzt, ist willkommen — wer ein Passwort oder + // einen Token hineinschreibt, soll hier haengen bleiben. + "no-restricted-syntax": [ + "error", + { + selector: + "CallExpression[callee.object.name='localStorage'][arguments.0.value=/(?:password|passwort|token|secret|geheim|api_?key)/i]", + message: + "Geheimnisse gehoeren nicht in den localStorage (v3-Umbau P1, Befund B-01). " + + "Auf der Box ablegen: backend/services/geheimnisse.py.", + }, + ], + }, + }, + + // Tests duerfen mehr: Attrappen brauchen `any`, und sie schreiben absichtlich + // Geheimnisse in den localStorage, um zu beweisen, dass api() sie NICHT mitschickt. + { + files: ["src/**/*.test.{ts,tsx}", "src/test/**/*.ts"], + rules: { + "@typescript-eslint/no-explicit-any": "off", + "no-restricted-syntax": "off", + }, + }, +) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index f8ef696..55715d3 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,3850 +1,6340 @@ -{ - "name": "mission-control-2-frontend", - "version": "2.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "mission-control-2-frontend", - "version": "2.0.0", - "dependencies": { - "@fontsource/inter": "^5.2.8", - "@fontsource/jetbrains-mono": "^5.2.8", - "@fontsource/space-grotesk": "^5.2.10", - "@tanstack/react-query": "^5.101.1", - "clsx": "^2.1.1", - "cmdk": "^1.1.1", - "d3-force": "^3.0.0", - "lucide-react": "^0.460.0", - "react": "^18.3.1", - "react-dom": "^18.3.1", - "react-force-graph-2d": "^1.29.1", - "recharts": "^3.9.0", - "tailwind-merge": "^2.5.5" - }, - "devDependencies": { - "@tailwindcss/vite": "^4.0.0", - "@types/d3-force": "^3.0.10", - "@types/node": "^22.10.1", - "@types/react": "^18.3.12", - "@types/react-dom": "^18.3.1", - "@vitejs/plugin-react": "^4.3.4", - "tailwindcss": "^4.0.0", - "typescript": "^5.6.3", - "vite": "^6.0.3" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", - "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.29.7", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", - "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", - "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.7", - "@babel/generator": "^7.29.7", - "@babel/helper-compilation-targets": "^7.29.7", - "@babel/helper-module-transforms": "^7.29.7", - "@babel/helpers": "^7.29.7", - "@babel/parser": "^7.29.7", - "@babel/template": "^7.29.7", - "@babel/traverse": "^7.29.7", - "@babel/types": "^7.29.7", - "@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.29.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", - "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.29.7", - "@babel/types": "^7.29.7", - "@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.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", - "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.29.7", - "@babel/helper-validator-option": "^7.29.7", - "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.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", - "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", - "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.29.7", - "@babel/types": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", - "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.29.7", - "@babel/helper-validator-identifier": "^7.29.7", - "@babel/traverse": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", - "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", - "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", - "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", - "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", - "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.29.7", - "@babel/types": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", - "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.29.7" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.29.7.tgz", - "integrity": "sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.29.7.tgz", - "integrity": "sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", - "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.7", - "@babel/parser": "^7.29.7", - "@babel/types": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", - "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.7", - "@babel/generator": "^7.29.7", - "@babel/helper-globals": "^7.29.7", - "@babel/parser": "^7.29.7", - "@babel/template": "^7.29.7", - "@babel/types": "^7.29.7", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", - "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.29.7", - "@babel/helper-validator-identifier": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", - "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", - "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", - "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", - "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", - "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", - "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", - "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", - "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", - "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", - "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", - "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", - "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", - "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", - "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", - "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", - "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", - "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", - "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", - "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", - "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", - "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", - "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", - "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", - "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", - "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", - "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@fontsource/inter": { - "version": "5.2.8", - "resolved": "https://registry.npmjs.org/@fontsource/inter/-/inter-5.2.8.tgz", - "integrity": "sha512-P6r5WnJoKiNVV+zvW2xM13gNdFhAEpQ9dQJHt3naLvfg+LkF2ldgSLiF4T41lf1SQCM9QmkqPTn4TH568IRagg==", - "license": "OFL-1.1", - "funding": { - "url": "https://github.com/sponsors/ayuhito" - } - }, - "node_modules/@fontsource/jetbrains-mono": { - "version": "5.2.8", - "resolved": "https://registry.npmjs.org/@fontsource/jetbrains-mono/-/jetbrains-mono-5.2.8.tgz", - "integrity": "sha512-6w8/SG4kqvIMu7xd7wt6x3idn1Qux3p9N62s6G3rfldOUYHpWcc2FKrqf+Vo44jRvqWj2oAtTHrZXEP23oSKwQ==", - "license": "OFL-1.1", - "funding": { - "url": "https://github.com/sponsors/ayuhito" - } - }, - "node_modules/@fontsource/space-grotesk": { - "version": "5.2.10", - "resolved": "https://registry.npmjs.org/@fontsource/space-grotesk/-/space-grotesk-5.2.10.tgz", - "integrity": "sha512-XNXEbT74OIITPqw2H6HXwPDp85fy43uxfBwFR5PU+9sLnjuLj12KlhVM9nZVN6q6dlKjkuN8JisW/OBxwxgUew==", - "license": "OFL-1.1", - "funding": { - "url": "https://github.com/sponsors/ayuhito" - } - }, - "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, - "license": "MIT", - "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, - "license": "MIT", - "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, - "license": "MIT", - "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, - "license": "MIT" - }, - "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, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@radix-ui/primitive": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.4.tgz", - "integrity": "sha512-7AdCK9PQyiljKoBDbN8OuctCbd/esdwZPQ8RtOE3SsyQtUpiPb+ND75q0jEhC1m1ecBI0MFNeLJvwIh9iKHRcQ==", - "license": "MIT" - }, - "node_modules/@radix-ui/react-compose-refs": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.3.tgz", - "integrity": "sha512-rYOP8OMnuuPMQF1uhPVlGNcCDlkokKqGFE3JcxFViIkAXP7EvFWUliJAstrapypaBLJNHbZL6jGhbVDGTwmVhA==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-context": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.4.tgz", - "integrity": "sha512-QwH4PO5urrbO+FaGd5Aglg+YJgWTyyuZ3g/6mKvsqraLkglDdckw9JafgL5McL5VEJ6EPNduPaT3ZE9BttDAqg==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dialog": { - "version": "1.1.17", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.17.tgz", - "integrity": "sha512-TDTYmpdq8dI2+Xgvgj9AJ8Ghqq+Eph/TRVEdaFQPDItIY+6QSkU7MJMeevw1568Yw/2Ijz8BTphPSP2XejKphw==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-dismissable-layer": "1.1.13", - "@radix-ui/react-focus-guards": "1.1.4", - "@radix-ui/react-focus-scope": "1.1.10", - "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-portal": "1.1.12", - "@radix-ui/react-presence": "1.1.6", - "@radix-ui/react-primitive": "2.1.6", - "@radix-ui/react-slot": "1.3.0", - "@radix-ui/react-use-controllable-state": "1.2.3", - "aria-hidden": "^1.2.4", - "react-remove-scroll": "^2.7.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.13.tgz", - "integrity": "sha512-2v+zNAWWe0ySxgC0D0yeXMPQ23xZVgXZTerTz+JKlmdRj6gfTqmCcR29jb6d290DezXPGgruHWDX/vYUebtErg==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-primitive": "2.1.6", - "@radix-ui/react-use-callback-ref": "1.1.2", - "@radix-ui/react-use-escape-keydown": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-focus-guards": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.4.tgz", - "integrity": "sha512-cot/aB/mOm0IYVYTTmQcEEK1M48lZWi8FlYe5nDPQQ8NYZUlXEFgncJ9p2Kzer3RKSrY7cTTpEMLZKNo9QoP5Q==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-focus-scope": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.10.tgz", - "integrity": "sha512-Fas/lXQqhVvqwAb64s5RFeHiHYElZ6SUQbZaNd6EkfhP/Al7wTIQ9WIR4QVX475tlu5yFCEdDcJH6/UwsZjMWw==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-primitive": "2.1.6", - "@radix-ui/react-use-callback-ref": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-id": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.2.tgz", - "integrity": "sha512-orBC88futVpqCmhX1p4cvquNHsELQ+w+vBJnuj3ftETI5bJb0bZn3Tqu3SWN2IOcPycTnMGnhwoermvISt72sA==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-portal": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.12.tgz", - "integrity": "sha512-m309havGzsjLHHaIX50G5PlvRs3xkgPCsGk/5PTvYm8D5q33yG0J7w/712PTOhid7NTaFETtnSXjngHQavvhVw==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.6", - "@radix-ui/react-use-layout-effect": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-presence": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.6.tgz", - "integrity": "sha512-zdTk4PlUO0E18HnZ3wYbW0KkJJxWCdiNYp6g6X1PtONFhxVkg01vliTJAmwIszU6mHiyBOoW9P0rAugl5/hULQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-primitive": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.6.tgz", - "integrity": "sha512-wetd0QI77DbvrPpTAvH1SqOxsYF2wZe5TNxqwOd5Ty4XDpV3dpV0s8K/1MGMJBeY5o7lg8ub5VIt1Ub+yVen6g==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.3.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-slot": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.3.0.tgz", - "integrity": "sha512-MojKku4U/miO8Av4Dkb+ctMAQx7JmY96LmtDQlAarCRtd7rN52QCSzBF+XAvr5S6coSVj9HEPBgHAHKEJVk/WA==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.3" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-callback-ref": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.2.tgz", - "integrity": "sha512-xCso9j1/u8sEgP1RNHjFrXJLApL8LiqOkI1R4ywuN00rxWdYg4oQXuwKLS3i0j5NWLromUD27/4nlxj2UFVvIw==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-controllable-state": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.3.tgz", - "integrity": "sha512-PLzC90MS+ReootmjC597dvopoelpZ8Q61HJkDXZSExitIq7PL55vHNnesAHwguHK0aPfBnpdNzQtv1uliaqQrA==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-effect-event": "0.0.3", - "@radix-ui/react-use-layout-effect": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-effect-event": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.3.tgz", - "integrity": "sha512-6c8ZqvPTWILEKnyVkP53EGRCcpnJiKTC21sS/6R1GF5xKyHJJWQEPfkqlcgUkdRQivd6tb23abUwe4ngWmY0JA==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-escape-keydown": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.2.tgz", - "integrity": "sha512-2uVLvLjgO7NZCWw01/FdqRwmA42J0BcjPMUCA+koFEOAb+zjqIP7SiFz/7zWPrKnVmSqr76Omq2ALyCuX4dhLw==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-callback-ref": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.2.tgz", - "integrity": "sha512-jrBWOxZITuGcnjRCM2t2U5ZPkCLxD+Ym6DjfssS5haTj2iiak/DOb64JeN6OdLfLgptb6/e2kKR+ZuTrGoZTPA==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@reduxjs/toolkit": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.12.0.tgz", - "integrity": "sha512-KiT+RzZbp6mQET+Mg+h2c97+9j1sNflUxQkIHI7Yuzf6Peu+OYpmkn6nbHWmLLWj+1ZODUJFwGZ7gx3L9R9EOw==", - "license": "MIT", - "dependencies": { - "@standard-schema/spec": "^1.0.0", - "@standard-schema/utils": "^0.3.0", - "immer": "^11.0.0", - "redux": "^5.0.1", - "redux-thunk": "^3.1.0", - "reselect": "^5.1.0" - }, - "peerDependencies": { - "react": "^16.9.0 || ^17.0.0 || ^18 || ^19", - "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" - }, - "peerDependenciesMeta": { - "react": { - "optional": true - }, - "react-redux": { - "optional": true - } - } - }, - "node_modules/@reduxjs/toolkit/node_modules/immer": { - "version": "11.1.8", - "resolved": "https://registry.npmjs.org/immer/-/immer-11.1.8.tgz", - "integrity": "sha512-/tbkHMW7y10Lx6i1crLjD4/OhNkRG+Fo7byZHtah0547nIeXYcpIXaUh0IAQY6gO5459qpGGYapcEOHtFXkIuA==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/immer" - } - }, - "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, - "license": "MIT" - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.2.tgz", - "integrity": "sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.2.tgz", - "integrity": "sha512-BaH7BllCACHoH1LguOU56UItGfUWjujlO65kS9LAodViaN4bwIKd7oeW/ZHJ/4ljr/7MIiENnNy3HJ0zXv8Zkw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.2.tgz", - "integrity": "sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.2.tgz", - "integrity": "sha512-yl0y2vq3S3lHeuXhEdss6TWfKW8vkujImO12tn4ZkG/4oghr09LvdYm2RElVjokTQiUvDUGXLGsYeLqUMCKpGA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.2.tgz", - "integrity": "sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.2.tgz", - "integrity": "sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.2.tgz", - "integrity": "sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg==", - "cpu": [ - "arm" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.2.tgz", - "integrity": "sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA==", - "cpu": [ - "arm" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.2.tgz", - "integrity": "sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.2.tgz", - "integrity": "sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.2.tgz", - "integrity": "sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg==", - "cpu": [ - "loong64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.2.tgz", - "integrity": "sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.2.tgz", - "integrity": "sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A==", - "cpu": [ - "ppc64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.2.tgz", - "integrity": "sha512-CjvEnqJL/0/TQ3TXX3OPIJ/kmBellrWd4heXUmHeJlTnmwjKpSJzoehLaL6Xk0ZnMHBu9dZuFADNOrtjF4v+2w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.2.tgz", - "integrity": "sha512-1SiZbzwdkaDURsew/tSOrooKiYy7EQGT6m8ufavAi9NEyQb/6VuIxFXAL1fqa4iZe3g4NbNk4P7J32z2tw5Mgg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.2.tgz", - "integrity": "sha512-nQts12zJ3NQRoE6uYljOH89v7szzLDvG2JD/vsX+vGXU8w/At1GowTZ5/7qeFQ8m7L55rpR8Okugnuo5bgjy2Q==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.2.tgz", - "integrity": "sha512-E9/ll019jhPIJgpzfZoIkBGhcz+kKNgVWYRY0zr9srBdPPFVpvOKW8VaJKUbeK+eZXyQF9ltME+Kk6affeaPgg==", - "cpu": [ - "s390x" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.2.tgz", - "integrity": "sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.2.tgz", - "integrity": "sha512-uNN83XxQrRAh/w0/pmAfibcwyb6YWt4gP+dpnQKPVJshAloQ785ii8CT8ZCIxkGg9opVsvAlGhFitSm6D1Jjpg==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.2.tgz", - "integrity": "sha512-srjEIxSH3LRnJN6THczDHWQplqEMFiAJrTab0msUryh9kwNpkICf3Ea6q6MN/2cZwRFUNx5w+h6Hpi4QuHS6Zg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ] - }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.2.tgz", - "integrity": "sha512-8hOJnxgbyObnCm5AlRA3A931xX19xq80RjVTKgJOvEKWqJruP/Uf12IbAOaDjjEXYRewwHLfmF0YRIdK3OwKWA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.2.tgz", - "integrity": "sha512-mmF4AY1i0hG/bLWUctUq59gtmgaSIRa3cu/A3JFRp/sCNEme2bgDEiDS22P9FbnJB8NJNF4jPJiSP5RHQpUTDg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.2.tgz", - "integrity": "sha512-DZgkknc6jhHrk46V25vbAM0zZkyP0nSDkJB8/dRkLTxv470dOmWDqGoEJl/9A0dFfS7yE3REOwNDxpHwSLSt0Q==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.2.tgz", - "integrity": "sha512-T6xr6ucWSFto+VGajA8YH26LdpHRuP4YLHEKAtCWvJDOlnmWcDZVCI2Jmjr+IFHDlt2zRaTAKE4tfjTaWLgJBg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.2.tgz", - "integrity": "sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@standard-schema/spec": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", - "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", - "license": "MIT" - }, - "node_modules/@standard-schema/utils": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@standard-schema/utils/-/utils-0.3.0.tgz", - "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==", - "license": "MIT" - }, - "node_modules/@tailwindcss/node": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.1.tgz", - "integrity": "sha512-6NDaqRoAMSXD1mr/RXu0HBvNE9a2n5tHPsxu9XHLws8o4Twes5rBM2205SUUiJ9goAtadrN6xTGX0UDEwp/N4A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/remapping": "^2.3.5", - "enhanced-resolve": "5.21.6", - "jiti": "^2.7.0", - "lightningcss": "1.32.0", - "magic-string": "^0.30.21", - "source-map-js": "^1.2.1", - "tailwindcss": "4.3.1" - } - }, - "node_modules/@tailwindcss/oxide": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.1.tgz", - "integrity": "sha512-yVPyo8RNkabVr3O2EhHEE0Rewu7YKzc1DhIqfL46LKveFrmu9XbDazNOJY7/GRuvw1h6u3utWnR29H/p5JPlgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 20" - }, - "optionalDependencies": { - "@tailwindcss/oxide-android-arm64": "4.3.1", - "@tailwindcss/oxide-darwin-arm64": "4.3.1", - "@tailwindcss/oxide-darwin-x64": "4.3.1", - "@tailwindcss/oxide-freebsd-x64": "4.3.1", - "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.1", - "@tailwindcss/oxide-linux-arm64-gnu": "4.3.1", - "@tailwindcss/oxide-linux-arm64-musl": "4.3.1", - "@tailwindcss/oxide-linux-x64-gnu": "4.3.1", - "@tailwindcss/oxide-linux-x64-musl": "4.3.1", - "@tailwindcss/oxide-wasm32-wasi": "4.3.1", - "@tailwindcss/oxide-win32-arm64-msvc": "4.3.1", - "@tailwindcss/oxide-win32-x64-msvc": "4.3.1" - } - }, - "node_modules/@tailwindcss/oxide-android-arm64": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.1.tgz", - "integrity": "sha512-SVlyf61g374l5cHyg8x9kf5xmLcOaxvOTsbsqDnSsDJaKOEFZ7GCvi84VAVGpxojYOs1+3K6M0UjXfqPU8vmOQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-darwin-arm64": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.1.tgz", - "integrity": "sha512-hVnWLwv+e/l7c4WKyVtHVrIPvYdqWHjRB3MDIqARynzFtnQg85kmQEFCbV9Ja0VVx4xXTIiDWY60Y7iz/iNoDA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-darwin-x64": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.1.tgz", - "integrity": "sha512-Cf7abu0WVgbhU7ANgPUnSAvm7nCvMweusHb8FnaHlLfv/Caq4GYaEZg7ZImzzmjx4lIAfuS8q+eLIS7A7IzxIg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-freebsd-x64": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.1.tgz", - "integrity": "sha512-ZZqzX2Y+GXtXXfqSfpJhDm60OoZfvLHLCgm+J7NVqgHHJjG/m9ugZI77RwTsVd4fnBJuCFP6Ae6kTJb71UdS8g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.1.tgz", - "integrity": "sha512-/Ah/xik0LaMYfv9DZ0S/t4pBlBNYOcqtRwusjgovHkvT8ixueWCLyJjsaF5kQIckjb4IT8Q6K6p/iPmZMixYgg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.1.tgz", - "integrity": "sha512-gqdFoVJlw444GvpnheZLHmvTzSxI/cOUUh2KSNejQjTcYkW062SVD+En0rUgD+QV91bz1XGIGtt1HJd48xUGbQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-linux-arm64-musl": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.1.tgz", - "integrity": "sha512-Bwv9KwOvE0VKa86xPFif9b9c3Y1NxOV1P0gLti/IYaWEsQYZXDlxfGEtA8mdDZ7SG3wyNXAWYT5SIn3giL57oA==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-linux-x64-gnu": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.1.tgz", - "integrity": "sha512-Ymi8O8T15HYQdOUWUtTI6ldN0neHP85FC+Qz32xTcZ7iJXtem/x8ITev0o1e9e5rkqj4lONZfTRLvkmin1+tKg==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-linux-x64-musl": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.1.tgz", - "integrity": "sha512-M+P/91qJ6uILLw4k2G93GMDRAXj61SMvFQYt39AqvUqYgExXpLL5aepfns7sj4HiAQeolirQF9E0lzRvdf4zPQ==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-wasm32-wasi": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.1.tgz", - "integrity": "sha512-zsM8uOeqvVGHsAXsJxsT28ttosFahLJKCLOTUBqRAtKnVgGSRitds9T432QiT8b77Yga7JIBkulIRRlJPtYhRA==", - "bundleDependencies": [ - "@napi-rs/wasm-runtime", - "@emnapi/core", - "@emnapi/runtime", - "@tybys/wasm-util", - "@emnapi/wasi-threads", - "tslib" - ], - "cpu": [ - "wasm32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "^1.10.0", - "@emnapi/runtime": "^1.10.0", - "@emnapi/wasi-threads": "^1.2.1", - "@napi-rs/wasm-runtime": "^1.1.4", - "@tybys/wasm-util": "^0.10.2", - "tslib": "^2.8.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.1.tgz", - "integrity": "sha512-aiNvSq9BsVk8V513lDKlrCFAgf8qBMPZTpgEhInL+NwQqs97mYmupVMrPrgBBSL8Pv/0zXu9MrMF9rMun1ZeNg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-win32-x64-msvc": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.1.tgz", - "integrity": "sha512-xDEyu1rg290472FEGaKHnzyDyh5QH+AlWvsU5hMoMtPpzmKlRI0jaYKCgSHDYtaQWZOYbMaduSyCwFwY4n1HmA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/vite": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.3.1.tgz", - "integrity": "sha512-hItDHuIIlEV61R+faXu66s1K36aTurO/Qw0e45Vskz57gXl9pWOT6eg3zmcEui6CZXddbN7zd41bwmvag4JGwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@tailwindcss/node": "4.3.1", - "@tailwindcss/oxide": "4.3.1", - "tailwindcss": "4.3.1" - }, - "peerDependencies": { - "vite": "^5.2.0 || ^6 || ^7 || ^8" - } - }, - "node_modules/@tanstack/query-core": { - "version": "5.101.1", - "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.101.1.tgz", - "integrity": "sha512-Y6Y92dkXtNqx67m2pMSxUsA3zOCwv862JexZRP8/EPwvKXMPu9m8rv43spiXWzOUIggQ3SQApttALStzhA8B4g==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - } - }, - "node_modules/@tanstack/react-query": { - "version": "5.101.1", - "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.101.1.tgz", - "integrity": "sha512-ZnONUuQKJe1bJMStXUL1s5uKN9FcfC28j5cK+iDZcdSHtUv1wtin1cGc/Oewhf2Oc4eKY7lggtpvT/AbMmhHew==", - "license": "MIT", - "dependencies": { - "@tanstack/query-core": "5.101.1" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "react": "^18 || ^19" - } - }, - "node_modules/@tweenjs/tween.js": { - "version": "23.1.3", - "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-23.1.3.tgz", - "integrity": "sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==", - "license": "MIT" - }, - "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, - "license": "MIT", - "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, - "license": "MIT", - "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, - "license": "MIT", - "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, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.2" - } - }, - "node_modules/@types/d3-array": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", - "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==", - "license": "MIT" - }, - "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==", - "license": "MIT" - }, - "node_modules/@types/d3-ease": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", - "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", - "license": "MIT" - }, - "node_modules/@types/d3-force": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz", - "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==", - "dev": true, - "license": "MIT" - }, - "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==", - "license": "MIT", - "dependencies": { - "@types/d3-color": "*" - } - }, - "node_modules/@types/d3-path": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", - "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", - "license": "MIT" - }, - "node_modules/@types/d3-scale": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", - "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", - "license": "MIT", - "dependencies": { - "@types/d3-time": "*" - } - }, - "node_modules/@types/d3-shape": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.8.tgz", - "integrity": "sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==", - "license": "MIT", - "dependencies": { - "@types/d3-path": "*" - } - }, - "node_modules/@types/d3-time": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", - "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", - "license": "MIT" - }, - "node_modules/@types/d3-timer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", - "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", - "license": "MIT" - }, - "node_modules/@types/estree": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", - "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "22.20.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.0.tgz", - "integrity": "sha512-QWlFW2wf3nTjC13/DqRnBpR4ZO36VJH/JVBkA/vcnmbTBNQIlnObqyqZE1tUR7+Ni23Lda8R1BxMfbXRpCUx5g==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" - } - }, - "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, - "license": "MIT" - }, - "node_modules/@types/react": { - "version": "18.3.31", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.31.tgz", - "integrity": "sha512-vfEqpXTvwT91yhmwdfouStN2hSKwTvyRs8qpLfADyrq/kxDw0hZM7Wk9Ug1FELj8hIby+S/+kQCSRFF32nv2Qw==", - "devOptional": true, - "license": "MIT", - "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==", - "devOptional": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "^18.0.0" - } - }, - "node_modules/@types/use-sync-external-store": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz", - "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==", - "license": "MIT" - }, - "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, - "license": "MIT", - "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/accessor-fn": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/accessor-fn/-/accessor-fn-1.5.3.tgz", - "integrity": "sha512-rkAofCwe/FvYFUlMB0v0gWmhqtfAtV1IUkdPbfhTUyYniu5LrC0A0UJkTH0Jv3S8SvwkmfuAlY+mQIJATdocMA==", - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/aria-hidden": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", - "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/baseline-browser-mapping": { - "version": "2.10.38", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.38.tgz", - "integrity": "sha512-31/02mVB4yuQU6adKk5SlY6m+mxDwUq5KZkyYgnLrrKl7TEm1+3PyDtDBz2kOv/wxZz41GHsvV1A/u6RmiyBvw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.cjs" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/bezier-js": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/bezier-js/-/bezier-js-6.1.4.tgz", - "integrity": "sha512-PA0FW9ZpcHbojUCMu28z9Vg/fNkwTj5YhusSAjHHDfHDGLxJ6YUKrAN2vk1fP2MMOxVw4Oko16FMlRGVBGqLKg==", - "license": "MIT", - "funding": { - "type": "individual", - "url": "https://github.com/Pomax/bezierjs/blob/master/FUNDING.md" - } - }, - "node_modules/browserslist": { - "version": "4.28.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.4.tgz", - "integrity": "sha512-MTc8i/x9jBQd1iMw2CFGS+rwMa07eYjLR0CCTLDACl9xhxy+nIs3KeML/biicXtk9JrZ6dnnTatmc7ErPXIxqw==", - "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" - } - ], - "license": "MIT", - "dependencies": { - "baseline-browser-mapping": "^2.10.38", - "caniuse-lite": "^1.0.30001799", - "electron-to-chromium": "^1.5.376", - "node-releases": "^2.0.48", - "update-browserslist-db": "^1.2.3" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001799", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001799.tgz", - "integrity": "sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw==", - "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" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/canvas-color-tracker": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/canvas-color-tracker/-/canvas-color-tracker-1.3.2.tgz", - "integrity": "sha512-ryQkDX26yJ3CXzb3hxUVNlg1NKE4REc5crLBq661Nxzr8TNd236SaEf2ffYLXyI5tSABSeguHLqcVq4vf9L3Zg==", - "license": "MIT", - "dependencies": { - "tinycolor2": "^1.6.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/cmdk": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/cmdk/-/cmdk-1.1.1.tgz", - "integrity": "sha512-Vsv7kFaXm+ptHDMZ7izaRsP70GgrW9NBNGswt9OZaVBLlE0SNpDq8eu/VGXyF9r7M0azK3Wy7OlYXsuyYLFzHg==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "^1.1.1", - "@radix-ui/react-dialog": "^1.1.6", - "@radix-ui/react-id": "^1.1.0", - "@radix-ui/react-primitive": "^2.0.2" - }, - "peerDependencies": { - "react": "^18 || ^19 || ^19.0.0-rc", - "react-dom": "^18 || ^19 || ^19.0.0-rc" - } - }, - "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, - "license": "MIT" - }, - "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, - "license": "MIT" - }, - "node_modules/d3-array": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", - "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", - "license": "ISC", - "dependencies": { - "internmap": "1 - 2" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-binarytree": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/d3-binarytree/-/d3-binarytree-1.0.2.tgz", - "integrity": "sha512-cElUNH+sHu95L04m92pG73t2MEJXKu+GeKUN1TJkFsu93E5W8E9Sc3kHEGJKgenGvj19m6upSn2EunvMgMD2Yw==", - "license": "MIT" - }, - "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==", - "license": "ISC", - "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==", - "license": "ISC", - "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==", - "license": "ISC", - "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==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-force": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", - "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", - "license": "ISC", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-quadtree": "1 - 3", - "d3-timer": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-force-3d": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/d3-force-3d/-/d3-force-3d-3.0.6.tgz", - "integrity": "sha512-4tsKHUPLOVkyfEffZo1v6sFHvGFwAIIjt/W8IThbp08DYAsXZck+2pSHEG5W1+gQgEvFLdZkYvmJAbRM2EzMnA==", - "license": "MIT", - "dependencies": { - "d3-binarytree": "1", - "d3-dispatch": "1 - 3", - "d3-octree": "1", - "d3-quadtree": "1 - 3", - "d3-timer": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-format": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz", - "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==", - "license": "ISC", - "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==", - "license": "ISC", - "dependencies": { - "d3-color": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-octree": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/d3-octree/-/d3-octree-1.1.0.tgz", - "integrity": "sha512-F8gPlqpP+HwRPMO/8uOu5wjH110+6q4cgJvgJT6vlpy3BEaDIKlTZrgHKZSp/i1InRpVfh4puY/kvL6MxK930A==", - "license": "MIT" - }, - "node_modules/d3-path": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", - "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-quadtree": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", - "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-scale": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", - "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", - "license": "ISC", - "dependencies": { - "d3-array": "2.10.0 - 3", - "d3-format": "1 - 3", - "d3-interpolate": "1.2.0 - 3", - "d3-time": "2.1.1 - 3", - "d3-time-format": "2 - 4" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-scale-chromatic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", - "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", - "license": "ISC", - "dependencies": { - "d3-color": "1 - 3", - "d3-interpolate": "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==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-shape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", - "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", - "license": "ISC", - "dependencies": { - "d3-path": "^3.1.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-time": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", - "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", - "license": "ISC", - "dependencies": { - "d3-array": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-time-format": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", - "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", - "license": "ISC", - "dependencies": { - "d3-time": "1 - 3" - }, - "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==", - "license": "ISC", - "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==", - "license": "ISC", - "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==", - "license": "ISC", - "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, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decimal.js-light": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", - "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==", - "license": "MIT" - }, - "node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-node-es": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", - "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", - "license": "MIT" - }, - "node_modules/electron-to-chromium": { - "version": "1.5.378", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.378.tgz", - "integrity": "sha512-VinvOAuuPmdD1guEgGv5f2Qp7/vlfqOrUOMYNnOD4wj3pit8kRsQHzfIf6teyUGWo15Tg5+bOJaRunvyltpVWQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/enhanced-resolve": { - "version": "5.21.6", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.6.tgz", - "integrity": "sha512-aNnGCvbJ/RIyWo1IuhNdVjnNF+EjH9wpzpNHt+ci/m9He9LJvUN8wrCcXjp9cWsGNAuvSpVFTx/vraAFQ8qGjQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.3.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/es-toolkit": { - "version": "1.49.0", - "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.49.0.tgz", - "integrity": "sha512-G5iZ6Pc/FNRY/soKZHC+TxGDD83rHUDXxzaWhGCX44vAv/tMs56WMusnm/KMNK+luUPsgA9U28cGr4RDlSzL2g==", - "license": "MIT", - "workspaces": [ - "docs", - "benchmarks" - ] - }, - "node_modules/esbuild": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", - "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.12", - "@esbuild/android-arm": "0.25.12", - "@esbuild/android-arm64": "0.25.12", - "@esbuild/android-x64": "0.25.12", - "@esbuild/darwin-arm64": "0.25.12", - "@esbuild/darwin-x64": "0.25.12", - "@esbuild/freebsd-arm64": "0.25.12", - "@esbuild/freebsd-x64": "0.25.12", - "@esbuild/linux-arm": "0.25.12", - "@esbuild/linux-arm64": "0.25.12", - "@esbuild/linux-ia32": "0.25.12", - "@esbuild/linux-loong64": "0.25.12", - "@esbuild/linux-mips64el": "0.25.12", - "@esbuild/linux-ppc64": "0.25.12", - "@esbuild/linux-riscv64": "0.25.12", - "@esbuild/linux-s390x": "0.25.12", - "@esbuild/linux-x64": "0.25.12", - "@esbuild/netbsd-arm64": "0.25.12", - "@esbuild/netbsd-x64": "0.25.12", - "@esbuild/openbsd-arm64": "0.25.12", - "@esbuild/openbsd-x64": "0.25.12", - "@esbuild/openharmony-arm64": "0.25.12", - "@esbuild/sunos-x64": "0.25.12", - "@esbuild/win32-arm64": "0.25.12", - "@esbuild/win32-ia32": "0.25.12", - "@esbuild/win32-x64": "0.25.12" - } - }, - "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, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/eventemitter3": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", - "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", - "license": "MIT" - }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/float-tooltip": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/float-tooltip/-/float-tooltip-1.7.5.tgz", - "integrity": "sha512-/kXzuDnnBqyyWyhDMH7+PfP8J/oXiAavGzcRxASOMRHFuReDtofizLLJsf7nnDLAfEaMW4pVWaXrAjtnglpEkg==", - "license": "MIT", - "dependencies": { - "d3-selection": "2 - 3", - "kapsule": "^1.16", - "preact": "10" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/force-graph": { - "version": "1.51.4", - "resolved": "https://registry.npmjs.org/force-graph/-/force-graph-1.51.4.tgz", - "integrity": "sha512-TdJ2KbkoiDQ7NIRx8IPGD0mAXXpLhamS7c+b7W98b0MHG7lphnda1VOQX/98UDTsttIAdH4TcP0l0MauSnLK8w==", - "license": "MIT", - "dependencies": { - "@tweenjs/tween.js": "18 - 25", - "accessor-fn": "1", - "bezier-js": "3 - 6", - "canvas-color-tracker": "^1.3", - "d3-array": "1 - 3", - "d3-drag": "2 - 3", - "d3-force-3d": "2 - 3", - "d3-scale": "1 - 4", - "d3-scale-chromatic": "1 - 3", - "d3-selection": "2 - 3", - "d3-zoom": "2 - 3", - "float-tooltip": "^1.7", - "index-array-by": "1", - "kapsule": "^1.16", - "lodash-es": "4" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "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, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-nonce": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", - "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/immer": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/immer/-/immer-10.2.0.tgz", - "integrity": "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/immer" - } - }, - "node_modules/index-array-by": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/index-array-by/-/index-array-by-1.4.2.tgz", - "integrity": "sha512-SP23P27OUKzXWEC/TOyWlwLviofQkCSCKONnc62eItjp69yCZZPqDQtr3Pw5gJDnPeUMqExmKydNZaJO0FU9pw==", - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/internmap": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", - "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/jerrypick": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/jerrypick/-/jerrypick-1.1.2.tgz", - "integrity": "sha512-YKnxXEekXKzhpf7CLYA0A+oDP8V0OhICNCr5lv96FvSsDEmrb0GKM776JgQvHTMjr7DTTPEVv/1Ciaw0uEWzBA==", - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/jiti": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", - "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", - "dev": true, - "license": "MIT", - "bin": { - "jiti": "lib/jiti-cli.mjs" - } - }, - "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==", - "license": "MIT" - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true, - "license": "MIT", - "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, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/kapsule": { - "version": "1.16.3", - "resolved": "https://registry.npmjs.org/kapsule/-/kapsule-1.16.3.tgz", - "integrity": "sha512-4+5mNNf4vZDSwPhKprKwz3330iisPrb08JyMgbsdFrimBCKNHecua/WBwvVg3n7vwx0C1ARjfhwIpbrbd9n5wg==", - "license": "MIT", - "dependencies": { - "lodash-es": "4" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/lightningcss": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", - "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "detect-libc": "^2.0.3" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "lightningcss-android-arm64": "1.32.0", - "lightningcss-darwin-arm64": "1.32.0", - "lightningcss-darwin-x64": "1.32.0", - "lightningcss-freebsd-x64": "1.32.0", - "lightningcss-linux-arm-gnueabihf": "1.32.0", - "lightningcss-linux-arm64-gnu": "1.32.0", - "lightningcss-linux-arm64-musl": "1.32.0", - "lightningcss-linux-x64-gnu": "1.32.0", - "lightningcss-linux-x64-musl": "1.32.0", - "lightningcss-win32-arm64-msvc": "1.32.0", - "lightningcss-win32-x64-msvc": "1.32.0" - } - }, - "node_modules/lightningcss-android-arm64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", - "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-arm64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", - "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-x64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", - "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-freebsd-x64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", - "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", - "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", - "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", - "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", - "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-musl": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", - "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", - "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", - "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lodash-es": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz", - "integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==", - "license": "MIT" - }, - "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==", - "license": "MIT", - "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, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/lucide-react": { - "version": "0.460.0", - "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.460.0.tgz", - "integrity": "sha512-BVtq/DykVeIvRTJvRAgCsOwaGL8Un3Bxh8MbDxMhEWlZay3T4IpEKDEpwt5KZ0KJMHzgm6jrltxlT5eXOWXDHg==", - "license": "ISC", - "peerDependencies": { - "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc" - } - }, - "node_modules/magic-string": { - "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, - "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, - "license": "MIT" - }, - "node_modules/nanoid": { - "version": "3.3.15", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.15.tgz", - "integrity": "sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/node-releases": { - "version": "2.0.49", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.49.tgz", - "integrity": "sha512-f06bl1D+8ZDkn2oOQQKAh5/otFWqVnM1Q5oerA8Pex7UfT66Tx4IPHIqVVFKqFT3FUtaDstdgkM7yT7JWhqxfw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "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, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/postcss": { - "version": "8.5.15", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", - "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", - "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" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.12", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/preact": { - "version": "10.29.7", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.29.7.tgz", - "integrity": "sha512-DCHYrK/B10yUD3ZjLfhZ3WIE/9Vf9VFUODcRE2dRomTYDpJk6z6L9wecSfhfE6M9ZTHUdyQkoC46arIDhEV84Q==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/preact" - }, - "peerDependencies": { - "preact-render-to-string": ">=5" - }, - "peerDependenciesMeta": { - "preact-render-to-string": { - "optional": true - } - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "license": "MIT" - }, - "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==", - "license": "MIT", - "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==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" - }, - "peerDependencies": { - "react": "^18.3.1" - } - }, - "node_modules/react-force-graph-2d": { - "version": "1.29.1", - "resolved": "https://registry.npmjs.org/react-force-graph-2d/-/react-force-graph-2d-1.29.1.tgz", - "integrity": "sha512-1Rl/1Z3xy2iTHKj6a0jRXGyiI86xUti81K+jBQZ+Oe46csaMikp47L5AjrzA9hY9fNGD63X8ffrqnvaORukCuQ==", - "license": "MIT", - "dependencies": { - "force-graph": "^1.51", - "prop-types": "15", - "react-kapsule": "^2.5" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "react": "*" - } - }, - "node_modules/react-is": { - "version": "19.2.7", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.7.tgz", - "integrity": "sha512-kZFnouyVv7eP/Phmrlo9FK+zcAdriZJvzxXHF1Sl1P377WSGe2G/JxVolhTrB/jeV47lKImhNUsijjHAAbcl/A==", - "license": "MIT", - "peer": true - }, - "node_modules/react-kapsule": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/react-kapsule/-/react-kapsule-2.6.0.tgz", - "integrity": "sha512-HzLJoYb1n1kfwjXbqFFcRR0EA6oPsJ64tNdDmCSaL/bz2o9wUZRSb0cMe//grLFeF9EVoL4CD/e6ozLyzEv+PQ==", - "license": "MIT", - "dependencies": { - "jerrypick": "^1.1.2" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "react": ">=16.13.1" - } - }, - "node_modules/react-redux": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.3.0.tgz", - "integrity": "sha512-KQopgqFo/p/fgmAs5qz6p5RWaNAzq40WAu7fJIXnQpYxFPbJYtsJPWvGeF2rOBaY/kEuV77AVsX8TsQzKm+A/g==", - "license": "MIT", - "dependencies": { - "@types/use-sync-external-store": "^0.0.6", - "use-sync-external-store": "^1.4.0" - }, - "peerDependencies": { - "@types/react": "^18.2.25 || ^19", - "react": "^18.0 || ^19", - "redux": "^5.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "redux": { - "optional": true - } - } - }, - "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, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-remove-scroll": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz", - "integrity": "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==", - "license": "MIT", - "dependencies": { - "react-remove-scroll-bar": "^2.3.7", - "react-style-singleton": "^2.2.3", - "tslib": "^2.1.0", - "use-callback-ref": "^1.3.3", - "use-sidecar": "^1.1.3" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-remove-scroll-bar": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", - "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", - "license": "MIT", - "dependencies": { - "react-style-singleton": "^2.2.2", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-style-singleton": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", - "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", - "license": "MIT", - "dependencies": { - "get-nonce": "^1.0.0", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/recharts": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/recharts/-/recharts-3.9.0.tgz", - "integrity": "sha512-dCEcE9y20c8H2tkVeByrAXhhnBJk6/QLbxKmn+dJUptOfc5NMjwRh1jo0vZPRLD+5dMrHrP+hPEsfbGBMfnf5Q==", - "license": "MIT", - "workspaces": [ - "www" - ], - "dependencies": { - "@reduxjs/toolkit": "^1.9.0 || 2.x.x", - "clsx": "^2.1.1", - "decimal.js-light": "^2.5.1", - "es-toolkit": "^1.39.3", - "eventemitter3": "^5.0.1", - "immer": "^10.1.1", - "react-redux": "8.x.x || 9.x.x", - "reselect": "5.2.0", - "tiny-invariant": "^1.3.3", - "use-sync-external-store": "^1.2.2", - "victory-vendor": "^37.0.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react-is": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/redux": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", - "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", - "license": "MIT" - }, - "node_modules/redux-thunk": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz", - "integrity": "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==", - "license": "MIT", - "peerDependencies": { - "redux": "^5.0.0" - } - }, - "node_modules/reselect": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.2.0.tgz", - "integrity": "sha512-AgZ3UOZm3YndfrJ4OYjgrT7bmCm/1iqkjvEfH/oYjzh6PD2qw4QuT3jjnXIrpdt4MTpMXclMT3lXbmRY+XRakw==", - "license": "MIT" - }, - "node_modules/rollup": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.2.tgz", - "integrity": "sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.9" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.62.2", - "@rollup/rollup-android-arm64": "4.62.2", - "@rollup/rollup-darwin-arm64": "4.62.2", - "@rollup/rollup-darwin-x64": "4.62.2", - "@rollup/rollup-freebsd-arm64": "4.62.2", - "@rollup/rollup-freebsd-x64": "4.62.2", - "@rollup/rollup-linux-arm-gnueabihf": "4.62.2", - "@rollup/rollup-linux-arm-musleabihf": "4.62.2", - "@rollup/rollup-linux-arm64-gnu": "4.62.2", - "@rollup/rollup-linux-arm64-musl": "4.62.2", - "@rollup/rollup-linux-loong64-gnu": "4.62.2", - "@rollup/rollup-linux-loong64-musl": "4.62.2", - "@rollup/rollup-linux-ppc64-gnu": "4.62.2", - "@rollup/rollup-linux-ppc64-musl": "4.62.2", - "@rollup/rollup-linux-riscv64-gnu": "4.62.2", - "@rollup/rollup-linux-riscv64-musl": "4.62.2", - "@rollup/rollup-linux-s390x-gnu": "4.62.2", - "@rollup/rollup-linux-x64-gnu": "4.62.2", - "@rollup/rollup-linux-x64-musl": "4.62.2", - "@rollup/rollup-openbsd-x64": "4.62.2", - "@rollup/rollup-openharmony-arm64": "4.62.2", - "@rollup/rollup-win32-arm64-msvc": "4.62.2", - "@rollup/rollup-win32-ia32-msvc": "4.62.2", - "@rollup/rollup-win32-x64-gnu": "4.62.2", - "@rollup/rollup-win32-x64-msvc": "4.62.2", - "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==", - "license": "MIT", - "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, - "license": "ISC", - "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, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/tailwind-merge": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.6.1.tgz", - "integrity": "sha512-Oo6tHdpZsGpkKG88HJ8RR1rg/RdnEkQEfMoEk2x1XRI3F1AxeU+ijRXpiVUF4UbLfcxxRGw6TbUINKYdWVsQTQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/dcastil" - } - }, - "node_modules/tailwindcss": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.1.tgz", - "integrity": "sha512-hk+TB1m+K8CYNrP6rjQaq/Y+4Zylwpa87mLYBKCunwnnQ9p+fHb7kmSfGqyEJoxF/O6CDyABWVFEafNSYKll+Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/tapable": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", - "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/tiny-invariant": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", - "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", - "license": "MIT" - }, - "node_modules/tinycolor2": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz", - "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==", - "license": "MIT" - }, - "node_modules/tinyglobby": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", - "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.4" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "dev": true, - "license": "MIT" - }, - "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" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/use-callback-ref": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", - "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/use-sidecar": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", - "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", - "license": "MIT", - "dependencies": { - "detect-node-es": "^1.1.0", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "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==", - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/victory-vendor": { - "version": "37.3.6", - "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-37.3.6.tgz", - "integrity": "sha512-SbPDPdDBYp+5MJHhBCAyI7wKM3d5ivekigc2Dk2s7pgbZ9wIgIBYGVw4zGHBml/qTFbexrofXW6Gu4noGxrOwQ==", - "license": "MIT AND ISC", - "dependencies": { - "@types/d3-array": "^3.0.3", - "@types/d3-ease": "^3.0.0", - "@types/d3-interpolate": "^3.0.1", - "@types/d3-scale": "^4.0.2", - "@types/d3-shape": "^3.1.0", - "@types/d3-time": "^3.0.0", - "@types/d3-timer": "^3.0.0", - "d3-array": "^3.1.6", - "d3-ease": "^3.0.1", - "d3-interpolate": "^3.0.1", - "d3-scale": "^4.0.2", - "d3-shape": "^3.1.0", - "d3-time": "^3.0.0", - "d3-timer": "^3.0.1" - } - }, - "node_modules/vite": { - "version": "6.4.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.3.tgz", - "integrity": "sha512-NTKlcQjlAK7MlQoyb6LgaqHc8sso/pVyUJYWMws3jg21uTJw/LddqIFPcPqP6PzpgbIcZyKI85sFE4HBrQDA8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.25.0", - "fdir": "^6.4.4", - "picomatch": "^4.0.2", - "postcss": "^8.5.3", - "rollup": "^4.34.9", - "tinyglobby": "^0.2.13" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.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 || >=22.0.0", - "jiti": ">=1.21.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "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, - "license": "ISC" - } - } -} +{ + "name": "mission-control-2-frontend", + "version": "2.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "mission-control-2-frontend", + "version": "2.0.0", + "dependencies": { + "@fontsource/inter": "^5.2.8", + "@fontsource/jetbrains-mono": "^5.2.8", + "@fontsource/space-grotesk": "^5.2.10", + "@tanstack/react-query": "^5.101.1", + "clsx": "^2.1.1", + "cmdk": "^1.1.1", + "d3-force": "^3.0.0", + "lucide-react": "^0.460.0", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-force-graph-2d": "^1.29.1", + "recharts": "^3.9.0", + "tailwind-merge": "^2.5.5" + }, + "devDependencies": { + "@eslint/js": "^10.0.1", + "@tailwindcss/vite": "^4.0.0", + "@testing-library/jest-dom": "^7.0.1", + "@testing-library/react": "^16.3.3", + "@testing-library/user-event": "^14.6.6", + "@types/d3-force": "^3.0.10", + "@types/node": "^22.10.1", + "@types/react": "^18.3.12", + "@types/react-dom": "^18.3.1", + "@vitejs/plugin-react": "^4.3.4", + "eslint": "^10.9.1", + "eslint-plugin-react-hooks": "^7.1.1", + "eslint-plugin-react-refresh": "^0.5.5", + "globals": "^17.11.0", + "jsdom": "^30.0.1", + "prettier": "^3.9.6", + "tailwindcss": "^4.0.0", + "typescript": "^5.6.3", + "typescript-eslint": "^8.68.0", + "vite": "^6.0.3", + "vitest": "^3.2.7" + } + }, + "node_modules/@adobe/css-tools": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.5.0.tgz", + "integrity": "sha512-6OzddxPio9UiWTCemp4N8cYLV2ZN1ncRnV1cVGtve7dhPOtRkleRyx32GQCYSwDYgaHU3USMm84tNsvKzRCa1Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@asamuzakjp/css-color": { + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-6.0.7.tgz", + "integrity": "sha512-vC/bk1Lz7Tn/EfU9/apOTBk80/8dyGyWMowPoV1tJ52muDGsDqt2HPT2klrFUiY60MQmQv9q8yIht15JnBgDGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@csstools/css-calc": "^3.3.0", + "@csstools/css-color-parser": "^4.1.10", + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0", + "lru-cache": "^11.5.2" + }, + "engines": { + "node": "^22.13.0 || >=24.0.0" + } + }, + "node_modules/@asamuzakjp/css-color/node_modules/lru-cache": { + "version": "11.5.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", + "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@asamuzakjp/dom-selector": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-8.3.2.tgz", + "integrity": "sha512-93Z1N+BQNXysodoicpOIyNh2drHfz/CTf9nnT0FEx72GJcIiwgydD7tGAr78j41LsYn3hlRn+LdGPuBLn1Bl8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "bidi-js": "^1.0.3", + "css-tree": "^3.2.1", + "is-potential-custom-element-name": "^1.0.1", + "lru-cache": "^11.5.2" + }, + "engines": { + "node": "^22.13.0 || >=24.0.0" + } + }, + "node_modules/@asamuzakjp/dom-selector/node_modules/lru-cache": { + "version": "11.5.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", + "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", + "@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.29.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", + "@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.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "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.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", + "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.29.7.tgz", + "integrity": "sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.29.7.tgz", + "integrity": "sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", + "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bramus/specificity": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@bramus/specificity/-/specificity-2.4.2.tgz", + "integrity": "sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-tree": "^3.0.0" + }, + "bin": { + "specificity": "bin/cli.js" + } + }, + "node_modules/@csstools/color-helpers": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-6.1.1.tgz", + "integrity": "sha512-gLNsunvwf3mCi5u5o46/Z/JcJMnhbHSaZ69rkgPzNM3J4s8hWwpPUQB6/tt0EDFyCiWzxANlx+2LJwpYj4zS1w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=20.19.0" + } + }, + "node_modules/@csstools/css-calc": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.3.0.tgz", + "integrity": "sha512-c5ihYsPkdG6JCkU2zTMm4+k6r7RXuGxtWYhu5DHMIiF1FHzrfmHL5so11AoFpUv/tu61xfcmT4AmKoFfMPoqdQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.2.1.tgz", + "integrity": "sha512-YpAJZhaHplYQkG8ib+/Fx5Y0eF2lVWi3tIvMJA6i39TLyUNp2439cifzW8VMjhlqrBjHzK5hVGugRRm2zTKI/A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^6.1.1", + "@csstools/css-calc": "^3.3.0" + }, + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-4.0.0.tgz", + "integrity": "sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^4.0.0" + } + }, + "node_modules/@csstools/css-syntax-patches-for-csstree": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.9.tgz", + "integrity": "sha512-iGGw4OsAYsS6pD29MdJ2bX/nJx65a04ZZiw6x+VwWlP2DdXf6f++Zmuv/OzALpdyfVhjbduIIF2cXM7HWBIe9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "peerDependencies": { + "css-tree": "^3.2.1" + }, + "peerDependenciesMeta": { + "css-tree": { + "optional": true + } + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-4.0.0.tgz", + "integrity": "sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=20.19.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz", + "integrity": "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.23.5", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz", + "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^3.0.5", + "debug": "^4.3.1", + "minimatch": "^10.2.4" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.7.0.tgz", + "integrity": "sha512-DObd/KKUsU+FaFv4PLxSRenpXfQWmPXXP3pPZ6/K1PCrMu2vQpMDMuQe/BqYeoLcz8ro0bVDF1RxOJgfVEdhUw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.2.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/core": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz", + "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/js": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-10.0.1.tgz", + "integrity": "sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "eslint": "^10.0.0" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/@eslint/object-schema": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz", + "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.2.tgz", + "integrity": "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.2.1", + "levn": "^0.4.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@exodus/bytes": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.15.1.tgz", + "integrity": "sha512-S6mL0yNB/Abt9Ei4tq8gDhcczc4S3+vQ4ra7vxnAf+YHC02srtqxKKZghx2Dq6p0e66THKwR6r8N6P95wEty7Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@noble/hashes": "^1.8.0 || ^2.0.0" + }, + "peerDependenciesMeta": { + "@noble/hashes": { + "optional": true + } + } + }, + "node_modules/@fontsource/inter": { + "version": "5.2.8", + "resolved": "https://registry.npmjs.org/@fontsource/inter/-/inter-5.2.8.tgz", + "integrity": "sha512-P6r5WnJoKiNVV+zvW2xM13gNdFhAEpQ9dQJHt3naLvfg+LkF2ldgSLiF4T41lf1SQCM9QmkqPTn4TH568IRagg==", + "license": "OFL-1.1", + "funding": { + "url": "https://github.com/sponsors/ayuhito" + } + }, + "node_modules/@fontsource/jetbrains-mono": { + "version": "5.2.8", + "resolved": "https://registry.npmjs.org/@fontsource/jetbrains-mono/-/jetbrains-mono-5.2.8.tgz", + "integrity": "sha512-6w8/SG4kqvIMu7xd7wt6x3idn1Qux3p9N62s6G3rfldOUYHpWcc2FKrqf+Vo44jRvqWj2oAtTHrZXEP23oSKwQ==", + "license": "OFL-1.1", + "funding": { + "url": "https://github.com/sponsors/ayuhito" + } + }, + "node_modules/@fontsource/space-grotesk": { + "version": "5.2.10", + "resolved": "https://registry.npmjs.org/@fontsource/space-grotesk/-/space-grotesk-5.2.10.tgz", + "integrity": "sha512-XNXEbT74OIITPqw2H6HXwPDp85fy43uxfBwFR5PU+9sLnjuLj12KlhVM9nZVN6q6dlKjkuN8JisW/OBxwxgUew==", + "license": "OFL-1.1", + "funding": { + "url": "https://github.com/sponsors/ayuhito" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/types": "^0.15.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "MIT" + }, + "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, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@radix-ui/primitive": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.4.tgz", + "integrity": "sha512-7AdCK9PQyiljKoBDbN8OuctCbd/esdwZPQ8RtOE3SsyQtUpiPb+ND75q0jEhC1m1ecBI0MFNeLJvwIh9iKHRcQ==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.3.tgz", + "integrity": "sha512-rYOP8OMnuuPMQF1uhPVlGNcCDlkokKqGFE3JcxFViIkAXP7EvFWUliJAstrapypaBLJNHbZL6jGhbVDGTwmVhA==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.4.tgz", + "integrity": "sha512-QwH4PO5urrbO+FaGd5Aglg+YJgWTyyuZ3g/6mKvsqraLkglDdckw9JafgL5McL5VEJ6EPNduPaT3ZE9BttDAqg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog": { + "version": "1.1.17", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.17.tgz", + "integrity": "sha512-TDTYmpdq8dI2+Xgvgj9AJ8Ghqq+Eph/TRVEdaFQPDItIY+6QSkU7MJMeevw1568Yw/2Ijz8BTphPSP2XejKphw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.4", + "@radix-ui/react-compose-refs": "1.1.3", + "@radix-ui/react-context": "1.1.4", + "@radix-ui/react-dismissable-layer": "1.1.13", + "@radix-ui/react-focus-guards": "1.1.4", + "@radix-ui/react-focus-scope": "1.1.10", + "@radix-ui/react-id": "1.1.2", + "@radix-ui/react-portal": "1.1.12", + "@radix-ui/react-presence": "1.1.6", + "@radix-ui/react-primitive": "2.1.6", + "@radix-ui/react-slot": "1.3.0", + "@radix-ui/react-use-controllable-state": "1.2.3", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.7.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.13.tgz", + "integrity": "sha512-2v+zNAWWe0ySxgC0D0yeXMPQ23xZVgXZTerTz+JKlmdRj6gfTqmCcR29jb6d290DezXPGgruHWDX/vYUebtErg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.4", + "@radix-ui/react-compose-refs": "1.1.3", + "@radix-ui/react-primitive": "2.1.6", + "@radix-ui/react-use-callback-ref": "1.1.2", + "@radix-ui/react-use-escape-keydown": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.4.tgz", + "integrity": "sha512-cot/aB/mOm0IYVYTTmQcEEK1M48lZWi8FlYe5nDPQQ8NYZUlXEFgncJ9p2Kzer3RKSrY7cTTpEMLZKNo9QoP5Q==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.10.tgz", + "integrity": "sha512-Fas/lXQqhVvqwAb64s5RFeHiHYElZ6SUQbZaNd6EkfhP/Al7wTIQ9WIR4QVX475tlu5yFCEdDcJH6/UwsZjMWw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.3", + "@radix-ui/react-primitive": "2.1.6", + "@radix-ui/react-use-callback-ref": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-id": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.2.tgz", + "integrity": "sha512-orBC88futVpqCmhX1p4cvquNHsELQ+w+vBJnuj3ftETI5bJb0bZn3Tqu3SWN2IOcPycTnMGnhwoermvISt72sA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-portal": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.12.tgz", + "integrity": "sha512-m309havGzsjLHHaIX50G5PlvRs3xkgPCsGk/5PTvYm8D5q33yG0J7w/712PTOhid7NTaFETtnSXjngHQavvhVw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.6", + "@radix-ui/react-use-layout-effect": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-presence": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.6.tgz", + "integrity": "sha512-zdTk4PlUO0E18HnZ3wYbW0KkJJxWCdiNYp6g6X1PtONFhxVkg01vliTJAmwIszU6mHiyBOoW9P0rAugl5/hULQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.6.tgz", + "integrity": "sha512-wetd0QI77DbvrPpTAvH1SqOxsYF2wZe5TNxqwOd5Ty4XDpV3dpV0s8K/1MGMJBeY5o7lg8ub5VIt1Ub+yVen6g==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.3.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.3.0.tgz", + "integrity": "sha512-MojKku4U/miO8Av4Dkb+ctMAQx7JmY96LmtDQlAarCRtd7rN52QCSzBF+XAvr5S6coSVj9HEPBgHAHKEJVk/WA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.2.tgz", + "integrity": "sha512-xCso9j1/u8sEgP1RNHjFrXJLApL8LiqOkI1R4ywuN00rxWdYg4oQXuwKLS3i0j5NWLromUD27/4nlxj2UFVvIw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.3.tgz", + "integrity": "sha512-PLzC90MS+ReootmjC597dvopoelpZ8Q61HJkDXZSExitIq7PL55vHNnesAHwguHK0aPfBnpdNzQtv1uliaqQrA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-effect-event": "0.0.3", + "@radix-ui/react-use-layout-effect": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-effect-event": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.3.tgz", + "integrity": "sha512-6c8ZqvPTWILEKnyVkP53EGRCcpnJiKTC21sS/6R1GF5xKyHJJWQEPfkqlcgUkdRQivd6tb23abUwe4ngWmY0JA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.2.tgz", + "integrity": "sha512-2uVLvLjgO7NZCWw01/FdqRwmA42J0BcjPMUCA+koFEOAb+zjqIP7SiFz/7zWPrKnVmSqr76Omq2ALyCuX4dhLw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.2.tgz", + "integrity": "sha512-jrBWOxZITuGcnjRCM2t2U5ZPkCLxD+Ym6DjfssS5haTj2iiak/DOb64JeN6OdLfLgptb6/e2kKR+ZuTrGoZTPA==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@reduxjs/toolkit": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.12.0.tgz", + "integrity": "sha512-KiT+RzZbp6mQET+Mg+h2c97+9j1sNflUxQkIHI7Yuzf6Peu+OYpmkn6nbHWmLLWj+1ZODUJFwGZ7gx3L9R9EOw==", + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@standard-schema/utils": "^0.3.0", + "immer": "^11.0.0", + "redux": "^5.0.1", + "redux-thunk": "^3.1.0", + "reselect": "^5.1.0" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18 || ^19", + "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-redux": { + "optional": true + } + } + }, + "node_modules/@reduxjs/toolkit/node_modules/immer": { + "version": "11.1.8", + "resolved": "https://registry.npmjs.org/immer/-/immer-11.1.8.tgz", + "integrity": "sha512-/tbkHMW7y10Lx6i1crLjD4/OhNkRG+Fo7byZHtah0547nIeXYcpIXaUh0IAQY6gO5459qpGGYapcEOHtFXkIuA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "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, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.2.tgz", + "integrity": "sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.2.tgz", + "integrity": "sha512-BaH7BllCACHoH1LguOU56UItGfUWjujlO65kS9LAodViaN4bwIKd7oeW/ZHJ/4ljr/7MIiENnNy3HJ0zXv8Zkw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.2.tgz", + "integrity": "sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.2.tgz", + "integrity": "sha512-yl0y2vq3S3lHeuXhEdss6TWfKW8vkujImO12tn4ZkG/4oghr09LvdYm2RElVjokTQiUvDUGXLGsYeLqUMCKpGA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.2.tgz", + "integrity": "sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.2.tgz", + "integrity": "sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.2.tgz", + "integrity": "sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.2.tgz", + "integrity": "sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.2.tgz", + "integrity": "sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.2.tgz", + "integrity": "sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.2.tgz", + "integrity": "sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.2.tgz", + "integrity": "sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.2.tgz", + "integrity": "sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.2.tgz", + "integrity": "sha512-CjvEnqJL/0/TQ3TXX3OPIJ/kmBellrWd4heXUmHeJlTnmwjKpSJzoehLaL6Xk0ZnMHBu9dZuFADNOrtjF4v+2w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.2.tgz", + "integrity": "sha512-1SiZbzwdkaDURsew/tSOrooKiYy7EQGT6m8ufavAi9NEyQb/6VuIxFXAL1fqa4iZe3g4NbNk4P7J32z2tw5Mgg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.2.tgz", + "integrity": "sha512-nQts12zJ3NQRoE6uYljOH89v7szzLDvG2JD/vsX+vGXU8w/At1GowTZ5/7qeFQ8m7L55rpR8Okugnuo5bgjy2Q==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.2.tgz", + "integrity": "sha512-E9/ll019jhPIJgpzfZoIkBGhcz+kKNgVWYRY0zr9srBdPPFVpvOKW8VaJKUbeK+eZXyQF9ltME+Kk6affeaPgg==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.2.tgz", + "integrity": "sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.2.tgz", + "integrity": "sha512-uNN83XxQrRAh/w0/pmAfibcwyb6YWt4gP+dpnQKPVJshAloQ785ii8CT8ZCIxkGg9opVsvAlGhFitSm6D1Jjpg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.2.tgz", + "integrity": "sha512-srjEIxSH3LRnJN6THczDHWQplqEMFiAJrTab0msUryh9kwNpkICf3Ea6q6MN/2cZwRFUNx5w+h6Hpi4QuHS6Zg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.2.tgz", + "integrity": "sha512-8hOJnxgbyObnCm5AlRA3A931xX19xq80RjVTKgJOvEKWqJruP/Uf12IbAOaDjjEXYRewwHLfmF0YRIdK3OwKWA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.2.tgz", + "integrity": "sha512-mmF4AY1i0hG/bLWUctUq59gtmgaSIRa3cu/A3JFRp/sCNEme2bgDEiDS22P9FbnJB8NJNF4jPJiSP5RHQpUTDg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.2.tgz", + "integrity": "sha512-DZgkknc6jhHrk46V25vbAM0zZkyP0nSDkJB8/dRkLTxv470dOmWDqGoEJl/9A0dFfS7yE3REOwNDxpHwSLSt0Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.2.tgz", + "integrity": "sha512-T6xr6ucWSFto+VGajA8YH26LdpHRuP4YLHEKAtCWvJDOlnmWcDZVCI2Jmjr+IFHDlt2zRaTAKE4tfjTaWLgJBg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.2.tgz", + "integrity": "sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "license": "MIT" + }, + "node_modules/@standard-schema/utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@standard-schema/utils/-/utils-0.3.0.tgz", + "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==", + "license": "MIT" + }, + "node_modules/@tailwindcss/node": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.1.tgz", + "integrity": "sha512-6NDaqRoAMSXD1mr/RXu0HBvNE9a2n5tHPsxu9XHLws8o4Twes5rBM2205SUUiJ9goAtadrN6xTGX0UDEwp/N4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "5.21.6", + "jiti": "^2.7.0", + "lightningcss": "1.32.0", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.3.1" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.1.tgz", + "integrity": "sha512-yVPyo8RNkabVr3O2EhHEE0Rewu7YKzc1DhIqfL46LKveFrmu9XbDazNOJY7/GRuvw1h6u3utWnR29H/p5JPlgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.3.1", + "@tailwindcss/oxide-darwin-arm64": "4.3.1", + "@tailwindcss/oxide-darwin-x64": "4.3.1", + "@tailwindcss/oxide-freebsd-x64": "4.3.1", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.1", + "@tailwindcss/oxide-linux-arm64-gnu": "4.3.1", + "@tailwindcss/oxide-linux-arm64-musl": "4.3.1", + "@tailwindcss/oxide-linux-x64-gnu": "4.3.1", + "@tailwindcss/oxide-linux-x64-musl": "4.3.1", + "@tailwindcss/oxide-wasm32-wasi": "4.3.1", + "@tailwindcss/oxide-win32-arm64-msvc": "4.3.1", + "@tailwindcss/oxide-win32-x64-msvc": "4.3.1" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.1.tgz", + "integrity": "sha512-SVlyf61g374l5cHyg8x9kf5xmLcOaxvOTsbsqDnSsDJaKOEFZ7GCvi84VAVGpxojYOs1+3K6M0UjXfqPU8vmOQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.1.tgz", + "integrity": "sha512-hVnWLwv+e/l7c4WKyVtHVrIPvYdqWHjRB3MDIqARynzFtnQg85kmQEFCbV9Ja0VVx4xXTIiDWY60Y7iz/iNoDA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.1.tgz", + "integrity": "sha512-Cf7abu0WVgbhU7ANgPUnSAvm7nCvMweusHb8FnaHlLfv/Caq4GYaEZg7ZImzzmjx4lIAfuS8q+eLIS7A7IzxIg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.1.tgz", + "integrity": "sha512-ZZqzX2Y+GXtXXfqSfpJhDm60OoZfvLHLCgm+J7NVqgHHJjG/m9ugZI77RwTsVd4fnBJuCFP6Ae6kTJb71UdS8g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.1.tgz", + "integrity": "sha512-/Ah/xik0LaMYfv9DZ0S/t4pBlBNYOcqtRwusjgovHkvT8ixueWCLyJjsaF5kQIckjb4IT8Q6K6p/iPmZMixYgg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.1.tgz", + "integrity": "sha512-gqdFoVJlw444GvpnheZLHmvTzSxI/cOUUh2KSNejQjTcYkW062SVD+En0rUgD+QV91bz1XGIGtt1HJd48xUGbQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.1.tgz", + "integrity": "sha512-Bwv9KwOvE0VKa86xPFif9b9c3Y1NxOV1P0gLti/IYaWEsQYZXDlxfGEtA8mdDZ7SG3wyNXAWYT5SIn3giL57oA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.1.tgz", + "integrity": "sha512-Ymi8O8T15HYQdOUWUtTI6ldN0neHP85FC+Qz32xTcZ7iJXtem/x8ITev0o1e9e5rkqj4lONZfTRLvkmin1+tKg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.1.tgz", + "integrity": "sha512-M+P/91qJ6uILLw4k2G93GMDRAXj61SMvFQYt39AqvUqYgExXpLL5aepfns7sj4HiAQeolirQF9E0lzRvdf4zPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.1.tgz", + "integrity": "sha512-zsM8uOeqvVGHsAXsJxsT28ttosFahLJKCLOTUBqRAtKnVgGSRitds9T432QiT8b77Yga7JIBkulIRRlJPtYhRA==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.10.0", + "@emnapi/runtime": "^1.10.0", + "@emnapi/wasi-threads": "^1.2.1", + "@napi-rs/wasm-runtime": "^1.1.4", + "@tybys/wasm-util": "^0.10.2", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.1.tgz", + "integrity": "sha512-aiNvSq9BsVk8V513lDKlrCFAgf8qBMPZTpgEhInL+NwQqs97mYmupVMrPrgBBSL8Pv/0zXu9MrMF9rMun1ZeNg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.1.tgz", + "integrity": "sha512-xDEyu1rg290472FEGaKHnzyDyh5QH+AlWvsU5hMoMtPpzmKlRI0jaYKCgSHDYtaQWZOYbMaduSyCwFwY4n1HmA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.3.1.tgz", + "integrity": "sha512-hItDHuIIlEV61R+faXu66s1K36aTurO/Qw0e45Vskz57gXl9pWOT6eg3zmcEui6CZXddbN7zd41bwmvag4JGwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.3.1", + "@tailwindcss/oxide": "4.3.1", + "tailwindcss": "4.3.1" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7 || ^8" + } + }, + "node_modules/@tanstack/query-core": { + "version": "5.101.1", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.101.1.tgz", + "integrity": "sha512-Y6Y92dkXtNqx67m2pMSxUsA3zOCwv862JexZRP8/EPwvKXMPu9m8rv43spiXWzOUIggQ3SQApttALStzhA8B4g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/react-query": { + "version": "5.101.1", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.101.1.tgz", + "integrity": "sha512-ZnONUuQKJe1bJMStXUL1s5uKN9FcfC28j5cK+iDZcdSHtUv1wtin1cGc/Oewhf2Oc4eKY7lggtpvT/AbMmhHew==", + "license": "MIT", + "dependencies": { + "@tanstack/query-core": "5.101.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^18 || ^19" + } + }, + "node_modules/@testing-library/dom": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", + "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "picocolors": "1.1.1", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@testing-library/jest-dom": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-7.0.1.tgz", + "integrity": "sha512-oMDTC3oA+6CXSO2JZnvOI7CA6oVub6kij5ggk9ohwye5slmkwxYDXcPOVxgMw/RQlticjtO0C1RZkR97HgrWMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@adobe/css-tools": "^4.4.0", + "aria-query": "^5.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.6.3", + "picocolors": "^1.1.1", + "redent": "^3.0.0" + }, + "engines": { + "node": ">=22", + "npm": ">=6", + "yarn": ">=1" + }, + "peerDependencies": { + "@testing-library/dom": ">=10 <11", + "vitest": ">= 0.32" + }, + "peerDependenciesMeta": { + "vitest": { + "optional": true + } + } + }, + "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", + "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@testing-library/react": { + "version": "16.3.3", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.3.3.tgz", + "integrity": "sha512-Uo193NgQbPMz6lrrhtRQQFcMC6Re/ELLFbbuVL30WDlZxlpZf9/lMHTAVxPRLw1q1iu9OJmR1c2BLiENRstdBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@testing-library/dom": "^10.0.0", + "@types/react": "^18.0.0 || ^19.0.0", + "@types/react-dom": "^18.0.0 || ^19.0.0", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@testing-library/user-event": { + "version": "14.6.6", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.6.tgz", + "integrity": "sha512-Jbs9FpkkIDw8FgSc6kOVsOv8JuuqGAL7J4X1oot77JxAoDlkNn2GRkd0aYRVuQ+pVQAiHWVkE4rX/dkF5fBiCw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "peerDependencies": { + "@testing-library/dom": ">=7.21.4" + } + }, + "node_modules/@tweenjs/tween.js": { + "version": "23.1.3", + "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-23.1.3.tgz", + "integrity": "sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==", + "license": "MIT" + }, + "node_modules/@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" + } + }, + "node_modules/@types/d3-array": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", + "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==", + "license": "MIT" + }, + "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==", + "license": "MIT" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "license": "MIT" + }, + "node_modules/@types/d3-force": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz", + "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==", + "dev": true, + "license": "MIT" + }, + "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==", + "license": "MIT", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", + "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", + "license": "MIT" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", + "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", + "license": "MIT", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-shape": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.8.tgz", + "integrity": "sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==", + "license": "MIT", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", + "license": "MIT" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "license": "MIT" + }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/esrecurse": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", + "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.20.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.0.tgz", + "integrity": "sha512-QWlFW2wf3nTjC13/DqRnBpR4ZO36VJH/JVBkA/vcnmbTBNQIlnObqyqZE1tUR7+Ni23Lda8R1BxMfbXRpCUx5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "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, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.31", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.31.tgz", + "integrity": "sha512-vfEqpXTvwT91yhmwdfouStN2hSKwTvyRs8qpLfADyrq/kxDw0hZM7Wk9Ug1FELj8hIby+S/+kQCSRFF32nv2Qw==", + "devOptional": true, + "license": "MIT", + "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==", + "devOptional": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^18.0.0" + } + }, + "node_modules/@types/use-sync-external-store": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz", + "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==", + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.68.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.68.0.tgz", + "integrity": "sha512-WASHDpCm6qO5jj9g1a+8NiW5+GCkAyLReR56/4VruYmNgfUmqpxOfZ2Yfb8xGfJPWv5Qi6LSD8sXdces3vbp/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.68.0", + "@typescript-eslint/type-utils": "8.68.0", + "@typescript-eslint/utils": "8.68.0", + "@typescript-eslint/visitor-keys": "8.68.0", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.68.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.6.tgz", + "integrity": "sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.68.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.68.0.tgz", + "integrity": "sha512-fHq2VC1kpyYfvEcbiMjOpySY4WS7voEp89yAThrHRX5sm9j2lzYppCb2umFMEed4fWcyeLjHxrz0mpjNBaBxMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.68.0", + "@typescript-eslint/types": "8.68.0", + "@typescript-eslint/typescript-estree": "8.68.0", + "@typescript-eslint/visitor-keys": "8.68.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.68.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.68.0.tgz", + "integrity": "sha512-5GQtWZCXFcFYux955pvoS02WLc49pXNlvIxocKjS0clvwo3in1RdlzVKyiqQH9vE5AKWFLTaUgeQkOrTS+0Qxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.68.0", + "@typescript-eslint/types": "^8.68.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.68.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.68.0.tgz", + "integrity": "sha512-T5eXpcaJNg8bhjHJ8Rjp68Vq/QBteYtTKY8TZqVNPaUbuz0f6jI9t6aDkylwvalpAB9XTTFeFOjrjXAZ3YvmVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.68.0", + "@typescript-eslint/visitor-keys": "8.68.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.68.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.68.0.tgz", + "integrity": "sha512-F7zrGQfiJHojPwi8vhxZQC1tWtJzvL74cK/nqri2lk8YUXvYaYwl263xOJ69jDWPUk1hmcdoayFwk9lX09npVw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.68.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.68.0.tgz", + "integrity": "sha512-X77zqoY1EjeWGs/0JNxeaMfp5C5lIz4Tw8y66F1Ne8Faq6g424sBNYM6xBAqElfGZPLpWS+CZAp0DXyKDzWiHg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.68.0", + "@typescript-eslint/typescript-estree": "8.68.0", + "@typescript-eslint/utils": "8.68.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.68.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.68.0.tgz", + "integrity": "sha512-9RnpsGJjrAllCMefGVVsImJM24YurhC0Q1h4UbvivtvOqXmR/vEJge2OoE++z9m6hyg8T1Q8t5SNT6tHSbrxcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.68.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.68.0.tgz", + "integrity": "sha512-OKKsD0tYmoNiU5PW2zehO1yO56jYOm1ShYlxon/Z0SJNidAkdVg86eg9ruRuoXf8xfnuWZGbwDsStkoXbZtIIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.68.0", + "@typescript-eslint/tsconfig-utils": "8.68.0", + "@typescript-eslint/types": "8.68.0", + "@typescript-eslint/visitor-keys": "8.68.0", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.68.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.68.0.tgz", + "integrity": "sha512-PB5gJMMOg0Q5P1tsgWtEAqQacJXq0qEqRHDX/YJ4FaTMLfZPpHB3gjl2EJuiZyPABxmj4ZQYiY9m1bdAJ5y7tQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.68.0", + "@typescript-eslint/types": "8.68.0", + "@typescript-eslint/typescript-estree": "8.68.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.68.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.68.0.tgz", + "integrity": "sha512-YR65gGdGvTUAWLldC3xLOvOzamdGzB4A5/N8rehEaHs3Zvoe39BhgY+u0SPch1OvrVTfLcc55wsSgK2NcnTS/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.68.0", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "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, + "license": "MIT", + "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/@vitest/expect": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.7.tgz", + "integrity": "sha512-E8eBXaKibuvH2pSZErOjdVb5vF4PbKYcrnluBTYxEk1l/VhhwZg1kZQsdtjq+CsF5CFydf2Rdkz7jDHKSisi3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/chai": "^5.2.2", + "@vitest/spy": "3.2.7", + "@vitest/utils": "3.2.7", + "chai": "^5.2.0", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.7.tgz", + "integrity": "sha512-Trr0hYO9CM3Wj6ksWHRhK9IZpIY6wTMO5u/MqXurMxT57sWBaOPEtP3Oq60ihZuh5JsiagKfz95OcxdEP6dBrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "3.2.7", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.17" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/pretty-format": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.7.tgz", + "integrity": "sha512-KUHlwqVu0sRlhCdyPdQ/wBoTfRahjUky1MubOmYw9fWfIZy1gNoHpuaaQBPAaMaVYdQYHJLurzj8ECCj5OwTqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.7.tgz", + "integrity": "sha512-sB9y4ovltoQP+WaUPwmSxO9WIg9Ig694Di5PalVPsYHklAdE027mehpWF2SQSVq+k6sFgaivbTjTJwZLSHbedA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "3.2.7", + "pathe": "^2.0.3", + "strip-literal": "^3.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.7.tgz", + "integrity": "sha512-7C+MwShwtBSI5Buwoyg3s/iY1eHL9PKAf+O1wVh/TdnjXUtkoL/9YQtre90i4MtNXM6edP1wJ2zOBpfCyhIS7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.2.7", + "magic-string": "^0.30.17", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.7.tgz", + "integrity": "sha512-Q2eQGI6d2L/hBtZ0qNuKcAGid68XK6cv1xsoaIma6PaJhHPoqcEJhYpXZ/5myCMqkNgtP6UKuBhbc0nHKnrkuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^4.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.7.tgz", + "integrity": "sha512-x6BDOd7dyo3PFLY3I9/HJ25X/6OurhGXk2/B9gOZNPF7XDVjeBK4k01lQE5uvDpbuheErh91qYuE1E2OEjK3Rw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.2.7", + "loupe": "^3.1.4", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/accessor-fn": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/accessor-fn/-/accessor-fn-1.5.3.tgz", + "integrity": "sha512-rkAofCwe/FvYFUlMB0v0gWmhqtfAtV1IUkdPbfhTUyYniu5LrC0A0UJkTH0Jv3S8SvwkmfuAlY+mQIJATdocMA==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/acorn": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", + "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/aria-hidden": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", + "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.38", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.38.tgz", + "integrity": "sha512-31/02mVB4yuQU6adKk5SlY6m+mxDwUq5KZkyYgnLrrKl7TEm1+3PyDtDBz2kOv/wxZz41GHsvV1A/u6RmiyBvw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/bezier-js": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/bezier-js/-/bezier-js-6.1.4.tgz", + "integrity": "sha512-PA0FW9ZpcHbojUCMu28z9Vg/fNkwTj5YhusSAjHHDfHDGLxJ6YUKrAN2vk1fP2MMOxVw4Oko16FMlRGVBGqLKg==", + "license": "MIT", + "funding": { + "type": "individual", + "url": "https://github.com/Pomax/bezierjs/blob/master/FUNDING.md" + } + }, + "node_modules/bidi-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", + "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "require-from-string": "^2.0.2" + } + }, + "node_modules/brace-expansion": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", + "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/browserslist": { + "version": "4.28.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.4.tgz", + "integrity": "sha512-MTc8i/x9jBQd1iMw2CFGS+rwMa07eYjLR0CCTLDACl9xhxy+nIs3KeML/biicXtk9JrZ6dnnTatmc7ErPXIxqw==", + "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" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.10.38", + "caniuse-lite": "^1.0.30001799", + "electron-to-chromium": "^1.5.376", + "node-releases": "^2.0.48", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001799", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001799.tgz", + "integrity": "sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw==", + "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" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/canvas-color-tracker": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/canvas-color-tracker/-/canvas-color-tracker-1.3.2.tgz", + "integrity": "sha512-ryQkDX26yJ3CXzb3hxUVNlg1NKE4REc5crLBq661Nxzr8TNd236SaEf2ffYLXyI5tSABSeguHLqcVq4vf9L3Zg==", + "license": "MIT", + "dependencies": { + "tinycolor2": "^1.6.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/chai": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", + "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/check-error": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.3.tgz", + "integrity": "sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/cmdk": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cmdk/-/cmdk-1.1.1.tgz", + "integrity": "sha512-Vsv7kFaXm+ptHDMZ7izaRsP70GgrW9NBNGswt9OZaVBLlE0SNpDq8eu/VGXyF9r7M0azK3Wy7OlYXsuyYLFzHg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "^1.1.1", + "@radix-ui/react-dialog": "^1.1.6", + "@radix-ui/react-id": "^1.1.0", + "@radix-ui/react-primitive": "^2.0.2" + }, + "peerDependencies": { + "react": "^18 || ^19 || ^19.0.0-rc", + "react-dom": "^18 || ^19 || ^19.0.0-rc" + } + }, + "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, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-tree": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", + "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.27.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", + "dev": true, + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-binarytree": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/d3-binarytree/-/d3-binarytree-1.0.2.tgz", + "integrity": "sha512-cElUNH+sHu95L04m92pG73t2MEJXKu+GeKUN1TJkFsu93E5W8E9Sc3kHEGJKgenGvj19m6upSn2EunvMgMD2Yw==", + "license": "MIT" + }, + "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==", + "license": "ISC", + "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==", + "license": "ISC", + "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==", + "license": "ISC", + "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==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-force-3d": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/d3-force-3d/-/d3-force-3d-3.0.6.tgz", + "integrity": "sha512-4tsKHUPLOVkyfEffZo1v6sFHvGFwAIIjt/W8IThbp08DYAsXZck+2pSHEG5W1+gQgEvFLdZkYvmJAbRM2EzMnA==", + "license": "MIT", + "dependencies": { + "d3-binarytree": "1", + "d3-dispatch": "1 - 3", + "d3-octree": "1", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz", + "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==", + "license": "ISC", + "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==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-octree": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/d3-octree/-/d3-octree-1.1.0.tgz", + "integrity": "sha512-F8gPlqpP+HwRPMO/8uOu5wjH110+6q4cgJvgJT6vlpy3BEaDIKlTZrgHKZSp/i1InRpVfh4puY/kvL6MxK930A==", + "license": "MIT" + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "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==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", + "dependencies": { + "d3-time": "1 - 3" + }, + "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==", + "license": "ISC", + "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==", + "license": "ISC", + "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==", + "license": "ISC", + "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/data-urls": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-7.0.0.tgz", + "integrity": "sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-mimetype": "^5.0.0", + "whatwg-url": "^16.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/data-urls/node_modules/whatwg-url": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-16.0.1.tgz", + "integrity": "sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@exodus/bytes": "^1.11.0", + "tr46": "^6.0.0", + "webidl-conversions": "^8.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", + "dev": true, + "license": "MIT" + }, + "node_modules/decimal.js-light": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", + "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==", + "license": "MIT" + }, + "node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", + "license": "MIT" + }, + "node_modules/dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/electron-to-chromium": { + "version": "1.5.378", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.378.tgz", + "integrity": "sha512-VinvOAuuPmdD1guEgGv5f2Qp7/vlfqOrUOMYNnOD4wj3pit8kRsQHzfIf6teyUGWo15Tg5+bOJaRunvyltpVWQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/enhanced-resolve": { + "version": "5.21.6", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.6.tgz", + "integrity": "sha512-aNnGCvbJ/RIyWo1IuhNdVjnNF+EjH9wpzpNHt+ci/m9He9LJvUN8wrCcXjp9cWsGNAuvSpVFTx/vraAFQ8qGjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-8.0.0.tgz", + "integrity": "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-toolkit": { + "version": "1.49.0", + "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.49.0.tgz", + "integrity": "sha512-G5iZ6Pc/FNRY/soKZHC+TxGDD83rHUDXxzaWhGCX44vAv/tMs56WMusnm/KMNK+luUPsgA9U28cGr4RDlSzL2g==", + "license": "MIT", + "workspaces": [ + "docs", + "benchmarks" + ] + }, + "node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.9.1.tgz", + "integrity": "sha512-9VaAkDURekixUQJy0oJYl2DcN6oKMfxay7XzaGYAWQwsb6qfKf+x76R2k1L8kb1boc+FyCAaTA9GmiKaaiaF+A==", + "dev": true, + "license": "MIT", + "workspaces": [ + "packages/*" + ], + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.2", + "@eslint/config-array": "^0.23.5", + "@eslint/config-helpers": "^0.7.0", + "@eslint/core": "^1.2.1", + "@eslint/plugin-kit": "^0.7.2", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^9.1.2", + "eslint-visitor-keys": "^5.0.1", + "espree": "^11.2.0", + "esquery": "^1.7.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "minimatch": "^10.2.5", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.1.1.tgz", + "integrity": "sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/parser": "^7.24.4", + "hermes-parser": "^0.25.1", + "zod": "^3.25.0 || ^4.0.0", + "zod-validation-error": "^3.5.0 || ^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.5.5.tgz", + "integrity": "sha512-vG7yLURXNvCHy0FBdbZRwIu0BLPJMlUUJS2Ep7ud9w1YCLftFZtuEjyjhym0Qq9yuZ6LJUitNlu/hMk0gakXAw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": "^9 || ^10" + } + }, + "node_modules/eslint-scope": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", + "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@types/esrecurse": "^4.3.1", + "@types/estree": "^1.0.8", + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", + "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.16.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^5.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", + "license": "MIT" + }, + "node_modules/expect-type": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.4.0.tgz", + "integrity": "sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.4.tgz", + "integrity": "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==", + "dev": true, + "license": "ISC" + }, + "node_modules/float-tooltip": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/float-tooltip/-/float-tooltip-1.7.5.tgz", + "integrity": "sha512-/kXzuDnnBqyyWyhDMH7+PfP8J/oXiAavGzcRxASOMRHFuReDtofizLLJsf7nnDLAfEaMW4pVWaXrAjtnglpEkg==", + "license": "MIT", + "dependencies": { + "d3-selection": "2 - 3", + "kapsule": "^1.16", + "preact": "10" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/force-graph": { + "version": "1.51.4", + "resolved": "https://registry.npmjs.org/force-graph/-/force-graph-1.51.4.tgz", + "integrity": "sha512-TdJ2KbkoiDQ7NIRx8IPGD0mAXXpLhamS7c+b7W98b0MHG7lphnda1VOQX/98UDTsttIAdH4TcP0l0MauSnLK8w==", + "license": "MIT", + "dependencies": { + "@tweenjs/tween.js": "18 - 25", + "accessor-fn": "1", + "bezier-js": "3 - 6", + "canvas-color-tracker": "^1.3", + "d3-array": "1 - 3", + "d3-drag": "2 - 3", + "d3-force-3d": "2 - 3", + "d3-scale": "1 - 4", + "d3-scale-chromatic": "1 - 3", + "d3-selection": "2 - 3", + "d3-zoom": "2 - 3", + "float-tooltip": "^1.7", + "index-array-by": "1", + "kapsule": "^1.16", + "lodash-es": "4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "17.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.11.0.tgz", + "integrity": "sha512-Z2I8hM+PbJDXQDq3Icgpzv+mPdwr68iZUU9d5WW4FuXfDUQfkZaZuvjMv42/5crNyw154+9+VWXbYrUgDXbxNw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/hermes-estree": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", + "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", + "dev": true, + "license": "MIT" + }, + "node_modules/hermes-parser": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", + "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hermes-estree": "0.25.1" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-6.0.0.tgz", + "integrity": "sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@exodus/bytes": "^1.6.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immer": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/immer/-/immer-10.2.0.tgz", + "integrity": "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/index-array-by": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/index-array-by/-/index-array-by-1.4.2.tgz", + "integrity": "sha512-SP23P27OUKzXWEC/TOyWlwLviofQkCSCKONnc62eItjp69yCZZPqDQtr3Pw5gJDnPeUMqExmKydNZaJO0FU9pw==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/jerrypick": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/jerrypick/-/jerrypick-1.1.2.tgz", + "integrity": "sha512-YKnxXEekXKzhpf7CLYA0A+oDP8V0OhICNCr5lv96FvSsDEmrb0GKM776JgQvHTMjr7DTTPEVv/1Ciaw0uEWzBA==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/jiti": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/jsdom": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-30.0.1.tgz", + "integrity": "sha512-52v7mUVUfNQVYYqE1lcdaymWL0njO7lTLUog6ZvW2U5KsbiLk/GnZlVJ+qx0xfNJZ6Gn+KSpPNE52vurbxZwrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/css-color": "^6.0.5", + "@asamuzakjp/dom-selector": "^8.3.0", + "@bramus/specificity": "^2.4.2", + "@csstools/css-syntax-patches-for-csstree": "^1.1.7", + "@exodus/bytes": "^1.15.1", + "css-tree": "^3.2.1", + "data-urls": "^7.0.0", + "decimal.js": "^10.6.0", + "html-encoding-sniffer": "^6.0.0", + "is-potential-custom-element-name": "^1.0.1", + "lru-cache": "^11.5.2", + "parse5": "^8.0.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^6.0.2", + "undici": "^8.9.0", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^8.0.1", + "whatwg-mimetype": "^5.0.0", + "whatwg-url": "^17.1.0", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": "^22.22.2 || ^24.15.0 || >=26.0.0" + }, + "peerDependencies": { + "canvas": "^3.2.3" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/lru-cache": { + "version": "11.5.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", + "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "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, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/kapsule": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/kapsule/-/kapsule-1.16.3.tgz", + "integrity": "sha512-4+5mNNf4vZDSwPhKprKwz3330iisPrb08JyMgbsdFrimBCKNHecua/WBwvVg3n7vwx0C1ARjfhwIpbrbd9n5wg==", + "license": "MIT", + "dependencies": { + "lodash-es": "4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash-es": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz", + "integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/loupe": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", + "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==", + "dev": true, + "license": "MIT" + }, + "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, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lucide-react": { + "version": "0.460.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.460.0.tgz", + "integrity": "sha512-BVtq/DykVeIvRTJvRAgCsOwaGL8Un3Bxh8MbDxMhEWlZay3T4IpEKDEpwt5KZ0KJMHzgm6jrltxlT5eXOWXDHg==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc" + } + }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/mdn-data": { + "version": "2.27.1", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", + "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.8" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.15", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.15.tgz", + "integrity": "sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.49", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.49.tgz", + "integrity": "sha512-f06bl1D+8ZDkn2oOQQKAh5/otFWqVnM1Q5oerA8Pex7UfT66Tx4IPHIqVVFKqFT3FUtaDstdgkM7yT7JWhqxfw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.1.tgz", + "integrity": "sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^8.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathval": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz", + "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.16" + } + }, + "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, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.15", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", + "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", + "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" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.12", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/preact": { + "version": "10.29.7", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.29.7.tgz", + "integrity": "sha512-DCHYrK/B10yUD3ZjLfhZ3WIE/9Vf9VFUODcRE2dRomTYDpJk6z6L9wecSfhfE6M9ZTHUdyQkoC46arIDhEV84Q==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + }, + "peerDependencies": { + "preact-render-to-string": ">=5" + }, + "peerDependenciesMeta": { + "preact-render-to-string": { + "optional": true + } + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.9.6", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.6.tgz", + "integrity": "sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/pretty-format/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-force-graph-2d": { + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/react-force-graph-2d/-/react-force-graph-2d-1.29.1.tgz", + "integrity": "sha512-1Rl/1Z3xy2iTHKj6a0jRXGyiI86xUti81K+jBQZ+Oe46csaMikp47L5AjrzA9hY9fNGD63X8ffrqnvaORukCuQ==", + "license": "MIT", + "dependencies": { + "force-graph": "^1.51", + "prop-types": "15", + "react-kapsule": "^2.5" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/react-is": { + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.7.tgz", + "integrity": "sha512-kZFnouyVv7eP/Phmrlo9FK+zcAdriZJvzxXHF1Sl1P377WSGe2G/JxVolhTrB/jeV47lKImhNUsijjHAAbcl/A==", + "license": "MIT", + "peer": true + }, + "node_modules/react-kapsule": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/react-kapsule/-/react-kapsule-2.6.0.tgz", + "integrity": "sha512-HzLJoYb1n1kfwjXbqFFcRR0EA6oPsJ64tNdDmCSaL/bz2o9wUZRSb0cMe//grLFeF9EVoL4CD/e6ozLyzEv+PQ==", + "license": "MIT", + "dependencies": { + "jerrypick": "^1.1.2" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "react": ">=16.13.1" + } + }, + "node_modules/react-redux": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.3.0.tgz", + "integrity": "sha512-KQopgqFo/p/fgmAs5qz6p5RWaNAzq40WAu7fJIXnQpYxFPbJYtsJPWvGeF2rOBaY/kEuV77AVsX8TsQzKm+A/g==", + "license": "MIT", + "dependencies": { + "@types/use-sync-external-store": "^0.0.6", + "use-sync-external-store": "^1.4.0" + }, + "peerDependencies": { + "@types/react": "^18.2.25 || ^19", + "react": "^18.0 || ^19", + "redux": "^5.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "redux": { + "optional": true + } + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-remove-scroll": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz", + "integrity": "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==", + "license": "MIT", + "dependencies": { + "react-remove-scroll-bar": "^2.3.7", + "react-style-singleton": "^2.2.3", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.3", + "use-sidecar": "^1.1.3" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", + "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", + "license": "MIT", + "dependencies": { + "react-style-singleton": "^2.2.2", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", + "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", + "license": "MIT", + "dependencies": { + "get-nonce": "^1.0.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/recharts": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/recharts/-/recharts-3.9.0.tgz", + "integrity": "sha512-dCEcE9y20c8H2tkVeByrAXhhnBJk6/QLbxKmn+dJUptOfc5NMjwRh1jo0vZPRLD+5dMrHrP+hPEsfbGBMfnf5Q==", + "license": "MIT", + "workspaces": [ + "www" + ], + "dependencies": { + "@reduxjs/toolkit": "^1.9.0 || 2.x.x", + "clsx": "^2.1.1", + "decimal.js-light": "^2.5.1", + "es-toolkit": "^1.39.3", + "eventemitter3": "^5.0.1", + "immer": "^10.1.1", + "react-redux": "8.x.x || 9.x.x", + "reselect": "5.2.0", + "tiny-invariant": "^1.3.3", + "use-sync-external-store": "^1.2.2", + "victory-vendor": "^37.0.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-is": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/redux": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", + "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", + "license": "MIT" + }, + "node_modules/redux-thunk": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz", + "integrity": "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==", + "license": "MIT", + "peerDependencies": { + "redux": "^5.0.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/reselect": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.2.0.tgz", + "integrity": "sha512-AgZ3UOZm3YndfrJ4OYjgrT7bmCm/1iqkjvEfH/oYjzh6PD2qw4QuT3jjnXIrpdt4MTpMXclMT3lXbmRY+XRakw==", + "license": "MIT" + }, + "node_modules/rollup": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.2.tgz", + "integrity": "sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.9" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.62.2", + "@rollup/rollup-android-arm64": "4.62.2", + "@rollup/rollup-darwin-arm64": "4.62.2", + "@rollup/rollup-darwin-x64": "4.62.2", + "@rollup/rollup-freebsd-arm64": "4.62.2", + "@rollup/rollup-freebsd-x64": "4.62.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.62.2", + "@rollup/rollup-linux-arm-musleabihf": "4.62.2", + "@rollup/rollup-linux-arm64-gnu": "4.62.2", + "@rollup/rollup-linux-arm64-musl": "4.62.2", + "@rollup/rollup-linux-loong64-gnu": "4.62.2", + "@rollup/rollup-linux-loong64-musl": "4.62.2", + "@rollup/rollup-linux-ppc64-gnu": "4.62.2", + "@rollup/rollup-linux-ppc64-musl": "4.62.2", + "@rollup/rollup-linux-riscv64-gnu": "4.62.2", + "@rollup/rollup-linux-riscv64-musl": "4.62.2", + "@rollup/rollup-linux-s390x-gnu": "4.62.2", + "@rollup/rollup-linux-x64-gnu": "4.62.2", + "@rollup/rollup-linux-x64-musl": "4.62.2", + "@rollup/rollup-openbsd-x64": "4.62.2", + "@rollup/rollup-openharmony-arm64": "4.62.2", + "@rollup/rollup-win32-arm64-msvc": "4.62.2", + "@rollup/rollup-win32-ia32-msvc": "4.62.2", + "@rollup/rollup-win32-x64-gnu": "4.62.2", + "@rollup/rollup-win32-x64-msvc": "4.62.2", + "fsevents": "~2.3.2" + } + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "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, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, + "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, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/std-env": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", + "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", + "dev": true, + "license": "MIT" + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-literal": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.1.0.tgz", + "integrity": "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^9.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/strip-literal/node_modules/js-tokens": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", + "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tailwind-merge": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.6.1.tgz", + "integrity": "sha512-Oo6tHdpZsGpkKG88HJ8RR1rg/RdnEkQEfMoEk2x1XRI3F1AxeU+ijRXpiVUF4UbLfcxxRGw6TbUINKYdWVsQTQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwindcss": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.1.tgz", + "integrity": "sha512-hk+TB1m+K8CYNrP6rjQaq/Y+4Zylwpa87mLYBKCunwnnQ9p+fHb7kmSfGqyEJoxF/O6CDyABWVFEafNSYKll+Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "license": "MIT" + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinycolor2": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz", + "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==", + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinypool": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", + "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/tinyrainbow": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", + "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.4.tgz", + "integrity": "sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tldts": { + "version": "7.4.11", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.4.11.tgz", + "integrity": "sha512-aBiNayCfTQxuIJBm06M+xR14cYaYlDlSXZbgsnKzKNxDKUVq7KFwTjwBSsb7m9Y5xO8WfPnBc63WaYFMTGlvqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tldts-core": "^7.4.11" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "7.4.11", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.4.11.tgz", + "integrity": "sha512-CW3WN2rIIE/Of21mulhgnGOwoDyEFNygyIBOONSdyAuSATgMMUCpLeUlB+E8sAwA5xRV9hYPl+kyZ9citHCaKg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tough-cookie": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.2.tgz", + "integrity": "sha512-exgYmnmL/sJpR3upZfXG5PoatXQii55xAiXGXzY+sROLZ/Y+SLcp9PgJNI9Vz37HpQ74WvDcLT8eqm+kV3FzrA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tldts": "^7.0.5" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/tr46": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-6.0.0.tgz", + "integrity": "sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.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, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.68.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.68.0.tgz", + "integrity": "sha512-MHy0Y0ynqeEbx/S45+i/bBssdy3X6KNBfmJAP35GrgtNxu2TQ5K5xsFDhAnmsq1jvpdoZOPG1LGtJo0HWqYCrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.68.0", + "@typescript-eslint/parser": "8.68.0", + "@typescript-eslint/typescript-estree": "8.68.0", + "@typescript-eslint/utils": "8.68.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/undici": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-8.10.0.tgz", + "integrity": "sha512-HvltHd7avK13QIw/oLe4qoOLyoVSoafqJ2jYOrtMRBkbYT31eiBQ8O0ehRKZiEZCMEyLFQNIADpgCWC5fALvYQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=22.19.0" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "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" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/use-callback-ref": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", + "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", + "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", + "license": "MIT", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "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==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/victory-vendor": { + "version": "37.3.6", + "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-37.3.6.tgz", + "integrity": "sha512-SbPDPdDBYp+5MJHhBCAyI7wKM3d5ivekigc2Dk2s7pgbZ9wIgIBYGVw4zGHBml/qTFbexrofXW6Gu4noGxrOwQ==", + "license": "MIT AND ISC", + "dependencies": { + "@types/d3-array": "^3.0.3", + "@types/d3-ease": "^3.0.0", + "@types/d3-interpolate": "^3.0.1", + "@types/d3-scale": "^4.0.2", + "@types/d3-shape": "^3.1.0", + "@types/d3-time": "^3.0.0", + "@types/d3-timer": "^3.0.0", + "d3-array": "^3.1.6", + "d3-ease": "^3.0.1", + "d3-interpolate": "^3.0.1", + "d3-scale": "^4.0.2", + "d3-shape": "^3.1.0", + "d3-time": "^3.0.0", + "d3-timer": "^3.0.1" + } + }, + "node_modules/vite": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.3.tgz", + "integrity": "sha512-NTKlcQjlAK7MlQoyb6LgaqHc8sso/pVyUJYWMws3jg21uTJw/LddqIFPcPqP6PzpgbIcZyKI85sFE4HBrQDA8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.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 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz", + "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.4.1", + "es-module-lexer": "^1.7.0", + "pathe": "^2.0.3", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vitest": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.7.tgz", + "integrity": "sha512-KrxIJ62Fd89gfysR4WotlgZABiz2dqFPgqGzX7s+CwsqLFomRH7777ZcrOD6+WVAh7khPQP41A+BKbpcJFrdEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/chai": "^5.2.2", + "@vitest/expect": "3.2.7", + "@vitest/mocker": "3.2.7", + "@vitest/pretty-format": "^3.2.7", + "@vitest/runner": "3.2.7", + "@vitest/snapshot": "3.2.7", + "@vitest/spy": "3.2.7", + "@vitest/utils": "3.2.7", + "chai": "^5.2.0", + "debug": "^4.4.1", + "expect-type": "^1.2.1", + "magic-string": "^0.30.17", + "pathe": "^2.0.3", + "picomatch": "^4.0.2", + "std-env": "^3.9.0", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.2", + "tinyglobby": "^0.2.14", + "tinypool": "^1.1.1", + "tinyrainbow": "^2.0.0", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", + "vite-node": "3.2.4", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/debug": "^4.1.12", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "@vitest/browser": "3.2.7", + "@vitest/ui": "3.2.7", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/debug": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/w3c-xmlserializer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/webidl-conversions": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-8.0.1.tgz", + "integrity": "sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=20" + } + }, + "node_modules/whatwg-mimetype": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-5.0.0.tgz", + "integrity": "sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/whatwg-url": { + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-17.1.0.tgz", + "integrity": "sha512-3GeworPmc2ZfEEHP7lEbUfBX/L75wdEsi0rLNhXcXxnoN5jyq0SL5gCy06SGW2cyTIZdTvWIDQNQoza++vKeaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@exodus/bytes": "^1.15.1", + "tr46": "^6.0.0", + "webidl-conversions": "^8.0.1" + }, + "engines": { + "node": "^22.14.0 || >=24.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/xml-name-validator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true, + "license": "MIT" + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-validation-error": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", + "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } + } + } +} diff --git a/frontend/package.json b/frontend/package.json index c2a74be..e7b9f5e 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,37 +1,53 @@ -{ - "name": "mission-control-2-frontend", - "private": true, - "version": "2.0.0", - "type": "module", - "scripts": { - "dev": "vite", - "build": "tsc --noEmit && vite build", - "preview": "vite preview" - }, - "dependencies": { - "@fontsource/inter": "^5.2.8", - "@fontsource/jetbrains-mono": "^5.2.8", - "@fontsource/space-grotesk": "^5.2.10", - "@tanstack/react-query": "^5.101.1", - "clsx": "^2.1.1", - "cmdk": "^1.1.1", - "d3-force": "^3.0.0", - "lucide-react": "^0.460.0", - "react": "^18.3.1", - "react-dom": "^18.3.1", - "react-force-graph-2d": "^1.29.1", - "recharts": "^3.9.0", - "tailwind-merge": "^2.5.5" - }, - "devDependencies": { - "@tailwindcss/vite": "^4.0.0", - "@types/d3-force": "^3.0.10", - "@types/node": "^22.10.1", - "@types/react": "^18.3.12", - "@types/react-dom": "^18.3.1", - "@vitejs/plugin-react": "^4.3.4", - "tailwindcss": "^4.0.0", - "typescript": "^5.6.3", - "vite": "^6.0.3" - } -} +{ + "name": "mission-control-2-frontend", + "private": true, + "version": "2.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc --noEmit && vite build", + "preview": "vite preview", + "test": "vitest run", + "test:watch": "vitest", + "lint": "eslint src", + "format": "prettier --write \"src/**/*.{ts,tsx,css}\"" + }, + "dependencies": { + "@fontsource/inter": "^5.2.8", + "@fontsource/jetbrains-mono": "^5.2.8", + "@fontsource/space-grotesk": "^5.2.10", + "@tanstack/react-query": "^5.101.1", + "clsx": "^2.1.1", + "cmdk": "^1.1.1", + "d3-force": "^3.0.0", + "lucide-react": "^0.460.0", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-force-graph-2d": "^1.29.1", + "recharts": "^3.9.0", + "tailwind-merge": "^2.5.5" + }, + "devDependencies": { + "@eslint/js": "^10.0.1", + "@tailwindcss/vite": "^4.0.0", + "@testing-library/jest-dom": "^7.0.1", + "@testing-library/react": "^16.3.3", + "@testing-library/user-event": "^14.6.6", + "@types/d3-force": "^3.0.10", + "@types/node": "^22.10.1", + "@types/react": "^18.3.12", + "@types/react-dom": "^18.3.1", + "@vitejs/plugin-react": "^4.3.4", + "eslint": "^10.9.1", + "eslint-plugin-react-hooks": "^7.1.1", + "eslint-plugin-react-refresh": "^0.5.5", + "globals": "^17.11.0", + "jsdom": "^30.0.1", + "prettier": "^3.9.6", + "tailwindcss": "^4.0.0", + "typescript": "^5.6.3", + "typescript-eslint": "^8.68.0", + "vite": "^6.0.3", + "vitest": "^3.2.7" + } +} diff --git a/frontend/src/components/dashboard/LiveAreaChart.test.tsx b/frontend/src/components/dashboard/LiveAreaChart.test.tsx new file mode 100644 index 0000000..65c436f --- /dev/null +++ b/frontend/src/components/dashboard/LiveAreaChart.test.tsx @@ -0,0 +1,41 @@ +import { describe, expect, it } from "vitest" +import { render, screen, waitFor } from "@testing-library/react" +import { LiveAreaChart } from "./LiveAreaChart" +import type { ChartSeries } from "./chartTypes" + +const SERIEN: ChartSeries[] = [{ key: "cpu", label: "CPU", color: "#2dd4bf" }] +const DATEN = [ + { t: 1_700_000_000_000, cpu: 12 }, + { t: 1_700_000_003_000, cpu: 34 }, +] + +// Die Lazy-Huelle ist der Grund, warum Recharts nicht mehr im Startbuendel liegt (P0). +// Wichtig ist dabei nur eines: Der Platzhalter muss GENAU so hoch sein wie das spaetere +// Diagramm — sonst springt die Karte beim Nachladen. +describe("LiveAreaChart (Lazy-Huelle)", () => { + it("haelt vor dem Nachladen die volle Diagrammhoehe frei", () => { + const { container } = render() + const platzhalter = container.querySelector('[aria-hidden="true"]') + expect(platzhalter).not.toBeNull() + expect(platzhalter!.style.height).toBe("176px") + }) + + it("uebernimmt eine abweichende Hoehe", () => { + const { container } = render() + expect(container.querySelector('[aria-hidden="true"]')!.style.height).toBe("96px") + }) + + it("laedt die Recharts-Umsetzung nach und zeigt sie an", async () => { + const { container } = render() + await waitFor(() => { + expect(container.querySelector(".recharts-responsive-container")).not.toBeNull() + }) + // Platzhalter ist verschwunden, sobald das Diagramm da ist. + expect(container.querySelector('[aria-hidden="true"]')).toBeNull() + }) + + it("ist fuer Screenreader stumm — der Platzhalter ist reine Optik", () => { + render() + expect(screen.queryByText(/l(ä|ae)dt/i)).toBeNull() + }) +}) diff --git a/frontend/src/components/system/SettingsTab.tsx b/frontend/src/components/system/SettingsTab.tsx index 14516f2..3bcb752 100644 --- a/frontend/src/components/system/SettingsTab.tsx +++ b/frontend/src/components/system/SettingsTab.tsx @@ -1,123 +1,182 @@ -import { useEffect, useState } from "react" -import { Eye, EyeOff, Key, Shield } from "lucide-react" - -// Einstellungen-Tab des SystemDrawers (Review P2-14: extrahiert). Hält seinen State komplett -// selbst (localStorage-Zugangsdaten) — der Drawer liefert nur `open` (zum Neu-Laden) und -// `showAlert` (gemeinsamer Dialog). -export function SettingsTab({ open, showAlert }: { - open: boolean - showAlert: (title: string, message: string) => void -}) { - const [sudoPasswordInput, setSudoPasswordInput] = useState("") - const [hfTokenInput, setHfTokenInput] = useState("") - const [showSudo, setShowSudo] = useState(false) - const [showHf, setShowHf] = useState(false) - - useEffect(() => { - if (open) { - setSudoPasswordInput(localStorage.getItem("mc_sudo_password") || "") - setHfTokenInput(localStorage.getItem("mc_hf_token") || "") - } - }, [open]) - - return ( -
-
-

Zugangsdaten & Schlüssel

-

- Diese Daten werden ausschließlich lokal in deinem Browser (localStorage) gespeichert und bei Bedarf an das Backend übertragen. -

-
- - {/* Sudo Passwort */} -
- -
- setSudoPasswordInput(e.target.value)} - aria-label="Host Sudo-Passwort" - name="sudo-password" - autoComplete="off" - spellCheck={false} - placeholder="Sudo-Passwort für System-Operationen" - className="w-full h-10 pl-3 pr-10 text-xs bg-background/40 border border-border/60 rounded-lg outline-none focus:border-primary transition-colors text-foreground" - /> - -
-

- Wird benötigt für systemd-Dienste (Llama Swap logs/restart), OS-Update (apt) und Reboot. -

-
- - {/* HuggingFace Token */} -
- -
- setHfTokenInput(e.target.value)} - aria-label="HuggingFace API Token" - name="hf-token" - autoComplete="off" - spellCheck={false} - placeholder="hf_…" - className="w-full h-10 pl-3 pr-10 text-xs bg-background/40 border border-border/60 rounded-lg outline-none focus:border-primary transition-colors text-foreground" - /> - -
-

- Erlaubt das Herunterladen von geschützten oder Gate-restricted Modellen direkt über Mission Control. -

-
- - {/* Buttons */} -
- - -
-
- ) -} +import { useEffect, useState } from "react" +import { Eye, EyeOff, Key, Loader2, ShieldCheck } from "lucide-react" +import { api } from "@/lib/api" + +// Einstellungen-Tab des SystemDrawers. +// +// v3-Umbau P1 (28.08.2026): Hier standen zwei Geheimnisse, die im localStorage des +// Browsers lagen und bei jedem mutierenden Request mitreisten. +// +// · Das Box-Sudo-Passwort ist ERSATZLOS weg. Auf der Box gemessen: `sudo -n true` +// laeuft durch, weil /etc/sudoers den Dienst-Nutzer mit `NOPASSWD: ALL` fuehrt. +// Das Feld hat also nie etwas bewirkt — es war reines Risiko (ein XSS in dieser +// SPA haette Root bedeutet). +// · Der HuggingFace-Token liegt jetzt auf der Box (services/geheimnisse.py, 0600). +// Diese Ansicht erfaehrt nur noch, OB einer gesetzt ist — nie seinen Wert. Deshalb +// gibt es kein "Anzeigen" fuer einen gespeicherten Token, sondern nur Ersetzen +// oder Loeschen. + +interface GeheimnisStatus { + hf_token_gesetzt: boolean + hf_token_aus_env: boolean + schreibbar: boolean +} + +export function SettingsTab({ open, showAlert }: { + open: boolean + showAlert: (title: string, message: string) => void +}) { + const [status, setStatus] = useState(null) + const [eingabe, setEingabe] = useState("") + const [sichtbar, setSichtbar] = useState(false) + const [laedt, setLaedt] = useState(false) + const [arbeitet, setArbeitet] = useState(false) + + async function statusLaden() { + setLaedt(true) + try { + setStatus(await api("/api/maintenance/geheimnisse")) + } catch (e: any) { + showAlert("Nicht erreichbar", `Der Geheimnis-Zustand konnte nicht geladen werden: ${e?.message || e}`) + } finally { + setLaedt(false) + } + } + + useEffect(() => { + if (open) { + setEingabe("") + setSichtbar(false) + void statusLaden() + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [open]) + + async function setzen(wert: string | null) { + setArbeitet(true) + try { + const r = await api("/api/maintenance/geheimnisse", { + method: "POST", + body: JSON.stringify({ schluessel: "hf_token", wert }), + }) + setStatus(r) + setEingabe("") + showAlert(wert ? "Gespeichert" : "Gelöscht", + wert ? "Der Token liegt jetzt auf der Box — der Browser behält ihn nicht." + : "Der Token wurde von der Box entfernt.") + } catch (e: any) { + showAlert("Fehlgeschlagen", e?.message || String(e)) + } finally { + setArbeitet(false) + } + } + + return ( +
+
+

Zugangsdaten & Schlüssel

+

+ Geheimnisse liegen auf der Box (Datei mit Rechten 0600), nicht im Browser. Diese Seite + zeigt nur, ob etwas gesetzt ist — den Wert bekommt sie nie zurück. +

+
+ + {/* Sudo: bewusst nur noch eine Erklaerung, kein Eingabefeld. */} +
+
+
+

+ Systemdienste, OS-Update und Neustart laufen passwortlos (NOPASSWD in + /etc/sudoers). Das frühere Feld hat nie etwas bewirkt und lag dabei + im Browser-Speicher — es ist am 28.08.2026 ersatzlos entfallen. Verlangt sudo auf + der Box je doch ein Passwort, sagt die Wartung das im Klartext; das ist dann dort zu lösen. +

+
+ + {/* HuggingFace-Token */} +
+ + +
+ {laedt ? ( + + + ) : status?.hf_token_gesetzt ? ( + + + ) : ( + + + )} +
+ + {status?.hf_token_aus_env && ( +

+ Der Token kommt aus der Umgebung des Dienstes und hat Vorrang. Hier gespeicherte Werte + bleiben wirkungslos, solange HF_TOKEN gesetzt ist. +

+ )} + + {status && !status.schreibbar && ( +

+ Die Ablage ist nicht beschreibbar — auf einem Entwicklungsrechner ohne den Modell-Ordner + der Box ist das normal. Speichern würde hier ins Leere laufen. +

+ )} + +
+ setEingabe(e.target.value)} + autoComplete="off" + spellCheck={false} + placeholder={status?.hf_token_gesetzt ? "Neuen Token eingeben, um zu ersetzen" : "hf_…"} + className="h-10 w-full rounded-lg border border-border/60 bg-background/40 pl-3 pr-10 text-xs text-foreground outline-none transition-colors focus:border-primary" + /> + +
+

+ Nötig für Modelle mit Zugangsschranke. Wird beim Download als + HF_TOKEN an den Job gereicht und verlässt die Box nicht. +

+
+ +
+ + +
+
+ ) +} diff --git a/frontend/src/lib/api.test.ts b/frontend/src/lib/api.test.ts new file mode 100644 index 0000000..629d70d --- /dev/null +++ b/frontend/src/lib/api.test.ts @@ -0,0 +1,116 @@ +import { afterEach, describe, expect, it, vi } from "vitest" +import { ApiError, api } from "./api" + +/** Ruft api() auf und gibt den erwarteten ApiError typisiert zurueck. + * Kommt kein Fehler, scheitert der Test hier statt spaeter an einer Zusicherung. */ +async function fehlerVon(pfad: string, init?: RequestInit): Promise { + try { + await api(pfad, init) + } catch (e) { + if (e instanceof ApiError) return e + throw e + } + throw new Error(`api(${pfad}) hat keinen Fehler geworfen`) +} + +// Antwort-Attrappe: `text()` liefert den Rumpf, den fehlerText() lesen soll. +function antwort(status: number, rumpf: string, ok = status < 400): Response { + return { + ok, + status, + statusText: status === 500 ? "Internal Server Error" : "Bad Request", + text: async () => rumpf, + json: async () => JSON.parse(rumpf), + } as unknown as Response +} + +function fetchAttrappe(res: Response) { + const spion = vi.fn(async () => res) + vi.stubGlobal("fetch", spion) + return spion +} + +afterEach(() => vi.unstubAllGlobals()) + +describe("api()", () => { + it("gibt den JSON-Rumpf zurueck, wenn alles gut geht", async () => { + fetchAttrappe(antwort(200, '{"ok":true,"wert":42}')) + await expect(api<{ wert: number }>("/api/test")).resolves.toEqual({ ok: true, wert: 42 }) + }) + + // Der Kern von B-14: frueher warf der Helfer "500 Internal Server Error" und verwarf + // den Rumpf — der eigentliche Grund erreichte die Oberflaeche nie. + it("hebt FastAPIs `detail` in die Fehlermeldung", async () => { + fetchAttrappe(antwort(400, '{"detail":"Dienst \'llama-swap\' nicht erlaubt."}')) + await expect(api("/api/maintenance/restart", { method: "POST" })) + .rejects.toThrowError("Dienst 'llama-swap' nicht erlaubt.") + }) + + it("fasst FastAPI-Validierungslisten zu einem Satz zusammen", async () => { + fetchAttrappe(antwort(422, '{"detail":[{"msg":"repo fehlt"},{"msg":"quant ungueltig"}]}')) + await expect(api("/api/models/install", { method: "POST" })) + .rejects.toThrowError("repo fehlt; quant ungueltig") + }) + + it("faellt auf Status + Statustext zurueck, wenn der Rumpf leer ist", async () => { + fetchAttrappe(antwort(500, "")) + await expect(api("/api/test")).rejects.toThrowError("500 Internal Server Error") + }) + + it("laesst sich von einer HTML-Fehlerseite nicht aus dem Tritt bringen", async () => { + fetchAttrappe(antwort(502, "Bad Gateway")) + const fehler = await fehlerVon("/api/test") + expect(fehler.status).toBe(502) + // Kein zweiter Fehler beim Parsen — irgendeine brauchbare Zeile kommt heraus. + expect(typeof fehler.message).toBe("string") + expect(fehler.message.length).toBeGreaterThan(0) + }) + + it("traegt status und detail am Fehlerobjekt", async () => { + fetchAttrappe(antwort(400, '{"detail":"kaputt"}')) + const fehler = await fehlerVon("/api/test") + expect(fehler.status).toBe(400) + expect(fehler.detail).toBe("kaputt") + }) +}) + +// ── Sicherheits-Wache (B-01) ──────────────────────────────────────────────── +// Bis zum 28.08.2026 las api() das Box-Sudo-Passwort und den HF-Token aus dem +// localStorage und haengte sie an jeden mutierenden Request — als Header UND in den +// JSON-Rumpf. Da der Dienst-Nutzer auf der Box mit NOPASSWD: ALL laeuft, war ein XSS +// in dieser SPA gleichbedeutend mit Root. Diese Tests sind der Zaun davor: Wer die +// Bequemlichkeit je wieder einbaut, macht sie rot. +describe("api() traegt keine Geheimnisse", () => { + it("schickt keine Kopfzeilen und keinen Rumpf aus dem localStorage", async () => { + localStorage.setItem("mc_sudo_password", "geheim123") + localStorage.setItem("mc_hf_token", "hf_geheim") + + const spion = fetchAttrappe(antwort(200, '{"ok":true}')) + await api("/api/maintenance/restart", { + method: "POST", + body: JSON.stringify({ service: "llama-swap" }), + }) + + const [, init] = spion.mock.calls[0] as unknown as [string, RequestInit] + const kopfzeilen = JSON.stringify(init.headers ?? {}) + const rumpf = String(init.body ?? "") + + expect(kopfzeilen.toLowerCase()).not.toContain("sudo") + expect(kopfzeilen).not.toContain("geheim123") + expect(rumpf).not.toContain("geheim123") + expect(rumpf).not.toContain("hf_geheim") + expect(rumpf).not.toContain("sudo_password") + expect(rumpf).not.toContain("hf_token") + // Der Rumpf des Aufrufers bleibt unveraendert — nichts wird heimlich angereichert. + expect(JSON.parse(rumpf)).toEqual({ service: "llama-swap" }) + }) + + it("erfindet auch ohne Rumpf keinen", async () => { + localStorage.setItem("mc_sudo_password", "geheim123") + const spion = fetchAttrappe(antwort(200, '{"ok":true}')) + await api("/api/maintenance/reboot", { method: "POST" }) + + const [, init] = spion.mock.calls[0] as unknown as [string, RequestInit] + expect(init.body ?? null).toBeNull() + }) +}) diff --git a/frontend/src/lib/api.ts b/frontend/src/lib/api.ts index bbe6e8b..5371751 100644 --- a/frontend/src/lib/api.ts +++ b/frontend/src/lib/api.ts @@ -1,646 +1,647 @@ -// Schmaler Fetch-Helfer gegen das MC-2-Backend (/api/*). - -export async function api(path: string, init?: RequestInit): Promise { - const headers = { - "Content-Type": "application/json", - ...init?.headers, - } as Record - - const method = init?.method?.toUpperCase() || "GET" - - // Geheimnisse (Box-Passwort, HF-Token) reisen NUR bei mutierenden Requests mit — - // die Dauer-Polls (GET) brauchen sie nie und sollen sie auch nie im Netz tragen. - const sudoPassword = method === "GET" ? null : localStorage.getItem("mc_sudo_password") - const hfToken = method === "GET" ? null : localStorage.getItem("mc_hf_token") - - if (sudoPassword) { - headers["X-Sudo-Password"] = sudoPassword - } - - let body = init?.body - if (method === "POST") { - if (typeof body === "string") { - try { - const data = JSON.parse(body) - let changed = false - if (sudoPassword && !("sudo_password" in data)) { - data["sudo_password"] = sudoPassword - changed = true - } - if (hfToken && !("hf_token" in data)) { - data["hf_token"] = hfToken - changed = true - } - if (changed) { - body = JSON.stringify(data) - } - } catch (e) { - // ignore JSON parse errors - } - } else if (!body) { - const data: Record = {} - if (sudoPassword) data["sudo_password"] = sudoPassword - if (hfToken) data["hf_token"] = hfToken - if (Object.keys(data).length > 0) { - body = JSON.stringify(data) - } - } - } - - const res = await fetch(path, { - ...init, - headers, - body, - }) - if (!res.ok) throw new Error(`${res.status} ${res.statusText}`) - return res.json() as Promise -} - -// llama-swap-`groups`: Mitglieder mit swap=false dürfen GLEICHZEITIG resident sein (Ko-Residenz). -// Die `brains`-Gruppe hält Hirn (fast) + Augen (vision) gemeinsam warm, statt sich zu verdrängen. -export interface GroupSpec { - swap: boolean - persist: boolean - members: string[] -} -export interface GroupsResp { - groups: Record -} -export const getGroups = () => api("/api/groups") -export const setGroup = (group: string, members: string[], swap = false, persist = true) => - api("/api/groups", { method: "PUT", body: JSON.stringify({ group, members, swap, persist }) }) - -export interface Capabilities { - moe: boolean - active_b: number | null - tools: "yes" | "likely" | "no" - vision: boolean - coder: boolean - reasoning: boolean - embedding: boolean - ctx: number | null - params_b: number | null - arch: string | null -} - -export interface Fit { - level: "perfect" | "marginal" | "too_tight" - text: string - req_gb: number - tps: number -} - -export interface RoleRecModel { - name: string - current_role: string | null - params_b: number - quant: string - fit: Fit - suitable: boolean - incomplete: boolean - score: number - reason: string - recommended: boolean -} - -export interface RoleRecResp { - role: string - recommended: string | null - models: RoleRecModel[] -} - -export interface FitResp { - params_b: number - fit: Fit - optimal_ctx: number - assigned_ctx: number - budget: { gtt_gb: number; reserved_gb: number; budget_gb: number; mode: string } - sys_ram_gb: number -} - -export interface ModelInfo { - name: string - role: string | null - aliases: string[] - api_ids: string[] - ctx: number | null - ttl: number | null - cmd: string - gguf_path: string - filename: string - quant: string - size_bytes: number | null - incomplete: boolean - prompt_cache: boolean - spec_draft_model: string | null - spec_type: string | null - spec_active: boolean - parallel_slots: number - capabilities: Capabilities -} - -export interface VocabFingerprint { - model: string | null - pre: string | null - n_vocab: number | null - arch: string | null -} - -export interface DraftInfo { - path: string - filename: string - size_bytes: number | null - vocab: VocabFingerprint | null - compatible: boolean | null // null = nicht prüfbar (Ziel-GGUF fehlt) - mtp?: boolean // MTP-Kopf (Multi-Token-Prediction) statt klassischem Draft -} - -export interface DraftsResp { - target_path: string - target_exists: boolean - target_vocab: VocabFingerprint | null - drafts: DraftInfo[] -} - -export interface DiscoverModel { - name: string - author: string - repo: string - role: string - params_b: number - quant: string - tags: string[] - downloads: number - fit: Fit - optimal_ctx: number - caps: Capabilities -} - -export interface DiscoverCategory { - role: string - title: string - icon: string - models: DiscoverModel[] - recommended: string | null -} - -export interface DiscoverResp { - updated: number - categories: DiscoverCategory[] - sys_ram_gb: number -} - -export interface RoutingResp { - mode?: string - endpoint?: string - heavy_threshold_chars?: number - routes: { name: string; target: string }[] - lanes?: { name: string; target: string; threshold_chars?: number; escalate_chars?: number; aka?: string }[] - fallbacks: Record[] - context_window_fallbacks: Record[] - gateway_reachable: boolean -} - -// UI-editierbare Routing-Policy (GET/PUT /api/routing/policy). Aliase + Zeichen-Schwellen -// hinter den Lanes; hot-reload im Backend (kein Restart). -export interface RoutingPolicy { - fast: string - heavy: string - coder: string - coder_lite: string - heavy_chars: number - coding_escalate_chars: number - fast_no_think: boolean -} -export interface RoutingPolicyField { - key: keyof RoutingPolicy - label: string - type: "str" | "int" | "bool" - min?: number - max?: number -} -export interface RoutingPolicyMeta { - policy: RoutingPolicy - defaults: RoutingPolicy - fields: RoutingPolicyField[] -} -export const getRoutingPolicy = () => api("/api/routing/policy") -export const updateRoutingPolicy = (patch: Partial) => - api<{ policy: RoutingPolicy }>("/api/routing/policy", { method: "PUT", body: JSON.stringify(patch) }) - -export interface GitInfo { - hash: string - date: string - subject: string - branch: string - dirty: boolean - path: string -} - -// Engine kann git-, binary- oder unbekannte Version sein — Felder je nach `type`. -export interface ComponentVersion { - type: "git" | "binary" | "unknown" - hash?: string - date?: string - subject?: string - branch?: string - dirty?: boolean - path?: string - version_text?: string -} - -export interface Versions { - mc2: GitInfo | null - engine: ComponentVersion - hermes_agent: GitInfo | null -} - -export interface SystemStatus { - cpu: { percent: number; cores: number | null } - ram: { total: number; used: number; percent: number } - gpu: { - busy_percent: number | null - vram_used: number | null - vram_total: number | null - gtt_used?: number | null - gtt_total?: number | null - } | null - temp: { cpu?: number; gpu?: number } | null - disk: { total: number; used: number; percent: number } | null - versions?: Versions -} - -export interface ServiceInfo { - name: string - unit: string // echter systemd-Name — Basis für Restart/Logs/Matching (kein Namens-Raten) - url: string - ok: boolean - scope: "user" | "system" -} -export interface ServicesResp { - services: ServiceInfo[] - links: { engine_ui: string; gateway: string; hermes_ui: string } -} - -export interface ComponentUpdate { - key: string // z.B. "hermes_agent" - name: string - current: string | null - latest: string | null - update: boolean | null // null = unbestimmbar (installierte Version remote nicht abfragbar) - reachable: boolean | null -} - -export interface UpdatesResp { - os: number - engine: number - swap: number - models: number - model_list: { role: string; title: string; repo: string }[] - last_check?: number | null - components?: ComponentUpdate[] -} - -export interface UpdateDetails { - kind: "os" | "engine" | "swap" | "hermes" - error?: string - // LLM-Zusammenfassung in Lucys Stimme (hermes/engine/swap; Breaking Changes zuerst) - summary?: string - // Aktions-Verdikt: muss der Besitzer selbst etwas tun? (null = kein Verdikt/keine Summary) - action_needed?: boolean | null - action_text?: string - // os - count?: number - packages?: { name: string; current: string; candidate: string }[] - // os: vom System zurückgestellte Pakete (Phasen-Rollout / kept back) — ehrlich statt "hängt" - held_back?: { name: string; reason: "phasing" | "kept_back" }[] - // engine - installed_build?: number | null - latest_build?: number | null - latest_tag?: string | null - name?: string | null - url?: string | null - body?: string | null - // hermes - branch?: string | null - behind?: number - commits?: { hash: string; subject: string; when: string }[] -} - -export interface ConnectTool { - label: string - lang: string - snippet: string - note: string -} -export interface ConnectResp { - host: string - gateway_url: string - mc_url: string - tools: Record // Leitung 1 — Modell (IDEs/Agenten → Gateway) -} - -export interface ConnectLine { - ok: boolean - detail: string -} -export interface ConnectHealth { - gateway: ConnectLine - memory: ConnectLine // Leitung 2 — Hermes-natives Gedächtnis (nur Status, nichts zu konfigurieren) - desktop_gateway: ConnectLine -} - -// Graph-Ansicht des Wissens-Vaults (GET /api/wissen/graph) — trägt aus historischen Gründen -// noch „Memory" im Namen; die Daten kommen aus dem Vault, nicht aus einem Gedächtnis-Dienst. -export interface MemoryGraphNode { - id: string - content: string - category: string - source: string -} -export interface MemoryGraph { - nodes: MemoryGraphNode[] - edges: { source: string; target: string; weight: number }[] -} - -export interface AgentStatus { - gateway_url: string - box_console_url?: string - hermes_ui_url?: string - gateway_reachable: boolean - box_console_reachable?: boolean - hermes_ui_reachable?: boolean - home_exists: boolean - brain_model?: string - has_config: boolean - has_skills: boolean - has_memories: boolean - telegram_enabled?: boolean - mcp_server_count?: number - pc_executor_reachable?: boolean - pc_executor_url?: string -} - -export interface Job { - id: string - label: string - group?: string | null // "maintenance" = system-veränderndes Update (Wartungs-Riegel) - state: "queued" | "running" | "done" | "failed" | "canceled" - progress?: number - total_bytes?: number - done_bytes?: number - rate_bps?: number - eta_s?: number -} - -export interface Health { - status: string - version: string - engine_reachable: boolean - gateway_reachable: boolean - brain?: { role: string; model: string | null; ready: boolean } -} - -// 24-h-Metrik-Verlauf (GET /api/system/history?minutes=N) — Basis der Cockpit-Zeitachse. -// tp/tc sind Token-GESAMTZÄHLER; Raten rechnet das Frontend aus den Deltas. -export interface HistoryPoint { - t: number // Epoch-Sekunden - cpu: number | null - ram: number | null - gpu: number | null - disk: number | null - tp: number | null - tc: number | null -} -export interface HistoryResp { - sample_s: number - points: HistoryPoint[] -} - -export interface TokenStats { - prompt_tokens: number - completion_tokens: number - total_tokens: number - saved_usd: number - saved_eur: number - pricing?: Record -} - -// Per-Turn-Latenz-Trace (GET /api/voice/trace). Balken-Stufen (zeitlich disjunkt): -// stt · vision · hirn · gen. Der Gedächtnis-Abruf läuft seit der Mem0-Ablösung Hermes-intern -// (kein Rückruf an MC2) und steckt daher unsichtbar in hirn_ms. -export interface VoiceTurn { - id: string - ts: number // Epoch-Sekunden - session: string - kind: string - had_images: boolean - stt_ms: number | null - vision_ms: number | null - hirn_ms: number | null // Zeit bis erstes Inhalts-Token (Agent + Gedächtnis + LLM-TTFT) - gen_ms: number | null // Generierung nach dem ersten Token bis Stream-Ende - total_ms: number - error: string | null -} - -export interface VoiceTraceResp { - turns: VoiceTurn[] -} - -export interface ModelsResp { - models: ModelInfo[] - running?: string[] -} - -// ── Auftragsbuch (Vorschlags-Inbox) ────────────────────────────────────────── -export interface AuftragStatus { - state: "laeuft" | "eingespielt" | "fehlgeschlagen" | "rollback" | "zurueckgerollt" | "kritisch" | "abgelehnt" - detail: string - ts: number -} -export interface AuftragItem { - repo?: "mc2" | "lucy" // Quelle: Box-Stack (mc2) oder Lucy-Desktop (Annahme baut am PC) - branch: string - kind: string // wartung | orchestrator | doku | feature - subject: string - body: string - author: string - ts: number | null - ahead: number - behind: number - shortstat: string - files: { status: string; path: string }[] - files_truncated: boolean - frontend_ohne_build: boolean // Frontend-Quelltext ohne dist → Box kann nicht bauen - verwaist?: boolean // kein gemeinsamer Ursprung mit main (kaputt aufgesetzt) → Merge unmöglich - leer?: boolean // Diff gegen main ist leer → bringt nichts (schon in main / am Repo vorbei) - status: AuftragStatus | null - ci_status?: "success" | "failure" | "pending" | "skipped" | null - // Empfehlungs-Stempel des nächtlichen Karten-Gutachters (Meinung, kein Gate). - empfehlung: { empfehlung: "ANNEHMEN" | "ABLEHNEN" | "UNKLAR"; satz: string; richter: string } | null -} -export interface SkillKandidat { - file: string - title: string - preview: string - mtime: number -} -export interface AuftragsbuchResp { - available: boolean - items: AuftragItem[] - skill_kandidaten: SkillKandidat[] - open_count: number -} - -// ── Ideen-Queue (natives Hermes-Kanban) ────────────────────────────────────── -export interface IdeenItem { - id: string - titel: string - body: string - status: string // triage | todo | ready | running | blocked | review | done - assignee: string | null - welt?: string // "box" = Werkstatt baut · "ide" = für Zed vorbereitet - art?: string // "box" | "idee" (nur durchdacht) | "projekt" (Repo vorbereitet) - erstellt: number | null - fertig: number | null - von: string | null - frage?: string | null // bei status=blocked: die Frage/der Grund des Workers - frage_kind?: string | null // needs_input | capability | transient | "" - eltern?: string[] // offene Vorgänger-Karten (task_links) — leer = startbereit - wartet_auf?: string[] // Titel der offenen Vorgänger (max. 3, für die Anzeige) - notiz?: string | null // bei running: jüngste Heartbeat-Notiz des Workers - projekt?: string | null // Familien-Schlüssel (verkettete Karten) — null = Einzelkarte - prio?: number // Dispatcher-Reihenfolge: priority DESC, created ASC - puls_alter?: number | null // bei running: Sekunden seit letztem Lebenszeichen (Hänger-Warnung) - gestartet?: number | null // bei running: started_at (Epoch) -} -// Karten-Familie (verkettete Karten = ein Projekt) für die gruppierte Queue-Sicht -export interface IdeenProjekt { - key: string - titel: string - gesamt: number - fertig: number - laeuft: number - haengt: number -} -export interface IdeenLogResp { - available: boolean - lines: string[] -} -export interface IdeenResp { - available: boolean - items: IdeenItem[] - offen: number - fehler?: string - projekte?: IdeenProjekt[] -} - -// Ergebnis einer fertigen Queue-Aufgabe (Abschluss-Zusammenfassung des Workers) -export interface IdeenErgebnis { - available: boolean - summary: string - result: string -} - -// Konzept einer IDE-Karte — aus dem Gitea-Repo oder aus ~/konzepte auf der Box -export interface IdeenKonzept { - available: boolean - repo?: string | null - clone_url?: string - quelle?: "repo" | "datei" - pfad?: string // nur quelle=datei: Pfad auf der Box - datei?: string - konzept?: string - error?: string -} - -// ── Chronik (Timeline aus dem Melde-Briefkasten) ───────────────────────────── -export interface ChronikItem { - id: number - ts: number - subject: string - text: string - source: string - priority: "normal" | "silent" -} -export interface ChronikResp { - items: ChronikItem[] -} - -// ── Wissens-Vault (Traum-Notizen, read-only) ───────────────────────────────── -export interface WissenFile { - path: string - name: string - dir: string - title: string - mtime: number - neu: boolean -} -export interface WissenResp { - available: boolean - files: WissenFile[] -} -export interface WissenDatei { - path: string - content: string - mtime: number -} - -// ── Zeitmaschine (Snapshots + Restore) ─────────────────────────────────────── -export interface Snapshot { - snapshot: string - file: string - size_mb: number -} -export interface ZeitmaschineResp { - available: boolean - backups: Snapshot[] -} - -// ── Erinnerungen (Wecker/Routinen) ─────────────────────────────────────────── -export interface Reminder { - id: number - text: string - next_ts: number - repeat: string // '' einmalig | daily | weekdays | weekly - created_ts: number -} - -export interface HermesBrainModel { - name: string - filename?: string - params_b: number | null - quant?: string - size_bytes?: number | null - version?: number | null - gguf_path?: string - incomplete?: boolean -} - -export interface HermesBrainCandidate { - repo: string - name: string - version: number - params_b: number - downloads: number - fit: Fit -} - -export interface HermesBrainBudget { - gtt_gb: number - brain_gb: number // Footprint des (empfohlenen) Brains, das immer resident bleibt - warm_projected_gb: number // alle persist-Modelle warm (Info) - free_after_gb: number // frei nach Brain + größtem on-demand - largest_ondemand_gb: number // größtes on-demand-Modell (z.B. heavy/coder) - fits: boolean // passt Brain + größtes on-demand zusammen ins Budget? -} - -export interface HermesBrainResp { - current: HermesBrainModel | null - recommended: HermesBrainCandidate | null - update_available: boolean - budget?: HermesBrainBudget | null -} - -// ── Ideen-Log (Live Worker Log) ────────────────────────────────────────────── -export const getIdeenLog = (id: string) => api(`/api/ideen/${id}/log`) +// Schmaler Fetch-Helfer gegen das MC-2-Backend (/api/*). +// +// v3-Umbau P1 (28.08.2026): Hier wurden frueher zwei Geheimnisse aus dem localStorage +// gelesen und an jeden mutierenden Request gehaengt — das Box-Sudo-Passwort (als Header +// UND im JSON-Rumpf) und der HuggingFace-Token. Da der Dienst-Nutzer auf der Box mit +// `NOPASSWD: ALL` laeuft, war ein XSS in dieser SPA gleichbedeutend mit Root. +// Das Sudo-Passwort ist ersatzlos weg (auf der Box gemessen: `sudo -n true` laeuft durch, +// es wurde nie gebraucht), der HF-Token liegt jetzt auf der Box (services/geheimnisse.py). +// Diese Datei kennt kein Geheimnis mehr — und soll auch nie wieder eines kennen. + +/** Fehler mit dem, was das Backend WIRKLICH gesagt hat. + * + * Vorher warf der Helfer `new Error("500 Internal Server Error")` und verwarf den Rumpf. + * FastAPI legt den eigentlichen Grund aber in `detail` — der erreichte die Oberflaeche nie, + * und der Nutzer las "500" statt "Dienst 'llama-swap' nicht erlaubt". */ +export class ApiError extends Error { + readonly status: number + readonly detail: string | null + constructor(status: number, statusText: string, detail: string | null) { + super(detail || `${status} ${statusText}`) + this.name = "ApiError" + this.status = status + this.detail = detail + } +} + +/** Liest den Fehler-Rumpf, ohne selbst zu scheitern: Ein kaputter oder leerer Rumpf darf + * die Fehlermeldung nicht in einen zweiten Fehler verwandeln. */ +async function fehlerText(res: Response): Promise { + try { + const roh = await res.text() + if (!roh) return null + try { + const d = JSON.parse(roh) + const detail = d?.detail ?? d?.err ?? d?.message + if (typeof detail === "string" && detail.trim()) return detail.trim() + if (Array.isArray(detail) && detail.length) { + // FastAPI-Validierungsfehler: Liste aus {loc, msg, type} + return detail.map((e: any) => e?.msg).filter(Boolean).join("; ") || null + } + return null + } catch { + // Kein JSON (HTML-Fehlerseite eines Proxys o. AE.) — erste Zeile reicht als Hinweis. + return roh.slice(0, 200).split("\n")[0].trim() || null + } + } catch { + return null + } +} + +export async function api(path: string, init?: RequestInit): Promise { + const res = await fetch(path, { + ...init, + headers: { "Content-Type": "application/json", ...init?.headers }, + }) + if (!res.ok) throw new ApiError(res.status, res.statusText, await fehlerText(res)) + return res.json() as Promise +} + +// llama-swap-`groups`: Mitglieder mit swap=false dürfen GLEICHZEITIG resident sein (Ko-Residenz). +// Die `brains`-Gruppe hält Hirn (fast) + Augen (vision) gemeinsam warm, statt sich zu verdrängen. +export interface GroupSpec { + swap: boolean + persist: boolean + members: string[] +} +export interface GroupsResp { + groups: Record +} +export const getGroups = () => api("/api/groups") +export const setGroup = (group: string, members: string[], swap = false, persist = true) => + api("/api/groups", { method: "PUT", body: JSON.stringify({ group, members, swap, persist }) }) + +export interface Capabilities { + moe: boolean + active_b: number | null + tools: "yes" | "likely" | "no" + vision: boolean + coder: boolean + reasoning: boolean + embedding: boolean + ctx: number | null + params_b: number | null + arch: string | null +} + +export interface Fit { + level: "perfect" | "marginal" | "too_tight" + text: string + req_gb: number + tps: number +} + +export interface RoleRecModel { + name: string + current_role: string | null + params_b: number + quant: string + fit: Fit + suitable: boolean + incomplete: boolean + score: number + reason: string + recommended: boolean +} + +export interface RoleRecResp { + role: string + recommended: string | null + models: RoleRecModel[] +} + +export interface FitResp { + params_b: number + fit: Fit + optimal_ctx: number + assigned_ctx: number + budget: { gtt_gb: number; reserved_gb: number; budget_gb: number; mode: string } + sys_ram_gb: number +} + +export interface ModelInfo { + name: string + role: string | null + aliases: string[] + api_ids: string[] + ctx: number | null + ttl: number | null + cmd: string + gguf_path: string + filename: string + quant: string + size_bytes: number | null + incomplete: boolean + prompt_cache: boolean + spec_draft_model: string | null + spec_type: string | null + spec_active: boolean + parallel_slots: number + capabilities: Capabilities +} + +export interface VocabFingerprint { + model: string | null + pre: string | null + n_vocab: number | null + arch: string | null +} + +export interface DraftInfo { + path: string + filename: string + size_bytes: number | null + vocab: VocabFingerprint | null + compatible: boolean | null // null = nicht prüfbar (Ziel-GGUF fehlt) + mtp?: boolean // MTP-Kopf (Multi-Token-Prediction) statt klassischem Draft +} + +export interface DraftsResp { + target_path: string + target_exists: boolean + target_vocab: VocabFingerprint | null + drafts: DraftInfo[] +} + +export interface DiscoverModel { + name: string + author: string + repo: string + role: string + params_b: number + quant: string + tags: string[] + downloads: number + fit: Fit + optimal_ctx: number + caps: Capabilities +} + +export interface DiscoverCategory { + role: string + title: string + icon: string + models: DiscoverModel[] + recommended: string | null +} + +export interface DiscoverResp { + updated: number + categories: DiscoverCategory[] + sys_ram_gb: number +} + +export interface RoutingResp { + mode?: string + endpoint?: string + heavy_threshold_chars?: number + routes: { name: string; target: string }[] + lanes?: { name: string; target: string; threshold_chars?: number; escalate_chars?: number; aka?: string }[] + fallbacks: Record[] + context_window_fallbacks: Record[] + gateway_reachable: boolean +} + +// UI-editierbare Routing-Policy (GET/PUT /api/routing/policy). Aliase + Zeichen-Schwellen +// hinter den Lanes; hot-reload im Backend (kein Restart). +export interface RoutingPolicy { + fast: string + heavy: string + coder: string + coder_lite: string + heavy_chars: number + coding_escalate_chars: number + fast_no_think: boolean +} +export interface RoutingPolicyField { + key: keyof RoutingPolicy + label: string + type: "str" | "int" | "bool" + min?: number + max?: number +} +export interface RoutingPolicyMeta { + policy: RoutingPolicy + defaults: RoutingPolicy + fields: RoutingPolicyField[] +} +export const getRoutingPolicy = () => api("/api/routing/policy") +export const updateRoutingPolicy = (patch: Partial) => + api<{ policy: RoutingPolicy }>("/api/routing/policy", { method: "PUT", body: JSON.stringify(patch) }) + +export interface GitInfo { + hash: string + date: string + subject: string + branch: string + dirty: boolean + path: string +} + +// Engine kann git-, binary- oder unbekannte Version sein — Felder je nach `type`. +export interface ComponentVersion { + type: "git" | "binary" | "unknown" + hash?: string + date?: string + subject?: string + branch?: string + dirty?: boolean + path?: string + version_text?: string +} + +export interface Versions { + mc2: GitInfo | null + engine: ComponentVersion + hermes_agent: GitInfo | null +} + +export interface SystemStatus { + cpu: { percent: number; cores: number | null } + ram: { total: number; used: number; percent: number } + gpu: { + busy_percent: number | null + vram_used: number | null + vram_total: number | null + gtt_used?: number | null + gtt_total?: number | null + } | null + temp: { cpu?: number; gpu?: number } | null + disk: { total: number; used: number; percent: number } | null + versions?: Versions +} + +export interface ServiceInfo { + name: string + unit: string // echter systemd-Name — Basis für Restart/Logs/Matching (kein Namens-Raten) + url: string + ok: boolean + scope: "user" | "system" +} +export interface ServicesResp { + services: ServiceInfo[] + links: { engine_ui: string; gateway: string; hermes_ui: string } +} + +export interface ComponentUpdate { + key: string // z.B. "hermes_agent" + name: string + current: string | null + latest: string | null + update: boolean | null // null = unbestimmbar (installierte Version remote nicht abfragbar) + reachable: boolean | null +} + +export interface UpdatesResp { + os: number + engine: number + swap: number + models: number + model_list: { role: string; title: string; repo: string }[] + last_check?: number | null + components?: ComponentUpdate[] +} + +export interface UpdateDetails { + kind: "os" | "engine" | "swap" | "hermes" + error?: string + // LLM-Zusammenfassung in Lucys Stimme (hermes/engine/swap; Breaking Changes zuerst) + summary?: string + // Aktions-Verdikt: muss der Besitzer selbst etwas tun? (null = kein Verdikt/keine Summary) + action_needed?: boolean | null + action_text?: string + // os + count?: number + packages?: { name: string; current: string; candidate: string }[] + // os: vom System zurückgestellte Pakete (Phasen-Rollout / kept back) — ehrlich statt "hängt" + held_back?: { name: string; reason: "phasing" | "kept_back" }[] + // engine + installed_build?: number | null + latest_build?: number | null + latest_tag?: string | null + name?: string | null + url?: string | null + body?: string | null + // hermes + branch?: string | null + behind?: number + commits?: { hash: string; subject: string; when: string }[] +} + +export interface ConnectTool { + label: string + lang: string + snippet: string + note: string +} +export interface ConnectResp { + host: string + gateway_url: string + mc_url: string + tools: Record // Leitung 1 — Modell (IDEs/Agenten → Gateway) +} + +export interface ConnectLine { + ok: boolean + detail: string +} +export interface ConnectHealth { + gateway: ConnectLine + memory: ConnectLine // Leitung 2 — Hermes-natives Gedächtnis (nur Status, nichts zu konfigurieren) + desktop_gateway: ConnectLine +} + +// Graph-Ansicht des Wissens-Vaults (GET /api/wissen/graph) — trägt aus historischen Gründen +// noch „Memory" im Namen; die Daten kommen aus dem Vault, nicht aus einem Gedächtnis-Dienst. +export interface MemoryGraphNode { + id: string + content: string + category: string + source: string +} +export interface MemoryGraph { + nodes: MemoryGraphNode[] + edges: { source: string; target: string; weight: number }[] +} + +export interface AgentStatus { + gateway_url: string + box_console_url?: string + hermes_ui_url?: string + gateway_reachable: boolean + box_console_reachable?: boolean + hermes_ui_reachable?: boolean + home_exists: boolean + brain_model?: string + has_config: boolean + has_skills: boolean + has_memories: boolean + telegram_enabled?: boolean + mcp_server_count?: number + pc_executor_reachable?: boolean + pc_executor_url?: string +} + +export interface Job { + id: string + label: string + group?: string | null // "maintenance" = system-veränderndes Update (Wartungs-Riegel) + state: "queued" | "running" | "done" | "failed" | "canceled" + progress?: number + total_bytes?: number + done_bytes?: number + rate_bps?: number + eta_s?: number +} + +export interface Health { + status: string + version: string + engine_reachable: boolean + gateway_reachable: boolean + brain?: { role: string; model: string | null; ready: boolean } +} + +// 24-h-Metrik-Verlauf (GET /api/system/history?minutes=N) — Basis der Cockpit-Zeitachse. +// tp/tc sind Token-GESAMTZÄHLER; Raten rechnet das Frontend aus den Deltas. +export interface HistoryPoint { + t: number // Epoch-Sekunden + cpu: number | null + ram: number | null + gpu: number | null + disk: number | null + tp: number | null + tc: number | null +} +export interface HistoryResp { + sample_s: number + points: HistoryPoint[] +} + +export interface TokenStats { + prompt_tokens: number + completion_tokens: number + total_tokens: number + saved_usd: number + saved_eur: number + pricing?: Record +} + +// Per-Turn-Latenz-Trace (GET /api/voice/trace). Balken-Stufen (zeitlich disjunkt): +// stt · vision · hirn · gen. Der Gedächtnis-Abruf läuft seit der Mem0-Ablösung Hermes-intern +// (kein Rückruf an MC2) und steckt daher unsichtbar in hirn_ms. +export interface VoiceTurn { + id: string + ts: number // Epoch-Sekunden + session: string + kind: string + had_images: boolean + stt_ms: number | null + vision_ms: number | null + hirn_ms: number | null // Zeit bis erstes Inhalts-Token (Agent + Gedächtnis + LLM-TTFT) + gen_ms: number | null // Generierung nach dem ersten Token bis Stream-Ende + total_ms: number + error: string | null +} + +export interface VoiceTraceResp { + turns: VoiceTurn[] +} + +export interface ModelsResp { + models: ModelInfo[] + running?: string[] +} + +// ── Auftragsbuch (Vorschlags-Inbox) ────────────────────────────────────────── +export interface AuftragStatus { + state: "laeuft" | "eingespielt" | "fehlgeschlagen" | "rollback" | "zurueckgerollt" | "kritisch" | "abgelehnt" + detail: string + ts: number +} +export interface AuftragItem { + repo?: "mc2" | "lucy" // Quelle: Box-Stack (mc2) oder Lucy-Desktop (Annahme baut am PC) + branch: string + kind: string // wartung | orchestrator | doku | feature + subject: string + body: string + author: string + ts: number | null + ahead: number + behind: number + shortstat: string + files: { status: string; path: string }[] + files_truncated: boolean + frontend_ohne_build: boolean // Frontend-Quelltext ohne dist → Box kann nicht bauen + verwaist?: boolean // kein gemeinsamer Ursprung mit main (kaputt aufgesetzt) → Merge unmöglich + leer?: boolean // Diff gegen main ist leer → bringt nichts (schon in main / am Repo vorbei) + status: AuftragStatus | null + ci_status?: "success" | "failure" | "pending" | "skipped" | null + // Empfehlungs-Stempel des nächtlichen Karten-Gutachters (Meinung, kein Gate). + empfehlung: { empfehlung: "ANNEHMEN" | "ABLEHNEN" | "UNKLAR"; satz: string; richter: string } | null +} +export interface SkillKandidat { + file: string + title: string + preview: string + mtime: number +} +export interface AuftragsbuchResp { + available: boolean + items: AuftragItem[] + skill_kandidaten: SkillKandidat[] + open_count: number +} + +// ── Ideen-Queue (natives Hermes-Kanban) ────────────────────────────────────── +export interface IdeenItem { + id: string + titel: string + body: string + status: string // triage | todo | ready | running | blocked | review | done + assignee: string | null + welt?: string // "box" = Werkstatt baut · "ide" = für Zed vorbereitet + art?: string // "box" | "idee" (nur durchdacht) | "projekt" (Repo vorbereitet) + erstellt: number | null + fertig: number | null + von: string | null + frage?: string | null // bei status=blocked: die Frage/der Grund des Workers + frage_kind?: string | null // needs_input | capability | transient | "" + eltern?: string[] // offene Vorgänger-Karten (task_links) — leer = startbereit + wartet_auf?: string[] // Titel der offenen Vorgänger (max. 3, für die Anzeige) + notiz?: string | null // bei running: jüngste Heartbeat-Notiz des Workers + projekt?: string | null // Familien-Schlüssel (verkettete Karten) — null = Einzelkarte + prio?: number // Dispatcher-Reihenfolge: priority DESC, created ASC + puls_alter?: number | null // bei running: Sekunden seit letztem Lebenszeichen (Hänger-Warnung) + gestartet?: number | null // bei running: started_at (Epoch) +} +// Karten-Familie (verkettete Karten = ein Projekt) für die gruppierte Queue-Sicht +export interface IdeenProjekt { + key: string + titel: string + gesamt: number + fertig: number + laeuft: number + haengt: number +} +export interface IdeenLogResp { + available: boolean + lines: string[] +} +export interface IdeenResp { + available: boolean + items: IdeenItem[] + offen: number + fehler?: string + projekte?: IdeenProjekt[] +} + +// Ergebnis einer fertigen Queue-Aufgabe (Abschluss-Zusammenfassung des Workers) +export interface IdeenErgebnis { + available: boolean + summary: string + result: string +} + +// Konzept einer IDE-Karte — aus dem Gitea-Repo oder aus ~/konzepte auf der Box +export interface IdeenKonzept { + available: boolean + repo?: string | null + clone_url?: string + quelle?: "repo" | "datei" + pfad?: string // nur quelle=datei: Pfad auf der Box + datei?: string + konzept?: string + error?: string +} + +// ── Chronik (Timeline aus dem Melde-Briefkasten) ───────────────────────────── +export interface ChronikItem { + id: number + ts: number + subject: string + text: string + source: string + priority: "normal" | "silent" +} +export interface ChronikResp { + items: ChronikItem[] +} + +// ── Wissens-Vault (Traum-Notizen, read-only) ───────────────────────────────── +export interface WissenFile { + path: string + name: string + dir: string + title: string + mtime: number + neu: boolean +} +export interface WissenResp { + available: boolean + files: WissenFile[] +} +export interface WissenDatei { + path: string + content: string + mtime: number +} + +// ── Zeitmaschine (Snapshots + Restore) ─────────────────────────────────────── +export interface Snapshot { + snapshot: string + file: string + size_mb: number +} +export interface ZeitmaschineResp { + available: boolean + backups: Snapshot[] +} + +// ── Erinnerungen (Wecker/Routinen) ─────────────────────────────────────────── +export interface Reminder { + id: number + text: string + next_ts: number + repeat: string // '' einmalig | daily | weekdays | weekly + created_ts: number +} + +export interface HermesBrainModel { + name: string + filename?: string + params_b: number | null + quant?: string + size_bytes?: number | null + version?: number | null + gguf_path?: string + incomplete?: boolean +} + +export interface HermesBrainCandidate { + repo: string + name: string + version: number + params_b: number + downloads: number + fit: Fit +} + +export interface HermesBrainBudget { + gtt_gb: number + brain_gb: number // Footprint des (empfohlenen) Brains, das immer resident bleibt + warm_projected_gb: number // alle persist-Modelle warm (Info) + free_after_gb: number // frei nach Brain + größtem on-demand + largest_ondemand_gb: number // größtes on-demand-Modell (z.B. heavy/coder) + fits: boolean // passt Brain + größtes on-demand zusammen ins Budget? +} + +export interface HermesBrainResp { + current: HermesBrainModel | null + recommended: HermesBrainCandidate | null + update_available: boolean + budget?: HermesBrainBudget | null +} + +// ── Ideen-Log (Live Worker Log) ────────────────────────────────────────────── +export const getIdeenLog = (id: string) => api(`/api/ideen/${id}/log`) diff --git a/frontend/src/lib/metricsStore.test.ts b/frontend/src/lib/metricsStore.test.ts new file mode 100644 index 0000000..3ac8f23 --- /dev/null +++ b/frontend/src/lib/metricsStore.test.ts @@ -0,0 +1,59 @@ +import { beforeEach, describe, expect, it, vi } from "vitest" +import { act, renderHook } from "@testing-library/react" + +// Der Verlaufsspeicher ist modul-global (er soll Tab-Wechsel ueberleben). Fuer jeden Test +// eine frische Modul-Instanz, sonst tragen sich die Faelle gegenseitig Daten ein. +async function frischerStore() { + vi.resetModules() + return await import("./metricsStore") +} + +describe("metricsStore", () => { + let store: Awaited> + + beforeEach(async () => { + store = await frischerStore() + }) + + it("beginnt leer", () => { + const { result } = renderHook(() => store.useSysHistory()) + expect(result.current).toEqual([]) + }) + + it("meldet neue Messpunkte an die Abonnenten", () => { + const { result } = renderHook(() => store.useSysHistory()) + act(() => store.pushSys({ t: 1, cpu: 10, ram: 20, gpu: 30, disk: 40 })) + expect(result.current).toHaveLength(1) + expect(result.current[0].cpu).toBe(10) + }) + + // Ohne Deckel waechst der Verlauf unbegrenzt — bei 3-s-Takt sind das ~28 800 Punkte + // pro Tag in einem Dauerlaeufer-Tab. + it("deckelt den Verlauf und behaelt die JUENGSTEN Punkte", () => { + const { result } = renderHook(() => store.useSysHistory()) + act(() => { + for (let i = 0; i < 60; i++) store.pushSys({ t: i, cpu: i, ram: 0, gpu: null, disk: null }) + }) + expect(result.current).toHaveLength(40) + expect(result.current[0].t).toBe(20) + expect(result.current[39].t).toBe(59) + }) + + it("haelt System- und Token-Verlauf auseinander", () => { + const { result: sys } = renderHook(() => store.useSysHistory()) + const { result: tok } = renderHook(() => store.useTokHistory()) + act(() => store.pushTok({ t: 1, prompt: 5, completion: 7 })) + expect(sys.current).toHaveLength(0) + expect(tok.current).toHaveLength(1) + expect(tok.current[0].completion).toBe(7) + }) + + // useSyncExternalStore vergleicht per Referenz: wuerde pushSys das Array an Ort und + // Stelle veraendern, bliebe die Anzeige stehen, obwohl Daten da sind. + it("liefert bei jeder Aenderung ein NEUES Array (Referenzwechsel)", () => { + const { result } = renderHook(() => store.useSysHistory()) + const vorher = result.current + act(() => store.pushSys({ t: 1, cpu: 1, ram: 1, gpu: null, disk: null })) + expect(result.current).not.toBe(vorher) + }) +}) diff --git a/frontend/src/lib/veralteteVersion.ts b/frontend/src/lib/veralteteVersion.ts new file mode 100644 index 0000000..d2780f6 --- /dev/null +++ b/frontend/src/lib/veralteteVersion.ts @@ -0,0 +1,31 @@ +// Umgang mit einem veralteten Bündel (v3-Umbau P1). +// +// DAS PROBLEM, hier gemessen am 28.08.2026: Ein Deploy ersetzt `frontend/dist` und startet +// den Dienst neu. Offene Browser-Tabs behalten aber ihr altes, bereits geladenes +// Start-Bündel — und dessen Nachlade-Chunks (`IdeenView-J4hS7xB2.js` …) tragen den Hash +// des ALTEN Builds. Die Dateien sind weg. Beim nächsten Ansichtswechsel wirft der +// dynamische Import, die Fehlergrenze schlägt zu und der Nutzer sieht eine kaputte Seite, +// obwohl nur sein Tab alt ist. +// +// Vite meldet genau diesen Fall als `vite:preloadError`. Wir laden dann EINMAL neu — der +// Browser holt `index.html` (das nie gecacht wird, siehe backend/app.py) und damit das +// aktuelle Bündel. Die Sperre in sessionStorage verhindert eine Schleife, falls der Chunk +// aus einem anderen Grund fehlt (Netz weg, Datei wirklich kaputt): Dann bleibt es beim +// ehrlichen Fehler statt bei einer endlos neuladenden Seite. + +const SPERRE = "mc_neuladen_wegen_version" + +export function veralteteVersionAbfangen() { + window.addEventListener("vite:preloadError", (e) => { + if (sessionStorage.getItem(SPERRE)) return // schon versucht — Fehler durchlassen + e.preventDefault() // verhindert, dass der Import zusätzlich als Absturz hochblubbert + sessionStorage.setItem(SPERRE, "1") + window.location.reload() + }) + + // Hat der Neustart geklappt, ist die Sperre nach dem nächsten erfolgreichen Start wieder + // frei — sonst wäre der Schutz nach dem ersten Deploy für diese Sitzung verbraucht. + window.addEventListener("load", () => { + window.setTimeout(() => sessionStorage.removeItem(SPERRE), 5_000) + }) +} diff --git a/frontend/src/main.tsx b/frontend/src/main.tsx index 899909f..a61c836 100644 --- a/frontend/src/main.tsx +++ b/frontend/src/main.tsx @@ -1,27 +1,32 @@ -import React from "react" -import ReactDOM from "react-dom/client" -import { QueryClient, QueryClientProvider } from "@tanstack/react-query" -import App from "./App" -import { AppErrorBoundary } from "./components/AppErrorBoundary" -import "./index.css" - -// Zentraler Daten-Layer: Caching, Dedup, Retry, Polling pro Query-Hook. -const queryClient = new QueryClient({ - defaultOptions: { - queries: { - retry: 1, - refetchOnWindowFocus: false, - staleTime: 5_000, - }, - }, -}) - -ReactDOM.createRoot(document.getElementById("root")!).render( - - - - - - - , -) +import React from "react" +import ReactDOM from "react-dom/client" +import { QueryClient, QueryClientProvider } from "@tanstack/react-query" +import App from "./App" +import { AppErrorBoundary } from "./components/AppErrorBoundary" +import { veralteteVersionAbfangen } from "./lib/veralteteVersion" +import "./index.css" + +// Muss VOR dem ersten Rendern hängen: Nach einem Deploy sucht ein offener Tab +// Nachlade-Chunks des alten Builds, die es nicht mehr gibt (siehe lib/veralteteVersion.ts). +veralteteVersionAbfangen() + +// Zentraler Daten-Layer: Caching, Dedup, Retry, Polling pro Query-Hook. +const queryClient = new QueryClient({ + defaultOptions: { + queries: { + retry: 1, + refetchOnWindowFocus: false, + staleTime: 5_000, + }, + }, +}) + +ReactDOM.createRoot(document.getElementById("root")!).render( + + + + + + + , +) diff --git a/frontend/src/test/setup.ts b/frontend/src/test/setup.ts new file mode 100644 index 0000000..aa8a9cd --- /dev/null +++ b/frontend/src/test/setup.ts @@ -0,0 +1,52 @@ +// Test-Aufbau (v3-Umbau P1). Laeuft vor jeder Testdatei. +import "@testing-library/jest-dom/vitest" +import { cleanup } from "@testing-library/react" +import { afterEach } from "vitest" + +// Nach jedem Test das DOM leeren — sonst finden Abfragen Reste des Vorgaengers. +afterEach(() => { + cleanup() + localStorage.clear() +}) + +// jsdom rechnet kein Layout: JEDES Element ist 0x0, und es gibt keinen ResizeObserver. +// Messende Komponenten (Recharts' ResponsiveContainer, der Kraftgraph) zeichnen daraufhin +// gar nichts und warnen "width(0) and height(0)". +// +// Diese Attrappe meldet den Beobachtern EINMAL eine plausible Groesse, damit solche +// Komponenten ueberhaupt rendern. Sie ist bewusst konstant: Tests hier pruefen Logik und +// Struktur, nie gemessene Pixel — auf echte Layout-Werte darf sich kein Test stuetzen. +const TEST_BREITE = 800 +const TEST_HOEHE = 400 + +class TestResizeObserver implements ResizeObserver { + constructor(private rueckruf: ResizeObserverCallback) {} + + observe(ziel: Element) { + const rect = { + width: TEST_BREITE, height: TEST_HOEHE, top: 0, left: 0, + right: TEST_BREITE, bottom: TEST_HOEHE, x: 0, y: 0, + toJSON: () => ({}), + } as DOMRectReadOnly + const eintrag = { + target: ziel, + contentRect: rect, + borderBoxSize: [{ inlineSize: TEST_BREITE, blockSize: TEST_HOEHE }], + contentBoxSize: [{ inlineSize: TEST_BREITE, blockSize: TEST_HOEHE }], + devicePixelContentBoxSize: [{ inlineSize: TEST_BREITE, blockSize: TEST_HOEHE }], + } as unknown as ResizeObserverEntry + // Asynchron wie das Original — ein synchroner Rueckruf im Konstruktor-Pfad wuerde + // React mitten im Rendern aktualisieren. + queueMicrotask(() => this.rueckruf([eintrag], this)) + } + + unobserve() {} + disconnect() {} +} + +globalThis.ResizeObserver = TestResizeObserver as unknown as typeof ResizeObserver + +// Denselben Dienst fuer Komponenten, die direkt messen statt zu beobachten. +for (const [name, wert] of [["offsetWidth", TEST_BREITE], ["offsetHeight", TEST_HOEHE]] as const) { + Object.defineProperty(HTMLElement.prototype, name, { configurable: true, value: wert }) +} diff --git a/frontend/src/views/GraphView.tsx b/frontend/src/views/GraphView.tsx index 409ccd0..d2dbe55 100644 --- a/frontend/src/views/GraphView.tsx +++ b/frontend/src/views/GraphView.tsx @@ -75,7 +75,7 @@ export function GraphView({ data, selectedNodeId, onNodeSelect }: { useEffect(() => { if (!containerRef.current) return const resizeObserver = new ResizeObserver((entries) => { - for (let entry of entries) { + for (const entry of entries) { if (entry.contentRect.width > 0 && entry.contentRect.height > 0) { setDimensions({ width: Math.floor(entry.contentRect.width), diff --git a/frontend/src/views/models/Discover.tsx b/frontend/src/views/models/Discover.tsx index dd94a96..df40fa3 100644 --- a/frontend/src/views/models/Discover.tsx +++ b/frontend/src/views/models/Discover.tsx @@ -1,314 +1,316 @@ -import { useState } from "react" -import { Download, Star, Layers, Check, Zap, Eye, Code, Brain, BrainCircuit, Compass, ChevronDown, ChevronUp, Scale, Search } from "lucide-react" -import { api } from "@/lib/api" -import { useModels, useUpdates, useDiscover } from "@/lib/queries" -import { cn } from "@/lib/utils" -import { fmtBytes } from "@/lib/format" -import { FitBadge } from "@/components/models/ModelBadges" -import { ModelBrowse } from "./ModelBrowse" - -// Die kanonischen Rollen (identisch zu sources.py / ModelBadges.ROLES). -const ROLE_METADATA: Record = { - fast: { - title: "Schnelles Alltags-Hirn", - desc: "Schnelle MoE-Antworten für Chat, Zusammenfassungen und alltägliche Aufgaben.", - icon: Zap - }, - heavy: { - title: "Schweres Reasoning", - desc: "Große Modelle für komplexe Logik, Mathematik und tiefgründiges Planen.", - icon: Brain - }, - coder: { - title: "Coden & Entwicklung", - desc: "Autovervollständigung, Refactoring und Codegenerierung direkt in deiner IDE.", - icon: Code - }, - vision: { - title: "Bilder & Vision", - desc: "Verarbeitet Bilder, Screenshots und visuelle Diagramme in multimodalen Chats.", - icon: Eye - }, - hermes: { - title: "Lucys Hirn (Agent)", - desc: "Lucys dauer-warmes Agent-Hirn mit Tool-Calling — bleibt ko-resident, lädt nie kalt nach.", - icon: BrainCircuit - }, - scout: { - title: "Multimodal-Allrounder", - desc: "Multimodaler Allrounder für schnelle Antworten, Übersetzungen und Alltag.", - icon: Compass - }, - kritiker: { - title: "Kritisches Prüf-Hirn", - desc: "Schärfer Blick für Fehler, Schwachstellen und Sicherheitslücken — denkt skeptisch, bevor du deployst.", - icon: Scale - }, - reranker: { - title: "Gedächtnis-Sortierer", - desc: "Sortiert und gewichtet gespeicherte Fakten nach Relevanz — damit die richtige Info sofort da ist.", - icon: Search - }, - debugger: { - title: "Debugger & Selbstheiler", - desc: "Agentisches Debugging, multimodale Fehleranalyse und Selbstreparatur (z.B. Muse-Glimmer).", - icon: Brain - } -} - -export function Discover() { - const { data, isLoading: loading, error: loadErr } = useDiscover() - const { data: modelsResp } = useModels() - const { data: updates } = useUpdates() - const models = modelsResp?.models ?? [] - const error = loadErr ? String(loadErr) : "" - const [installing, setInstalling] = useState>({}) - const [expandedAlternatives, setExpandedAlternatives] = useState>({}) - const [mode, setMode] = useState<"recommended" | "browse">("recommended") - - async function install(repo: string, role: string, quant: string, toolCapable: boolean) { - setInstalling((s) => ({ ...s, [repo]: "Starte..." })) - try { - await api("/api/models/install", { - method: "POST", - body: JSON.stringify({ repo, role, quant, jinja: toolCapable }), - }) - setInstalling((s) => ({ ...s, [repo]: "Download läuft" })) - } catch (e) { - setInstalling((s) => ({ ...s, [repo]: "Fehler" })) - } - } - - return ( -
- {/* Modus-Umschalter: geführt (Empfohlen) vs. Stöbern & Suchen */} -
- {([["recommended", "Empfohlen"], ["browse", "Stöbern & Suchen"]] as const).map(([m, label]) => ( - - ))} -
- - {mode === "browse" ? ( - - ) : loading ? ( -
Analysiere Hardware und suche passende GGUF-Empfehlungen…
- ) : (error || !data) ? ( -
- Empfehlungsdienst temporär nicht erreichbar ({error}). -
- ) : ( -
- {/* Informational Header */} -
-
- Modell-Registry geladen für {data.sys_ram_gb} GB System-RAM. -
-
- - Empfehlungen sind automatisch auf deine Box-Hardware optimiert. -
-
- - {/* Sockets/Slots Grid */} -
- {data.categories.map((cat) => { - const meta = ROLE_METADATA[cat.role] || { - title: cat.title || cat.role, - desc: "Spezifisches Modell für diese Systemrolle.", - icon: Layers - } - const IconComponent = meta.icon - - // Check if a model is installed for this role — per Rolle ODER Alias: - // ein Modell kann eine Kategorie über einen Alias bedienen (z.B. Qwen3.6 hat - // role="hermes" + Alias "fast" → sonst zeigte die Fast-Karte fälschlich „Frei"). - const installedModel = models.find( - (m) => m.role === cat.role || (m.aliases || []).includes(cat.role), - ) - - // Check if an upgrade is available for this role - const hasUpgrade = updates?.model_list.find((u) => u.role === cat.role) - - // Get the primary recommended model - const recommendedModel = cat.models.find((m) => m.repo === cat.recommended) || cat.models[0] - if (!recommendedModel) return null - - const isInstallingRecommended = installing[recommendedModel.repo] - const alternativeModels = cat.models.filter((m) => m.repo !== cat.recommended) - const isExpanded = !!expandedAlternatives[cat.role] - - return ( -
-
- {/* Socket Header */} -
-
-
- -
-
-

{meta.title}

- - Rolle: {cat.role} - -
-
- - {/* Status Badges */} - {installedModel ? ( - - - Aktiviert - - ) : ( - - Frei - - )} -
- - {/* Role Description */} -

- {meta.desc} -

- - {/* Current vs Recommended model card */} -
- {installedModel ? ( -
-
Aktive GGUF-Belegung
-
- {installedModel.name.split("/").pop()} -
-
- Größe: {fmtBytes(installedModel.size_bytes || 0)} - - Quant: {installedModel.quant || "GGUF"} -
-
- ) : ( -
-
Empfohlenes Modell
-
- {recommendedModel.name} -
-
- Ersteller: {recommendedModel.author} - - Quant: {recommendedModel.quant} -
-
- -
-
- )} -
- - {/* Main Action Button */} -
- {installedModel ? ( - hasUpgrade ? ( -
-
- - Bessere Version in der Registry: {hasUpgrade.repo.split("/").pop()} -
- -
- ) : ( -
- Auf neuestem Stand -
- ) - ) : ( - - )} -
-
- - {/* Collapsible alternatives list */} - {alternativeModels.length > 0 && ( -
- - - {isExpanded && ( -
- {alternativeModels.map((alt) => ( -
-
-
- {alt.name} -
-
- Quant: {alt.quant} - - {alt.fit.text} -
-
- -
- ))} -
- )} -
- )} -
- ) - })} -
- -
- )} -
- ) -} +import { useState } from "react" +import { Download, Star, Layers, Check, Zap, Eye, Code, Brain, BrainCircuit, Compass, ChevronDown, ChevronUp, Scale, Search } from "lucide-react" +import { api } from "@/lib/api" +import { useModels, useUpdates, useDiscover } from "@/lib/queries" +import { cn } from "@/lib/utils" +import { fmtBytes } from "@/lib/format" +import { FitBadge } from "@/components/models/ModelBadges" +import { ModelBrowse } from "./ModelBrowse" + +// Die kanonischen Rollen (identisch zu sources.py / ModelBadges.ROLES). +const ROLE_METADATA: Record = { + fast: { + title: "Schnelles Alltags-Hirn", + desc: "Schnelle MoE-Antworten für Chat, Zusammenfassungen und alltägliche Aufgaben.", + icon: Zap + }, + heavy: { + title: "Schweres Reasoning", + desc: "Große Modelle für komplexe Logik, Mathematik und tiefgründiges Planen.", + icon: Brain + }, + coder: { + title: "Coden & Entwicklung", + desc: "Autovervollständigung, Refactoring und Codegenerierung direkt in deiner IDE.", + icon: Code + }, + vision: { + title: "Bilder & Vision", + desc: "Verarbeitet Bilder, Screenshots und visuelle Diagramme in multimodalen Chats.", + icon: Eye + }, + hermes: { + title: "Lucys Hirn (Agent)", + desc: "Lucys dauer-warmes Agent-Hirn mit Tool-Calling — bleibt ko-resident, lädt nie kalt nach.", + icon: BrainCircuit + }, + scout: { + title: "Multimodal-Allrounder", + desc: "Multimodaler Allrounder für schnelle Antworten, Übersetzungen und Alltag.", + icon: Compass + }, + kritiker: { + title: "Kritisches Prüf-Hirn", + desc: "Schärfer Blick für Fehler, Schwachstellen und Sicherheitslücken — denkt skeptisch, bevor du deployst.", + icon: Scale + }, + reranker: { + title: "Gedächtnis-Sortierer", + desc: "Sortiert und gewichtet gespeicherte Fakten nach Relevanz — damit die richtige Info sofort da ist.", + icon: Search + }, + debugger: { + title: "Debugger & Selbstheiler", + desc: "Agentisches Debugging, multimodale Fehleranalyse und Selbstreparatur (z.B. Muse-Glimmer).", + icon: Brain + } +} + +export function Discover() { + const { data, isLoading: loading, error: loadErr } = useDiscover() + const { data: modelsResp } = useModels() + const { data: updates } = useUpdates() + const models = modelsResp?.models ?? [] + const error = loadErr ? String(loadErr) : "" + const [installing, setInstalling] = useState>({}) + const [expandedAlternatives, setExpandedAlternatives] = useState>({}) + const [mode, setMode] = useState<"recommended" | "browse">("recommended") + + async function install(repo: string, role: string, quant: string, toolCapable: boolean) { + setInstalling((s) => ({ ...s, [repo]: "Starte..." })) + try { + await api("/api/models/install", { + method: "POST", + body: JSON.stringify({ repo, role, quant, jinja: toolCapable }), + }) + setInstalling((s) => ({ ...s, [repo]: "Download läuft" })) + } catch (e) { + // Seit P1 traegt api() den echten Grund vom Backend (ApiError.detail) — den zeigen, + // statt ihn zu verschlucken und "Fehler" hinzuschreiben. + setInstalling((s) => ({ ...s, [repo]: `Fehler: ${e instanceof Error ? e.message : String(e)}` })) + } + } + + return ( +
+ {/* Modus-Umschalter: geführt (Empfohlen) vs. Stöbern & Suchen */} +
+ {([["recommended", "Empfohlen"], ["browse", "Stöbern & Suchen"]] as const).map(([m, label]) => ( + + ))} +
+ + {mode === "browse" ? ( + + ) : loading ? ( +
Analysiere Hardware und suche passende GGUF-Empfehlungen…
+ ) : (error || !data) ? ( +
+ Empfehlungsdienst temporär nicht erreichbar ({error}). +
+ ) : ( +
+ {/* Informational Header */} +
+
+ Modell-Registry geladen für {data.sys_ram_gb} GB System-RAM. +
+
+ + Empfehlungen sind automatisch auf deine Box-Hardware optimiert. +
+
+ + {/* Sockets/Slots Grid */} +
+ {data.categories.map((cat) => { + const meta = ROLE_METADATA[cat.role] || { + title: cat.title || cat.role, + desc: "Spezifisches Modell für diese Systemrolle.", + icon: Layers + } + const IconComponent = meta.icon + + // Check if a model is installed for this role — per Rolle ODER Alias: + // ein Modell kann eine Kategorie über einen Alias bedienen (z.B. Qwen3.6 hat + // role="hermes" + Alias "fast" → sonst zeigte die Fast-Karte fälschlich „Frei"). + const installedModel = models.find( + (m) => m.role === cat.role || (m.aliases || []).includes(cat.role), + ) + + // Check if an upgrade is available for this role + const hasUpgrade = updates?.model_list.find((u) => u.role === cat.role) + + // Get the primary recommended model + const recommendedModel = cat.models.find((m) => m.repo === cat.recommended) || cat.models[0] + if (!recommendedModel) return null + + const isInstallingRecommended = installing[recommendedModel.repo] + const alternativeModels = cat.models.filter((m) => m.repo !== cat.recommended) + const isExpanded = !!expandedAlternatives[cat.role] + + return ( +
+
+ {/* Socket Header */} +
+
+
+ +
+
+

{meta.title}

+ + Rolle: {cat.role} + +
+
+ + {/* Status Badges */} + {installedModel ? ( + + + Aktiviert + + ) : ( + + Frei + + )} +
+ + {/* Role Description */} +

+ {meta.desc} +

+ + {/* Current vs Recommended model card */} +
+ {installedModel ? ( +
+
Aktive GGUF-Belegung
+
+ {installedModel.name.split("/").pop()} +
+
+ Größe: {fmtBytes(installedModel.size_bytes || 0)} + + Quant: {installedModel.quant || "GGUF"} +
+
+ ) : ( +
+
Empfohlenes Modell
+
+ {recommendedModel.name} +
+
+ Ersteller: {recommendedModel.author} + + Quant: {recommendedModel.quant} +
+
+ +
+
+ )} +
+ + {/* Main Action Button */} +
+ {installedModel ? ( + hasUpgrade ? ( +
+
+ + Bessere Version in der Registry: {hasUpgrade.repo.split("/").pop()} +
+ +
+ ) : ( +
+ Auf neuestem Stand +
+ ) + ) : ( + + )} +
+
+ + {/* Collapsible alternatives list */} + {alternativeModels.length > 0 && ( +
+ + + {isExpanded && ( +
+ {alternativeModels.map((alt) => ( +
+
+
+ {alt.name} +
+
+ Quant: {alt.quant} + + {alt.fit.text} +
+
+ +
+ ))} +
+ )} +
+ )} +
+ ) + })} +
+ +
+ )} +
+ ) +} diff --git a/frontend/src/views/models/ModelBrowse.tsx b/frontend/src/views/models/ModelBrowse.tsx index aa80538..92224ee 100644 --- a/frontend/src/views/models/ModelBrowse.tsx +++ b/frontend/src/views/models/ModelBrowse.tsx @@ -118,7 +118,9 @@ export function ModelBrowse() { setInstalling((s) => ({ ...s, [repo]: "Download läuft" })) setOomArmed(false) } catch (e) { - setInstalling((s) => ({ ...s, [repo]: "Fehler" })) + // Seit P1 traegt api() den echten Grund vom Backend (ApiError.detail) — den zeigen, + // statt ihn zu verschlucken und "Fehler" hinzuschreiben. + setInstalling((s) => ({ ...s, [repo]: `Fehler: ${e instanceof Error ? e.message : String(e)}` })) } } diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json index 6cc4943..fc4b43d 100644 --- a/frontend/tsconfig.json +++ b/frontend/tsconfig.json @@ -17,7 +17,9 @@ "noUnusedParameters": true, "noFallthroughCasesInSwitch": true, "baseUrl": ".", - "paths": { "@/*": ["./src/*"] } + "paths": { "@/*": ["./src/*"] }, + // Vitest-Globals (describe/it/expect) + jest-dom-Matcher ohne Import je Datei. + "types": ["vitest/globals", "@testing-library/jest-dom"] }, - "include": ["src"] + "include": ["src", "vite.config.ts"] } diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts index f145fe1..8c9127e 100644 --- a/frontend/vite.config.ts +++ b/frontend/vite.config.ts @@ -20,4 +20,13 @@ export default defineConfig({ }, }, build: { outDir: "dist" }, + // Vitest teilt sich diese Konfiguration (Aliase, Plugins) — kein zweiter Build-Aufbau. + // jsdom, weil die Tests echte Komponenten mounten; `globals` spart den import in jeder Datei. + test: { + environment: "jsdom", + globals: true, + setupFiles: ["./src/test/setup.ts"], + include: ["src/**/*.test.{ts,tsx}"], + restoreMocks: true, + }, })