@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.mjs CHANGED
@@ -1,9 +1,9 @@
1
1
  // src/XViewScene.jsx
2
- import React36, {
2
+ import React37, {
3
3
  useCallback as useCallback8,
4
4
  useEffect as useEffect27,
5
5
  useRef as useRef25,
6
- useState as useState33,
6
+ useState as useState34,
7
7
  useMemo as useMemo15
8
8
  } from "react";
9
9
  import { useRouter, useSearchParams } from "next/navigation";
@@ -5119,8 +5119,8 @@ function ContextMenu({
5119
5119
  const handleClickOutside = (e) => {
5120
5120
  if (menuRef.current && !menuRef.current.contains(e.target)) onClose();
5121
5121
  };
5122
- document.addEventListener("mousedown", handleClickOutside);
5123
- return () => document.removeEventListener("mousedown", handleClickOutside);
5122
+ document.addEventListener("pointerdown", handleClickOutside);
5123
+ return () => document.removeEventListener("pointerdown", handleClickOutside);
5124
5124
  }, [data.visible, onClose]);
5125
5125
  const visibleLinkIds = useMemo(() => {
5126
5126
  var _a2;
@@ -5560,7 +5560,7 @@ function ContextMenu({
5560
5560
  "div",
5561
5561
  {
5562
5562
  ref: menuRef,
5563
- 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",
5563
+ 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",
5564
5564
  style: { position: "absolute", left: `${menuPos.left}px`, top: `${menuPos.top}px`, zIndex: 1e3 },
5565
5565
  onPointerDown: swallow,
5566
5566
  onPointerMove: swallow,
@@ -6193,7 +6193,8 @@ function XViewSidebar({
6193
6193
  options: [
6194
6194
  { value: "Star", label: "Star" },
6195
6195
  { value: "Circle", label: "Circle" },
6196
- { value: "Column", label: "Column" }
6196
+ { value: "Column", label: "Column" },
6197
+ { value: "Network", label: "Network" }
6197
6198
  ],
6198
6199
  placeholder: "Selecione um Formato"
6199
6200
  }
@@ -13789,14 +13790,18 @@ function NodeDetailsPanel({
13789
13790
  });
13790
13791
  const [selectedImageUrl, setSelectedImageUrl] = useState20((node == null ? void 0 : node.textureImageUrl) ?? null);
13791
13792
  const [hasUnsavedChanges, setHasUnsavedChanges] = useState20(false);
13792
- const maxPanelW = typeof window !== "undefined" ? window.innerWidth * 0.92 : 1200;
13793
+ const isMobile = typeof window !== "undefined" && window.innerWidth < 640;
13794
+ const maxPanelW = typeof window !== "undefined" ? Math.min(window.innerWidth - 32, 1200) : 1200;
13795
+ const defaultWidth = isMobile ? typeof window !== "undefined" ? window.innerWidth - 32 : 360 : isReadMode ? 700 : 440;
13793
13796
  const { width: panelWidth, isResizing, handlePointerDown: handleResize, setWidth } = useResizablePanel({
13794
- initialWidth: isReadMode ? 700 : 440,
13795
- minWidth: 320,
13797
+ initialWidth: defaultWidth,
13798
+ minWidth: typeof window !== "undefined" ? Math.min(280, window.innerWidth - 32) : 280,
13796
13799
  maxWidth: maxPanelW
13797
13800
  });
13798
13801
  useEffect17(() => {
13799
- setWidth(isReadMode ? 700 : 440);
13802
+ const isMob = typeof window !== "undefined" && window.innerWidth < 640;
13803
+ const targetW = isMob ? typeof window !== "undefined" ? window.innerWidth - 32 : 360 : isReadMode ? 700 : 440;
13804
+ setWidth(targetW);
13800
13805
  }, [isReadMode, setWidth]);
13801
13806
  const prevNodeIdRef = useRef15(null);
13802
13807
  const propsEndRef = useRef15(null);
@@ -17492,8 +17497,8 @@ function MultiNodeContextMenu({
17492
17497
  const handleClickOutside = (e) => {
17493
17498
  if (menuRef.current && !menuRef.current.contains(e.target)) onClose();
17494
17499
  };
17495
- document.addEventListener("mousedown", handleClickOutside);
17496
- return () => document.removeEventListener("mousedown", handleClickOutside);
17500
+ document.addEventListener("pointerdown", handleClickOutside);
17501
+ return () => document.removeEventListener("pointerdown", handleClickOutside);
17497
17502
  }, [data.visible, onClose]);
17498
17503
  if (!data.visible || !data.nodeIds || data.nodeIds.size === 0) return null;
17499
17504
  const swallow = (e) => e.stopPropagation();
@@ -17934,8 +17939,8 @@ function RelationshipContextMenu({
17934
17939
  const handleClickOutside = (e) => {
17935
17940
  if (menuRef.current && !menuRef.current.contains(e.target)) onClose();
17936
17941
  };
17937
- document.addEventListener("mousedown", handleClickOutside);
17938
- return () => document.removeEventListener("mousedown", handleClickOutside);
17942
+ document.addEventListener("pointerdown", handleClickOutside);
17943
+ return () => document.removeEventListener("pointerdown", handleClickOutside);
17939
17944
  }, [data.visible, onClose]);
17940
17945
  if (!data.visible) return null;
17941
17946
  const swallow = (e) => e.stopPropagation();
@@ -19528,63 +19533,201 @@ function MilestoneManager({
19528
19533
  }
19529
19534
 
19530
19535
  // src/components/UpgradeModal.jsx
19536
+ import React36, { useState as useState33 } from "react";
19537
+
19538
+ // src/components/icons/UltraMinimalIcon.jsx
19531
19539
  import React35 from "react";
19532
- import { Sparkles, X, Rocket, Zap, ShieldCheck } from "lucide-react";
19540
+ function UltraMinimalIcon({
19541
+ size = 13,
19542
+ className = "",
19543
+ strokeWidth = 1.5,
19544
+ ...props
19545
+ }) {
19546
+ return /* @__PURE__ */ React35.createElement(
19547
+ "svg",
19548
+ {
19549
+ width: size,
19550
+ height: size,
19551
+ viewBox: "0 0 24 24",
19552
+ fill: "none",
19553
+ xmlns: "http://www.w3.org/2000/svg",
19554
+ className: `inline-block shrink-0 transition-transform duration-200 ${className}`,
19555
+ ...props
19556
+ },
19557
+ /* @__PURE__ */ React35.createElement(
19558
+ "path",
19559
+ {
19560
+ d: "M6 3h12l4 6-10 12L2 9l4-6z",
19561
+ stroke: "currentColor",
19562
+ strokeWidth,
19563
+ strokeLinecap: "round",
19564
+ strokeLinejoin: "round"
19565
+ }
19566
+ ),
19567
+ /* @__PURE__ */ React35.createElement(
19568
+ "path",
19569
+ {
19570
+ d: "M11 3v6",
19571
+ stroke: "currentColor",
19572
+ strokeWidth,
19573
+ strokeLinecap: "round",
19574
+ strokeLinejoin: "round"
19575
+ }
19576
+ ),
19577
+ /* @__PURE__ */ React35.createElement(
19578
+ "path",
19579
+ {
19580
+ d: "M13 3v6",
19581
+ stroke: "currentColor",
19582
+ strokeWidth,
19583
+ strokeLinecap: "round",
19584
+ strokeLinejoin: "round"
19585
+ }
19586
+ ),
19587
+ /* @__PURE__ */ React35.createElement(
19588
+ "path",
19589
+ {
19590
+ d: "M2 9h20",
19591
+ stroke: "currentColor",
19592
+ strokeWidth,
19593
+ strokeLinecap: "round",
19594
+ strokeLinejoin: "round"
19595
+ }
19596
+ ),
19597
+ /* @__PURE__ */ React35.createElement(
19598
+ "path",
19599
+ {
19600
+ d: "M12 21L8 9",
19601
+ stroke: "currentColor",
19602
+ strokeWidth,
19603
+ strokeLinecap: "round",
19604
+ strokeLinejoin: "round"
19605
+ }
19606
+ ),
19607
+ /* @__PURE__ */ React35.createElement(
19608
+ "path",
19609
+ {
19610
+ d: "M12 21l4-12",
19611
+ stroke: "currentColor",
19612
+ strokeWidth,
19613
+ strokeLinecap: "round",
19614
+ strokeLinejoin: "round"
19615
+ }
19616
+ )
19617
+ );
19618
+ }
19619
+
19620
+ // src/components/UpgradeModal.jsx
19533
19621
  function UpgradeModal({
19534
19622
  isOpen,
19535
19623
  onClose,
19536
- nodeCounter,
19624
+ nodeCounter = 0,
19537
19625
  nodeLimit = 100,
19626
+ plan,
19538
19627
  onUpgrade
19539
19628
  }) {
19629
+ const [isSubmitting, setIsSubmitting] = useState33(false);
19540
19630
  if (!isOpen) return null;
19541
- return /* @__PURE__ */ React35.createElement("div", { className: "fixed inset-0 z-[10000] flex items-center justify-center p-4" }, /* @__PURE__ */ React35.createElement("style", null, `
19542
- @keyframes modalShow {
19543
- from { opacity: 0; transform: scale(0.95); }
19544
- to { opacity: 1; transform: scale(1); }
19545
- }
19546
- @keyframes backdropShow {
19547
- from { opacity: 0; }
19548
- to { opacity: 1; }
19549
- }
19550
- .animate-modal { animation: modalShow 0.3s ease-out forwards; }
19551
- .animate-backdrop { animation: backdropShow 0.3s ease-out forwards; }
19552
- `), /* @__PURE__ */ React35.createElement(
19631
+ const currentPlan = plan || (nodeLimit === -1 ? "premium" : "free");
19632
+ const handleUpgradeClick = async () => {
19633
+ if (isSubmitting) return;
19634
+ setIsSubmitting(true);
19635
+ try {
19636
+ if (onUpgrade) {
19637
+ await onUpgrade();
19638
+ } else {
19639
+ alert("Redirecting to checkout...");
19640
+ }
19641
+ } catch (error) {
19642
+ console.error("Error during upgrade:", error);
19643
+ } finally {
19644
+ setIsSubmitting(false);
19645
+ }
19646
+ };
19647
+ const limit = nodeLimit === -1 ? 100 : nodeLimit;
19648
+ const safeNodeCounter = Math.max(0, nodeCounter || 0);
19649
+ const usagePercentage = Math.min(
19650
+ 100,
19651
+ Math.round(safeNodeCounter / limit * 100)
19652
+ );
19653
+ return /* @__PURE__ */ React36.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__ */ React36.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__ */ React36.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__ */ React36.createElement("div", { className: "flex justify-center mb-4 relative" }, /* @__PURE__ */ React36.createElement("div", { className: "relative w-14 h-14 flex items-center justify-center" }, /* @__PURE__ */ React36.createElement("div", { className: "absolute inset-0 bg-cyan-500 rounded-full blur-2xl opacity-20 animate-pulse" }), /* @__PURE__ */ React36.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__ */ React36.createElement(
19654
+ UltraMinimalIcon,
19655
+ {
19656
+ size: 22,
19657
+ className: "text-cyan-400",
19658
+ strokeWidth: 2
19659
+ }
19660
+ )))), /* @__PURE__ */ React36.createElement("h2", { className: "text-xl font-bold text-white mb-1 tracking-tight font-sans" }, "Upgrade x.plore"), /* @__PURE__ */ React36.createElement("p", { className: "text-slate-400 text-[11px] mb-6 leading-relaxed px-4 font-medium italic" }, "Unlock unlimited nodes and community features."), /* @__PURE__ */ React36.createElement("div", { className: "grid grid-cols-2 gap-3 mb-3 text-left" }, /* @__PURE__ */ React36.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__ */ React36.createElement("div", null, /* @__PURE__ */ React36.createElement("span", { className: "text-xs font-sans font-normal text-cyan-400/80 tracking-normal block mb-1.5" }, "Node Usage"), /* @__PURE__ */ React36.createElement("div", { className: "flex items-baseline gap-1" }, /* @__PURE__ */ React36.createElement("span", { className: "text-lg font-bold text-white font-sans tracking-tight" }, nodeCounter), /* @__PURE__ */ React36.createElement("span", { className: "text-xs font-sans font-medium text-slate-400" }, "/ ", currentPlan === "premium" ? "\u221E" : "100"))), currentPlan !== "premium" && /* @__PURE__ */ React36.createElement("div", { className: "mt-2.5" }, /* @__PURE__ */ React36.createElement("div", { className: "w-full h-1.5 bg-slate-900 border border-white/5 rounded-full overflow-hidden p-[1px]" }, /* @__PURE__ */ React36.createElement(
19553
19661
  "div",
19554
19662
  {
19555
- className: "absolute inset-0 bg-black/60 backdrop-blur-xl animate-backdrop",
19556
- onClick: onClose
19663
+ 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]"}`,
19664
+ style: { width: `${usagePercentage}%` }
19557
19665
  }
19558
- ), /* @__PURE__ */ React35.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__ */ React35.createElement("div", { className: "absolute inset-0 -z-10 bg-gradient-to-br from-sky-500/10 via-transparent to-purple-500/10" }), /* @__PURE__ */ React35.createElement("div", { className: "absolute -top-24 -left-24 w-48 h-48 bg-sky-500/20 blur-[100px] rounded-full" }), /* @__PURE__ */ React35.createElement("div", { className: "absolute -bottom-24 -right-24 w-48 h-48 bg-purple-500/20 blur-[100px] rounded-full" }), /* @__PURE__ */ React35.createElement(
19666
+ )))), /* @__PURE__ */ React36.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__ */ React36.createElement("div", null, /* @__PURE__ */ React36.createElement("span", { className: "text-xs font-sans font-normal text-cyan-400/80 tracking-normal block mb-1.5" }, "Current Plan"), /* @__PURE__ */ React36.createElement("div", { className: "mt-1" }, /* @__PURE__ */ React36.createElement(
19667
+ "span",
19668
+ {
19669
+ 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"}`
19670
+ },
19671
+ /* @__PURE__ */ React36.createElement(
19672
+ "span",
19673
+ {
19674
+ 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]"}`
19675
+ }
19676
+ ),
19677
+ currentPlan === "premium" ? "Premium" : "Free"
19678
+ ))))), /* @__PURE__ */ React36.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__ */ React36.createElement("div", { className: "flex items-center gap-2.5 text-slate-200 text-xs font-medium" }, /* @__PURE__ */ React36.createElement("span", { className: "w-1.5 h-1.5 rounded-full bg-cyan-400 shadow-[0_0_6px_#22d3ee] shrink-0" }), /* @__PURE__ */ React36.createElement("span", null, "Unlimited Nodes")), /* @__PURE__ */ React36.createElement("div", { className: "flex items-center gap-2.5 text-slate-200 text-xs font-medium" }, /* @__PURE__ */ React36.createElement("span", { className: "w-1.5 h-1.5 rounded-full bg-cyan-400 shadow-[0_0_6px_#22d3ee] shrink-0" }), /* @__PURE__ */ React36.createElement("span", null, "Community and collaboration features"))), /* @__PURE__ */ React36.createElement("div", { className: "space-y-2.5" }, currentPlan !== "premium" ? /* @__PURE__ */ React36.createElement(
19559
19679
  "button",
19560
19680
  {
19561
- onClick: onClose,
19562
- className: "absolute top-6 right-6 p-2 rounded-full hover:bg-white/5 text-white/40 hover:text-white transition-all duration-300"
19681
+ onClick: handleUpgradeClick,
19682
+ disabled: isSubmitting,
19683
+ 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"
19563
19684
  },
19564
- /* @__PURE__ */ React35.createElement(X, { size: 20 })
19565
- ), /* @__PURE__ */ React35.createElement("div", { className: "p-12 flex flex-col items-center text-center" }, /* @__PURE__ */ React35.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__ */ React35.createElement("div", { className: "w-full h-full rounded-[2rem] bg-[#0d1117] flex items-center justify-center" }, /* @__PURE__ */ React35.createElement(Zap, { className: "text-sky-400 fill-sky-400/20", size: 32 }))), /* @__PURE__ */ React35.createElement("h2", { className: "text-3xl font-bold text-white mb-4 tracking-tight" }, "Limite de Nodes", " ", /* @__PURE__ */ React35.createElement("span", { className: "bg-clip-text text-transparent bg-gradient-to-r from-sky-400 to-indigo-400" }, "Atingido")), /* @__PURE__ */ React35.createElement("p", { className: "text-white/60 text-lg leading-relaxed mb-10 max-w-md" }, "Voc\xEA atingiu o limite de", " ", /* @__PURE__ */ React35.createElement("span", { className: "text-white font-semibold" }, nodeLimit, " nodes"), " ", "do seu plano Free. Seu universo est\xE1 crescendo r\xE1pido!"), /* @__PURE__ */ React35.createElement("div", { className: "w-full grid grid-cols-2 gap-4 mb-10" }, /* @__PURE__ */ React35.createElement("div", { className: "bg-white/5 border border-white/10 rounded-3xl p-6 backdrop-blur-md" }, /* @__PURE__ */ React35.createElement("p", { className: "text-white/30 text-[10px] font-bold uppercase tracking-widest mb-1" }, "Status Atual"), /* @__PURE__ */ React35.createElement("p", { className: "text-2xl font-bold text-white" }, nodeCounter, " / ", nodeLimit)), /* @__PURE__ */ React35.createElement("div", { className: "bg-white/5 border border-white/10 rounded-3xl p-6 backdrop-blur-md" }, /* @__PURE__ */ React35.createElement("p", { className: "text-white/30 text-[10px] font-bold uppercase tracking-widest mb-1" }, "Pr\xF3ximo Plano"), /* @__PURE__ */ React35.createElement("p", { className: "text-2xl font-bold text-sky-400" }, "Ilimitado"))), /* @__PURE__ */ React35.createElement("div", { className: "w-full space-y-4 mb-10 text-left px-4" }, /* @__PURE__ */ React35.createElement("div", { className: "flex items-center gap-3 text-white/70 text-sm" }, /* @__PURE__ */ React35.createElement("div", { className: "w-6 h-6 rounded-full bg-sky-500/10 flex items-center justify-center shrink-0" }, /* @__PURE__ */ React35.createElement(Rocket, { size: 14, className: "text-sky-400" })), /* @__PURE__ */ React35.createElement("span", null, "Cria\xE7\xE3o de Nodes ilimitada")), /* @__PURE__ */ React35.createElement("div", { className: "flex items-center gap-3 text-white/70 text-sm" }, /* @__PURE__ */ React35.createElement("div", { className: "w-6 h-6 rounded-full bg-sky-500/10 flex items-center justify-center shrink-0" }, /* @__PURE__ */ React35.createElement(ShieldCheck, { size: 14, className: "text-sky-400" })), /* @__PURE__ */ React35.createElement("span", null, "Acesso expandido \xE0s funcionalidades colaborativas e de comunidade"))), /* @__PURE__ */ React35.createElement("div", { className: "w-full flex flex-col gap-4" }, /* @__PURE__ */ React35.createElement(
19685
+ /* @__PURE__ */ React36.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" }),
19686
+ isSubmitting ? /* @__PURE__ */ React36.createElement("div", { className: "relative z-10 flex items-center justify-center gap-2" }, /* @__PURE__ */ React36.createElement("div", { className: "h-4 w-4 border-2 border-slate-950/30 border-t-slate-950 rounded-full animate-spin" })) : /* @__PURE__ */ React36.createElement("span", { className: "relative z-10 font-normal" }, "Upgrade Now")
19687
+ ) : /* @__PURE__ */ React36.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__ */ React36.createElement("span", null, "Your Account is Premium")), /* @__PURE__ */ React36.createElement(
19566
19688
  "button",
19567
19689
  {
19568
- 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",
19569
- onClick: async () => {
19570
- if (onUpgrade) {
19571
- await onUpgrade();
19572
- } else {
19573
- alert("Redirecionando para upgrade... (Em breve)");
19574
- }
19575
- onClose();
19576
- }
19690
+ onClick: onClose,
19691
+ 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"
19577
19692
  },
19578
- "Fazer Upgrade Agora",
19579
- /* @__PURE__ */ React35.createElement(Sparkles, { size: 16 })
19580
- ), /* @__PURE__ */ React35.createElement(
19693
+ currentPlan === "premium" ? "Close" : "Continue with Free Plan"
19694
+ )), /* @__PURE__ */ React36.createElement(
19581
19695
  "button",
19582
19696
  {
19583
19697
  onClick: onClose,
19584
- 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"
19698
+ className: "absolute top-6 right-6 text-slate-500 hover:text-cyan-400 transition-all duration-300 p-1 hover:rotate-90 cursor-pointer",
19699
+ "aria-label": "Close modal"
19585
19700
  },
19586
- "Talvez depois"
19587
- )))));
19701
+ /* @__PURE__ */ React36.createElement(
19702
+ "svg",
19703
+ {
19704
+ xmlns: "http://www.w3.org/2000/svg",
19705
+ width: "18",
19706
+ height: "18",
19707
+ viewBox: "0 0 24 24",
19708
+ fill: "none",
19709
+ stroke: "currentColor",
19710
+ strokeWidth: "2.5",
19711
+ strokeLinecap: "round",
19712
+ strokeLinejoin: "round"
19713
+ },
19714
+ /* @__PURE__ */ React36.createElement("line", { x1: "18", y1: "6", x2: "6", y2: "18" }),
19715
+ /* @__PURE__ */ React36.createElement("line", { x1: "6", y1: "6", x2: "18", y2: "18" })
19716
+ )
19717
+ )), /* @__PURE__ */ React36.createElement("style", null, `
19718
+ @keyframes float {
19719
+ 0%,
19720
+ 100% {
19721
+ transform: translateY(0px);
19722
+ }
19723
+ 50% {
19724
+ transform: translateY(-8px);
19725
+ }
19726
+ }
19727
+ .animate-float {
19728
+ animation: float 4s ease-in-out infinite;
19729
+ }
19730
+ `));
19588
19731
  }
