@lv-x-software-house/x_view 1.3.8 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/dist/index.js +604 -217
  2. package/dist/index.mjs +528 -141
  3. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -44,9 +44,9 @@ __export(index_exports, {
44
44
  module.exports = __toCommonJS(index_exports);
45
45
 
46
46
  // src/XViewScene.jsx
47
- var import_react37 = __toESM(require("react"));
47
+ var import_react38 = __toESM(require("react"));
48
48
  var import_navigation = require("next/navigation");
49
- var import_react38 = require("next-auth/react");
49
+ var import_react39 = require("next-auth/react");
50
50
  var import_crypto_js = __toESM(require("crypto-js"));
51
51
  var THREE3 = __toESM(require("three"));
52
52
  var import_OrbitControls = require("three/examples/jsm/controls/OrbitControls.js");
@@ -5158,8 +5158,8 @@ function ContextMenu({
5158
5158
  const handleClickOutside = (e) => {
5159
5159
  if (menuRef.current && !menuRef.current.contains(e.target)) onClose();
5160
5160
  };
5161
- document.addEventListener("mousedown", handleClickOutside);
5162
- return () => document.removeEventListener("mousedown", handleClickOutside);
5161
+ document.addEventListener("pointerdown", handleClickOutside);
5162
+ return () => document.removeEventListener("pointerdown", handleClickOutside);
5163
5163
  }, [data.visible, onClose]);
5164
5164
  const visibleLinkIds = (0, import_react2.useMemo)(() => {
5165
5165
  var _a2;
@@ -5599,7 +5599,7 @@ function ContextMenu({
5599
5599
  "div",
5600
5600
  {
5601
5601
  ref: menuRef,
5602
- className: "ui-overlay context-menu-class origin-top-left rounded-xl border border-white/10 bg-slate-950/70 backdrop-blur-xl shadow-[0_20px_80px_rgba(0,0,0,0.6)] ring-1 ring-white/10 text-white min-w-[220px] max-w-[min(95vw,420px)] w-max overflow-hidden",
5602
+ className: "ui-overlay context-menu-class origin-top-left rounded-xl border border-white/10 bg-slate-950/70 backdrop-blur-xl shadow-[0_20px_80px_rgba(0,0,0,0.6)] ring-1 ring-white/10 text-white min-w-[220px] max-w-[min(95vw,420px)] max-h-[85vh] overflow-y-auto custom-scrollbar w-max",
5603
5603
  style: { position: "absolute", left: `${menuPos.left}px`, top: `${menuPos.top}px`, zIndex: 1e3 },
5604
5604
  onPointerDown: swallow,
5605
5605
  onPointerMove: swallow,
@@ -6232,7 +6232,8 @@ function XViewSidebar({
6232
6232
  options: [
6233
6233
  { value: "Star", label: "Star" },
6234
6234
  { value: "Circle", label: "Circle" },
6235
- { value: "Column", label: "Column" }
6235
+ { value: "Column", label: "Column" },
6236
+ { value: "Network", label: "Network" }
6236
6237
  ],
6237
6238
  placeholder: "Selecione um Formato"
6238
6239
  }
@@ -13747,14 +13748,18 @@ function NodeDetailsPanel({
13747
13748
  });
13748
13749
  const [selectedImageUrl, setSelectedImageUrl] = (0, import_react21.useState)((node == null ? void 0 : node.textureImageUrl) ?? null);
13749
13750
  const [hasUnsavedChanges, setHasUnsavedChanges] = (0, import_react21.useState)(false);
13750
- const maxPanelW = typeof window !== "undefined" ? window.innerWidth * 0.92 : 1200;
13751
+ const isMobile = typeof window !== "undefined" && window.innerWidth < 640;
13752
+ const maxPanelW = typeof window !== "undefined" ? Math.min(window.innerWidth - 32, 1200) : 1200;
13753
+ const defaultWidth = isMobile ? typeof window !== "undefined" ? window.innerWidth - 32 : 360 : isReadMode ? 700 : 440;
13751
13754
  const { width: panelWidth, isResizing, handlePointerDown: handleResize, setWidth } = useResizablePanel({
13752
- initialWidth: isReadMode ? 700 : 440,
13753
- minWidth: 320,
13755
+ initialWidth: defaultWidth,
13756
+ minWidth: typeof window !== "undefined" ? Math.min(280, window.innerWidth - 32) : 280,
13754
13757
  maxWidth: maxPanelW
13755
13758
  });
13756
13759
  (0, import_react21.useEffect)(() => {
13757
- setWidth(isReadMode ? 700 : 440);
13760
+ const isMob = typeof window !== "undefined" && window.innerWidth < 640;
13761
+ const targetW = isMob ? typeof window !== "undefined" ? window.innerWidth - 32 : 360 : isReadMode ? 700 : 440;
13762
+ setWidth(targetW);
13758
13763
  }, [isReadMode, setWidth]);
13759
13764
  const prevNodeIdRef = (0, import_react21.useRef)(null);
13760
13765
  const propsEndRef = (0, import_react21.useRef)(null);
@@ -17415,8 +17420,8 @@ function MultiNodeContextMenu({
17415
17420
  const handleClickOutside = (e) => {
17416
17421
  if (menuRef.current && !menuRef.current.contains(e.target)) onClose();
17417
17422
  };
17418
- document.addEventListener("mousedown", handleClickOutside);
17419
- return () => document.removeEventListener("mousedown", handleClickOutside);
17423
+ document.addEventListener("pointerdown", handleClickOutside);
17424
+ return () => document.removeEventListener("pointerdown", handleClickOutside);
17420
17425
  }, [data.visible, onClose]);
17421
17426
  if (!data.visible || !data.nodeIds || data.nodeIds.size === 0) return null;
17422
17427
  const swallow = (e) => e.stopPropagation();
@@ -17857,8 +17862,8 @@ function RelationshipContextMenu({
17857
17862
  const handleClickOutside = (e) => {
17858
17863
  if (menuRef.current && !menuRef.current.contains(e.target)) onClose();
17859
17864
  };
17860
- document.addEventListener("mousedown", handleClickOutside);
17861
- return () => document.removeEventListener("mousedown", handleClickOutside);
17865
+ document.addEventListener("pointerdown", handleClickOutside);
17866
+ return () => document.removeEventListener("pointerdown", handleClickOutside);
17862
17867
  }, [data.visible, onClose]);
17863
17868
  if (!data.visible) return null;
17864
17869
  const swallow = (e) => e.stopPropagation();
@@ -19426,63 +19431,201 @@ function MilestoneManager({
19426
19431
  }
19427
19432
 
19428
19433
  // src/components/UpgradeModal.jsx
19434
+ var import_react37 = __toESM(require("react"));
19435
+
19436
+ // src/components/icons/UltraMinimalIcon.jsx
19429
19437
  var import_react36 = __toESM(require("react"));
19430
- var import_lucide_react = require("lucide-react");
19438
+ function UltraMinimalIcon({
19439
+ size = 13,
19440
+ className = "",
19441
+ strokeWidth = 1.5,
19442
+ ...props
19443
+ }) {
19444
+ return /* @__PURE__ */ import_react36.default.createElement(
19445
+ "svg",
19446
+ {
19447
+ width: size,
19448
+ height: size,
19449
+ viewBox: "0 0 24 24",
19450
+ fill: "none",
19451
+ xmlns: "http://www.w3.org/2000/svg",
19452
+ className: `inline-block shrink-0 transition-transform duration-200 ${className}`,
19453
+ ...props
19454
+ },
19455
+ /* @__PURE__ */ import_react36.default.createElement(
19456
+ "path",
19457
+ {
19458
+ d: "M6 3h12l4 6-10 12L2 9l4-6z",
19459
+ stroke: "currentColor",
19460
+ strokeWidth,
19461
+ strokeLinecap: "round",
19462
+ strokeLinejoin: "round"
19463
+ }
19464
+ ),
19465
+ /* @__PURE__ */ import_react36.default.createElement(
19466
+ "path",
19467
+ {
19468
+ d: "M11 3v6",
19469
+ stroke: "currentColor",
19470
+ strokeWidth,
19471
+ strokeLinecap: "round",
19472
+ strokeLinejoin: "round"
19473
+ }
19474
+ ),
19475
+ /* @__PURE__ */ import_react36.default.createElement(
19476
+ "path",
19477
+ {
19478
+ d: "M13 3v6",
19479
+ stroke: "currentColor",
19480
+ strokeWidth,
19481
+ strokeLinecap: "round",
19482
+ strokeLinejoin: "round"
19483
+ }
19484
+ ),
19485
+ /* @__PURE__ */ import_react36.default.createElement(
19486
+ "path",
19487
+ {
19488
+ d: "M2 9h20",
19489
+ stroke: "currentColor",
19490
+ strokeWidth,
19491
+ strokeLinecap: "round",
19492
+ strokeLinejoin: "round"
19493
+ }
19494
+ ),
19495
+ /* @__PURE__ */ import_react36.default.createElement(
19496
+ "path",
19497
+ {
19498
+ d: "M12 21L8 9",
19499
+ stroke: "currentColor",
19500
+ strokeWidth,
19501
+ strokeLinecap: "round",
19502
+ strokeLinejoin: "round"
19503
+ }
19504
+ ),
19505
+ /* @__PURE__ */ import_react36.default.createElement(
19506
+ "path",
19507
+ {
19508
+ d: "M12 21l4-12",
19509
+ stroke: "currentColor",
19510
+ strokeWidth,
19511
+ strokeLinecap: "round",
19512
+ strokeLinejoin: "round"
19513
+ }
19514
+ )
19515
+ );
19516
+ }
19517
+
19518
+ // src/components/UpgradeModal.jsx
19431
19519
  function UpgradeModal({
19432
19520
  isOpen,
19433
19521
  onClose,
19434
- nodeCounter,
19522
+ nodeCounter = 0,
19435
19523
  nodeLimit = 100,
19524
+ plan,
19436
19525
  onUpgrade
19437
19526
  }) {
19527
+ const [isSubmitting, setIsSubmitting] = (0, import_react37.useState)(false);
19438
19528
  if (!isOpen) return null;
19439
- return /* @__PURE__ */ import_react36.default.createElement("div", { className: "fixed inset-0 z-[10000] flex items-center justify-center p-4" }, /* @__PURE__ */ import_react36.default.createElement("style", null, `
19440
- @keyframes modalShow {
19441
- from { opacity: 0; transform: scale(0.95); }
19442
- to { opacity: 1; transform: scale(1); }
19443
- }
19444
- @keyframes backdropShow {
19445
- from { opacity: 0; }
19446
- to { opacity: 1; }
19447
- }
19448
- .animate-modal { animation: modalShow 0.3s ease-out forwards; }
19449
- .animate-backdrop { animation: backdropShow 0.3s ease-out forwards; }
19450
- `), /* @__PURE__ */ import_react36.default.createElement(
19529
+ const currentPlan = plan || (nodeLimit === -1 ? "premium" : "free");
19530
+ const handleUpgradeClick = async () => {
19531
+ if (isSubmitting) return;
19532
+ setIsSubmitting(true);
19533
+ try {
19534
+ if (onUpgrade) {
19535
+ await onUpgrade();
19536
+ } else {
19537
+ alert("Redirecting to checkout...");
19538
+ }
19539
+ } catch (error) {
19540
+ console.error("Error during upgrade:", error);
19541
+ } finally {
19542
+ setIsSubmitting(false);
19543
+ }
19544
+ };
19545
+ const limit = nodeLimit === -1 ? 100 : nodeLimit;
19546
+ const safeNodeCounter = Math.max(0, nodeCounter || 0);
19547
+ const usagePercentage = Math.min(
19548
+ 100,
19549
+ Math.round(safeNodeCounter / limit * 100)
19550
+ );
19551
+ return /* @__PURE__ */ import_react37.default.createElement("div", { className: "fixed inset-0 bg-slate-950/40 backdrop-blur-md z-[10000] flex justify-center items-center p-4 animate-in fade-in duration-300 font-sans select-none" }, /* @__PURE__ */ import_react37.default.createElement("div", { className: "bg-[#0b1224]/80 border border-cyan-600/20 p-7 rounded-3xl shadow-[0_0_50px_-12px_rgba(6,182,212,0.2)] w-full max-w-[380px] relative text-center overflow-hidden animate-in zoom-in-95 duration-300" }, /* @__PURE__ */ import_react37.default.createElement("div", { className: "absolute -top-20 left-1/2 -translate-x-1/2 w-40 h-40 bg-cyan-600/10 rounded-full blur-[60px] pointer-events-none" }), /* @__PURE__ */ import_react37.default.createElement("div", { className: "flex justify-center mb-4 relative" }, /* @__PURE__ */ import_react37.default.createElement("div", { className: "relative w-14 h-14 flex items-center justify-center" }, /* @__PURE__ */ import_react37.default.createElement("div", { className: "absolute inset-0 bg-cyan-500 rounded-full blur-2xl opacity-20 animate-pulse" }), /* @__PURE__ */ import_react37.default.createElement("div", { className: "relative w-12 h-12 rounded-xl bg-slate-900 border border-cyan-400/30 shadow-lg flex items-center justify-center z-10 animate-float" }, /* @__PURE__ */ import_react37.default.createElement(
19552
+ UltraMinimalIcon,
19553
+ {
19554
+ size: 22,
19555
+ className: "text-cyan-400",
19556
+ strokeWidth: 2
19557
+ }
19558
+ )))), /* @__PURE__ */ import_react37.default.createElement("h2", { className: "text-xl font-bold text-white mb-1 tracking-tight font-sans" }, "Upgrade x.plore"), /* @__PURE__ */ import_react37.default.createElement("p", { className: "text-slate-400 text-[11px] mb-6 leading-relaxed px-4 font-medium italic" }, "Unlock unlimited nodes and community features."), /* @__PURE__ */ import_react37.default.createElement("div", { className: "grid grid-cols-2 gap-3 mb-3 text-left" }, /* @__PURE__ */ import_react37.default.createElement("div", { className: "bg-gradient-to-b from-[#0e172a]/90 to-[#070c18]/90 border border-cyan-500/20 hover:border-cyan-400/40 p-3.5 rounded-2xl flex flex-col justify-between shadow-md transition-all duration-300" }, /* @__PURE__ */ import_react37.default.createElement("div", null, /* @__PURE__ */ import_react37.default.createElement("span", { className: "text-xs font-sans font-normal text-cyan-400/80 tracking-normal block mb-1.5" }, "Node Usage"), /* @__PURE__ */ import_react37.default.createElement("div", { className: "flex items-baseline gap-1" }, /* @__PURE__ */ import_react37.default.createElement("span", { className: "text-lg font-bold text-white font-sans tracking-tight" }, nodeCounter), /* @__PURE__ */ import_react37.default.createElement("span", { className: "text-xs font-sans font-medium text-slate-400" }, "/ ", currentPlan === "premium" ? "\u221E" : "100"))), currentPlan !== "premium" && /* @__PURE__ */ import_react37.default.createElement("div", { className: "mt-2.5" }, /* @__PURE__ */ import_react37.default.createElement("div", { className: "w-full h-1.5 bg-slate-900 border border-white/5 rounded-full overflow-hidden p-[1px]" }, /* @__PURE__ */ import_react37.default.createElement(
19451
19559
  "div",
19452
19560
  {
19453
- className: "absolute inset-0 bg-black/60 backdrop-blur-xl animate-backdrop",
19454
- onClick: onClose
19561
+ className: `h-full rounded-full transition-all duration-500 ${usagePercentage >= 100 ? "bg-gradient-to-r from-rose-500 to-pink-500 shadow-[0_0_8px_#f43f5e]" : "bg-gradient-to-r from-cyan-500 to-sky-300 shadow-[0_0_8px_#22d3ee]"}`,
19562
+ style: { width: `${usagePercentage}%` }
19455
19563
  }
19456
- ), /* @__PURE__ */ import_react36.default.createElement("div", { className: "relative w-full max-w-xl overflow-hidden rounded-[2.5rem] border border-white/10 bg-[#0d1117]/80 shadow-[0_0_100px_-20px_rgba(56,189,248,0.3)] animate-modal" }, /* @__PURE__ */ import_react36.default.createElement("div", { className: "absolute inset-0 -z-10 bg-gradient-to-br from-sky-500/10 via-transparent to-purple-500/10" }), /* @__PURE__ */ import_react36.default.createElement("div", { className: "absolute -top-24 -left-24 w-48 h-48 bg-sky-500/20 blur-[100px] rounded-full" }), /* @__PURE__ */ import_react36.default.createElement("div", { className: "absolute -bottom-24 -right-24 w-48 h-48 bg-purple-500/20 blur-[100px] rounded-full" }), /* @__PURE__ */ import_react36.default.createElement(
19564
+ )))), /* @__PURE__ */ import_react37.default.createElement("div", { className: "bg-gradient-to-b from-[#0e172a]/90 to-[#070c18]/90 border border-cyan-500/20 hover:border-cyan-400/40 p-3.5 rounded-2xl flex flex-col justify-between shadow-md transition-all duration-300" }, /* @__PURE__ */ import_react37.default.createElement("div", null, /* @__PURE__ */ import_react37.default.createElement("span", { className: "text-xs font-sans font-normal text-cyan-400/80 tracking-normal block mb-1.5" }, "Current Plan"), /* @__PURE__ */ import_react37.default.createElement("div", { className: "mt-1" }, /* @__PURE__ */ import_react37.default.createElement(
19565
+ "span",
19566
+ {
19567
+ className: `inline-flex items-center gap-1.5 px-2.5 py-1 rounded-lg border text-xs font-normal font-sans tracking-normal ${currentPlan === "premium" ? "bg-indigo-500/15 border-indigo-400/30 text-indigo-300" : "bg-cyan-500/10 border-cyan-400/30 text-cyan-300"}`
19568
+ },
19569
+ /* @__PURE__ */ import_react37.default.createElement(
19570
+ "span",
19571
+ {
19572
+ className: `w-1.5 h-1.5 rounded-full animate-pulse ${currentPlan === "premium" ? "bg-indigo-400 shadow-[0_0_6px_#818cf8]" : "bg-cyan-400 shadow-[0_0_6px_#22d3ee]"}`
19573
+ }
19574
+ ),
19575
+ currentPlan === "premium" ? "Premium" : "Free"
19576
+ ))))), /* @__PURE__ */ import_react37.default.createElement("div", { className: "bg-gradient-to-b from-[#0e172a]/70 to-[#070c18]/80 border border-cyan-500/15 p-3.5 rounded-2xl space-y-2.5 mb-5 text-left shadow-sm" }, /* @__PURE__ */ import_react37.default.createElement("div", { className: "flex items-center gap-2.5 text-slate-200 text-xs font-medium" }, /* @__PURE__ */ import_react37.default.createElement("span", { className: "w-1.5 h-1.5 rounded-full bg-cyan-400 shadow-[0_0_6px_#22d3ee] shrink-0" }), /* @__PURE__ */ import_react37.default.createElement("span", null, "Unlimited Nodes")), /* @__PURE__ */ import_react37.default.createElement("div", { className: "flex items-center gap-2.5 text-slate-200 text-xs font-medium" }, /* @__PURE__ */ import_react37.default.createElement("span", { className: "w-1.5 h-1.5 rounded-full bg-cyan-400 shadow-[0_0_6px_#22d3ee] shrink-0" }), /* @__PURE__ */ import_react37.default.createElement("span", null, "Community and collaboration features"))), /* @__PURE__ */ import_react37.default.createElement("div", { className: "space-y-2.5" }, currentPlan !== "premium" ? /* @__PURE__ */ import_react37.default.createElement(
19457
19577
  "button",
19458
19578
  {
19459
- onClick: onClose,
19460
- className: "absolute top-6 right-6 p-2 rounded-full hover:bg-white/5 text-white/40 hover:text-white transition-all duration-300"
19579
+ onClick: handleUpgradeClick,
19580
+ disabled: isSubmitting,
19581
+ className: "group relative w-full py-3.5 rounded-xl bg-gradient-to-r from-cyan-400 to-cyan-500 hover:from-cyan-300 hover:to-cyan-400 text-slate-950 font-normal text-sm tracking-normal font-sans shadow-[0_0_15px_rgba(34,211,238,0.22)] hover:shadow-[0_0_22px_rgba(34,211,238,0.38)] hover:scale-[1.01] active:scale-[0.98] transition-all duration-300 overflow-hidden cursor-pointer border border-cyan-300/30 disabled:opacity-30 disabled:grayscale"
19461
19582
  },
19462
- /* @__PURE__ */ import_react36.default.createElement(import_lucide_react.X, { size: 20 })
19463
- ), /* @__PURE__ */ import_react36.default.createElement("div", { className: "p-12 flex flex-col items-center text-center" }, /* @__PURE__ */ import_react36.default.createElement("div", { className: "w-20 h-20 rounded-[2rem] bg-gradient-to-br from-sky-400 to-indigo-600 p-[1px] mb-8 shadow-lg shadow-sky-500/20" }, /* @__PURE__ */ import_react36.default.createElement("div", { className: "w-full h-full rounded-[2rem] bg-[#0d1117] flex items-center justify-center" }, /* @__PURE__ */ import_react36.default.createElement(import_lucide_react.Zap, { className: "text-sky-400 fill-sky-400/20", size: 32 }))), /* @__PURE__ */ import_react36.default.createElement("h2", { className: "text-3xl font-bold text-white mb-4 tracking-tight" }, "Limite de Nodes", " ", /* @__PURE__ */ import_react36.default.createElement("span", { className: "bg-clip-text text-transparent bg-gradient-to-r from-sky-400 to-indigo-400" }, "Atingido")), /* @__PURE__ */ import_react36.default.createElement("p", { className: "text-white/60 text-lg leading-relaxed mb-10 max-w-md" }, "Voc\xEA atingiu o limite de", " ", /* @__PURE__ */ import_react36.default.createElement("span", { className: "text-white font-semibold" }, nodeLimit, " nodes"), " ", "do seu plano Free. Seu universo est\xE1 crescendo r\xE1pido!"), /* @__PURE__ */ import_react36.default.createElement("div", { className: "w-full grid grid-cols-2 gap-4 mb-10" }, /* @__PURE__ */ import_react36.default.createElement("div", { className: "bg-white/5 border border-white/10 rounded-3xl p-6 backdrop-blur-md" }, /* @__PURE__ */ import_react36.default.createElement("p", { className: "text-white/30 text-[10px] font-bold uppercase tracking-widest mb-1" }, "Status Atual"), /* @__PURE__ */ import_react36.default.createElement("p", { className: "text-2xl font-bold text-white" }, nodeCounter, " / ", nodeLimit)), /* @__PURE__ */ import_react36.default.createElement("div", { className: "bg-white/5 border border-white/10 rounded-3xl p-6 backdrop-blur-md" }, /* @__PURE__ */ import_react36.default.createElement("p", { className: "text-white/30 text-[10px] font-bold uppercase tracking-widest mb-1" }, "Pr\xF3ximo Plano"), /* @__PURE__ */ import_react36.default.createElement("p", { className: "text-2xl font-bold text-sky-400" }, "Ilimitado"))), /* @__PURE__ */ import_react36.default.createElement("div", { className: "w-full space-y-4 mb-10 text-left px-4" }, /* @__PURE__ */ import_react36.default.createElement("div", { className: "flex items-center gap-3 text-white/70 text-sm" }, /* @__PURE__ */ import_react36.default.createElement("div", { className: "w-6 h-6 rounded-full bg-sky-500/10 flex items-center justify-center shrink-0" }, /* @__PURE__ */ import_react36.default.createElement(import_lucide_react.Rocket, { size: 14, className: "text-sky-400" })), /* @__PURE__ */ import_react36.default.createElement("span", null, "Cria\xE7\xE3o de Nodes ilimitada")), /* @__PURE__ */ import_react36.default.createElement("div", { className: "flex items-center gap-3 text-white/70 text-sm" }, /* @__PURE__ */ import_react36.default.createElement("div", { className: "w-6 h-6 rounded-full bg-sky-500/10 flex items-center justify-center shrink-0" }, /* @__PURE__ */ import_react36.default.createElement(import_lucide_react.ShieldCheck, { size: 14, className: "text-sky-400" })), /* @__PURE__ */ import_react36.default.createElement("span", null, "Acesso expandido \xE0s funcionalidades colaborativas e de comunidade"))), /* @__PURE__ */ import_react36.default.createElement("div", { className: "w-full flex flex-col gap-4" }, /* @__PURE__ */ import_react36.default.createElement(
19583
+ /* @__PURE__ */ import_react37.default.createElement("div", { className: "absolute inset-0 bg-gradient-to-r from-transparent via-white/40 to-transparent -translate-x-full group-hover:translate-x-full transition-transform duration-700 ease-in-out pointer-events-none" }),
19584
+ isSubmitting ? /* @__PURE__ */ import_react37.default.createElement("div", { className: "relative z-10 flex items-center justify-center gap-2" }, /* @__PURE__ */ import_react37.default.createElement("div", { className: "h-4 w-4 border-2 border-slate-950/30 border-t-slate-950 rounded-full animate-spin" })) : /* @__PURE__ */ import_react37.default.createElement("span", { className: "relative z-10 font-normal" }, "Upgrade Now")
19585
+ ) : /* @__PURE__ */ import_react37.default.createElement("div", { className: "w-full py-3 rounded-xl bg-indigo-500/10 border border-indigo-500/30 text-indigo-300 font-normal text-sm text-center flex items-center justify-center gap-2 font-sans tracking-normal" }, /* @__PURE__ */ import_react37.default.createElement("span", null, "Your Account is Premium")), /* @__PURE__ */ import_react37.default.createElement(
19464
19586
  "button",
19465
19587
  {
19466
- className: "w-full py-5 rounded-[1.5rem] bg-gradient-to-r from-sky-500 to-indigo-600 text-white font-bold text-sm uppercase tracking-widest hover:shadow-[0_0_30px_-5px_rgba(56,189,248,0.5)] hover:scale-[1.02] active:scale-95 transition-all duration-300 flex items-center justify-center gap-2",
19467
- onClick: async () => {
19468
- if (onUpgrade) {
19469
- await onUpgrade();
19470
- } else {
19471
- alert("Redirecionando para upgrade... (Em breve)");
19472
- }
19473
- onClose();
19474
- }
19588
+ onClick: onClose,
19589
+ className: "w-full py-2.5 rounded-xl bg-slate-950/50 hover:bg-slate-900 border border-slate-800 text-slate-400 hover:text-white text-xs font-semibold transition-all duration-300 active:scale-[0.98] cursor-pointer text-center"
19475
19590
  },
19476
- "Fazer Upgrade Agora",
19477
- /* @__PURE__ */ import_react36.default.createElement(import_lucide_react.Sparkles, { size: 16 })
19478
- ), /* @__PURE__ */ import_react36.default.createElement(
19591
+ currentPlan === "premium" ? "Close" : "Continue with Free Plan"
19592
+ )), /* @__PURE__ */ import_react37.default.createElement(
19479
19593
  "button",
19480
19594
  {
19481
19595
  onClick: onClose,
19482
- className: "w-full py-5 rounded-[1.5rem] bg-white/5 border border-white/10 text-white/40 font-bold text-sm uppercase tracking-widest hover:bg-white/10 hover:text-white transition-all duration-300"
19596
+ className: "absolute top-6 right-6 text-slate-500 hover:text-cyan-400 transition-all duration-300 p-1 hover:rotate-90 cursor-pointer",
19597
+ "aria-label": "Close modal"
19483
19598
  },
19484
- "Talvez depois"
19485
- )))));
19599
+ /* @__PURE__ */ import_react37.default.createElement(
19600
+ "svg",
19601
+ {
19602
+ xmlns: "http://www.w3.org/2000/svg",
19603
+ width: "18",
19604
+ height: "18",
19605
+ viewBox: "0 0 24 24",
19606
+ fill: "none",
19607
+ stroke: "currentColor",
19608
+ strokeWidth: "2.5",
19609
+ strokeLinecap: "round",
19610
+ strokeLinejoin: "round"
19611
+ },
19612
+ /* @__PURE__ */ import_react37.default.createElement("line", { x1: "18", y1: "6", x2: "6", y2: "18" }),
19613
+ /* @__PURE__ */ import_react37.default.createElement("line", { x1: "6", y1: "6", x2: "18", y2: "18" })
19614
+ )
19615
+ )), /* @__PURE__ */ import_react37.default.createElement("style", null, `
19616
+ @keyframes float {
19617
+ 0%,
19618
+ 100% {
19619
+ transform: translateY(0px);
19620
+ }
19621
+ 50% {
19622
+ transform: translateY(-8px);
19623
+ }
19624
+ }
19625
+ .animate-float {
19626
+ animation: float 4s ease-in-out infinite;
19627
+ }
19628
+ `));
19486
19629
  }
19487
19630
 
19488
19631
  // src/XViewScene.jsx
@@ -19636,12 +19779,12 @@ function XViewScene({
19636
19779
  onUpgrade
19637
19780
  }) {
19638
19781
  var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t;
19639
- const { data: session, status } = (0, import_react38.useSession)();
19782
+ const { data: session, status } = (0, import_react39.useSession)();
19640
19783
  const router = (0, import_navigation.useRouter)();
19641
19784
  const searchParams = (0, import_navigation.useSearchParams)();
19642
19785
  const focusNodeId = searchParams == null ? void 0 : searchParams.get("focus");
19643
19786
  const focusAncestryId = searchParams == null ? void 0 : searchParams.get("ancestry");
19644
- const viewParams = (0, import_react37.useMemo)(() => {
19787
+ const viewParams = (0, import_react38.useMemo)(() => {
19645
19788
  if (encryptedConfig) {
19646
19789
  const data = decryptData(encryptedConfig);
19647
19790
  if (data && data.id && data.owner_id && data.type) {
@@ -19650,12 +19793,12 @@ function XViewScene({
19650
19793
  }
19651
19794
  return null;
19652
19795
  }, [encryptedConfig, session]);
19653
- (0, import_react37.useEffect)(() => {
19796
+ (0, import_react38.useEffect)(() => {
19654
19797
  if (viewParams == null ? void 0 : viewParams.name) {
19655
19798
  document.title = `${viewParams.name} - x.plore`;
19656
19799
  }
19657
19800
  }, [viewParams == null ? void 0 : viewParams.name]);
19658
- (0, import_react37.useEffect)(() => {
19801
+ (0, import_react38.useEffect)(() => {
19659
19802
  async function verifyPermission() {
19660
19803
  if (!viewParams || !session || !check_user_permission) return;
19661
19804
  const { id, type, owner_id } = viewParams;
@@ -19692,68 +19835,70 @@ function XViewScene({
19692
19835
  setIsLoading(false);
19693
19836
  }
19694
19837
  }, [viewParams, session, status, check_user_permission]);
19695
- const sceneConfigId = (0, import_react37.useMemo)(() => (viewParams == null ? void 0 : viewParams.id) || null, [viewParams]);
19696
- const ownerId = (0, import_react37.useMemo)(() => (viewParams == null ? void 0 : viewParams.owner_id) || null, [viewParams]);
19697
- const dbSaveUrl = (0, import_react37.useMemo)(() => {
19838
+ const sceneConfigId = (0, import_react38.useMemo)(() => (viewParams == null ? void 0 : viewParams.id) || null, [viewParams]);
19839
+ const ownerId = (0, import_react38.useMemo)(() => (viewParams == null ? void 0 : viewParams.owner_id) || null, [viewParams]);
19840
+ const dbSaveUrl = (0, import_react38.useMemo)(() => {
19698
19841
  if (ownerId && sceneConfigId) {
19699
19842
  return `x_view_dbs/${ownerId}/${sceneConfigId}`;
19700
19843
  }
19701
19844
  return null;
19702
19845
  }, [ownerId, sceneConfigId]);
19703
- const sceneSaveUrl = (0, import_react37.useMemo)(() => {
19846
+ const sceneSaveUrl = (0, import_react38.useMemo)(() => {
19704
19847
  if (ownerId && sceneConfigId) {
19705
19848
  return `x_view_scenes/${ownerId}/${sceneConfigId}`;
19706
19849
  }
19707
19850
  return null;
19708
19851
  }, [ownerId, sceneConfigId]);
19709
- const ancestry_save_url = (0, import_react37.useMemo)(() => {
19852
+ const ancestry_save_url = (0, import_react38.useMemo)(() => {
19710
19853
  if (ownerId && sceneConfigId) {
19711
19854
  return `x_view_ancestry/${ownerId}/${sceneConfigId}`;
19712
19855
  }
19713
19856
  return null;
19714
19857
  }, [ownerId, sceneConfigId]);
19715
- const sceneDataRef = (0, import_react37.useRef)(null);
19716
- const parentDataRef = (0, import_react37.useRef)(null);
19858
+ const sceneDataRef = (0, import_react38.useRef)(null);
19859
+ const parentDataRef = (0, import_react38.useRef)(null);
19717
19860
  const graphDataRef = parentDataRef;
19718
- const ancestryDataRef = (0, import_react37.useRef)(null);
19719
- const [isLoading, setIsLoading] = (0, import_react37.useState)(true);
19720
- const [isProcessing, setIsProcessing] = (0, import_react37.useState)(false);
19721
- const [permissionStatus, setPermissionStatus] = (0, import_react37.useState)("loading");
19722
- const [userPermissionRole, setUserPermissionRole] = (0, import_react37.useState)(null);
19723
- const [viewMembers, setViewMembers] = (0, import_react37.useState)([]);
19724
- const [isInitialized, setIsInitialized] = (0, import_react37.useState)(false);
19725
- const [sceneVersion, setSceneVersion] = (0, import_react37.useState)(0);
19726
- const [contextMenu, setContextMenu] = (0, import_react37.useState)({
19861
+ const ancestryDataRef = (0, import_react38.useRef)(null);
19862
+ const [isLoading, setIsLoading] = (0, import_react38.useState)(true);
19863
+ const [isProcessing, setIsProcessing] = (0, import_react38.useState)(false);
19864
+ const [permissionStatus, setPermissionStatus] = (0, import_react38.useState)("loading");
19865
+ const [userPermissionRole, setUserPermissionRole] = (0, import_react38.useState)(null);
19866
+ const [viewMembers, setViewMembers] = (0, import_react38.useState)([]);
19867
+ const [isInitialized, setIsInitialized] = (0, import_react38.useState)(false);
19868
+ const [sceneVersion, setSceneVersion] = (0, import_react38.useState)(0);
19869
+ const [contextMenu, setContextMenu] = (0, import_react38.useState)({
19727
19870
  visible: false,
19728
19871
  x: 0,
19729
19872
  y: 0,
19730
19873
  nodeData: null
19731
19874
  });
19732
- const [multiContextMenu, setMultiContextMenu] = (0, import_react37.useState)({
19875
+ const [multiContextMenu, setMultiContextMenu] = (0, import_react38.useState)({
19733
19876
  visible: false,
19734
19877
  x: 0,
19735
19878
  y: 0,
19736
19879
  nodeIds: null
19737
19880
  });
19738
- const [relationshipMenu, setRelationshipMenu] = (0, import_react37.useState)({
19881
+ const [relationshipMenu, setRelationshipMenu] = (0, import_react38.useState)({
19739
19882
  visible: false,
19740
19883
  x: 0,
19741
19884
  y: 0,
19742
19885
  linkObject: null
19743
19886
  });
19744
- const [creationMode, setCreationMode] = (0, import_react37.useState)({
19887
+ const [creationMode, setCreationMode] = (0, import_react38.useState)({
19745
19888
  isActive: false,
19746
19889
  sourceNodeData: null
19747
19890
  });
19748
- const [versionMode, setVersionMode] = (0, import_react37.useState)({
19891
+ const [versionMode, setVersionMode] = (0, import_react38.useState)({
19749
19892
  isActive: false,
19750
19893
  sourceNodeData: null
19751
19894
  });
19752
- const [questMode, setQuestMode] = (0, import_react37.useState)({ isActive: false });
19753
- const [processMode, setProcessMode] = (0, import_react37.useState)({ isActive: false });
19754
- const [hasFocusedInitial, setHasFocusedInitial] = (0, import_react37.useState)(false);
19755
- const [hasOpenedInitialAncestry, setHasOpenedInitialAncestry] = (0, import_react37.useState)(false);
19756
- const [questTreeMode, setQuestTreeMode] = (0, import_react37.useState)({
19895
+ const [questMode, setQuestMode] = (0, import_react38.useState)({ isActive: false });
19896
+ const [processMode, setProcessMode] = (0, import_react38.useState)({ isActive: false });
19897
+ const longPressTimeoutRef = (0, import_react38.useRef)(null);
19898
+ const isLongPressTriggeredRef = (0, import_react38.useRef)(false);
19899
+ const [hasFocusedInitial, setHasFocusedInitial] = (0, import_react38.useState)(false);
19900
+ const [hasOpenedInitialAncestry, setHasOpenedInitialAncestry] = (0, import_react38.useState)(false);
19901
+ const [questTreeMode, setQuestTreeMode] = (0, import_react38.useState)({
19757
19902
  isActive: false,
19758
19903
  questNodeId: null,
19759
19904
  questTempData: null,
@@ -19763,7 +19908,7 @@ function XViewScene({
19763
19908
  isAddingNodes: false,
19764
19909
  isAddingAbstractionNodes: false
19765
19910
  });
19766
- const [processTreeMode, setProcessTreeMode] = (0, import_react37.useState)({
19911
+ const [processTreeMode, setProcessTreeMode] = (0, import_react38.useState)({
19767
19912
  isActive: false,
19768
19913
  processNodeId: null,
19769
19914
  processTempData: null,
@@ -19773,7 +19918,7 @@ function XViewScene({
19773
19918
  isAddingNodes: false,
19774
19919
  isAddingAbstractionNodes: false
19775
19920
  });
19776
- const [ancestryMode, setAncestryMode] = (0, import_react37.useState)({
19921
+ const [ancestryMode, setAncestryMode] = (0, import_react38.useState)({
19777
19922
  isActive: false,
19778
19923
  tree: null,
19779
19924
  selectedParentId: null,
@@ -19784,45 +19929,45 @@ function XViewScene({
19784
19929
  ancestryDescriptionSections: [],
19785
19930
  isAddingNodes: false
19786
19931
  });
19787
- const [readingMode, setReadingMode] = (0, import_react37.useState)({
19932
+ const [readingMode, setReadingMode] = (0, import_react38.useState)({
19788
19933
  isActive: false,
19789
19934
  ancestry: null,
19790
19935
  branchStack: [],
19791
19936
  autoAbstraction: false
19792
19937
  });
19793
- const [formPosition, setFormPosition] = (0, import_react37.useState)({
19938
+ const [formPosition, setFormPosition] = (0, import_react38.useState)({
19794
19939
  left: 16,
19795
19940
  top: 16,
19796
19941
  opacity: 0
19797
19942
  });
19798
- const [detailsNode, setDetailsNode] = (0, import_react37.useState)(null);
19799
- const [detailsLink, setDetailsLink] = (0, import_react37.useState)(null);
19800
- const [ancestryLinkDetails, setAncestryLinkDetails] = (0, import_react37.useState)(null);
19801
- const [imageViewer, setImageViewer] = (0, import_react37.useState)({
19943
+ const [detailsNode, setDetailsNode] = (0, import_react38.useState)(null);
19944
+ const [detailsLink, setDetailsLink] = (0, import_react38.useState)(null);
19945
+ const [ancestryLinkDetails, setAncestryLinkDetails] = (0, import_react38.useState)(null);
19946
+ const [imageViewer, setImageViewer] = (0, import_react38.useState)({
19802
19947
  visible: false,
19803
19948
  images: [],
19804
19949
  startIndex: 0
19805
19950
  });
19806
- const [editingAncestryRel, setEditingAncestryRel] = (0, import_react37.useState)({
19951
+ const [editingAncestryRel, setEditingAncestryRel] = (0, import_react38.useState)({
19807
19952
  visible: false,
19808
19953
  data: null,
19809
19954
  path: null
19810
19955
  });
19811
- const [isImportModalOpen, setIsImportModalOpen] = (0, import_react37.useState)(false);
19812
- const [importSuccessMessage, setImportSuccessMessage] = (0, import_react37.useState)("");
19813
- const [invalidTargetError, setInvalidTargetError] = (0, import_react37.useState)(null);
19814
- const [highlightedNodeId, setHighlightedNodeId] = (0, import_react37.useState)(null);
19815
- const [isBoardsOpen, setIsBoardsOpen] = (0, import_react37.useState)(false);
19816
- const [boardItems, setBoardItems] = (0, import_react37.useState)([]);
19817
- const [isSidebarOpen, setIsSidebarOpen] = (0, import_react37.useState)(false);
19818
- const [isMilestoneManagerOpen, setIsMilestoneManagerOpen] = (0, import_react37.useState)(false);
19819
- const [nodeCounter, setNodeCounter] = (0, import_react37.useState)(0);
19820
- const [isUpgradeModalOpen, setIsUpgradeModalOpen] = (0, import_react37.useState)(false);
19821
- const [nodeLimit, setNodeLimit] = (0, import_react37.useState)(100);
19822
- const mountRef = (0, import_react37.useRef)(null);
19823
- const tooltipRef = (0, import_react37.useRef)(null);
19824
- const formRef = (0, import_react37.useRef)(null);
19825
- const stateRef = (0, import_react37.useRef)({
19956
+ const [isImportModalOpen, setIsImportModalOpen] = (0, import_react38.useState)(false);
19957
+ const [importSuccessMessage, setImportSuccessMessage] = (0, import_react38.useState)("");
19958
+ const [invalidTargetError, setInvalidTargetError] = (0, import_react38.useState)(null);
19959
+ const [highlightedNodeId, setHighlightedNodeId] = (0, import_react38.useState)(null);
19960
+ const [isBoardsOpen, setIsBoardsOpen] = (0, import_react38.useState)(false);
19961
+ const [boardItems, setBoardItems] = (0, import_react38.useState)([]);
19962
+ const [isSidebarOpen, setIsSidebarOpen] = (0, import_react38.useState)(false);
19963
+ const [isMilestoneManagerOpen, setIsMilestoneManagerOpen] = (0, import_react38.useState)(false);
19964
+ const [nodeCounter, setNodeCounter] = (0, import_react38.useState)(0);
19965
+ const [isUpgradeModalOpen, setIsUpgradeModalOpen] = (0, import_react38.useState)(false);
19966
+ const [nodeLimit, setNodeLimit] = (0, import_react38.useState)(100);
19967
+ const mountRef = (0, import_react38.useRef)(null);
19968
+ const tooltipRef = (0, import_react38.useRef)(null);
19969
+ const formRef = (0, import_react38.useRef)(null);
19970
+ const stateRef = (0, import_react38.useRef)({
19826
19971
  readMode: {
19827
19972
  currentMaxIndex: 0,
19828
19973
  progressMap: {}
@@ -19907,16 +20052,16 @@ function XViewScene({
19907
20052
  minWidth: 320,
19908
20053
  maxWidth: maxReadPanelW
19909
20054
  });
19910
- (0, import_react37.useEffect)(() => {
20055
+ (0, import_react38.useEffect)(() => {
19911
20056
  stateRef.current.ancestry = ancestryMode;
19912
20057
  }, [ancestryMode]);
19913
- (0, import_react37.useEffect)(() => {
20058
+ (0, import_react38.useEffect)(() => {
19914
20059
  stateRef.current.questTree = questTreeMode;
19915
20060
  }, [questTreeMode]);
19916
- (0, import_react37.useEffect)(() => {
20061
+ (0, import_react38.useEffect)(() => {
19917
20062
  stateRef.current.processTree = processTreeMode;
19918
20063
  }, [processTreeMode]);
19919
- (0, import_react37.useEffect)(() => {
20064
+ (0, import_react38.useEffect)(() => {
19920
20065
  var _a2, _b2;
19921
20066
  if (!isInitialized) return;
19922
20067
  const map = /* @__PURE__ */ new Map();
@@ -19941,7 +20086,7 @@ function XViewScene({
19941
20086
  }
19942
20087
  stateRef.current.nodeIdToParentFileMap = map;
19943
20088
  }, [isInitialized, sceneVersion]);
19944
- const handleNavigateBack = (0, import_react37.useCallback)(() => {
20089
+ const handleNavigateBack = (0, import_react38.useCallback)(() => {
19945
20090
  const type = viewParams == null ? void 0 : viewParams.type;
19946
20091
  const tab = type === "database" ? "datasets" : "views";
19947
20092
  const targetUrl = `/dashboard/xview?tab=${tab}`;
@@ -19952,7 +20097,7 @@ function XViewScene({
19952
20097
  window.location.href = targetUrl;
19953
20098
  }
19954
20099
  }, [router, viewParams]);
19955
- const handleConfirmImport = (0, import_react37.useCallback)(
20100
+ const handleConfirmImport = (0, import_react38.useCallback)(
19956
20101
  async (importPayload) => {
19957
20102
  var _a2, _b2;
19958
20103
  let files = [];
@@ -20077,7 +20222,7 @@ function XViewScene({
20077
20222
  add_new_parent_file_to_scene_at_firebase_action
20078
20223
  ]
20079
20224
  );
20080
- const handleSaveConfig = (0, import_react37.useCallback)(
20225
+ const handleSaveConfig = (0, import_react38.useCallback)(
20081
20226
  async (newConfig) => {
20082
20227
  if (!sceneDataRef.current || !save_view_data || !sceneSaveUrl) return;
20083
20228
  const updatedData = {
@@ -20097,7 +20242,7 @@ function XViewScene({
20097
20242
  const handleOpenImageViewer = (images, startIndex) => {
20098
20243
  setImageViewer({ visible: true, images, startIndex });
20099
20244
  };
20100
- const tweenToTarget = (0, import_react37.useCallback)(
20245
+ const tweenToTarget = (0, import_react38.useCallback)(
20101
20246
  (target, zoomFactor = 1, forcedDirection = null) => {
20102
20247
  const {
20103
20248
  camera: sceneCamera,
@@ -20127,7 +20272,7 @@ function XViewScene({
20127
20272
  if (!t || typeof t.closest !== "function") return false;
20128
20273
  return !!t.closest(".ui-overlay");
20129
20274
  };
20130
- const buildFullAncestryTree = (0, import_react37.useCallback)(
20275
+ const buildFullAncestryTree = (0, import_react38.useCallback)(
20131
20276
  (idTree, nodes, ancestries = []) => {
20132
20277
  if (!idTree) return null;
20133
20278
  const nodeMap = new Map(nodes.map((n) => [String(n.id), n]));
@@ -20214,7 +20359,7 @@ function XViewScene({
20214
20359
  },
20215
20360
  []
20216
20361
  );
20217
- const handleActivateTimeline = (0, import_react37.useCallback)(() => {
20362
+ const handleActivateTimeline = (0, import_react38.useCallback)(() => {
20218
20363
  const { nodeObjects, tweenGroup, timelineIntervalsGroup } = stateRef.current;
20219
20364
  if (!nodeObjects || !tweenGroup || !timelineIntervalsGroup) return;
20220
20365
  while (timelineIntervalsGroup.children.length > 0) {
@@ -20367,7 +20512,7 @@ function XViewScene({
20367
20512
  tweenToTarget(center, zoomFactor);
20368
20513
  }
20369
20514
  }, [tweenToTarget]);
20370
- const handleVersionTimeline = (0, import_react37.useCallback)(
20515
+ const handleVersionTimeline = (0, import_react38.useCallback)(
20371
20516
  (sourceMesh, versionMeshes) => {
20372
20517
  const { tweenGroup, timelineIntervalsGroup } = stateRef.current;
20373
20518
  if (!tweenGroup || !timelineIntervalsGroup || versionMeshes.length === 0)
@@ -20516,7 +20661,7 @@ function XViewScene({
20516
20661
  },
20517
20662
  [tweenToTarget]
20518
20663
  );
20519
- (0, import_react37.useEffect)(() => {
20664
+ (0, import_react38.useEffect)(() => {
20520
20665
  async function fetchAllData(configPath, ownerId2) {
20521
20666
  var _a2, _b2;
20522
20667
  if (!get_scene_view_data) {
@@ -20614,12 +20759,12 @@ function XViewScene({
20614
20759
  focusNodeId,
20615
20760
  focusAncestryId
20616
20761
  ]);
20617
- const isNodeInView = (0, import_react37.useCallback)((id) => {
20762
+ const isNodeInView = (0, import_react38.useCallback)((id) => {
20618
20763
  const key = String(id);
20619
20764
  const objs = stateRef.current.nodeObjects || {};
20620
20765
  return !!objs[key];
20621
20766
  }, []);
20622
- const addOrUpdateNodeMesh = (0, import_react37.useCallback)(
20767
+ const addOrUpdateNodeMesh = (0, import_react38.useCallback)(
20623
20768
  (nodeData, position, suppressVersionUpdate = false, forceShowQuestDate = false, isTemplate = false) => {
20624
20769
  const {
20625
20770
  graphGroup,
@@ -20661,14 +20806,22 @@ function XViewScene({
20661
20806
  },
20662
20807
  []
20663
20808
  );
20664
- const handleActivateReshapeLens = (0, import_react37.useCallback)(
20809
+ const handleActivateReshapeLens = (0, import_react38.useCallback)(
20665
20810
  ({ type, columns, centerNodeId }) => {
20666
- const { nodeObjects, tweenGroup, camera, controls } = stateRef.current;
20811
+ const {
20812
+ nodeObjects,
20813
+ allLinks = [],
20814
+ ancestryLinks = [],
20815
+ tweenGroup,
20816
+ camera,
20817
+ controls
20818
+ } = stateRef.current;
20667
20819
  if (!nodeObjects || !tweenGroup || !camera || !controls) return;
20668
20820
  const activeNodeIds = Object.keys(nodeObjects);
20669
20821
  if (activeNodeIds.length === 0) return;
20670
20822
  let sumX = 0;
20671
20823
  let sumY = 0;
20824
+ let sumZ = 0;
20672
20825
  let nodeCount = 0;
20673
20826
  activeNodeIds.forEach((id) => {
20674
20827
  const mesh = nodeObjects[id];
@@ -20772,30 +20925,199 @@ function XViewScene({
20772
20925
  sumY += targetY;
20773
20926
  nodeCount++;
20774
20927
  });
20928
+ } else if (type === "Network") {
20929
+ const N = activeNodeIds.length;
20930
+ const activeSet = new Set(activeNodeIds.map(String));
20931
+ const edges = [];
20932
+ const degreeMap = new Map(activeNodeIds.map((id) => [String(id), 0]));
20933
+ const seenPairs = /* @__PURE__ */ new Set();
20934
+ [...allLinks, ...ancestryLinks].forEach((line) => {
20935
+ var _a2, _b2, _c2, _d2, _e2, _f2, _g2, _h2;
20936
+ const u = String(
20937
+ ((_c2 = (_b2 = (_a2 = line.userData) == null ? void 0 : _a2.sourceNode) == null ? void 0 : _b2.userData) == null ? void 0 : _c2.id) ?? ((_d2 = line.userData) == null ? void 0 : _d2.source) ?? ""
20938
+ );
20939
+ const v = String(
20940
+ ((_g2 = (_f2 = (_e2 = line.userData) == null ? void 0 : _e2.targetNode) == null ? void 0 : _f2.userData) == null ? void 0 : _g2.id) ?? ((_h2 = line.userData) == null ? void 0 : _h2.target) ?? ""
20941
+ );
20942
+ if (u && v && u !== v && activeSet.has(u) && activeSet.has(v)) {
20943
+ const pairKey = u < v ? `${u}_${v}` : `${v}_${u}`;
20944
+ if (!seenPairs.has(pairKey)) {
20945
+ seenPairs.add(pairKey);
20946
+ edges.push([u, v]);
20947
+ degreeMap.set(u, (degreeMap.get(u) || 0) + 1);
20948
+ degreeMap.set(v, (degreeMap.get(v) || 0) + 1);
20949
+ }
20950
+ }
20951
+ });
20952
+ const baseSpread = Math.max(45, Math.sqrt(N) * 19);
20953
+ const boundX = baseSpread * 1.75;
20954
+ const boundY = baseSpread * 1;
20955
+ const boundZ = Math.min(85, Math.max(25, baseSpread * 0.45));
20956
+ const sortedIds = [...activeNodeIds].sort(
20957
+ (a, b) => (degreeMap.get(String(b)) || 0) - (degreeMap.get(String(a)) || 0)
20958
+ );
20959
+ const posMap = /* @__PURE__ */ new Map();
20960
+ const velMap = /* @__PURE__ */ new Map();
20961
+ const goldenAngle = Math.PI * (3 - Math.sqrt(5));
20962
+ sortedIds.forEach((id, idx) => {
20963
+ const t = N > 1 ? idx / (N - 1) : 0.5;
20964
+ const r = Math.sqrt(0.12 + 0.88 * t);
20965
+ const theta = idx * goldenAngle * 7;
20966
+ const zLayer = Math.sin(idx * 2.39996) * boundZ * (0.4 + 0.6 * r);
20967
+ posMap.set(String(id), {
20968
+ x: Math.cos(theta) * r * boundX,
20969
+ y: Math.sin(theta) * r * boundY,
20970
+ z: zLayer
20971
+ });
20972
+ velMap.set(String(id), { x: 0, y: 0, z: 0 });
20973
+ });
20974
+ const iterations = 120;
20975
+ const minNodeDist = 24;
20976
+ const idealEdgeDist = 28;
20977
+ const repulsionRadius = 65;
20978
+ for (let iter = 0; iter < iterations; iter++) {
20979
+ const cooling = 1 - iter / iterations * 0.75;
20980
+ for (let i = 0; i < N; i++) {
20981
+ const idA = String(sortedIds[i]);
20982
+ const pA = posMap.get(idA);
20983
+ const vA = velMap.get(idA);
20984
+ for (let j = i + 1; j < N; j++) {
20985
+ const idB = String(sortedIds[j]);
20986
+ const pB = posMap.get(idB);
20987
+ const vB = velMap.get(idB);
20988
+ const dx = pA.x - pB.x;
20989
+ const dy = pA.y - pB.y;
20990
+ const dz = (pA.z - pB.z) * 0.6;
20991
+ const distSq = dx * dx + dy * dy + dz * dz + 0.1;
20992
+ const dist = Math.sqrt(distSq);
20993
+ if (dist < repulsionRadius) {
20994
+ const force = dist < minNodeDist ? (minNodeDist - dist) / dist * 1.8 : (repulsionRadius - dist) / repulsionRadius * 0.35 / dist;
20995
+ const fx = dx * force;
20996
+ const fy = dy * force;
20997
+ const fz = (pA.z - pB.z) * force * 0.5;
20998
+ vA.x += fx;
20999
+ vA.y += fy;
21000
+ vA.z += fz;
21001
+ vB.x -= fx;
21002
+ vB.y -= fy;
21003
+ vB.z -= fz;
21004
+ }
21005
+ }
21006
+ }
21007
+ for (let e = 0; e < edges.length; e++) {
21008
+ const [u, v] = edges[e];
21009
+ const pU = posMap.get(u);
21010
+ const pV = posMap.get(v);
21011
+ const vU = velMap.get(u);
21012
+ const vV = velMap.get(v);
21013
+ const dx = pV.x - pU.x;
21014
+ const dy = pV.y - pU.y;
21015
+ const dz = pV.z - pU.z;
21016
+ const dist = Math.sqrt(dx * dx + dy * dy + dz * dz) || 1;
21017
+ const delta = dist - idealEdgeDist;
21018
+ const springStrength = 0.085;
21019
+ const fx = dx / dist * delta * springStrength;
21020
+ const fy = dy / dist * delta * springStrength;
21021
+ const fz = dz / dist * delta * springStrength;
21022
+ vU.x += fx;
21023
+ vU.y += fy;
21024
+ vU.z += fz;
21025
+ vV.x -= fx;
21026
+ vV.y -= fy;
21027
+ vV.z -= fz;
21028
+ }
21029
+ for (let i = 0; i < N; i++) {
21030
+ const id = String(sortedIds[i]);
21031
+ const p = posMap.get(id);
21032
+ const v = velMap.get(id);
21033
+ const nx = p.x / boundX;
21034
+ const ny = p.y / boundY;
21035
+ const nz = p.z / boundZ;
21036
+ const radialNorm = Math.sqrt(nx * nx + ny * ny);
21037
+ if (radialNorm > 0.95) {
21038
+ const pull = (radialNorm - 0.95) * 2.2;
21039
+ v.x -= nx * pull * 8;
21040
+ v.y -= ny * pull * 8;
21041
+ } else if (radialNorm < 0.2 && N > 12 && (degreeMap.get(id) || 0) === 0) {
21042
+ v.x += (nx || 0.1) * 1.5;
21043
+ v.y += (ny || 0.1) * 1.5;
21044
+ }
21045
+ if (Math.abs(nz) > 0.95) {
21046
+ v.z -= nz * (Math.abs(nz) - 0.95) * 10;
21047
+ }
21048
+ const maxStep = 6 * cooling;
21049
+ const speed = Math.sqrt(v.x * v.x + v.y * v.y + v.z * v.z) || 1;
21050
+ const scale = speed > maxStep ? maxStep / speed : cooling;
21051
+ p.x += v.x * scale;
21052
+ p.y += v.y * scale;
21053
+ p.z += v.z * scale;
21054
+ v.x *= 0.4;
21055
+ v.y *= 0.4;
21056
+ v.z *= 0.4;
21057
+ }
21058
+ }
21059
+ activeNodeIds.forEach((id) => {
21060
+ const mesh = nodeObjects[id];
21061
+ const target = posMap.get(String(id)) || { x: 0, y: 0, z: 0 };
21062
+ const posTween = new import_tween2.Tween(mesh.position).to({ x: target.x, y: target.y, z: target.z }, 1500).easing(import_tween2.Easing.Cubic.InOut);
21063
+ tweenGroup.add(posTween);
21064
+ posTween.start();
21065
+ if (mesh.userData.labelObject) {
21066
+ const labelTarget = new THREE3.Vector3(
21067
+ target.x,
21068
+ target.y,
21069
+ target.z
21070
+ ).add(mesh.userData.labelOffset || new THREE3.Vector3(0, 3.8, 0));
21071
+ const lblTween = new import_tween2.Tween(mesh.userData.labelObject.position).to(labelTarget, 1500).easing(import_tween2.Easing.Cubic.InOut);
21072
+ tweenGroup.add(lblTween);
21073
+ lblTween.start();
21074
+ }
21075
+ sumX += target.x;
21076
+ sumY += target.y;
21077
+ sumZ += target.z;
21078
+ nodeCount++;
21079
+ });
20775
21080
  }
20776
21081
  if (nodeCount > 0) {
20777
21082
  const centerX = sumX / nodeCount;
20778
21083
  const centerY = sumY / nodeCount;
20779
- const targetFocus = new THREE3.Vector3(centerX, centerY, 0);
21084
+ const centerZ = type === "Network" ? sumZ / nodeCount : 0;
21085
+ const targetFocus = new THREE3.Vector3(centerX, centerY, centerZ);
20780
21086
  const targetTween = new import_tween2.Tween(controls.target).to({ x: targetFocus.x, y: targetFocus.y, z: targetFocus.z }, 1500).easing(import_tween2.Easing.Cubic.InOut);
20781
21087
  tweenGroup.add(targetTween);
20782
21088
  targetTween.start();
20783
21089
  let zoomZ = 140;
21090
+ let camOffsetY = 0;
20784
21091
  if (type === "Column") {
20785
21092
  const numRows = Math.ceil(nodeCount / (columns || 4));
20786
21093
  zoomZ = Math.max(140, numRows * 50);
20787
21094
  } else if (type === "Circle" || type === "Star") {
20788
21095
  const radius = Math.max(80, nodeCount * 8);
20789
21096
  zoomZ = radius * 2.5;
21097
+ } else if (type === "Network") {
21098
+ const baseSpread = Math.max(45, Math.sqrt(nodeCount) * 19);
21099
+ const immersionFactor = Math.max(
21100
+ 0.52,
21101
+ 1.15 - Math.min(nodeCount, 120) * 52e-4
21102
+ );
21103
+ zoomZ = targetFocus.z + Math.max(55, baseSpread * immersionFactor);
21104
+ camOffsetY = -baseSpread * 0.08;
20790
21105
  }
20791
- const camTween = new import_tween2.Tween(camera.position).to({ x: targetFocus.x, y: targetFocus.y, z: zoomZ }, 1500).easing(import_tween2.Easing.Cubic.InOut);
21106
+ const camTween = new import_tween2.Tween(camera.position).to(
21107
+ {
21108
+ x: targetFocus.x,
21109
+ y: targetFocus.y + camOffsetY,
21110
+ z: zoomZ
21111
+ },
21112
+ 1500
21113
+ ).easing(import_tween2.Easing.Cubic.InOut);
20792
21114
  tweenGroup.add(camTween);
20793
21115
  camTween.start();
20794
21116
  }
20795
21117
  },
20796
21118
  []
20797
21119
  );
20798
- const handleActivateQuestLens = (0, import_react37.useCallback)(
21120
+ const handleActivateQuestLens = (0, import_react38.useCallback)(
20799
21121
  ({ assigneeId, status: status2, milestoneId }) => {
20800
21122
  var _a2;
20801
21123
  const { nodeObjects, tweenGroup, graphGroup } = stateRef.current;
@@ -21017,7 +21339,7 @@ function XViewScene({
21017
21339
  },
21018
21340
  [addOrUpdateNodeMesh]
21019
21341
  );
21020
- (0, import_react37.useEffect)(() => {
21342
+ (0, import_react38.useEffect)(() => {
21021
21343
  if (!isInitialized || !sceneDataRef.current) return;
21022
21344
  const currentMount = mountRef.current;
21023
21345
  if (!currentMount) return;
@@ -21046,11 +21368,17 @@ function XViewScene({
21046
21368
  renderer.outputColorSpace = THREE3.SRGBColorSpace;
21047
21369
  renderer.toneMapping = THREE3.ACESFilmicToneMapping;
21048
21370
  renderer.toneMappingExposure = 1.2;
21371
+ currentMount.style.touchAction = "none";
21372
+ renderer.domElement.style.touchAction = "none";
21049
21373
  currentMount.appendChild(renderer.domElement);
21050
21374
  stateRef.current.renderer = renderer;
21051
21375
  const controls = new import_OrbitControls.OrbitControls(camera, renderer.domElement);
21052
21376
  controls.enableDamping = true;
21053
21377
  controls.dampingFactor = 0.05;
21378
+ controls.touches = {
21379
+ ONE: THREE3.TOUCH.ROTATE,
21380
+ TWO: THREE3.TOUCH.DOLLY_PAN
21381
+ };
21054
21382
  stateRef.current.controls = controls;
21055
21383
  scene.add(new THREE3.AmbientLight(16777215, 0.1));
21056
21384
  const directionalLight = new THREE3.DirectionalLight(16777215, 0.2);
@@ -21275,21 +21603,58 @@ function XViewScene({
21275
21603
  stateRef.current.dragCandidate = null;
21276
21604
  return;
21277
21605
  }
21278
- if (event.button !== 0) return;
21606
+ if (event.button !== 0 && event.pointerType !== "touch") return;
21279
21607
  if (picked && !stateRef.current.ancestry.isActive) {
21280
21608
  stateRef.current.controls.enabled = false;
21281
21609
  }
21282
21610
  stateRef.current.pointerDown = {
21283
21611
  isDown: true,
21284
21612
  x: event.clientX,
21285
- y: event.clientY
21613
+ y: event.clientY,
21614
+ pointerType: event.pointerType
21286
21615
  };
21287
21616
  stateRef.current.dragCandidate = picked;
21617
+ if (event.pointerType === "touch" || event.pointerType === "pen") {
21618
+ if (longPressTimeoutRef.current) {
21619
+ clearTimeout(longPressTimeoutRef.current);
21620
+ }
21621
+ isLongPressTriggeredRef.current = false;
21622
+ if (picked) {
21623
+ const touchX = event.clientX;
21624
+ const touchY = event.clientY;
21625
+ longPressTimeoutRef.current = setTimeout(() => {
21626
+ isLongPressTriggeredRef.current = true;
21627
+ if (typeof navigator !== "undefined" && navigator.vibrate) {
21628
+ navigator.vibrate(40);
21629
+ }
21630
+ setContextMenu({
21631
+ visible: true,
21632
+ x: touchX,
21633
+ y: touchY,
21634
+ nodeData: picked.userData
21635
+ });
21636
+ setMultiContextMenu((prev) => ({ ...prev, visible: false }));
21637
+ setRelationshipMenu((prev) => ({ ...prev, visible: false }));
21638
+ setDetailsNode(null);
21639
+ }, 450);
21640
+ }
21641
+ }
21288
21642
  }
21289
21643
  function onPointerMove(event) {
21290
21644
  if (stateRef.current.camera) stateRef.current.camera.layers.enableAll();
21291
21645
  if (isFromUiOverlay(event)) return;
21292
21646
  setMouseFromEvent(event);
21647
+ if (stateRef.current.pointerDown.isDown) {
21648
+ const dx = event.clientX - stateRef.current.pointerDown.x;
21649
+ const dy = event.clientY - stateRef.current.pointerDown.y;
21650
+ const dist = Math.hypot(dx, dy);
21651
+ if (dist > (x_view_config.DRAG_THRESHOLD_PX || 5)) {
21652
+ if (longPressTimeoutRef.current) {
21653
+ clearTimeout(longPressTimeoutRef.current);
21654
+ longPressTimeoutRef.current = null;
21655
+ }
21656
+ }
21657
+ }
21293
21658
  if (stateRef.current.isDragging && stateRef.current.draggedNode) {
21294
21659
  const raycaster2 = new THREE3.Raycaster();
21295
21660
  raycaster2.setFromCamera(mouse, camera);
@@ -21332,7 +21697,7 @@ function XViewScene({
21332
21697
  return;
21333
21698
  }
21334
21699
  if (stateRef.current.creation.isActive) return;
21335
- if (stateRef.current.pointerDown.isDown && stateRef.current.dragCandidate) {
21700
+ if (stateRef.current.pointerDown.isDown && stateRef.current.dragCandidate && !isLongPressTriggeredRef.current) {
21336
21701
  const dx = event.clientX - stateRef.current.pointerDown.x;
21337
21702
  const dy = event.clientY - stateRef.current.pointerDown.y;
21338
21703
  if (Math.hypot(dx, dy) > x_view_config.DRAG_THRESHOLD_PX) {
@@ -21364,6 +21729,17 @@ function XViewScene({
21364
21729
  async function onPointerUp(event) {
21365
21730
  var _a2, _b2, _c2;
21366
21731
  if (stateRef.current.camera) stateRef.current.camera.layers.enableAll();
21732
+ if (longPressTimeoutRef.current) {
21733
+ clearTimeout(longPressTimeoutRef.current);
21734
+ longPressTimeoutRef.current = null;
21735
+ }
21736
+ if (isLongPressTriggeredRef.current) {
21737
+ isLongPressTriggeredRef.current = false;
21738
+ stateRef.current.pointerDown.isDown = false;
21739
+ stateRef.current.dragCandidate = null;
21740
+ stateRef.current.controls.enabled = true;
21741
+ return;
21742
+ }
21367
21743
  if (isFromUiOverlay(event)) return;
21368
21744
  const {
21369
21745
  connection,
@@ -21598,7 +21974,7 @@ function XViewScene({
21598
21974
  stateRef.current.dragCandidate = null;
21599
21975
  return;
21600
21976
  }
21601
- if (event.button === 0 && !stateRef.current.creation.isActive && stateRef.current.pointerDown.isDown) {
21977
+ if ((event.button === 0 || event.pointerType === "touch") && !stateRef.current.creation.isActive && stateRef.current.pointerDown.isDown) {
21602
21978
  setMouseFromEvent(event);
21603
21979
  const clickedNode = stateRef.current.dragCandidate || tryPickNode();
21604
21980
  stateRef.current.dragCandidate = null;
@@ -21607,6 +21983,9 @@ function XViewScene({
21607
21983
  stateRef.current.selectedNodes.clear();
21608
21984
  }
21609
21985
  if (clickedNode) {
21986
+ setContextMenu((prev) => prev.visible ? { ...prev, visible: false } : prev);
21987
+ setMultiContextMenu((prev) => prev.visible ? { ...prev, visible: false } : prev);
21988
+ setRelationshipMenu((prev) => prev.visible ? { ...prev, visible: false } : prev);
21610
21989
  setDetailsNode({ ...clickedNode.userData });
21611
21990
  setDetailsLink(null);
21612
21991
  return;
@@ -21642,6 +22021,14 @@ function XViewScene({
21642
22021
  if (stateRef.current.camera) stateRef.current.camera.layers.enableAll();
21643
22022
  if (isFromUiOverlay(event)) return;
21644
22023
  event.preventDefault();
22024
+ if (longPressTimeoutRef.current) {
22025
+ clearTimeout(longPressTimeoutRef.current);
22026
+ longPressTimeoutRef.current = null;
22027
+ }
22028
+ isLongPressTriggeredRef.current = true;
22029
+ stateRef.current.pointerDown.isDown = false;
22030
+ stateRef.current.dragCandidate = null;
22031
+ setDetailsNode(null);
21645
22032
  if (stateRef.current.creation.isActive || stateRef.current.connection.isActive || stateRef.current.relink.isActive)
21646
22033
  return;
21647
22034
  setMouseFromEvent(event);
@@ -21942,7 +22329,7 @@ function XViewScene({
21942
22329
  get_scene_view_data,
21943
22330
  save_view_data
21944
22331
  ]);
21945
- const handleGhostNodeImageChange = (0, import_react37.useCallback)((useImage, imageUrl) => {
22332
+ const handleGhostNodeImageChange = (0, import_react38.useCallback)((useImage, imageUrl) => {
21946
22333
  const {
21947
22334
  node: ghostNode,
21948
22335
  line: ghostLine,
@@ -21990,7 +22377,7 @@ function XViewScene({
21990
22377
  aura: newGhostNode.getObjectByName("aura")
21991
22378
  };
21992
22379
  }, []);
21993
- const handleGhostNodeIntensityChange = (0, import_react37.useCallback)((newIntensity) => {
22380
+ const handleGhostNodeIntensityChange = (0, import_react38.useCallback)((newIntensity) => {
21994
22381
  const { node: ghostNode, aura: ghostAura } = stateRef.current.ghostElements;
21995
22382
  if (!ghostNode) return;
21996
22383
  const adjustedIntensity = newIntensity + MIN_VISIBILITY_INTENSITY;
@@ -22011,7 +22398,7 @@ function XViewScene({
22011
22398
  ghostAura.material.opacity = Math.min(0.8, newIntensity * 0.15);
22012
22399
  }
22013
22400
  }, []);
22014
- const handleDetailNodeIntensityChange = (0, import_react37.useCallback)(
22401
+ const handleDetailNodeIntensityChange = (0, import_react38.useCallback)(
22015
22402
  (nodeId, newIntensity) => {
22016
22403
  const mesh = stateRef.current.nodeObjects[String(nodeId)];
22017
22404
  if (!mesh) return;
@@ -22167,7 +22554,7 @@ function XViewScene({
22167
22554
  mountRef.current.style.cursor = "default";
22168
22555
  }
22169
22556
  };
22170
- const handleAncestryTreeUpdate = (0, import_react37.useCallback)((newTree, extraData = null) => {
22557
+ const handleAncestryTreeUpdate = (0, import_react38.useCallback)((newTree, extraData = null) => {
22171
22558
  setAncestryMode((prev) => {
22172
22559
  const prevTreeStr = JSON.stringify(prev.tree);
22173
22560
  const newTreeStr = JSON.stringify(newTree);
@@ -22190,7 +22577,7 @@ function XViewScene({
22190
22577
  };
22191
22578
  });
22192
22579
  }, []);
22193
- const actionHandlerContext = (0, import_react37.useMemo)(
22580
+ const actionHandlerContext = (0, import_react38.useMemo)(
22194
22581
  () => {
22195
22582
  var _a2;
22196
22583
  return {
@@ -22302,7 +22689,7 @@ function XViewScene({
22302
22689
  const handleStartVersioning = (nodeData) => {
22303
22690
  userActionHandlers.handleStartVersioning(actionHandlerContext, nodeData);
22304
22691
  };
22305
- const handleStartQuestQuick = (0, import_react37.useCallback)(
22692
+ const handleStartQuestQuick = (0, import_react38.useCallback)(
22306
22693
  (questNode) => {
22307
22694
  var _a2, _b2, _c2, _d2, _e2, _f2;
22308
22695
  if (!questNode || !actionHandlerContext) return;
@@ -22384,7 +22771,7 @@ function XViewScene({
22384
22771
  },
22385
22772
  [session, actionHandlerContext]
22386
22773
  );
22387
- const handleFinishQuestQuick = (0, import_react37.useCallback)(
22774
+ const handleFinishQuestQuick = (0, import_react38.useCallback)(
22388
22775
  (questNode) => {
22389
22776
  var _a2, _b2, _c2, _d2, _e2, _f2, _g2;
22390
22777
  if (!questNode || !actionHandlerContext) return;
@@ -22534,7 +22921,7 @@ function XViewScene({
22534
22921
  },
22535
22922
  [session, actionHandlerContext, viewMembers, detailsNode]
22536
22923
  );
22537
- const handleCancelQuest = (0, import_react37.useCallback)(() => {
22924
+ const handleCancelQuest = (0, import_react38.useCallback)(() => {
22538
22925
  const { graphGroup, ghostElements } = stateRef.current;
22539
22926
  if (ghostElements.node && graphGroup) {
22540
22927
  if (ghostElements.node.userData.labelObject) {
@@ -22556,7 +22943,7 @@ function XViewScene({
22556
22943
  stateRef.current.ghostElements = { node: null, line: null, aura: null };
22557
22944
  setQuestMode({ isActive: false });
22558
22945
  }, []);
22559
- const handleCancelProcess = (0, import_react37.useCallback)(() => {
22946
+ const handleCancelProcess = (0, import_react38.useCallback)(() => {
22560
22947
  const { graphGroup, ghostElements } = stateRef.current;
22561
22948
  if (ghostElements.node && graphGroup) {
22562
22949
  if (ghostElements.node.userData.labelObject) {
@@ -22909,7 +23296,7 @@ function XViewScene({
22909
23296
  alert("Ocorreu um erro ao criar o Processo.");
22910
23297
  }
22911
23298
  };
22912
- const handleClearAncestryVisuals = (0, import_react37.useCallback)((ancestryId) => {
23299
+ const handleClearAncestryVisuals = (0, import_react38.useCallback)((ancestryId) => {
22913
23300
  const { renderedAncestries, ancestryGroup } = stateRef.current;
22914
23301
  const renderIndex = renderedAncestries.findIndex(
22915
23302
  (a) => String(a.id) === String(ancestryId)
@@ -22927,7 +23314,7 @@ function XViewScene({
22927
23314
  );
22928
23315
  }
22929
23316
  }, []);
22930
- const handleRenderAncestry = (0, import_react37.useCallback)(
23317
+ const handleRenderAncestry = (0, import_react38.useCallback)(
22931
23318
  async (ancestryObject, allowedSectionIds = null, activeSectionIdForFocus = null, baseRotation = 0, forceReprocess = true) => {
22932
23319
  setContextMenu(
22933
23320
  (prev) => prev.visible ? { ...prev, visible: false } : prev
@@ -23421,7 +23808,7 @@ function XViewScene({
23421
23808
  ancestryMode.isActive
23422
23809
  ]
23423
23810
  );
23424
- const handleRenderAbstractionTree = (0, import_react37.useCallback)(
23811
+ const handleRenderAbstractionTree = (0, import_react38.useCallback)(
23425
23812
  (ancestryObject, targetNodeId = null, focusNodeId2 = null) => {
23426
23813
  setContextMenu(
23427
23814
  (prev) => prev.visible ? { ...prev, visible: false } : prev
@@ -23530,7 +23917,7 @@ function XViewScene({
23530
23917
  handleClearAncestryVisuals
23531
23918
  ]
23532
23919
  );
23533
- const handleReadModeBranchNav = (0, import_react37.useCallback)(
23920
+ const handleReadModeBranchNav = (0, import_react38.useCallback)(
23534
23921
  (nodeId, action, direction = "right") => {
23535
23922
  const { ancestry, branchStack } = readingMode;
23536
23923
  if (!ancestry || !ancestry.tree) return;
@@ -23708,13 +24095,13 @@ function XViewScene({
23708
24095
  },
23709
24096
  [readingMode, handleRenderAncestry, buildFullAncestryTree, tweenToTarget]
23710
24097
  );
23711
- const handleReadModeHighlight = (0, import_react37.useCallback)((nodeId) => {
24098
+ const handleReadModeHighlight = (0, import_react38.useCallback)((nodeId) => {
23712
24099
  if (stateRef.current.highlightedNodeId !== nodeId) {
23713
24100
  stateRef.current.highlightedNodeId = nodeId;
23714
24101
  }
23715
24102
  setHighlightedNodeId(nodeId);
23716
24103
  }, []);
23717
- const activeNodeBranches = (0, import_react37.useMemo)(() => {
24104
+ const activeNodeBranches = (0, import_react38.useMemo)(() => {
23718
24105
  if (!highlightedNodeId || !readingMode.ancestry || !readingMode.ancestry.tree)
23719
24106
  return null;
23720
24107
  const fullTree = buildFullAncestryTree(
@@ -23758,7 +24145,7 @@ function XViewScene({
23758
24145
  readingMode.branchStack,
23759
24146
  ancestryDataRef.current
23760
24147
  ]);
23761
- const backNavigationInfo = (0, import_react37.useMemo)(() => {
24148
+ const backNavigationInfo = (0, import_react38.useMemo)(() => {
23762
24149
  const { branchStack } = readingMode;
23763
24150
  if (!branchStack || branchStack.length === 0) return null;
23764
24151
  const lastStep = branchStack[branchStack.length - 1];
@@ -23769,7 +24156,7 @@ function XViewScene({
23769
24156
  name: "Voltar para anterior"
23770
24157
  };
23771
24158
  }, [readingMode.branchStack]);
23772
- const getReadModeDisplayContext = (0, import_react37.useMemo)(() => {
24159
+ const getReadModeDisplayContext = (0, import_react38.useMemo)(() => {
23773
24160
  const { ancestry, branchStack } = readingMode;
23774
24161
  if (!ancestry) return null;
23775
24162
  if (branchStack.length === 0) {
@@ -23812,7 +24199,7 @@ function XViewScene({
23812
24199
  customProperties: branchProps
23813
24200
  };
23814
24201
  }, [readingMode, buildFullAncestryTree, ancestryDataRef.current]);
23815
- const readModeAbstractionTree = (0, import_react37.useMemo)(() => {
24202
+ const readModeAbstractionTree = (0, import_react38.useMemo)(() => {
23816
24203
  if (!readingMode.isActive || !readingMode.ancestry || !readingMode.ancestry.abstraction_tree) {
23817
24204
  return null;
23818
24205
  }
@@ -23831,7 +24218,7 @@ function XViewScene({
23831
24218
  buildFullAncestryTree,
23832
24219
  sceneVersion
23833
24220
  ]);
23834
- const handleStartReadingAncestry = (0, import_react37.useCallback)(
24221
+ const handleStartReadingAncestry = (0, import_react38.useCallback)(
23835
24222
  async (ancestryObject, renderMode = "full") => {
23836
24223
  setContextMenu(
23837
24224
  (prev) => prev.visible ? { ...prev, visible: false } : prev
@@ -23874,7 +24261,7 @@ function XViewScene({
23874
24261
  },
23875
24262
  [handleRenderAncestry, handleRenderAbstractionTree]
23876
24263
  );
23877
- const handleReadModeSectionChange = (0, import_react37.useCallback)(
24264
+ const handleReadModeSectionChange = (0, import_react38.useCallback)(
23878
24265
  (activeSectionId) => {
23879
24266
  const { ancestry, branchStack } = readingMode;
23880
24267
  if (!ancestry || !readingMode.isActive) return;
@@ -23959,10 +24346,10 @@ function XViewScene({
23959
24346
  ancestryDataRef.current
23960
24347
  ]
23961
24348
  );
23962
- const handleCloseReadMode = (0, import_react37.useCallback)(() => {
24349
+ const handleCloseReadMode = (0, import_react38.useCallback)(() => {
23963
24350
  setReadingMode({ isActive: false, ancestry: null, branchStack: [] });
23964
24351
  }, []);
23965
- const handleAncestrySectionChange = (0, import_react37.useCallback)(
24352
+ const handleAncestrySectionChange = (0, import_react38.useCallback)(
23966
24353
  (activeSectionId, ancestryOverride = null, rotation = 0) => {
23967
24354
  var _a2, _b2;
23968
24355
  const currentMode = stateRef.current.ancestry;
@@ -24024,7 +24411,7 @@ function XViewScene({
24024
24411
  },
24025
24412
  [handleRenderAncestry]
24026
24413
  );
24027
- const handleEditAncestry = (0, import_react37.useCallback)(
24414
+ const handleEditAncestry = (0, import_react38.useCallback)(
24028
24415
  async (ancestryObject) => {
24029
24416
  setContextMenu(
24030
24417
  (prev) => prev.visible ? { ...prev, visible: false } : prev
@@ -24079,7 +24466,7 @@ function XViewScene({
24079
24466
  const handleSelectAncestryParent = (nodeId) => {
24080
24467
  setAncestryMode((prev) => ({ ...prev, selectedParentId: nodeId }));
24081
24468
  };
24082
- const handleRemoveFromAncestry = (0, import_react37.useCallback)((pathToRemove) => {
24469
+ const handleRemoveFromAncestry = (0, import_react38.useCallback)((pathToRemove) => {
24083
24470
  if (!Array.isArray(pathToRemove) || pathToRemove.length === 0) {
24084
24471
  console.warn("Tentativa de remover a raiz ou caminho inv\xE1lido.");
24085
24472
  return;
@@ -24104,7 +24491,7 @@ function XViewScene({
24104
24491
  return { ...prev, tree: newTree };
24105
24492
  });
24106
24493
  }, []);
24107
- const handleSaveAncestry = (0, import_react37.useCallback)(
24494
+ const handleSaveAncestry = (0, import_react38.useCallback)(
24108
24495
  async (ancestryName, ancestryDescription, ancestrySections, keepOpen = false, treeOverride = null, ancestryCustomProps = {}) => {
24109
24496
  var _a2;
24110
24497
  const treeToUse = treeOverride || ancestryMode.tree;
@@ -24372,7 +24759,7 @@ function XViewScene({
24372
24759
  });
24373
24760
  setEditingAncestryRel({ visible: false, data: null, path: null });
24374
24761
  };
24375
- const handleDeleteAncestry = (0, import_react37.useCallback)(
24762
+ const handleDeleteAncestry = (0, import_react38.useCallback)(
24376
24763
  async (ancestryIdToDelete) => {
24377
24764
  if (!ancestryIdToDelete) {
24378
24765
  alert("ID da ancestralidade n\xE3o encontrado.");
@@ -24506,19 +24893,19 @@ function XViewScene({
24506
24893
  },
24507
24894
  [save_view_data, delete_file_action]
24508
24895
  );
24509
- const handleOpenBoards = (0, import_react37.useCallback)(() => {
24896
+ const handleOpenBoards = (0, import_react38.useCallback)(() => {
24510
24897
  setIsBoardsOpen(true);
24511
24898
  }, []);
24512
- const allAvailableNodes = (0, import_react37.useMemo)(() => {
24899
+ const allAvailableNodes = (0, import_react38.useMemo)(() => {
24513
24900
  if (!parentDataRef.current) return [];
24514
24901
  return Object.values(parentDataRef.current).flatMap(
24515
24902
  (fileData) => fileData.nodes || []
24516
24903
  );
24517
24904
  }, [sceneVersion, isInitialized]);
24518
- const allAvailableAncestries = (0, import_react37.useMemo)(() => {
24905
+ const allAvailableAncestries = (0, import_react38.useMemo)(() => {
24519
24906
  return ancestryDataRef.current || [];
24520
24907
  }, [sceneVersion, isInitialized]);
24521
- const handleFocusNode = (0, import_react37.useCallback)(
24908
+ const handleFocusNode = (0, import_react38.useCallback)(
24522
24909
  (nodeData) => {
24523
24910
  var _a2;
24524
24911
  if (!nodeData) return;
@@ -24534,7 +24921,7 @@ function XViewScene({
24534
24921
  },
24535
24922
  [tweenToTarget]
24536
24923
  );
24537
- const handleOpenReference = (0, import_react37.useCallback)(
24924
+ const handleOpenReference = (0, import_react38.useCallback)(
24538
24925
  (referenceData) => {
24539
24926
  const { type, id } = referenceData;
24540
24927
  if (type === "node") {
@@ -24570,7 +24957,7 @@ function XViewScene({
24570
24957
  handleFocusNode
24571
24958
  ]
24572
24959
  );
24573
- const handleSelectAncestryFromBoard = (0, import_react37.useCallback)(
24960
+ const handleSelectAncestryFromBoard = (0, import_react38.useCallback)(
24574
24961
  (item) => {
24575
24962
  setIsBoardsOpen(false);
24576
24963
  setIsSidebarOpen(false);
@@ -24582,7 +24969,7 @@ function XViewScene({
24582
24969
  },
24583
24970
  [handleStartReadingAncestry, handleOpenReference]
24584
24971
  );
24585
- const handleSaveBoards = (0, import_react37.useCallback)(
24972
+ const handleSaveBoards = (0, import_react38.useCallback)(
24586
24973
  async (boardItems2) => {
24587
24974
  if (!sceneConfigId || !viewParams || !session) return;
24588
24975
  const sceneType = (viewParams.type || "").toLowerCase().includes("database") ? "database" : "view";
@@ -24596,7 +24983,7 @@ function XViewScene({
24596
24983
  },
24597
24984
  [sceneConfigId, viewParams, session, save_boards_action, ownerId]
24598
24985
  );
24599
- const existingNodeTypes = (0, import_react37.useMemo)(() => {
24986
+ const existingNodeTypes = (0, import_react38.useMemo)(() => {
24600
24987
  if (!parentDataRef.current) {
24601
24988
  return [];
24602
24989
  }
@@ -24608,7 +24995,7 @@ function XViewScene({
24608
24995
  ).filter((t) => Boolean(t) && String(t).toLowerCase() !== "quest");
24609
24996
  return [...new Set(allTypes)];
24610
24997
  }, [parentDataRef.current, sceneVersion]);
24611
- const searchableDbNodes = (0, import_react37.useMemo)(() => {
24998
+ const searchableDbNodes = (0, import_react38.useMemo)(() => {
24612
24999
  if (!parentDataRef.current) {
24613
25000
  return [];
24614
25001
  }
@@ -24623,7 +25010,7 @@ function XViewScene({
24623
25010
  return !((_a2 = node.version_node) == null ? void 0 : _a2.is_version);
24624
25011
  });
24625
25012
  }, [parentDataRef.current, sceneVersion]);
24626
- const handleAddExistingNode = (0, import_react37.useCallback)(
25013
+ const handleAddExistingNode = (0, import_react38.useCallback)(
24627
25014
  (nodeId) => {
24628
25015
  return userActionHandlers.handleAddExistingNodeById(
24629
25016
  actionHandlerContext,
@@ -24632,7 +25019,7 @@ function XViewScene({
24632
25019
  },
24633
25020
  [actionHandlerContext]
24634
25021
  );
24635
- const handleUpdateMilestones = (0, import_react37.useCallback)(
25022
+ const handleUpdateMilestones = (0, import_react38.useCallback)(
24636
25023
  async (newMilestones) => {
24637
25024
  var _a2, _b2, _c2;
24638
25025
  if (!sceneDataRef.current) return;
@@ -24659,7 +25046,7 @@ function XViewScene({
24659
25046
  },
24660
25047
  [sceneConfigId, sceneSaveUrl, save_view_data, viewParams == null ? void 0 : viewParams.type]
24661
25048
  );
24662
- const handleSaveCurrentView = (0, import_react37.useCallback)(async () => {
25049
+ const handleSaveCurrentView = (0, import_react38.useCallback)(async () => {
24663
25050
  var _a2;
24664
25051
  const { nodeObjects, allLinks } = stateRef.current;
24665
25052
  if (!nodeObjects || !allLinks || !sceneSaveUrl || !parentDataRef.current) {
@@ -24698,13 +25085,13 @@ function XViewScene({
24698
25085
  console.error("Erro na chamada de save_view_data:", error);
24699
25086
  }
24700
25087
  }, [sceneSaveUrl, save_view_data, sceneConfigId, viewParams == null ? void 0 : viewParams.type]);
24701
- const handleToggleAncestryAddMode = (0, import_react37.useCallback)(() => {
25088
+ const handleToggleAncestryAddMode = (0, import_react38.useCallback)(() => {
24702
25089
  setAncestryMode((prev) => ({
24703
25090
  ...prev,
24704
25091
  isAddingNodes: !prev.isAddingNodes
24705
25092
  }));
24706
25093
  }, []);
24707
- const availableDatasets = (0, import_react37.useMemo)(() => {
25094
+ const availableDatasets = (0, import_react38.useMemo)(() => {
24708
25095
  if (!sceneDataRef.current || !parentDataRef.current) return [];
24709
25096
  return sceneDataRef.current.parent_dbs.map((db) => {
24710
25097
  var _a2;
@@ -24718,7 +25105,7 @@ function XViewScene({
24718
25105
  String(creationMode.sourceNodeData.id)
24719
25106
  )) == null ? void 0 : _b.parentFileId : null;
24720
25107
  const detailsNodeDatasetInfo = detailsNode ? stateRef.current.nodeIdToParentFileMap.get(String(detailsNode.id)) : null;
24721
- (0, import_react37.useEffect)(() => {
25108
+ (0, import_react38.useEffect)(() => {
24722
25109
  if (!isInitialized || hasFocusedInitial) return;
24723
25110
  const nodeObjects = stateRef.current.nodeObjects || {};
24724
25111
  if (focusNodeId) {
@@ -24765,7 +25152,7 @@ function XViewScene({
24765
25152
  hasFocusedInitial,
24766
25153
  tweenToTarget
24767
25154
  ]);
24768
- (0, import_react37.useEffect)(() => {
25155
+ (0, import_react38.useEffect)(() => {
24769
25156
  if (isInitialized && focusAncestryId && !hasOpenedInitialAncestry) {
24770
25157
  const ancestries = ancestryDataRef.current || [];
24771
25158
  const targetAncestry = ancestries.find(
@@ -24790,7 +25177,7 @@ function XViewScene({
24790
25177
  hasOpenedInitialAncestry,
24791
25178
  handleStartReadingAncestry
24792
25179
  ]);
24793
- (0, import_react37.useEffect)(() => {
25180
+ (0, import_react38.useEffect)(() => {
24794
25181
  function handleKeyDown(event) {
24795
25182
  var _a2, _b2, _c2, _d2, _e2, _f2;
24796
25183
  const context = actionHandlerContext;
@@ -25013,7 +25400,7 @@ function XViewScene({
25013
25400
  // <-- handleCancelQuest adicionado aqui
25014
25401
  ]);
25015
25402
  if (isLoading || status === "loading" || permissionStatus === "loading") {
25016
- return /* @__PURE__ */ import_react37.default.createElement(LoadingScreen, null);
25403
+ return /* @__PURE__ */ import_react38.default.createElement(LoadingScreen, null);
25017
25404
  }
25018
25405
  const overlayHiddenStyle = questTreeMode.isActive || processTreeMode.isActive ? {
25019
25406
  opacity: 0,
@@ -25022,7 +25409,7 @@ function XViewScene({
25022
25409
  transition: "all 300ms ease-in-out"
25023
25410
  } : {};
25024
25411
  if (permissionStatus === "corrupted") {
25025
- return /* @__PURE__ */ import_react37.default.createElement("div", { className: "flex flex-col items-center justify-center min-h-screen w-full bg-slate-950 text-white" }, /* @__PURE__ */ import_react37.default.createElement("div", { className: "bg-slate-900/50 p-8 rounded-2xl border border-slate-800 shadow-2xl text-center max-w-md animate-fade-in" }, /* @__PURE__ */ import_react37.default.createElement("div", { className: "mb-4 text-amber-500" }, /* @__PURE__ */ import_react37.default.createElement(
25412
+ return /* @__PURE__ */ import_react38.default.createElement("div", { className: "flex flex-col items-center justify-center min-h-screen w-full bg-slate-950 text-white" }, /* @__PURE__ */ import_react38.default.createElement("div", { className: "bg-slate-900/50 p-8 rounded-2xl border border-slate-800 shadow-2xl text-center max-w-md animate-fade-in" }, /* @__PURE__ */ import_react38.default.createElement("div", { className: "mb-4 text-amber-500" }, /* @__PURE__ */ import_react38.default.createElement(
25026
25413
  "svg",
25027
25414
  {
25028
25415
  xmlns: "http://www.w3.org/2000/svg",
@@ -25032,7 +25419,7 @@ function XViewScene({
25032
25419
  stroke: "currentColor",
25033
25420
  className: "w-16 h-16 mx-auto"
25034
25421
  },
25035
- /* @__PURE__ */ import_react37.default.createElement(
25422
+ /* @__PURE__ */ import_react38.default.createElement(
25036
25423
  "path",
25037
25424
  {
25038
25425
  strokeLinecap: "round",
@@ -25040,13 +25427,13 @@ function XViewScene({
25040
25427
  d: "M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126zM12 15.75h.007v.008H12v-.008z"
25041
25428
  }
25042
25429
  )
25043
- )), /* @__PURE__ */ import_react37.default.createElement("h2", { className: "text-2xl font-bold mb-2" }, "Link Inv\xE1lido"), /* @__PURE__ */ import_react37.default.createElement("p", { className: "text-slate-400 mb-6" }, "O link de acesso a este cen\xE1rio est\xE1 corrompido, incompleto ou foi alterado de forma incorreta. Por favor, verifique a URL ou retorne ao dashboard."), /* @__PURE__ */ import_react37.default.createElement(
25430
+ )), /* @__PURE__ */ import_react38.default.createElement("h2", { className: "text-2xl font-bold mb-2" }, "Link Inv\xE1lido"), /* @__PURE__ */ import_react38.default.createElement("p", { className: "text-slate-400 mb-6" }, "O link de acesso a este cen\xE1rio est\xE1 corrompido, incompleto ou foi alterado de forma incorreta. Por favor, verifique a URL ou retorne ao dashboard."), /* @__PURE__ */ import_react38.default.createElement(
25044
25431
  "button",
25045
25432
  {
25046
25433
  onClick: handleNavigateBack,
25047
25434
  className: "flex items-center justify-center gap-2 w-full py-3 px-4 bg-blue-600 hover:bg-blue-700 text-white rounded-lg transition-colors font-medium cursor-pointer"
25048
25435
  },
25049
- /* @__PURE__ */ import_react37.default.createElement(
25436
+ /* @__PURE__ */ import_react38.default.createElement(
25050
25437
  "svg",
25051
25438
  {
25052
25439
  xmlns: "http://www.w3.org/2000/svg",
@@ -25056,7 +25443,7 @@ function XViewScene({
25056
25443
  stroke: "currentColor",
25057
25444
  className: "w-5 h-5"
25058
25445
  },
25059
- /* @__PURE__ */ import_react37.default.createElement(
25446
+ /* @__PURE__ */ import_react38.default.createElement(
25060
25447
  "path",
25061
25448
  {
25062
25449
  strokeLinecap: "round",
@@ -25069,7 +25456,7 @@ function XViewScene({
25069
25456
  )));
25070
25457
  }
25071
25458
  if (permissionStatus === "denied") {
25072
- return /* @__PURE__ */ import_react37.default.createElement("div", { className: "flex flex-col items-center justify-center min-h-screen w-full bg-slate-950 text-white" }, /* @__PURE__ */ import_react37.default.createElement("div", { className: "bg-slate-900/50 p-8 rounded-2xl border border-slate-800 shadow-2xl text-center max-w-md" }, /* @__PURE__ */ import_react37.default.createElement("div", { className: "mb-4 text-red-500" }, /* @__PURE__ */ import_react37.default.createElement(
25459
+ return /* @__PURE__ */ import_react38.default.createElement("div", { className: "flex flex-col items-center justify-center min-h-screen w-full bg-slate-950 text-white" }, /* @__PURE__ */ import_react38.default.createElement("div", { className: "bg-slate-900/50 p-8 rounded-2xl border border-slate-800 shadow-2xl text-center max-w-md" }, /* @__PURE__ */ import_react38.default.createElement("div", { className: "mb-4 text-red-500" }, /* @__PURE__ */ import_react38.default.createElement(
25073
25460
  "svg",
25074
25461
  {
25075
25462
  xmlns: "http://www.w3.org/2000/svg",
@@ -25079,7 +25466,7 @@ function XViewScene({
25079
25466
  stroke: "currentColor",
25080
25467
  className: "w-16 h-16 mx-auto"
25081
25468
  },
25082
- /* @__PURE__ */ import_react37.default.createElement(
25469
+ /* @__PURE__ */ import_react38.default.createElement(
25083
25470
  "path",
25084
25471
  {
25085
25472
  strokeLinecap: "round",
@@ -25087,13 +25474,13 @@ function XViewScene({
25087
25474
  d: "M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126zM12 15.75h.007v.008H12v-.008z"
25088
25475
  }
25089
25476
  )
25090
- )), /* @__PURE__ */ import_react37.default.createElement("h2", { className: "text-2xl font-bold mb-2" }, "Acesso Negado"), /* @__PURE__ */ import_react37.default.createElement("p", { className: "text-slate-400 mb-6" }, "Voc\xEA n\xE3o tem permiss\xE3o para acessar este conte\xFAdo. Solicite acesso ao propriet\xE1rio ou verifique se est\xE1 na conta correta."), /* @__PURE__ */ import_react37.default.createElement(
25477
+ )), /* @__PURE__ */ import_react38.default.createElement("h2", { className: "text-2xl font-bold mb-2" }, "Acesso Negado"), /* @__PURE__ */ import_react38.default.createElement("p", { className: "text-slate-400 mb-6" }, "Voc\xEA n\xE3o tem permiss\xE3o para acessar este conte\xFAdo. Solicite acesso ao propriet\xE1rio ou verifique se est\xE1 na conta correta."), /* @__PURE__ */ import_react38.default.createElement(
25091
25478
  "button",
25092
25479
  {
25093
25480
  onClick: handleNavigateBack,
25094
25481
  className: "flex items-center justify-center gap-2 w-full py-3 px-4 bg-blue-600 hover:bg-blue-700 text-white rounded-lg transition-colors font-medium"
25095
25482
  },
25096
- /* @__PURE__ */ import_react37.default.createElement(
25483
+ /* @__PURE__ */ import_react38.default.createElement(
25097
25484
  "svg",
25098
25485
  {
25099
25486
  xmlns: "http://www.w3.org/2000/svg",
@@ -25103,7 +25490,7 @@ function XViewScene({
25103
25490
  stroke: "currentColor",
25104
25491
  className: "w-5 h-5"
25105
25492
  },
25106
- /* @__PURE__ */ import_react37.default.createElement(
25493
+ /* @__PURE__ */ import_react38.default.createElement(
25107
25494
  "path",
25108
25495
  {
25109
25496
  strokeLinecap: "round",
@@ -25115,7 +25502,7 @@ function XViewScene({
25115
25502
  "Voltar para o X.View"
25116
25503
  )));
25117
25504
  }
25118
- return /* @__PURE__ */ import_react37.default.createElement(
25505
+ return /* @__PURE__ */ import_react38.default.createElement(
25119
25506
  "div",
25120
25507
  {
25121
25508
  ref: mountRef,
@@ -25127,7 +25514,7 @@ function XViewScene({
25127
25514
  cursor: isProcessing ? "progress" : stateRef.current.connection.isActive || stateRef.current.relink.isActive || ancestryMode.isActive ? "crosshair" : creationMode.isActive ? "default" : "grab"
25128
25515
  }
25129
25516
  },
25130
- userPermissionRole !== "link_viewer" && /* @__PURE__ */ import_react37.default.createElement(
25517
+ userPermissionRole !== "link_viewer" && /* @__PURE__ */ import_react38.default.createElement(
25131
25518
  XViewSidebar,
25132
25519
  {
25133
25520
  dbNodes: searchableDbNodes,
@@ -25156,7 +25543,7 @@ function XViewScene({
25156
25543
  viewMembers
25157
25544
  }
25158
25545
  ),
25159
- creationMode.isActive && /* @__PURE__ */ import_react37.default.createElement(
25546
+ creationMode.isActive && /* @__PURE__ */ import_react38.default.createElement(
25160
25547
  InSceneCreationForm,
25161
25548
  {
25162
25549
  onSave: (data) => userActionHandlers.handleSaveNode(actionHandlerContext, data),
@@ -25191,7 +25578,7 @@ function XViewScene({
25191
25578
  view_google_folder_id: (_h = sceneDataRef.current) == null ? void 0 : _h.view_google_folder_id
25192
25579
  }
25193
25580
  ),
25194
- versionMode.isActive && /* @__PURE__ */ import_react37.default.createElement(
25581
+ versionMode.isActive && /* @__PURE__ */ import_react38.default.createElement(
25195
25582
  InSceneVersionForm,
25196
25583
  {
25197
25584
  onSave: (data) => userActionHandlers.handleSaveVersionNode(actionHandlerContext, data),
@@ -25218,7 +25605,7 @@ function XViewScene({
25218
25605
  availableAncestries: allAvailableAncestries
25219
25606
  }
25220
25607
  ),
25221
- questTreeMode.isActive && /* @__PURE__ */ import_react37.default.createElement(
25608
+ questTreeMode.isActive && /* @__PURE__ */ import_react38.default.createElement(
25222
25609
  CreateQuestTreePanel,
25223
25610
  {
25224
25611
  questTreeMode,
@@ -25227,7 +25614,7 @@ function XViewScene({
25227
25614
  onClose: handleCloseQuestTree
25228
25615
  }
25229
25616
  ),
25230
- processTreeMode.isActive && /* @__PURE__ */ import_react37.default.createElement(
25617
+ processTreeMode.isActive && /* @__PURE__ */ import_react38.default.createElement(
25231
25618
  CreateProcessTreePanel,
25232
25619
  {
25233
25620
  processTreeMode,
@@ -25236,7 +25623,7 @@ function XViewScene({
25236
25623
  onClose: handleCloseProcessTree
25237
25624
  }
25238
25625
  ),
25239
- questMode.isActive && /* @__PURE__ */ import_react37.default.createElement(
25626
+ questMode.isActive && /* @__PURE__ */ import_react38.default.createElement(
25240
25627
  InSceneQuestForm,
25241
25628
  {
25242
25629
  onSave: (data) => handleSaveQuestNode(actionHandlerContext, data),
@@ -25267,7 +25654,7 @@ function XViewScene({
25267
25654
  view_google_folder_id: (_m = sceneDataRef.current) == null ? void 0 : _m.view_google_folder_id
25268
25655
  }
25269
25656
  ),
25270
- processMode.isActive && /* @__PURE__ */ import_react37.default.createElement(
25657
+ processMode.isActive && /* @__PURE__ */ import_react38.default.createElement(
25271
25658
  InSceneProcessForm,
25272
25659
  {
25273
25660
  onSave: (data) => handleSaveProcessNode(actionHandlerContext, data),
@@ -25294,7 +25681,7 @@ function XViewScene({
25294
25681
  view_google_folder_id: (_n = sceneDataRef.current) == null ? void 0 : _n.view_google_folder_id
25295
25682
  }
25296
25683
  ),
25297
- readingMode.isActive && readingMode.ancestry && /* @__PURE__ */ import_react37.default.createElement(
25684
+ readingMode.isActive && readingMode.ancestry && /* @__PURE__ */ import_react38.default.createElement(
25298
25685
  "div",
25299
25686
  {
25300
25687
  className: `ui-overlay absolute group rounded-2xl border border-white/10 bg-slate-950/70 backdrop-blur-xl shadow-[0_20px_80px_rgba(0,0,0,0.6)] ring-1 ring-white/10 text-white overflow-hidden flex flex-col ${isReadModeResizing ? "transition-none" : "transition-all duration-300 ease-out"}`,
@@ -25307,7 +25694,7 @@ function XViewScene({
25307
25694
  maxWidth: "92vw"
25308
25695
  }
25309
25696
  },
25310
- /* @__PURE__ */ import_react37.default.createElement(
25697
+ /* @__PURE__ */ import_react38.default.createElement(
25311
25698
  "div",
25312
25699
  {
25313
25700
  onPointerDown: (e) => {
@@ -25318,7 +25705,7 @@ function XViewScene({
25318
25705
  title: "Arraste para redimensionar"
25319
25706
  }
25320
25707
  ),
25321
- /* @__PURE__ */ import_react37.default.createElement(
25708
+ /* @__PURE__ */ import_react38.default.createElement(
25322
25709
  DescriptionReadModePanel,
25323
25710
  {
25324
25711
  key: readingMode.branchStack.length > 0 ? readingMode.branchStack[readingMode.branchStack.length - 1].branchId : readingMode.ancestry.ancestry_id,
@@ -25353,7 +25740,7 @@ function XViewScene({
25353
25740
  }
25354
25741
  )
25355
25742
  ),
25356
- ancestryMode.isActive && ancestryMode.tree && /* @__PURE__ */ import_react37.default.createElement(
25743
+ ancestryMode.isActive && ancestryMode.tree && /* @__PURE__ */ import_react38.default.createElement(
25357
25744
  CreateAncestryPanel,
25358
25745
  {
25359
25746
  ancestryMode,
@@ -25389,7 +25776,7 @@ function XViewScene({
25389
25776
  onRenderAbstractionTree: (data, targetId) => handleRenderAbstractionTree(data, targetId)
25390
25777
  }
25391
25778
  ),
25392
- editingAncestryRel.visible && /* @__PURE__ */ import_react37.default.createElement(
25779
+ editingAncestryRel.visible && /* @__PURE__ */ import_react38.default.createElement(
25393
25780
  AncestryRelationshipPanel,
25394
25781
  {
25395
25782
  data: editingAncestryRel.data,
@@ -25403,8 +25790,8 @@ function XViewScene({
25403
25790
  onUploadFile: upload_file_action
25404
25791
  }
25405
25792
  ),
25406
- isProcessing && /* @__PURE__ */ import_react37.default.createElement("div", { className: "fixed bottom-8 right-8 z-[2000] flex items-center gap-3 px-4 py-2 bg-slate-900/80 backdrop-blur-md border border-white/10 rounded-full shadow-2xl animate-pulse" }, /* @__PURE__ */ import_react37.default.createElement("div", { className: "w-4 h-4 border-2 border-indigo-500 border-t-transparent rounded-full animate-spin" }), /* @__PURE__ */ import_react37.default.createElement("span", { className: "text-xs font-medium text-indigo-200 tracking-wider uppercase" }, "Sincronizando Processo...")),
25407
- detailsNode && detailsNode.is_quest && /* @__PURE__ */ import_react37.default.createElement(
25793
+ isProcessing && /* @__PURE__ */ import_react38.default.createElement("div", { className: "fixed bottom-8 right-8 z-[2000] flex items-center gap-3 px-4 py-2 bg-slate-900/80 backdrop-blur-md border border-white/10 rounded-full shadow-2xl animate-pulse" }, /* @__PURE__ */ import_react38.default.createElement("div", { className: "w-4 h-4 border-2 border-indigo-500 border-t-transparent rounded-full animate-spin" }), /* @__PURE__ */ import_react38.default.createElement("span", { className: "text-xs font-medium text-indigo-200 tracking-wider uppercase" }, "Sincronizando Processo...")),
25794
+ detailsNode && detailsNode.is_quest && /* @__PURE__ */ import_react38.default.createElement(
25408
25795
  QuestDetailsPanel,
25409
25796
  {
25410
25797
  node: detailsNode,
@@ -25436,7 +25823,7 @@ function XViewScene({
25436
25823
  style: overlayHiddenStyle
25437
25824
  }
25438
25825
  ),
25439
- detailsNode && detailsNode.is_process && /* @__PURE__ */ import_react37.default.createElement(
25826
+ detailsNode && detailsNode.is_process && /* @__PURE__ */ import_react38.default.createElement(
25440
25827
  ProcessDetailsPanel,
25441
25828
  {
25442
25829
  node: detailsNode,
@@ -25466,7 +25853,7 @@ function XViewScene({
25466
25853
  style: overlayHiddenStyle
25467
25854
  }
25468
25855
  ),
25469
- detailsNode && !detailsNode.is_quest && !detailsNode.is_process && /* @__PURE__ */ import_react37.default.createElement(
25856
+ detailsNode && !detailsNode.is_quest && !detailsNode.is_process && /* @__PURE__ */ import_react38.default.createElement(
25470
25857
  NodeDetailsPanel,
25471
25858
  {
25472
25859
  node: detailsNode,
@@ -25501,7 +25888,7 @@ function XViewScene({
25501
25888
  style: overlayHiddenStyle
25502
25889
  }
25503
25890
  ),
25504
- detailsLink && /* @__PURE__ */ import_react37.default.createElement(
25891
+ detailsLink && /* @__PURE__ */ import_react38.default.createElement(
25505
25892
  RelationshipDetailsPanel,
25506
25893
  {
25507
25894
  link: detailsLink,
@@ -25516,7 +25903,7 @@ function XViewScene({
25516
25903
  onHighlight: handleReadModeHighlight
25517
25904
  }
25518
25905
  ),
25519
- ancestryLinkDetails && /* @__PURE__ */ import_react37.default.createElement(
25906
+ ancestryLinkDetails && /* @__PURE__ */ import_react38.default.createElement(
25520
25907
  AncestryLinkDetailsPanel,
25521
25908
  {
25522
25909
  data: ancestryLinkDetails,
@@ -25528,7 +25915,7 @@ function XViewScene({
25528
25915
  onHighlight: handleReadModeHighlight
25529
25916
  }
25530
25917
  ),
25531
- /* @__PURE__ */ import_react37.default.createElement(
25918
+ /* @__PURE__ */ import_react38.default.createElement(
25532
25919
  "div",
25533
25920
  {
25534
25921
  ref: tooltipRef,
@@ -25555,7 +25942,7 @@ function XViewScene({
25555
25942
  }
25556
25943
  }
25557
25944
  ),
25558
- /* @__PURE__ */ import_react37.default.createElement(
25945
+ /* @__PURE__ */ import_react38.default.createElement(
25559
25946
  ContextMenu,
25560
25947
  {
25561
25948
  data: contextMenu,
@@ -25594,7 +25981,7 @@ function XViewScene({
25594
25981
  onInitiateProcess: (data) => userActionHandlers.handleInitiateProcess(actionHandlerContext, data)
25595
25982
  }
25596
25983
  ),
25597
- /* @__PURE__ */ import_react37.default.createElement(
25984
+ /* @__PURE__ */ import_react38.default.createElement(
25598
25985
  MultiNodeContextMenu,
25599
25986
  {
25600
25987
  data: multiContextMenu,
@@ -25614,7 +26001,7 @@ function XViewScene({
25614
26001
  )
25615
26002
  }
25616
26003
  ),
25617
- /* @__PURE__ */ import_react37.default.createElement(
26004
+ /* @__PURE__ */ import_react38.default.createElement(
25618
26005
  RelationshipContextMenu,
25619
26006
  {
25620
26007
  data: relationshipMenu,
@@ -25632,14 +26019,14 @@ function XViewScene({
25632
26019
  onDelete: (data) => userActionHandlers.handleDeleteLink(actionHandlerContext, data)
25633
26020
  }
25634
26021
  ),
25635
- /* @__PURE__ */ import_react37.default.createElement(
26022
+ /* @__PURE__ */ import_react38.default.createElement(
25636
26023
  ImageViewer,
25637
26024
  {
25638
26025
  data: imageViewer,
25639
26026
  onClose: () => setImageViewer({ ...imageViewer, visible: false })
25640
26027
  }
25641
26028
  ),
25642
- /* @__PURE__ */ import_react37.default.createElement(
26029
+ /* @__PURE__ */ import_react38.default.createElement(
25643
26030
  Boards,
25644
26031
  {
25645
26032
  isOpen: isBoardsOpen,
@@ -25652,7 +26039,7 @@ function XViewScene({
25652
26039
  userRole: userPermissionRole
25653
26040
  }
25654
26041
  ),
25655
- /* @__PURE__ */ import_react37.default.createElement(
26042
+ /* @__PURE__ */ import_react38.default.createElement(
25656
26043
  MilestoneManager,
25657
26044
  {
25658
26045
  isOpen: isMilestoneManagerOpen,
@@ -25661,7 +26048,7 @@ function XViewScene({
25661
26048
  onUpdateMilestones: handleUpdateMilestones
25662
26049
  }
25663
26050
  ),
25664
- /* @__PURE__ */ import_react37.default.createElement(
26051
+ /* @__PURE__ */ import_react38.default.createElement(
25665
26052
  ImportParentFileModal,
25666
26053
  {
25667
26054
  isOpen: isImportModalOpen,
@@ -25674,7 +26061,7 @@ function XViewScene({
25674
26061
  currentAncestries: ancestryDataRef.current || []
25675
26062
  }
25676
26063
  ),
25677
- invalidTargetError && /* @__PURE__ */ import_react37.default.createElement(
26064
+ invalidTargetError && /* @__PURE__ */ import_react38.default.createElement(
25678
26065
  "div",
25679
26066
  {
25680
26067
  className: "ui-overlay",
@@ -25699,13 +26086,13 @@ function XViewScene({
25699
26086
  animation: "fadeInDown 0.5s cubic-bezier(0.16, 1, 0.3, 1)"
25700
26087
  }
25701
26088
  },
25702
- /* @__PURE__ */ import_react37.default.createElement("style", null, `
26089
+ /* @__PURE__ */ import_react38.default.createElement("style", null, `
25703
26090
  @keyframes fadeInDown {
25704
26091
  from { opacity: 0; transform: translate(-50%, -20px); }
25705
26092
  to { opacity: 1; transform: translate(-50%, 0); }
25706
26093
  }
25707
26094
  `),
25708
- /* @__PURE__ */ import_react37.default.createElement(
26095
+ /* @__PURE__ */ import_react38.default.createElement(
25709
26096
  "svg",
25710
26097
  {
25711
26098
  width: "20",
@@ -25717,12 +26104,12 @@ function XViewScene({
25717
26104
  strokeLinecap: "round",
25718
26105
  strokeLinejoin: "round"
25719
26106
  },
25720
- /* @__PURE__ */ import_react37.default.createElement("circle", { cx: "12", cy: "12", r: "10" }),
25721
- /* @__PURE__ */ import_react37.default.createElement("line", { x1: "12", y1: "8", x2: "12", y2: "12" }),
25722
- /* @__PURE__ */ import_react37.default.createElement("line", { x1: "12", y1: "16", x2: "12.01", y2: "16" })
26107
+ /* @__PURE__ */ import_react38.default.createElement("circle", { cx: "12", cy: "12", r: "10" }),
26108
+ /* @__PURE__ */ import_react38.default.createElement("line", { x1: "12", y1: "8", x2: "12", y2: "12" }),
26109
+ /* @__PURE__ */ import_react38.default.createElement("line", { x1: "12", y1: "16", x2: "12.01", y2: "16" })
25723
26110
  ),
25724
- /* @__PURE__ */ import_react37.default.createElement("span", { style: { fontSize: "14px", fontWeight: 500 } }, invalidTargetError),
25725
- /* @__PURE__ */ import_react37.default.createElement(
26111
+ /* @__PURE__ */ import_react38.default.createElement("span", { style: { fontSize: "14px", fontWeight: 500 } }, invalidTargetError),
26112
+ /* @__PURE__ */ import_react38.default.createElement(
25726
26113
  "button",
25727
26114
  {
25728
26115
  onClick: () => setInvalidTargetError(null),
@@ -25750,7 +26137,7 @@ function XViewScene({
25750
26137
  "Fechar"
25751
26138
  )
25752
26139
  ),
25753
- /* @__PURE__ */ import_react37.default.createElement(
26140
+ /* @__PURE__ */ import_react38.default.createElement(
25754
26141
  UpgradeModal,
25755
26142
  {
25756
26143
  isOpen: isUpgradeModalOpen,