19589
19732
 
19590
19733
  // src/XViewScene.jsx
@@ -19818,44 +19961,46 @@ function XViewScene({
19818
19961
  const parentDataRef = useRef25(null);
19819
19962
  const graphDataRef = parentDataRef;
19820
19963
  const ancestryDataRef = useRef25(null);
19821
- const [isLoading, setIsLoading] = useState33(true);
19822
- const [isProcessing, setIsProcessing] = useState33(false);
19823
- const [permissionStatus, setPermissionStatus] = useState33("loading");
19824
- const [userPermissionRole, setUserPermissionRole] = useState33(null);
19825
- const [viewMembers, setViewMembers] = useState33([]);
19826
- const [isInitialized, setIsInitialized] = useState33(false);
19827
- const [sceneVersion, setSceneVersion] = useState33(0);
19828
- const [contextMenu, setContextMenu] = useState33({
19964
+ const [isLoading, setIsLoading] = useState34(true);
19965
+ const [isProcessing, setIsProcessing] = useState34(false);
19966
+ const [permissionStatus, setPermissionStatus] = useState34("loading");
19967
+ const [userPermissionRole, setUserPermissionRole] = useState34(null);
19968
+ const [viewMembers, setViewMembers] = useState34([]);
19969
+ const [isInitialized, setIsInitialized] = useState34(false);
19970
+ const [sceneVersion, setSceneVersion] = useState34(0);
19971
+ const [contextMenu, setContextMenu] = useState34({
19829
19972
  visible: false,
19830
19973
  x: 0,
19831
19974
  y: 0,
19832
19975
  nodeData: null
19833
19976
  });
19834
- const [multiContextMenu, setMultiContextMenu] = useState33({
19977
+ const [multiContextMenu, setMultiContextMenu] = useState34({
19835
19978
  visible: false,
19836
19979
  x: 0,
19837
19980
  y: 0,
19838
19981
  nodeIds: null
19839
19982
  });
19840
- const [relationshipMenu, setRelationshipMenu] = useState33({
19983
+ const [relationshipMenu, setRelationshipMenu] = useState34({
19841
19984
  visible: false,
19842
19985
  x: 0,
19843
19986
  y: 0,
19844
19987
  linkObject: null
19845
19988
  });
19846
- const [creationMode, setCreationMode] = useState33({
19989
+ const [creationMode, setCreationMode] = useState34({
19847
19990
  isActive: false,
19848
19991
  sourceNodeData: null
19849
19992
  });
19850
- const [versionMode, setVersionMode] = useState33({
19993
+ const [versionMode, setVersionMode] = useState34({
19851
19994
  isActive: false,
19852
19995
  sourceNodeData: null
19853
19996
  });
19854
- const [questMode, setQuestMode] = useState33({ isActive: false });
19855
- const [processMode, setProcessMode] = useState33({ isActive: false });
19856
- const [hasFocusedInitial, setHasFocusedInitial] = useState33(false);
19857
- const [hasOpenedInitialAncestry, setHasOpenedInitialAncestry] = useState33(false);
19858
- const [questTreeMode, setQuestTreeMode] = useState33({
19997
+ const [questMode, setQuestMode] = useState34({ isActive: false });
19998
+ const [processMode, setProcessMode] = useState34({ isActive: false });
19999
+ const longPressTimeoutRef = useRef25(null);
20000
+ const isLongPressTriggeredRef = useRef25(false);
20001
+ const [hasFocusedInitial, setHasFocusedInitial] = useState34(false);
20002
+ const [hasOpenedInitialAncestry, setHasOpenedInitialAncestry] = useState34(false);
20003
+ const [questTreeMode, setQuestTreeMode] = useState34({
19859
20004
  isActive: false,
19860
20005
  questNodeId: null,
19861
20006
  questTempData: null,
@@ -19865,7 +20010,7 @@ function XViewScene({
19865
20010
  isAddingNodes: false,
19866
20011
  isAddingAbstractionNodes: false
19867
20012
  });
19868
- const [processTreeMode, setProcessTreeMode] = useState33({
20013
+ const [processTreeMode, setProcessTreeMode] = useState34({
19869
20014
  isActive: false,
19870
20015
  processNodeId: null,
19871
20016
  processTempData: null,
@@ -19875,7 +20020,7 @@ function XViewScene({
19875
20020
  isAddingNodes: false,
19876
20021
  isAddingAbstractionNodes: false
19877
20022
  });
19878
- const [ancestryMode, setAncestryMode] = useState33({
20023
+ const [ancestryMode, setAncestryMode] = useState34({
19879
20024
  isActive: false,
19880
20025
  tree: null,
19881
20026
  selectedParentId: null,
@@ -19886,41 +20031,41 @@ function XViewScene({
19886
20031
  ancestryDescriptionSections: [],
19887
20032
  isAddingNodes: false
19888
20033
  });
19889
- const [readingMode, setReadingMode] = useState33({
20034
+ const [readingMode, setReadingMode] = useState34({
19890
20035
  isActive: false,
19891
20036
  ancestry: null,
19892
20037
  branchStack: [],
19893
20038
  autoAbstraction: false
19894
20039
  });
19895
- const [formPosition, setFormPosition] = useState33({
20040
+ const [formPosition, setFormPosition] = useState34({
19896
20041
  left: 16,
19897
20042
  top: 16,
19898
20043
  opacity: 0
19899
20044
  });
19900
- const [detailsNode, setDetailsNode] = useState33(null);
19901
- const [detailsLink, setDetailsLink] = useState33(null);
19902
- const [ancestryLinkDetails, setAncestryLinkDetails] = useState33(null);
19903
- const [imageViewer, setImageViewer] = useState33({
20045
+ const [detailsNode, setDetailsNode] = useState34(null);
20046
+ const [detailsLink, setDetailsLink] = useState34(null);
20047
+ const [ancestryLinkDetails, setAncestryLinkDetails] = useState34(null);
20048
+ const [imageViewer, setImageViewer] = useState34({
19904
20049
  visible: false,
19905
20050
  images: [],
19906
20051
  startIndex: 0
19907
20052
  });
19908
- const [editingAncestryRel, setEditingAncestryRel] = useState33({
20053
+ const [editingAncestryRel, setEditingAncestryRel] = useState34({
19909
20054
  visible: false,
19910
20055
  data: null,
19911
20056
  path: null
19912
20057
  });
19913
- const [isImportModalOpen, setIsImportModalOpen] = useState33(false);
19914
- const [importSuccessMessage, setImportSuccessMessage] = useState33("");
19915
- const [invalidTargetError, setInvalidTargetError] = useState33(null);
19916
- const [highlightedNodeId, setHighlightedNodeId] = useState33(null);
19917
- const [isBoardsOpen, setIsBoardsOpen] = useState33(false);
19918
- const [boardItems, setBoardItems] = useState33([]);
19919
- const [isSidebarOpen, setIsSidebarOpen] = useState33(false);
19920
- const [isMilestoneManagerOpen, setIsMilestoneManagerOpen] = useState33(false);
19921
- const [nodeCounter, setNodeCounter] = useState33(0);
19922
- const [isUpgradeModalOpen, setIsUpgradeModalOpen] = useState33(false);
19923
- const [nodeLimit, setNodeLimit] = useState33(100);
20058
+ const [isImportModalOpen, setIsImportModalOpen] = useState34(false);
20059
+ const [importSuccessMessage, setImportSuccessMessage] = useState34("");
20060
+ const [invalidTargetError, setInvalidTargetError] = useState34(null);
20061
+ const [highlightedNodeId, setHighlightedNodeId] = useState34(null);
20062
+ const [isBoardsOpen, setIsBoardsOpen] = useState34(false);
20063
+ const [boardItems, setBoardItems] = useState34([]);
20064
+ const [isSidebarOpen, setIsSidebarOpen] = useState34(false);
20065
+ const [isMilestoneManagerOpen, setIsMilestoneManagerOpen] = useState34(false);
20066
+ const [nodeCounter, setNodeCounter] = useState34(0);
20067
+ const [isUpgradeModalOpen, setIsUpgradeModalOpen] = useState34(false);
20068
+ const [nodeLimit, setNodeLimit] = useState34(100);
19924
20069
  const mountRef = useRef25(null);
19925
20070
  const tooltipRef = useRef25(null);
19926
20071
  const formRef = useRef25(null);
@@ -20765,12 +20910,20 @@ function XViewScene({
20765
20910
  );
20766
20911
  const handleActivateReshapeLens = useCallback8(
20767
20912
  ({ type, columns, centerNodeId }) => {
20768
- const { nodeObjects, tweenGroup, camera, controls } = stateRef.current;
20913
+ const {
20914
+ nodeObjects,
20915
+ allLinks = [],
20916
+ ancestryLinks = [],
20917
+ tweenGroup,
20918
+ camera,
20919
+ controls
20920
+ } = stateRef.current;
20769
20921
  if (!nodeObjects || !tweenGroup || !camera || !controls) return;
20770
20922
  const activeNodeIds = Object.keys(nodeObjects);
20771
20923
  if (activeNodeIds.length === 0) return;
20772
20924
  let sumX = 0;
20773
20925
  let sumY = 0;
20926
+ let sumZ = 0;
20774
20927
  let nodeCount = 0;
20775
20928
  activeNodeIds.forEach((id) => {
20776
20929
  const mesh = nodeObjects[id];
@@ -20874,23 +21027,192 @@ function XViewScene({
20874
21027
  sumY += targetY;
20875
21028
  nodeCount++;
20876
21029
  });
21030
+ } else if (type === "Network") {
21031
+ const N = activeNodeIds.length;
21032
+ const activeSet = new Set(activeNodeIds.map(String));
21033
+ const edges = [];
21034
+ const degreeMap = new Map(activeNodeIds.map((id) => [String(id), 0]));
21035
+ const seenPairs = /* @__PURE__ */ new Set();
21036
+ [...allLinks, ...ancestryLinks].forEach((line) => {
21037
+ var _a2, _b2, _c2, _d2, _e2, _f2, _g2, _h2;
21038
+ const u = String(
21039
+ ((_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) ?? ""
21040
+ );
21041
+ const v = String(
21042
+ ((_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) ?? ""
21043
+ );
21044
+ if (u && v && u !== v && activeSet.has(u) && activeSet.has(v)) {
21045
+ const pairKey = u < v ? `${u}_${v}` : `${v}_${u}`;
21046
+ if (!seenPairs.has(pairKey)) {
21047
+ seenPairs.add(pairKey);
21048
+ edges.push([u, v]);
21049
+ degreeMap.set(u, (degreeMap.get(u) || 0) + 1);
21050
+ degreeMap.set(v, (degreeMap.get(v) || 0) + 1);
21051
+ }
21052
+ }
21053
+ });
21054
+ const baseSpread = Math.max(45, Math.sqrt(N) * 19);
21055
+ const boundX = baseSpread * 1.75;
21056
+ const boundY = baseSpread * 1;
21057
+ const boundZ = Math.min(85, Math.max(25, baseSpread * 0.45));
21058
+ const sortedIds = [...activeNodeIds].sort(
21059
+ (a, b) => (degreeMap.get(String(b)) || 0) - (degreeMap.get(String(a)) || 0)
21060
+ );
21061
+ const posMap = /* @__PURE__ */ new Map();
21062
+ const velMap = /* @__PURE__ */ new Map();
21063
+ const goldenAngle = Math.PI * (3 - Math.sqrt(5));
21064
+ sortedIds.forEach((id, idx) => {
21065
+ const t = N > 1 ? idx / (N - 1) : 0.5;
21066
+ const r = Math.sqrt(0.12 + 0.88 * t);
21067
+ const theta = idx * goldenAngle * 7;
21068
+ const zLayer = Math.sin(idx * 2.39996) * boundZ * (0.4 + 0.6 * r);
21069
+ posMap.set(String(id), {
21070
+ x: Math.cos(theta) * r * boundX,
21071
+ y: Math.sin(theta) * r * boundY,
21072
+ z: zLayer
21073
+ });
21074
+ velMap.set(String(id), { x: 0, y: 0, z: 0 });
21075
+ });
21076
+ const iterations = 120;
21077
+ const minNodeDist = 24;
21078
+ const idealEdgeDist = 28;
21079
+ const repulsionRadius = 65;
21080
+ for (let iter = 0; iter < iterations; iter++) {
21081
+ const cooling = 1 - iter / iterations * 0.75;
21082
+ for (let i = 0; i < N; i++) {
21083
+ const idA = String(sortedIds[i]);
21084
+ const pA = posMap.get(idA);
21085
+ const vA = velMap.get(idA);
21086
+ for (let j = i + 1; j < N; j++) {
21087
+ const idB = String(sortedIds[j]);
21088
+ const pB = posMap.get(idB);
21089
+ const vB = velMap.get(idB);
21090
+ const dx = pA.x - pB.x;
21091
+ const dy = pA.y - pB.y;
21092
+ const dz = (pA.z - pB.z) * 0.6;
21093
+ const distSq = dx * dx + dy * dy + dz * dz + 0.1;
21094
+ const dist = Math.sqrt(distSq);
21095
+ if (dist < repulsionRadius) {
21096
+ const force = dist < minNodeDist ? (minNodeDist - dist) / dist * 1.8 : (repulsionRadius - dist) / repulsionRadius * 0.35 / dist;
21097
+ const fx = dx * force;
21098
+ const fy = dy * force;
21099
+ const fz = (pA.z - pB.z) * force * 0.5;
21100
+ vA.x += fx;
21101
+ vA.y += fy;
21102
+ vA.z += fz;
21103
+ vB.x -= fx;
21104
+ vB.y -= fy;
21105
+ vB.z -= fz;
21106
+ }
21107
+ }
21108
+ }
21109
+ for (let e = 0; e < edges.length; e++) {
21110
+ const [u, v] = edges[e];
21111
+ const pU = posMap.get(u);
21112
+ const pV = posMap.get(v);
21113
+ const vU = velMap.get(u);
21114
+ const vV = velMap.get(v);
21115
+ const dx = pV.x - pU.x;
21116
+ const dy = pV.y - pU.y;
21117
+ const dz = pV.z - pU.z;
21118
+ const dist = Math.sqrt(dx * dx + dy * dy + dz * dz) || 1;
21119
+ const delta = dist - idealEdgeDist;
21120
+ const springStrength = 0.085;
21121
+ const fx = dx / dist * delta * springStrength;
21122
+ const fy = dy / dist * delta * springStrength;
21123
+ const fz = dz / dist * delta * springStrength;
21124
+ vU.x += fx;
21125
+ vU.y += fy;
21126
+ vU.z += fz;
21127
+ vV.x -= fx;
21128
+ vV.y -= fy;
21129
+ vV.z -= fz;
21130
+ }
21131
+ for (let i = 0; i < N; i++) {
21132
+ const id = String(sortedIds[i]);
21133
+ const p = posMap.get(id);
21134
+ const v = velMap.get(id);
21135
+ const nx = p.x / boundX;
21136
+ const ny = p.y / boundY;
21137
+ const nz = p.z / boundZ;
21138
+ const radialNorm = Math.sqrt(nx * nx + ny * ny);
21139
+ if (radialNorm > 0.95) {
21140
+ const pull = (radialNorm - 0.95) * 2.2;
21141
+ v.x -= nx * pull * 8;
21142
+ v.y -= ny * pull * 8;
21143
+ } else if (radialNorm < 0.2 && N > 12 && (degreeMap.get(id) || 0) === 0) {
21144
+ v.x += (nx || 0.1) * 1.5;
21145
+ v.y += (ny || 0.1) * 1.5;
21146
+ }
21147
+ if (Math.abs(nz) > 0.95) {
21148
+ v.z -= nz * (Math.abs(nz) - 0.95) * 10;
21149
+ }
21150
+ const maxStep = 6 * cooling;
21151
+ const speed = Math.sqrt(v.x * v.x + v.y * v.y + v.z * v.z) || 1;
21152
+ const scale = speed > maxStep ? maxStep / speed : cooling;
21153
+ p.x += v.x * scale;
21154
+ p.y += v.y * scale;
21155
+ p.z += v.z * scale;
21156
+ v.x *= 0.4;
21157
+ v.y *= 0.4;
21158
+ v.z *= 0.4;
21159
+ }
21160
+ }
21161
+ activeNodeIds.forEach((id) => {
21162
+ const mesh = nodeObjects[id];
21163
+ const target = posMap.get(String(id)) || { x: 0, y: 0, z: 0 };
21164
+ const posTween = new Tween2(mesh.position).to({ x: target.x, y: target.y, z: target.z }, 1500).easing(Easing2.Cubic.InOut);
21165
+ tweenGroup.add(posTween);
21166
+ posTween.start();
21167
+ if (mesh.userData.labelObject) {
21168
+ const labelTarget = new THREE3.Vector3(
21169
+ target.x,
21170
+ target.y,
21171
+ target.z
21172
+ ).add(mesh.userData.labelOffset || new THREE3.Vector3(0, 3.8, 0));
21173
+ const lblTween = new Tween2(mesh.userData.labelObject.position).to(labelTarget, 1500).easing(Easing2.Cubic.InOut);
21174
+ tweenGroup.add(lblTween);
21175
+ lblTween.start();
21176
+ }
21177
+ sumX += target.x;
21178
+ sumY += target.y;
21179
+ sumZ += target.z;
21180
+ nodeCount++;
21181
+ });
20877
21182
  }
20878
21183
  if (nodeCount > 0) {
20879
21184
  const centerX = sumX / nodeCount;
20880
21185
  const centerY = sumY / nodeCount;
20881
- const targetFocus = new THREE3.Vector3(centerX, centerY, 0);
21186
+ const centerZ = type === "Network" ? sumZ / nodeCount : 0;
21187
+ const targetFocus = new THREE3.Vector3(centerX, centerY, centerZ);
20882
21188
  const targetTween = new Tween2(controls.target).to({ x: targetFocus.x, y: targetFocus.y, z: targetFocus.z }, 1500).easing(Easing2.Cubic.InOut);
20883
21189
  tweenGroup.add(targetTween);
20884
21190
  targetTween.start();
20885
21191
  let zoomZ = 140;
21192
+ let camOffsetY = 0;
20886
21193
  if (type === "Column") {
20887
21194
  const numRows = Math.ceil(nodeCount / (columns || 4));
20888
21195
  zoomZ = Math.max(140, numRows * 50);
20889
21196
  } else if (type === "Circle" || type === "Star") {
20890
21197
  const radius = Math.max(80, nodeCount * 8);
20891
21198
  zoomZ = radius * 2.5;
21199
+ } else if (type === "Network") {
21200
+ const baseSpread = Math.max(45, Math.sqrt(nodeCount) * 19);
21201
+ const immersionFactor = Math.max(
21202
+ 0.52,
21203
+ 1.15 - Math.min(nodeCount, 120) * 52e-4
21204
+ );
21205
+ zoomZ = targetFocus.z + Math.max(55, baseSpread * immersionFactor);
21206
+ camOffsetY = -baseSpread * 0.08;
20892
21207
  }
20893
- const camTween = new Tween2(camera.position).to({ x: targetFocus.x, y: targetFocus.y, z: zoomZ }, 1500).easing(Easing2.Cubic.InOut);
21208
+ const camTween = new Tween2(camera.position).to(
21209
+ {
21210
+ x: targetFocus.x,
21211
+ y: targetFocus.y + camOffsetY,
21212
+ z: zoomZ
21213
+ },
21214
+ 1500
21215
+ ).easing(Easing2.Cubic.InOut);
20894
21216
  tweenGroup.add(camTween);
20895
21217
  camTween.start();
20896
21218
  }
@@ -21148,11 +21470,17 @@ function XViewScene({
21148
21470
  renderer.outputColorSpace = THREE3.SRGBColorSpace;
21149
21471
  renderer.toneMapping = THREE3.ACESFilmicToneMapping;
21150
21472
  renderer.toneMappingExposure = 1.2;
21473
+ currentMount.style.touchAction = "none";
21474
+ renderer.domElement.style.touchAction = "none";
21151
21475
  currentMount.appendChild(renderer.domElement);
21152
21476
  stateRef.current.renderer = renderer;
21153
21477
  const controls = new OrbitControls(camera, renderer.domElement);
21154
21478
  controls.enableDamping = true;
21155
21479
  controls.dampingFactor = 0.05;
21480
+ controls.touches = {
21481
+ ONE: THREE3.TOUCH.ROTATE,
21482
+ TWO: THREE3.TOUCH.DOLLY_PAN
21483
+ };
21156
21484
  stateRef.current.controls = controls;
21157
21485
  scene.add(new THREE3.AmbientLight(16777215, 0.1));
21158
21486
  const directionalLight = new THREE3.DirectionalLight(16777215, 0.2);
@@ -21377,21 +21705,58 @@ function XViewScene({
21377
21705
  stateRef.current.dragCandidate = null;
21378
21706
  return;
21379
21707
  }
21380
- if (event.button !== 0) return;
21708
+ if (event.button !== 0 && event.pointerType !== "touch") return;
21381
21709
  if (picked && !stateRef.current.ancestry.isActive) {
21382
21710
  stateRef.current.controls.enabled = false;
21383
21711
  }
21384
21712
  stateRef.current.pointerDown = {
21385
21713
  isDown: true,
21386
21714
  x: event.clientX,
21387
- y: event.clientY
21715
+ y: event.clientY,
21716
+ pointerType: event.pointerType
21388
21717
  };
21389
21718
  stateRef.current.dragCandidate = picked;
21719
+ if (event.pointerType === "touch" || event.pointerType === "pen") {
21720
+ if (longPressTimeoutRef.current) {
21721
+ clearTimeout(longPressTimeoutRef.current);
21722
+ }
21723
+ isLongPressTriggeredRef.current = false;
21724
+ if (picked) {
21725
+ const touchX = event.clientX;
21726
+ const touchY = event.clientY;
21727
+ longPressTimeoutRef.current = setTimeout(() => {
21728
+ isLongPressTriggeredRef.current = true;
21729
+ if (typeof navigator !== "undefined" && navigator.vibrate) {
21730
+ navigator.vibrate(40);
21731
+ }
21732
+ setContextMenu({
21733
+ visible: true,
21734
+ x: touchX,
21735
+ y: touchY,
21736
+ nodeData: picked.userData
21737
+ });
21738
+ setMultiContextMenu((prev) => ({ ...prev, visible: false }));
21739
+ setRelationshipMenu((prev) => ({ ...prev, visible: false }));
21740
+ setDetailsNode(null);
21741
+ }, 450);
21742
+ }
21743
+ }
21390
21744
  }
21391
21745
  function onPointerMove(event) {
21392
21746
  if (stateRef.current.camera) stateRef.current.camera.layers.enableAll();
21393
21747
  if (isFromUiOverlay(event)) return;
21394
21748
  setMouseFromEvent(event);
21749
+ if (stateRef.current.pointerDown.isDown) {
21750
+ const dx = event.clientX - stateRef.current.pointerDown.x;
21751
+ const dy = event.clientY - stateRef.current.pointerDown.y;
21752
+ const dist = Math.hypot(dx, dy);
21753
+ if (dist > (x_view_config.DRAG_THRESHOLD_PX || 5)) {
21754
+ if (longPressTimeoutRef.current) {
21755
+ clearTimeout(longPressTimeoutRef.current);
21756
+ longPressTimeoutRef.current = null;
21757
+ }
21758
+ }
21759
+ }
21395
21760
  if (stateRef.current.isDragging && stateRef.current.draggedNode) {
21396
21761
  const raycaster2 = new THREE3.Raycaster();
21397
21762
  raycaster2.setFromCamera(mouse, camera);
@@ -21434,7 +21799,7 @@ function XViewScene({
21434
21799
  return;
21435
21800
  }
21436
21801
  if (stateRef.current.creation.isActive) return;
21437
- if (stateRef.current.pointerDown.isDown && stateRef.current.dragCandidate) {
21802
+ if (stateRef.current.pointerDown.isDown && stateRef.current.dragCandidate && !isLongPressTriggeredRef.current) {
21438
21803
  const dx = event.clientX - stateRef.current.pointerDown.x;
21439
21804
  const dy = event.clientY - stateRef.current.pointerDown.y;
21440
21805
  if (Math.hypot(dx, dy) > x_view_config.DRAG_THRESHOLD_PX) {
@@ -21466,6 +21831,17 @@ function XViewScene({
21466
21831
  async function onPointerUp(event) {
21467
21832
  var _a2, _b2, _c2;
21468
21833
  if (stateRef.current.camera) stateRef.current.camera.layers.enableAll();
21834
+ if (longPressTimeoutRef.current) {
21835
+ clearTimeout(longPressTimeoutRef.current);
21836
+ longPressTimeoutRef.current = null;
21837
+ }
21838
+ if (isLongPressTriggeredRef.current) {
21839
+ isLongPressTriggeredRef.current = false;
21840
+ stateRef.current.pointerDown.isDown = false;
21841
+ stateRef.current.dragCandidate = null;
21842
+ stateRef.current.controls.enabled = true;
21843
+ return;
21844
+ }
21469
21845
  if (isFromUiOverlay(event)) return;
21470
21846
  const {
21471
21847
  connection,
@@ -21700,7 +22076,7 @@ function XViewScene({
21700
22076
  stateRef.current.dragCandidate = null;
21701
22077
  return;
21702
22078
  }
21703
- if (event.button === 0 && !stateRef.current.creation.isActive && stateRef.current.pointerDown.isDown) {
22079
+ if ((event.button === 0 || event.pointerType === "touch") && !stateRef.current.creation.isActive && stateRef.current.pointerDown.isDown) {
21704
22080
  setMouseFromEvent(event);
21705
22081
  const clickedNode = stateRef.current.dragCandidate || tryPickNode();
21706
22082
  stateRef.current.dragCandidate = null;
@@ -21709,6 +22085,9 @@ function XViewScene({
21709
22085
  stateRef.current.selectedNodes.clear();
21710
22086
  }
21711
22087
  if (clickedNode) {
22088
+ setContextMenu((prev) => prev.visible ? { ...prev, visible: false } : prev);
22089
+ setMultiContextMenu((prev) => prev.visible ? { ...prev, visible: false } : prev);
22090
+ setRelationshipMenu((prev) => prev.visible ? { ...prev, visible: false } : prev);
21712
22091
  setDetailsNode({ ...clickedNode.userData });
21713
22092
  setDetailsLink(null);
21714
22093
  return;
@@ -21744,6 +22123,14 @@ function XViewScene({
21744
22123
  if (stateRef.current.camera) stateRef.current.camera.layers.enableAll();
21745
22124
  if (isFromUiOverlay(event)) return;
21746
22125
  event.preventDefault();
22126
+ if (longPressTimeoutRef.current) {
22127
+ clearTimeout(longPressTimeoutRef.current);
22128
+ longPressTimeoutRef.current = null;
22129
+ }
22130
+ isLongPressTriggeredRef.current = true;
22131
+ stateRef.current.pointerDown.isDown = false;
22132
+ stateRef.current.dragCandidate = null;
22133
+ setDetailsNode(null);
21747
22134
  if (stateRef.current.creation.isActive || stateRef.current.connection.isActive || stateRef.current.relink.isActive)
21748
22135
  return;
21749
22136
  setMouseFromEvent(event);
@@ -25115,7 +25502,7 @@ function XViewScene({
25115
25502
  // <-- handleCancelQuest adicionado aqui
25116
25503
  ]);
25117
25504
  if (isLoading || status === "loading" || permissionStatus === "loading") {
25118
- return /* @__PURE__ */ React36.createElement(LoadingScreen, null);
25505
+ return /* @__PURE__ */ React37.createElement(LoadingScreen, null);
25119
25506
  }
25120
25507
  const overlayHiddenStyle = questTreeMode.isActive || processTreeMode.isActive ? {
25121
25508
  opacity: 0,
@@ -25124,7 +25511,7 @@ function XViewScene({
25124
25511
  transition: "all 300ms ease-in-out"
25125
25512
  } : {};
25126
25513
  if (permissionStatus === "corrupted") {
25127
- return /* @__PURE__ */ React36.createElement("div", { className: "flex flex-col items-center justify-center min-h-screen w-full bg-slate-950 text-white" }, /* @__PURE__ */ React36.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__ */ React36.createElement("div", { className: "mb-4 text-amber-500" }, /* @__PURE__ */ React36.createElement(
25514
+ return /* @__PURE__ */ React37.createElement("div", { className: "flex flex-col items-center justify-center min-h-screen w-full bg-slate-950 text-white" }, /* @__PURE__ */ React37.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__ */ React37.createElement("div", { className: "mb-4 text-amber-500" }, /* @__PURE__ */ React37.createElement(
25128
25515
  "svg",
25129
25516
  {
25130
25517
  xmlns: "http://www.w3.org/2000/svg",
@@ -25134,7 +25521,7 @@ function XViewScene({
25134
25521
  stroke: "currentColor",
25135
25522
  className: "w-16 h-16 mx-auto"
25136
25523
  },
25137
- /* @__PURE__ */ React36.createElement(
25524
+ /* @__PURE__ */ React37.createElement(
25138
25525
  "path",
25139
25526
  {
25140
25527
  strokeLinecap: "round",
@@ -25142,13 +25529,13 @@ function XViewScene({
25142
25529
  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"
25143
25530
  }
25144
25531
  )
25145
- )), /* @__PURE__ */ React36.createElement("h2", { className: "text-2xl font-bold mb-2" }, "Link Inv\xE1lido"), /* @__PURE__ */ React36.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__ */ React36.createElement(
25532
+ )), /* @__PURE__ */ React37.createElement("h2", { className: "text-2xl font-bold mb-2" }, "Link Inv\xE1lido"), /* @__PURE__ */ React37.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__ */ React37.createElement(
25146
25533
  "button",
25147
25534
  {
25148
25535
  onClick: handleNavigateBack,
25149
25536
  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"
25150
25537
  },
25151
- /* @__PURE__ */ React36.createElement(
25538
+ /* @__PURE__ */ React37.createElement(
25152
25539
  "svg",
25153
25540
  {
25154
25541
  xmlns: "http://www.w3.org/2000/svg",
@@ -25158,7 +25545,7 @@ function XViewScene({
25158
25545
  stroke: "currentColor",
25159
25546
  className: "w-5 h-5"
25160
25547
  },
25161
- /* @__PURE__ */ React36.createElement(
25548
+ /* @__PURE__ */ React37.createElement(
25162
25549
  "path",
25163
25550
  {
25164
25551
  strokeLinecap: "round",
@@ -25171,7 +25558,7 @@ function XViewScene({
25171
25558
  )));
25172
25559
  }
25173
25560
  if (permissionStatus === "denied") {
25174
- return /* @__PURE__ */ React36.createElement("div", { className: "flex flex-col items-center justify-center min-h-screen w-full bg-slate-950 text-white" }, /* @__PURE__ */ React36.createElement("div", { className: "bg-slate-900/50 p-8 rounded-2xl border border-slate-800 shadow-2xl text-center max-w-md" }, /* @__PURE__ */ React36.createElement("div", { className: "mb-4 text-red-500" }, /* @__PURE__ */ React36.createElement(
25561
+ return /* @__PURE__ */ React37.createElement("div", { className: "flex flex-col items-center justify-center min-h-screen w-full bg-slate-950 text-white" }, /* @__PURE__ */ React37.createElement("div", { className: "bg-slate-900/50 p-8 rounded-2xl border border-slate-800 shadow-2xl text-center max-w-md" }, /* @__PURE__ */ React37.createElement("div", { className: "mb-4 text-red-500" }, /* @__PURE__ */ React37.createElement(
25175
25562
  "svg",
25176
25563
  {
25177
25564
  xmlns: "http://www.w3.org/2000/svg",
@@ -25181,7 +25568,7 @@ function XViewScene({
25181
25568
  stroke: "currentColor",
25182
25569
  className: "w-16 h-16 mx-auto"
25183
25570
  },
25184
- /* @__PURE__ */ React36.createElement(
25571
+ /* @__PURE__ */ React37.createElement(
25185
25572
  "path",
25186
25573
  {
25187
25574
  strokeLinecap: "round",
@@ -25189,13 +25576,13 @@ function XViewScene({
25189
25576
  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"
25190
25577
  }
25191
25578
  )
25192
- )), /* @__PURE__ */ React36.createElement("h2", { className: "text-2xl font-bold mb-2" }, "Acesso Negado"), /* @__PURE__ */ React36.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__ */ React36.createElement(
25579
+ )), /* @__PURE__ */ React37.createElement("h2", { className: "text-2xl font-bold mb-2" }, "Acesso Negado"), /* @__PURE__ */ React37.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__ */ React37.createElement(
25193
25580
  "button",
25194
25581
  {
25195
25582
  onClick: handleNavigateBack,
25196
25583
  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"
25197
25584
  },
25198
- /* @__PURE__ */ React36.createElement(
25585
+ /* @__PURE__ */ React37.createElement(
25199
25586
  "svg",
25200
25587
  {
25201
25588
  xmlns: "http://www.w3.org/2000/svg",
@@ -25205,7 +25592,7 @@ function XViewScene({
25205
25592
  stroke: "currentColor",
25206
25593
  className: "w-5 h-5"
25207
25594
  },
25208
- /* @__PURE__ */ React36.createElement(
25595
+ /* @__PURE__ */ React37.createElement(
25209
25596
  "path",
25210
25597
  {
25211
25598
  strokeLinecap: "round",
@@ -25217,7 +25604,7 @@ function XViewScene({
25217
25604
  "Voltar para o X.View"
25218
25605
  )));
25219
25606
  }
25220
- return /* @__PURE__ */ React36.createElement(
25607
+ return /* @__PURE__ */ React37.createElement(
25221
25608
  "div",
25222
25609
  {
25223
25610
  ref: mountRef,
@@ -25229,7 +25616,7 @@ function XViewScene({
25229
25616
  cursor: isProcessing ? "progress" : stateRef.current.connection.isActive || stateRef.current.relink.isActive || ancestryMode.isActive ? "crosshair" : creationMode.isActive ? "default" : "grab"
25230
25617
  }
25231
25618
  },
25232
- userPermissionRole !== "link_viewer" && /* @__PURE__ */ React36.createElement(
25619
+ userPermissionRole !== "link_viewer" && /* @__PURE__ */ React37.createElement(
25233
25620
  XViewSidebar,
25234
25621
  {
25235
25622
  dbNodes: searchableDbNodes,
@@ -25258,7 +25645,7 @@ function XViewScene({
25258
25645
  viewMembers
25259
25646
  }
25260
25647
  ),
25261
- creationMode.isActive && /* @__PURE__ */ React36.createElement(
25648
+ creationMode.isActive && /* @__PURE__ */ React37.createElement(
25262
25649
  InSceneCreationForm,
25263
25650
  {
25264
25651
  onSave: (data) => userActionHandlers.handleSaveNode(actionHandlerContext, data),
@@ -25293,7 +25680,7 @@ function XViewScene({
25293
25680
  view_google_folder_id: (_h = sceneDataRef.current) == null ? void 0 : _h.view_google_folder_id
25294
25681
  }
25295
25682
  ),
25296
- versionMode.isActive && /* @__PURE__ */ React36.createElement(
25683
+ versionMode.isActive && /* @__PURE__ */ React37.createElement(
25297
25684
  InSceneVersionForm,
25298
25685
  {
25299
25686
  onSave: (data) => userActionHandlers.handleSaveVersionNode(actionHandlerContext, data),
@@ -25320,7 +25707,7 @@ function XViewScene({
25320
25707
  availableAncestries: allAvailableAncestries
25321
25708
  }
25322
25709
  ),
25323
- questTreeMode.isActive && /* @__PURE__ */ React36.createElement(
25710
+ questTreeMode.isActive && /* @__PURE__ */ React37.createElement(
25324
25711
  CreateQuestTreePanel,
25325
25712
  {
25326
25713
  questTreeMode,
@@ -25329,7 +25716,7 @@ function XViewScene({
25329
25716
  onClose: handleCloseQuestTree
25330
25717
  }
25331
25718
  ),
25332
- processTreeMode.isActive && /* @__PURE__ */ React36.createElement(
25719
+ processTreeMode.isActive && /* @__PURE__ */ React37.createElement(
25333
25720
  CreateProcessTreePanel,
25334
25721
  {
25335
25722
  processTreeMode,
@@ -25338,7 +25725,7 @@ function XViewScene({
25338
25725
  onClose: handleCloseProcessTree
25339
25726
  }
25340
25727
  ),
25341
- questMode.isActive && /* @__PURE__ */ React36.createElement(
25728
+ questMode.isActive && /* @__PURE__ */ React37.createElement(
25342
25729
  InSceneQuestForm,
25343
25730
  {
25344
25731
  onSave: (data) => handleSaveQuestNode(actionHandlerContext, data),
@@ -25369,7 +25756,7 @@ function XViewScene({
25369
25756
  view_google_folder_id: (_m = sceneDataRef.current) == null ? void 0 : _m.view_google_folder_id
25370
25757
  }
25371
25758
  ),
25372
- processMode.isActive && /* @__PURE__ */ React36.createElement(
25759
+ processMode.isActive && /* @__PURE__ */ React37.createElement(
25373
25760
  InSceneProcessForm,
25374
25761
  {
25375
25762
  onSave: (data) => handleSaveProcessNode(actionHandlerContext, data),
@@ -25396,7 +25783,7 @@ function XViewScene({
25396
25783
  view_google_folder_id: (_n = sceneDataRef.current) == null ? void 0 : _n.view_google_folder_id
25397
25784
  }
25398
25785
  ),
25399
- readingMode.isActive && readingMode.ancestry && /* @__PURE__ */ React36.createElement(
25786
+ readingMode.isActive && readingMode.ancestry && /* @__PURE__ */ React37.createElement(
25400
25787
  "div",
25401
25788
  {
25402
25789
  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"}`,
@@ -25409,7 +25796,7 @@ function XViewScene({
25409
25796
  maxWidth: "92vw"
25410
25797
  }
25411
25798
  },
25412
- /* @__PURE__ */ React36.createElement(
25799
+ /* @__PURE__ */ React37.createElement(
25413
25800
  "div",
25414
25801
  {
25415
25802
  onPointerDown: (e) => {
@@ -25420,7 +25807,7 @@ function XViewScene({
25420
25807
  title: "Arraste para redimensionar"
25421
25808
  }
25422
25809
  ),
25423
- /* @__PURE__ */ React36.createElement(
25810
+ /* @__PURE__ */ React37.createElement(
25424
25811
  DescriptionReadModePanel,
25425
25812
  {
25426
25813
  key: readingMode.branchStack.length > 0 ? readingMode.branchStack[readingMode.branchStack.length - 1].branchId : readingMode.ancestry.ancestry_id,
@@ -25455,7 +25842,7 @@ function XViewScene({
25455
25842
  }
25456
25843
  )
25457
25844
  ),
25458
- ancestryMode.isActive && ancestryMode.tree && /* @__PURE__ */ React36.createElement(
25845
+ ancestryMode.isActive && ancestryMode.tree && /* @__PURE__ */ React37.createElement(
25459
25846
  CreateAncestryPanel,
25460
25847
  {
25461
25848
  ancestryMode,
@@ -25491,7 +25878,7 @@ function XViewScene({
25491
25878
  onRenderAbstractionTree: (data, targetId) => handleRenderAbstractionTree(data, targetId)
25492
25879
  }
25493
25880
  ),
25494
- editingAncestryRel.visible && /* @__PURE__ */ React36.createElement(
25881
+ editingAncestryRel.visible && /* @__PURE__ */ React37.createElement(
25495
25882
  AncestryRelationshipPanel,
25496
25883
  {
25497
25884
  data: editingAncestryRel.data,
@@ -25505,8 +25892,8 @@ function XViewScene({
25505
25892
  onUploadFile: upload_file_action
25506
25893
  }
25507
25894
  ),
25508
- isProcessing && /* @__PURE__ */ React36.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__ */ React36.createElement("div", { className: "w-4 h-4 border-2 border-indigo-500 border-t-transparent rounded-full animate-spin" }), /* @__PURE__ */ React36.createElement("span", { className: "text-xs font-medium text-indigo-200 tracking-wider uppercase" }, "Sincronizando Processo...")),
25509
- detailsNode && detailsNode.is_quest && /* @__PURE__ */ React36.createElement(
25895
+ isProcessing && /* @__PURE__ */ React37.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__ */ React37.createElement("div", { className: "w-4 h-4 border-2 border-indigo-500 border-t-transparent rounded-full animate-spin" }), /* @__PURE__ */ React37.createElement("span", { className: "text-xs font-medium text-indigo-200 tracking-wider uppercase" }, "Sincronizando Processo...")),
25896
+ detailsNode && detailsNode.is_quest && /* @__PURE__ */ React37.createElement(
25510
25897
  QuestDetailsPanel,
25511
25898
  {
25512
25899
  node: detailsNode,
@@ -25538,7 +25925,7 @@ function XViewScene({
25538
25925
  style: overlayHiddenStyle
25539
25926
  }
25540
25927
  ),
25541
- detailsNode && detailsNode.is_process && /* @__PURE__ */ React36.createElement(
25928
+ detailsNode && detailsNode.is_process && /* @__PURE__ */ React37.createElement(
25542
25929
  ProcessDetailsPanel,
25543
25930
  {
25544
25931
  node: detailsNode,
@@ -25568,7 +25955,7 @@ function XViewScene({
25568
25955
  style: overlayHiddenStyle
25569
25956
  }
25570
25957
  ),
25571
- detailsNode && !detailsNode.is_quest && !detailsNode.is_process && /* @__PURE__ */ React36.createElement(
25958
+ detailsNode && !detailsNode.is_quest && !detailsNode.is_process && /* @__PURE__ */ React37.createElement(
25572
25959
  NodeDetailsPanel,
25573
25960
  {
25574
25961
  node: detailsNode,
@@ -25603,7 +25990,7 @@ function XViewScene({
25603
25990
  style: overlayHiddenStyle
25604
25991
  }
25605
25992
  ),
25606
- detailsLink && /* @__PURE__ */ React36.createElement(
25993
+ detailsLink && /* @__PURE__ */ React37.createElement(
25607
25994
  RelationshipDetailsPanel,
25608
25995
  {
25609
25996
  link: detailsLink,
@@ -25618,7 +26005,7 @@ function XViewScene({
25618
26005
  onHighlight: handleReadModeHighlight
25619
26006
  }
25620
26007
  ),
25621
- ancestryLinkDetails && /* @__PURE__ */ React36.createElement(
26008
+ ancestryLinkDetails && /* @__PURE__ */ React37.createElement(
25622
26009
  AncestryLinkDetailsPanel,
25623
26010
  {
25624
26011
  data: ancestryLinkDetails,
@@ -25630,7 +26017,7 @@ function XViewScene({
25630
26017
  onHighlight: handleReadModeHighlight
25631
26018
  }
25632
26019
  ),
25633
- /* @__PURE__ */ React36.createElement(
26020
+ /* @__PURE__ */ React37.createElement(
25634
26021
  "div",
25635
26022
  {
25636
26023
  ref: tooltipRef,
@@ -25657,7 +26044,7 @@ function XViewScene({
25657
26044
  }
25658
26045
  }
25659
26046
  ),
25660
- /* @__PURE__ */ React36.createElement(
26047
+ /* @__PURE__ */ React37.createElement(
25661
26048
  ContextMenu,
25662
26049
  {
25663
26050
  data: contextMenu,
@@ -25696,7 +26083,7 @@ function XViewScene({
25696
26083
  onInitiateProcess: (data) => userActionHandlers.handleInitiateProcess(actionHandlerContext, data)
25697
26084
  }
25698
26085
  ),
25699
- /* @__PURE__ */ React36.createElement(
26086
+ /* @__PURE__ */ React37.createElement(
25700
26087
  MultiNodeContextMenu,
25701
26088
  {
25702
26089
  data: multiContextMenu,
@@ -25716,7 +26103,7 @@ function XViewScene({
25716
26103
  )
25717
26104
  }
25718
26105
  ),
25719
- /* @__PURE__ */ React36.createElement(
26106
+ /* @__PURE__ */ React37.createElement(
25720
26107
  RelationshipContextMenu,
25721
26108
  {
25722
26109
  data: relationshipMenu,
@@ -25734,14 +26121,14 @@ function XViewScene({
25734
26121
  onDelete: (data) => userActionHandlers.handleDeleteLink(actionHandlerContext, data)
25735
26122
  }
25736
26123
  ),
25737
- /* @__PURE__ */ React36.createElement(
26124
+ /* @__PURE__ */ React37.createElement(
25738
26125
  ImageViewer,
25739
26126
  {
25740
26127
  data: imageViewer,
25741
26128
  onClose: () => setImageViewer({ ...imageViewer, visible: false })
25742
26129
  }
25743
26130
  ),
25744
- /* @__PURE__ */ React36.createElement(
26131
+ /* @__PURE__ */ React37.createElement(
25745
26132
  Boards,
25746
26133
  {
25747
26134
  isOpen: isBoardsOpen,
@@ -25754,7 +26141,7 @@ function XViewScene({
25754
26141
  userRole: userPermissionRole
25755
26142
  }
25756
26143
  ),
25757
- /* @__PURE__ */ React36.createElement(
26144
+ /* @__PURE__ */ React37.createElement(
25758
26145
  MilestoneManager,
25759
26146
  {
25760
26147
  isOpen: isMilestoneManagerOpen,
@@ -25763,7 +26150,7 @@ function XViewScene({
25763
26150
  onUpdateMilestones: handleUpdateMilestones
25764
26151
  }
25765
26152
  ),
25766
- /* @__PURE__ */ React36.createElement(
26153
+ /* @__PURE__ */ React37.createElement(
25767
26154
  ImportParentFileModal,
25768
26155
  {
25769
26156
  isOpen: isImportModalOpen,
@@ -25776,7 +26163,7 @@ function XViewScene({
25776
26163
  currentAncestries: ancestryDataRef.current || []
25777
26164
  }
25778
26165
  ),
25779
- invalidTargetError && /* @__PURE__ */ React36.createElement(
26166
+ invalidTargetError && /* @__PURE__ */ React37.createElement(
25780
26167
  "div",
25781
26168
  {
25782
26169
  className: "ui-overlay",
@@ -25801,13 +26188,13 @@ function XViewScene({
25801
26188
  animation: "fadeInDown 0.5s cubic-bezier(0.16, 1, 0.3, 1)"
25802
26189
  }
25803
26190
  },
25804
- /* @__PURE__ */ React36.createElement("style", null, `
26191
+ /* @__PURE__ */ React37.createElement("style", null, `
25805
26192
  @keyframes fadeInDown {
25806
26193
  from { opacity: 0; transform: translate(-50%, -20px); }
25807
26194
  to { opacity: 1; transform: translate(-50%, 0); }
25808
26195
  }
25809
26196
  `),
25810
- /* @__PURE__ */ React36.createElement(
26197
+ /* @__PURE__ */ React37.createElement(
25811
26198
  "svg",
25812
26199
  {
25813
26200
  width: "20",
@@ -25819,12 +26206,12 @@ function XViewScene({
25819
26206
  strokeLinecap: "round",
25820
26207
  strokeLinejoin: "round"
25821
26208
  },
25822
- /* @__PURE__ */ React36.createElement("circle", { cx: "12", cy: "12", r: "10" }),
25823
- /* @__PURE__ */ React36.createElement("line", { x1: "12", y1: "8", x2: "12", y2: "12" }),
25824
- /* @__PURE__ */ React36.createElement("line", { x1: "12", y1: "16", x2: "12.01", y2: "16" })
26209
+ /* @__PURE__ */ React37.createElement("circle", { cx: "12", cy: "12", r: "10" }),
26210
+ /* @__PURE__ */ React37.createElement("line", { x1: "12", y1: "8", x2: "12", y2: "12" }),
26211
+ /* @__PURE__ */ React37.createElement("line", { x1: "12", y1: "16", x2: "12.01", y2: "16" })
25825
26212
  ),
25826
- /* @__PURE__ */ React36.createElement("span", { style: { fontSize: "14px", fontWeight: 500 } }, invalidTargetError),
25827
- /* @__PURE__ */ React36.createElement(
26213
+ /* @__PURE__ */ React37.createElement("span", { style: { fontSize: "14px", fontWeight: 500 } }, invalidTargetError),
26214
+ /* @__PURE__ */ React37.createElement(
25828
26215
  "button",
25829
26216
  {
25830
26217
  onClick: () => setInvalidTargetError(null),
@@ -25852,7 +26239,7 @@ function XViewScene({
25852
26239
  "Fechar"
25853
26240
  )
25854
26241
  ),
25855
- /* @__PURE__ */ React36.createElement(
26242
+ /* @__PURE__ */ React37.createElement(
25856
26243
  UpgradeModal,
25857
26244
  {
25858
26245
  isOpen: isUpgradeModalOpen,