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

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 +422 -213
  2. package/dist/index.mjs +346 -137
  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,
@@ -13789,14 +13789,18 @@ function NodeDetailsPanel({
13789
13789
  });
13790
13790
  const [selectedImageUrl, setSelectedImageUrl] = useState20((node == null ? void 0 : node.textureImageUrl) ?? null);
13791
13791
  const [hasUnsavedChanges, setHasUnsavedChanges] = useState20(false);
13792
- const maxPanelW = typeof window !== "undefined" ? window.innerWidth * 0.92 : 1200;
13792
+ const isMobile = typeof window !== "undefined" && window.innerWidth < 640;
13793
+ const maxPanelW = typeof window !== "undefined" ? Math.min(window.innerWidth - 32, 1200) : 1200;
13794
+ const defaultWidth = isMobile ? typeof window !== "undefined" ? window.innerWidth - 32 : 360 : isReadMode ? 700 : 440;
13793
13795
  const { width: panelWidth, isResizing, handlePointerDown: handleResize, setWidth } = useResizablePanel({
13794
- initialWidth: isReadMode ? 700 : 440,
13795
- minWidth: 320,
13796
+ initialWidth: defaultWidth,
13797
+ minWidth: typeof window !== "undefined" ? Math.min(280, window.innerWidth - 32) : 280,
13796
13798
  maxWidth: maxPanelW
13797
13799
  });
13798
13800
  useEffect17(() => {
13799
- setWidth(isReadMode ? 700 : 440);
13801
+ const isMob = typeof window !== "undefined" && window.innerWidth < 640;
13802
+ const targetW = isMob ? typeof window !== "undefined" ? window.innerWidth - 32 : 360 : isReadMode ? 700 : 440;
13803
+ setWidth(targetW);
13800
13804
  }, [isReadMode, setWidth]);
13801
13805
  const prevNodeIdRef = useRef15(null);
13802
13806
  const propsEndRef = useRef15(null);
@@ -17492,8 +17496,8 @@ function MultiNodeContextMenu({
17492
17496
  const handleClickOutside = (e) => {
17493
17497
  if (menuRef.current && !menuRef.current.contains(e.target)) onClose();
17494
17498
  };
17495
- document.addEventListener("mousedown", handleClickOutside);
17496
- return () => document.removeEventListener("mousedown", handleClickOutside);
17499
+ document.addEventListener("pointerdown", handleClickOutside);
17500
+ return () => document.removeEventListener("pointerdown", handleClickOutside);
17497
17501
  }, [data.visible, onClose]);
17498
17502
  if (!data.visible || !data.nodeIds || data.nodeIds.size === 0) return null;
17499
17503
  const swallow = (e) => e.stopPropagation();
@@ -17934,8 +17938,8 @@ function RelationshipContextMenu({
17934
17938
  const handleClickOutside = (e) => {
17935
17939
  if (menuRef.current && !menuRef.current.contains(e.target)) onClose();
17936
17940
  };
17937
- document.addEventListener("mousedown", handleClickOutside);
17938
- return () => document.removeEventListener("mousedown", handleClickOutside);
17941
+ document.addEventListener("pointerdown", handleClickOutside);
17942
+ return () => document.removeEventListener("pointerdown", handleClickOutside);
17939
17943
  }, [data.visible, onClose]);
17940
17944
  if (!data.visible) return null;
17941
17945
  const swallow = (e) => e.stopPropagation();
@@ -19528,63 +19532,201 @@ function MilestoneManager({
19528
19532
  }
19529
19533
 
19530
19534
  // src/components/UpgradeModal.jsx
19535
+ import React36, { useState as useState33 } from "react";
19536
+
19537
+ // src/components/icons/UltraMinimalIcon.jsx
19531
19538
  import React35 from "react";
19532
- import { Sparkles, X, Rocket, Zap, ShieldCheck } from "lucide-react";
19539
+ function UltraMinimalIcon({
19540
+ size = 13,
19541
+ className = "",
19542
+ strokeWidth = 1.5,
19543
+ ...props
19544
+ }) {
19545
+ return /* @__PURE__ */ React35.createElement(
19546
+ "svg",
19547
+ {
19548
+ width: size,
19549
+ height: size,
19550
+ viewBox: "0 0 24 24",
19551
+ fill: "none",
19552
+ xmlns: "http://www.w3.org/2000/svg",
19553
+ className: `inline-block shrink-0 transition-transform duration-200 ${className}`,
19554
+ ...props
19555
+ },
19556
+ /* @__PURE__ */ React35.createElement(
19557
+ "path",
19558
+ {
19559
+ d: "M6 3h12l4 6-10 12L2 9l4-6z",
19560
+ stroke: "currentColor",
19561
+ strokeWidth,
19562
+ strokeLinecap: "round",
19563
+ strokeLinejoin: "round"
19564
+ }
19565
+ ),
19566
+ /* @__PURE__ */ React35.createElement(
19567
+ "path",
19568
+ {
19569
+ d: "M11 3v6",
19570
+ stroke: "currentColor",
19571
+ strokeWidth,
19572
+ strokeLinecap: "round",
19573
+ strokeLinejoin: "round"
19574
+ }
19575
+ ),
19576
+ /* @__PURE__ */ React35.createElement(
19577
+ "path",
19578
+ {
19579
+ d: "M13 3v6",
19580
+ stroke: "currentColor",
19581
+ strokeWidth,
19582
+ strokeLinecap: "round",
19583
+ strokeLinejoin: "round"
19584
+ }
19585
+ ),
19586
+ /* @__PURE__ */ React35.createElement(
19587
+ "path",
19588
+ {
19589
+ d: "M2 9h20",
19590
+ stroke: "currentColor",
19591
+ strokeWidth,
19592
+ strokeLinecap: "round",
19593
+ strokeLinejoin: "round"
19594
+ }
19595
+ ),
19596
+ /* @__PURE__ */ React35.createElement(
19597
+ "path",
19598
+ {
19599
+ d: "M12 21L8 9",
19600
+ stroke: "currentColor",
19601
+ strokeWidth,
19602
+ strokeLinecap: "round",
19603
+ strokeLinejoin: "round"
19604
+ }
19605
+ ),
19606
+ /* @__PURE__ */ React35.createElement(
19607
+ "path",
19608
+ {
19609
+ d: "M12 21l4-12",
19610
+ stroke: "currentColor",
19611
+ strokeWidth,
19612
+ strokeLinecap: "round",
19613
+ strokeLinejoin: "round"
19614
+ }
19615
+ )
19616
+ );
19617
+ }
19618
+
19619
+ // src/components/UpgradeModal.jsx
19533
19620
  function UpgradeModal({
19534
19621
  isOpen,
19535
19622
  onClose,
19536
- nodeCounter,
19623
+ nodeCounter = 0,
19537
19624
  nodeLimit = 100,
19625
+ plan,
19538
19626
  onUpgrade
19539
19627
  }) {
19628
+ const [isSubmitting, setIsSubmitting] = useState33(false);
19540
19629
  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(
19630
+ const currentPlan = plan || (nodeLimit === -1 ? "premium" : "free");
19631
+ const handleUpgradeClick = async () => {
19632
+ if (isSubmitting) return;
19633
+ setIsSubmitting(true);
19634
+ try {
19635
+ if (onUpgrade) {
19636
+ await onUpgrade();
19637
+ } else {
19638
+ alert("Redirecting to checkout...");
19639
+ }
19640
+ } catch (error) {
19641
+ console.error("Error during upgrade:", error);
19642
+ } finally {
19643
+ setIsSubmitting(false);
19644
+ }
19645
+ };
19646
+ const limit = nodeLimit === -1 ? 100 : nodeLimit;
19647
+ const safeNodeCounter = Math.max(0, nodeCounter || 0);
19648
+ const usagePercentage = Math.min(
19649
+ 100,
19650
+ Math.round(safeNodeCounter / limit * 100)
19651
+ );
19652
+ 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(
19653
+ UltraMinimalIcon,
19654
+ {
19655
+ size: 22,
19656
+ className: "text-cyan-400",
19657
+ strokeWidth: 2
19658
+ }
19659
+ )))), /* @__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
19660
  "div",
19554
19661
  {
19555
- className: "absolute inset-0 bg-black/60 backdrop-blur-xl animate-backdrop",
19556
- onClick: onClose
19662
+ 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]"}`,
19663
+ style: { width: `${usagePercentage}%` }
19557
19664
  }
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(
19665
+ )))), /* @__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(
19666
+ "span",
19667
+ {
19668
+ 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"}`
19669
+ },
19670
+ /* @__PURE__ */ React36.createElement(
19671
+ "span",
19672
+ {
19673
+ 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]"}`
19674
+ }
19675
+ ),
19676
+ currentPlan === "premium" ? "Premium" : "Free"
19677
+ ))))), /* @__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
19678
  "button",
19560
19679
  {
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"
19680
+ onClick: handleUpgradeClick,
19681
+ disabled: isSubmitting,
19682
+ 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
19683
  },
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(
19684
+ /* @__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" }),
19685
+ 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")
19686
+ ) : /* @__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
19687
  "button",
19567
19688
  {
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
- }
19689
+ onClick: onClose,
19690
+ 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
19691
  },
19578
- "Fazer Upgrade Agora",
19579
- /* @__PURE__ */ React35.createElement(Sparkles, { size: 16 })
19580
- ), /* @__PURE__ */ React35.createElement(
19692
+ currentPlan === "premium" ? "Close" : "Continue with Free Plan"
19693
+ )), /* @__PURE__ */ React36.createElement(
19581
19694
  "button",
19582
19695
  {
19583
19696
  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"
19697
+ className: "absolute top-6 right-6 text-slate-500 hover:text-cyan-400 transition-all duration-300 p-1 hover:rotate-90 cursor-pointer",
19698
+ "aria-label": "Close modal"
19585
19699
  },
19586
- "Talvez depois"
19587
- )))));
19700
+ /* @__PURE__ */ React36.createElement(
19701
+ "svg",
19702
+ {
19703
+ xmlns: "http://www.w3.org/2000/svg",
19704
+ width: "18",
19705
+ height: "18",
19706
+ viewBox: "0 0 24 24",
19707
+ fill: "none",
19708
+ stroke: "currentColor",
19709
+ strokeWidth: "2.5",
19710
+ strokeLinecap: "round",
19711
+ strokeLinejoin: "round"
19712
+ },
19713
+ /* @__PURE__ */ React36.createElement("line", { x1: "18", y1: "6", x2: "6", y2: "18" }),
19714
+ /* @__PURE__ */ React36.createElement("line", { x1: "6", y1: "6", x2: "18", y2: "18" })
19715
+ )
19716
+ )), /* @__PURE__ */ React36.createElement("style", null, `
19717
+ @keyframes float {
19718
+ 0%,
19719
+ 100% {
19720
+ transform: translateY(0px);
19721
+ }
19722
+ 50% {
19723
+ transform: translateY(-8px);
19724
+ }
19725
+ }
19726
+ .animate-float {
19727
+ animation: float 4s ease-in-out infinite;
19728
+ }
19729
+ `));
19588
19730
  }
19589
19731
 
19590
19732
  // src/XViewScene.jsx
@@ -19818,44 +19960,46 @@ function XViewScene({
19818
19960
  const parentDataRef = useRef25(null);
19819
19961
  const graphDataRef = parentDataRef;
19820
19962
  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({
19963
+ const [isLoading, setIsLoading] = useState34(true);
19964
+ const [isProcessing, setIsProcessing] = useState34(false);
19965
+ const [permissionStatus, setPermissionStatus] = useState34("loading");
19966
+ const [userPermissionRole, setUserPermissionRole] = useState34(null);
19967
+ const [viewMembers, setViewMembers] = useState34([]);
19968
+ const [isInitialized, setIsInitialized] = useState34(false);
19969
+ const [sceneVersion, setSceneVersion] = useState34(0);
19970
+ const [contextMenu, setContextMenu] = useState34({
19829
19971
  visible: false,
19830
19972
  x: 0,
19831
19973
  y: 0,
19832
19974
  nodeData: null
19833
19975
  });
19834
- const [multiContextMenu, setMultiContextMenu] = useState33({
19976
+ const [multiContextMenu, setMultiContextMenu] = useState34({
19835
19977
  visible: false,
19836
19978
  x: 0,
19837
19979
  y: 0,
19838
19980
  nodeIds: null
19839
19981
  });
19840
- const [relationshipMenu, setRelationshipMenu] = useState33({
19982
+ const [relationshipMenu, setRelationshipMenu] = useState34({
19841
19983
  visible: false,
19842
19984
  x: 0,
19843
19985
  y: 0,
19844
19986
  linkObject: null
19845
19987
  });
19846
- const [creationMode, setCreationMode] = useState33({
19988
+ const [creationMode, setCreationMode] = useState34({
19847
19989
  isActive: false,
19848
19990
  sourceNodeData: null
19849
19991
  });
19850
- const [versionMode, setVersionMode] = useState33({
19992
+ const [versionMode, setVersionMode] = useState34({
19851
19993
  isActive: false,
19852
19994
  sourceNodeData: null
19853
19995
  });
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({
19996
+ const [questMode, setQuestMode] = useState34({ isActive: false });
19997
+ const [processMode, setProcessMode] = useState34({ isActive: false });
19998
+ const longPressTimeoutRef = useRef25(null);
19999
+ const isLongPressTriggeredRef = useRef25(false);
20000
+ const [hasFocusedInitial, setHasFocusedInitial] = useState34(false);
20001
+ const [hasOpenedInitialAncestry, setHasOpenedInitialAncestry] = useState34(false);
20002
+ const [questTreeMode, setQuestTreeMode] = useState34({
19859
20003
  isActive: false,
19860
20004
  questNodeId: null,
19861
20005
  questTempData: null,
@@ -19865,7 +20009,7 @@ function XViewScene({
19865
20009
  isAddingNodes: false,
19866
20010
  isAddingAbstractionNodes: false
19867
20011
  });
19868
- const [processTreeMode, setProcessTreeMode] = useState33({
20012
+ const [processTreeMode, setProcessTreeMode] = useState34({
19869
20013
  isActive: false,
19870
20014
  processNodeId: null,
19871
20015
  processTempData: null,
@@ -19875,7 +20019,7 @@ function XViewScene({
19875
20019
  isAddingNodes: false,
19876
20020
  isAddingAbstractionNodes: false
19877
20021
  });
19878
- const [ancestryMode, setAncestryMode] = useState33({
20022
+ const [ancestryMode, setAncestryMode] = useState34({
19879
20023
  isActive: false,
19880
20024
  tree: null,
19881
20025
  selectedParentId: null,
@@ -19886,41 +20030,41 @@ function XViewScene({
19886
20030
  ancestryDescriptionSections: [],
19887
20031
  isAddingNodes: false
19888
20032
  });
19889
- const [readingMode, setReadingMode] = useState33({
20033
+ const [readingMode, setReadingMode] = useState34({
19890
20034
  isActive: false,
19891
20035
  ancestry: null,
19892
20036
  branchStack: [],
19893
20037
  autoAbstraction: false
19894
20038
  });
19895
- const [formPosition, setFormPosition] = useState33({
20039
+ const [formPosition, setFormPosition] = useState34({
19896
20040
  left: 16,
19897
20041
  top: 16,
19898
20042
  opacity: 0
19899
20043
  });
19900
- const [detailsNode, setDetailsNode] = useState33(null);
19901
- const [detailsLink, setDetailsLink] = useState33(null);
19902
- const [ancestryLinkDetails, setAncestryLinkDetails] = useState33(null);
19903
- const [imageViewer, setImageViewer] = useState33({
20044
+ const [detailsNode, setDetailsNode] = useState34(null);
20045
+ const [detailsLink, setDetailsLink] = useState34(null);
20046
+ const [ancestryLinkDetails, setAncestryLinkDetails] = useState34(null);
20047
+ const [imageViewer, setImageViewer] = useState34({
19904
20048
  visible: false,
19905
20049
  images: [],
19906
20050
  startIndex: 0
19907
20051
  });
19908
- const [editingAncestryRel, setEditingAncestryRel] = useState33({
20052
+ const [editingAncestryRel, setEditingAncestryRel] = useState34({
19909
20053
  visible: false,
19910
20054
  data: null,
19911
20055
  path: null
19912
20056
  });
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);
20057
+ const [isImportModalOpen, setIsImportModalOpen] = useState34(false);
20058
+ const [importSuccessMessage, setImportSuccessMessage] = useState34("");
20059
+ const [invalidTargetError, setInvalidTargetError] = useState34(null);
20060
+ const [highlightedNodeId, setHighlightedNodeId] = useState34(null);
20061
+ const [isBoardsOpen, setIsBoardsOpen] = useState34(false);
20062
+ const [boardItems, setBoardItems] = useState34([]);
20063
+ const [isSidebarOpen, setIsSidebarOpen] = useState34(false);
20064
+ const [isMilestoneManagerOpen, setIsMilestoneManagerOpen] = useState34(false);
20065
+ const [nodeCounter, setNodeCounter] = useState34(0);
20066
+ const [isUpgradeModalOpen, setIsUpgradeModalOpen] = useState34(false);
20067
+ const [nodeLimit, setNodeLimit] = useState34(100);
19924
20068
  const mountRef = useRef25(null);
19925
20069
  const tooltipRef = useRef25(null);
19926
20070
  const formRef = useRef25(null);
@@ -21148,11 +21292,17 @@ function XViewScene({
21148
21292
  renderer.outputColorSpace = THREE3.SRGBColorSpace;
21149
21293
  renderer.toneMapping = THREE3.ACESFilmicToneMapping;
21150
21294
  renderer.toneMappingExposure = 1.2;
21295
+ currentMount.style.touchAction = "none";
21296
+ renderer.domElement.style.touchAction = "none";
21151
21297
  currentMount.appendChild(renderer.domElement);
21152
21298
  stateRef.current.renderer = renderer;
21153
21299
  const controls = new OrbitControls(camera, renderer.domElement);
21154
21300
  controls.enableDamping = true;
21155
21301
  controls.dampingFactor = 0.05;
21302
+ controls.touches = {
21303
+ ONE: THREE3.TOUCH.ROTATE,
21304
+ TWO: THREE3.TOUCH.DOLLY_PAN
21305
+ };
21156
21306
  stateRef.current.controls = controls;
21157
21307
  scene.add(new THREE3.AmbientLight(16777215, 0.1));
21158
21308
  const directionalLight = new THREE3.DirectionalLight(16777215, 0.2);
@@ -21377,21 +21527,58 @@ function XViewScene({
21377
21527
  stateRef.current.dragCandidate = null;
21378
21528
  return;
21379
21529
  }
21380
- if (event.button !== 0) return;
21530
+ if (event.button !== 0 && event.pointerType !== "touch") return;
21381
21531
  if (picked && !stateRef.current.ancestry.isActive) {
21382
21532
  stateRef.current.controls.enabled = false;
21383
21533
  }
21384
21534
  stateRef.current.pointerDown = {
21385
21535
  isDown: true,
21386
21536
  x: event.clientX,
21387
- y: event.clientY
21537
+ y: event.clientY,
21538
+ pointerType: event.pointerType
21388
21539
  };
21389
21540
  stateRef.current.dragCandidate = picked;
21541
+ if (event.pointerType === "touch" || event.pointerType === "pen") {
21542
+ if (longPressTimeoutRef.current) {
21543
+ clearTimeout(longPressTimeoutRef.current);
21544
+ }
21545
+ isLongPressTriggeredRef.current = false;
21546
+ if (picked) {
21547
+ const touchX = event.clientX;
21548
+ const touchY = event.clientY;
21549
+ longPressTimeoutRef.current = setTimeout(() => {
21550
+ isLongPressTriggeredRef.current = true;
21551
+ if (typeof navigator !== "undefined" && navigator.vibrate) {
21552
+ navigator.vibrate(40);
21553
+ }
21554
+ setContextMenu({
21555
+ visible: true,
21556
+ x: touchX,
21557
+ y: touchY,
21558
+ nodeData: picked.userData
21559
+ });
21560
+ setMultiContextMenu((prev) => ({ ...prev, visible: false }));
21561
+ setRelationshipMenu((prev) => ({ ...prev, visible: false }));
21562
+ setDetailsNode(null);
21563
+ }, 450);
21564
+ }
21565
+ }
21390
21566
  }
21391
21567
  function onPointerMove(event) {
21392
21568
  if (stateRef.current.camera) stateRef.current.camera.layers.enableAll();
21393
21569
  if (isFromUiOverlay(event)) return;
21394
21570
  setMouseFromEvent(event);
21571
+ if (stateRef.current.pointerDown.isDown) {
21572
+ const dx = event.clientX - stateRef.current.pointerDown.x;
21573
+ const dy = event.clientY - stateRef.current.pointerDown.y;
21574
+ const dist = Math.hypot(dx, dy);
21575
+ if (dist > (x_view_config.DRAG_THRESHOLD_PX || 5)) {
21576
+ if (longPressTimeoutRef.current) {
21577
+ clearTimeout(longPressTimeoutRef.current);
21578
+ longPressTimeoutRef.current = null;
21579
+ }
21580
+ }
21581
+ }
21395
21582
  if (stateRef.current.isDragging && stateRef.current.draggedNode) {
21396
21583
  const raycaster2 = new THREE3.Raycaster();
21397
21584
  raycaster2.setFromCamera(mouse, camera);
@@ -21434,7 +21621,7 @@ function XViewScene({
21434
21621
  return;
21435
21622
  }
21436
21623
  if (stateRef.current.creation.isActive) return;
21437
- if (stateRef.current.pointerDown.isDown && stateRef.current.dragCandidate) {
21624
+ if (stateRef.current.pointerDown.isDown && stateRef.current.dragCandidate && !isLongPressTriggeredRef.current) {
21438
21625
  const dx = event.clientX - stateRef.current.pointerDown.x;
21439
21626
  const dy = event.clientY - stateRef.current.pointerDown.y;
21440
21627
  if (Math.hypot(dx, dy) > x_view_config.DRAG_THRESHOLD_PX) {
@@ -21466,6 +21653,17 @@ function XViewScene({
21466
21653
  async function onPointerUp(event) {
21467
21654
  var _a2, _b2, _c2;
21468
21655
  if (stateRef.current.camera) stateRef.current.camera.layers.enableAll();
21656
+ if (longPressTimeoutRef.current) {
21657
+ clearTimeout(longPressTimeoutRef.current);
21658
+ longPressTimeoutRef.current = null;
21659
+ }
21660
+ if (isLongPressTriggeredRef.current) {
21661
+ isLongPressTriggeredRef.current = false;
21662
+ stateRef.current.pointerDown.isDown = false;
21663
+ stateRef.current.dragCandidate = null;
21664
+ stateRef.current.controls.enabled = true;
21665
+ return;
21666
+ }
21469
21667
  if (isFromUiOverlay(event)) return;
21470
21668
  const {
21471
21669
  connection,
@@ -21700,7 +21898,7 @@ function XViewScene({
21700
21898
  stateRef.current.dragCandidate = null;
21701
21899
  return;
21702
21900
  }
21703
- if (event.button === 0 && !stateRef.current.creation.isActive && stateRef.current.pointerDown.isDown) {
21901
+ if ((event.button === 0 || event.pointerType === "touch") && !stateRef.current.creation.isActive && stateRef.current.pointerDown.isDown) {
21704
21902
  setMouseFromEvent(event);
21705
21903
  const clickedNode = stateRef.current.dragCandidate || tryPickNode();
21706
21904
  stateRef.current.dragCandidate = null;
@@ -21709,6 +21907,9 @@ function XViewScene({
21709
21907
  stateRef.current.selectedNodes.clear();
21710
21908
  }
21711
21909
  if (clickedNode) {
21910
+ setContextMenu((prev) => prev.visible ? { ...prev, visible: false } : prev);
21911
+ setMultiContextMenu((prev) => prev.visible ? { ...prev, visible: false } : prev);
21912
+ setRelationshipMenu((prev) => prev.visible ? { ...prev, visible: false } : prev);
21712
21913
  setDetailsNode({ ...clickedNode.userData });
21713
21914
  setDetailsLink(null);
21714
21915
  return;
@@ -21744,6 +21945,14 @@ function XViewScene({
21744
21945
  if (stateRef.current.camera) stateRef.current.camera.layers.enableAll();
21745
21946
  if (isFromUiOverlay(event)) return;
21746
21947
  event.preventDefault();
21948
+ if (longPressTimeoutRef.current) {
21949
+ clearTimeout(longPressTimeoutRef.current);
21950
+ longPressTimeoutRef.current = null;
21951
+ }
21952
+ isLongPressTriggeredRef.current = true;
21953
+ stateRef.current.pointerDown.isDown = false;
21954
+ stateRef.current.dragCandidate = null;
21955
+ setDetailsNode(null);
21747
21956
  if (stateRef.current.creation.isActive || stateRef.current.connection.isActive || stateRef.current.relink.isActive)
21748
21957
  return;
21749
21958
  setMouseFromEvent(event);
@@ -25115,7 +25324,7 @@ function XViewScene({
25115
25324
  // <-- handleCancelQuest adicionado aqui
25116
25325
  ]);
25117
25326
  if (isLoading || status === "loading" || permissionStatus === "loading") {
25118
- return /* @__PURE__ */ React36.createElement(LoadingScreen, null);
25327
+ return /* @__PURE__ */ React37.createElement(LoadingScreen, null);
25119
25328
  }
25120
25329
  const overlayHiddenStyle = questTreeMode.isActive || processTreeMode.isActive ? {
25121
25330
  opacity: 0,
@@ -25124,7 +25333,7 @@ function XViewScene({
25124
25333
  transition: "all 300ms ease-in-out"
25125
25334
  } : {};
25126
25335
  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(
25336
+ 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
25337
  "svg",
25129
25338
  {
25130
25339
  xmlns: "http://www.w3.org/2000/svg",
@@ -25134,7 +25343,7 @@ function XViewScene({
25134
25343
  stroke: "currentColor",
25135
25344
  className: "w-16 h-16 mx-auto"
25136
25345
  },
25137
- /* @__PURE__ */ React36.createElement(
25346
+ /* @__PURE__ */ React37.createElement(
25138
25347
  "path",
25139
25348
  {
25140
25349
  strokeLinecap: "round",
@@ -25142,13 +25351,13 @@ function XViewScene({
25142
25351
  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
25352
  }
25144
25353
  )
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(
25354
+ )), /* @__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
25355
  "button",
25147
25356
  {
25148
25357
  onClick: handleNavigateBack,
25149
25358
  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
25359
  },
25151
- /* @__PURE__ */ React36.createElement(
25360
+ /* @__PURE__ */ React37.createElement(
25152
25361
  "svg",
25153
25362
  {
25154
25363
  xmlns: "http://www.w3.org/2000/svg",
@@ -25158,7 +25367,7 @@ function XViewScene({
25158
25367
  stroke: "currentColor",
25159
25368
  className: "w-5 h-5"
25160
25369
  },
25161
- /* @__PURE__ */ React36.createElement(
25370
+ /* @__PURE__ */ React37.createElement(
25162
25371
  "path",
25163
25372
  {
25164
25373
  strokeLinecap: "round",
@@ -25171,7 +25380,7 @@ function XViewScene({
25171
25380
  )));
25172
25381
  }
25173
25382
  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(
25383
+ 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
25384
  "svg",
25176
25385
  {
25177
25386
  xmlns: "http://www.w3.org/2000/svg",
@@ -25181,7 +25390,7 @@ function XViewScene({
25181
25390
  stroke: "currentColor",
25182
25391
  className: "w-16 h-16 mx-auto"
25183
25392
  },
25184
- /* @__PURE__ */ React36.createElement(
25393
+ /* @__PURE__ */ React37.createElement(
25185
25394
  "path",
25186
25395
  {
25187
25396
  strokeLinecap: "round",
@@ -25189,13 +25398,13 @@ function XViewScene({
25189
25398
  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
25399
  }
25191
25400
  )
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(
25401
+ )), /* @__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
25402
  "button",
25194
25403
  {
25195
25404
  onClick: handleNavigateBack,
25196
25405
  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
25406
  },
25198
- /* @__PURE__ */ React36.createElement(
25407
+ /* @__PURE__ */ React37.createElement(
25199
25408
  "svg",
25200
25409
  {
25201
25410
  xmlns: "http://www.w3.org/2000/svg",
@@ -25205,7 +25414,7 @@ function XViewScene({
25205
25414
  stroke: "currentColor",
25206
25415
  className: "w-5 h-5"
25207
25416
  },
25208
- /* @__PURE__ */ React36.createElement(
25417
+ /* @__PURE__ */ React37.createElement(
25209
25418
  "path",
25210
25419
  {
25211
25420
  strokeLinecap: "round",
@@ -25217,7 +25426,7 @@ function XViewScene({
25217
25426
  "Voltar para o X.View"
25218
25427
  )));
25219
25428
  }
25220
- return /* @__PURE__ */ React36.createElement(
25429
+ return /* @__PURE__ */ React37.createElement(
25221
25430
  "div",
25222
25431
  {
25223
25432
  ref: mountRef,
@@ -25229,7 +25438,7 @@ function XViewScene({
25229
25438
  cursor: isProcessing ? "progress" : stateRef.current.connection.isActive || stateRef.current.relink.isActive || ancestryMode.isActive ? "crosshair" : creationMode.isActive ? "default" : "grab"
25230
25439
  }
25231
25440
  },
25232
- userPermissionRole !== "link_viewer" && /* @__PURE__ */ React36.createElement(
25441
+ userPermissionRole !== "link_viewer" && /* @__PURE__ */ React37.createElement(
25233
25442
  XViewSidebar,
25234
25443
  {
25235
25444
  dbNodes: searchableDbNodes,
@@ -25258,7 +25467,7 @@ function XViewScene({
25258
25467
  viewMembers
25259
25468
  }
25260
25469
  ),
25261
- creationMode.isActive && /* @__PURE__ */ React36.createElement(
25470
+ creationMode.isActive && /* @__PURE__ */ React37.createElement(
25262
25471
  InSceneCreationForm,
25263
25472
  {
25264
25473
  onSave: (data) => userActionHandlers.handleSaveNode(actionHandlerContext, data),
@@ -25293,7 +25502,7 @@ function XViewScene({
25293
25502
  view_google_folder_id: (_h = sceneDataRef.current) == null ? void 0 : _h.view_google_folder_id
25294
25503
  }
25295
25504
  ),
25296
- versionMode.isActive && /* @__PURE__ */ React36.createElement(
25505
+ versionMode.isActive && /* @__PURE__ */ React37.createElement(
25297
25506
  InSceneVersionForm,
25298
25507
  {
25299
25508
  onSave: (data) => userActionHandlers.handleSaveVersionNode(actionHandlerContext, data),
@@ -25320,7 +25529,7 @@ function XViewScene({
25320
25529
  availableAncestries: allAvailableAncestries
25321
25530
  }
25322
25531
  ),
25323
- questTreeMode.isActive && /* @__PURE__ */ React36.createElement(
25532
+ questTreeMode.isActive && /* @__PURE__ */ React37.createElement(
25324
25533
  CreateQuestTreePanel,
25325
25534
  {
25326
25535
  questTreeMode,
@@ -25329,7 +25538,7 @@ function XViewScene({
25329
25538
  onClose: handleCloseQuestTree
25330
25539
  }
25331
25540
  ),
25332
- processTreeMode.isActive && /* @__PURE__ */ React36.createElement(
25541
+ processTreeMode.isActive && /* @__PURE__ */ React37.createElement(
25333
25542
  CreateProcessTreePanel,
25334
25543
  {
25335
25544
  processTreeMode,
@@ -25338,7 +25547,7 @@ function XViewScene({
25338
25547
  onClose: handleCloseProcessTree
25339
25548
  }
25340
25549
  ),
25341
- questMode.isActive && /* @__PURE__ */ React36.createElement(
25550
+ questMode.isActive && /* @__PURE__ */ React37.createElement(
25342
25551
  InSceneQuestForm,
25343
25552
  {
25344
25553
  onSave: (data) => handleSaveQuestNode(actionHandlerContext, data),
@@ -25369,7 +25578,7 @@ function XViewScene({
25369
25578
  view_google_folder_id: (_m = sceneDataRef.current) == null ? void 0 : _m.view_google_folder_id
25370
25579
  }
25371
25580
  ),
25372
- processMode.isActive && /* @__PURE__ */ React36.createElement(
25581
+ processMode.isActive && /* @__PURE__ */ React37.createElement(
25373
25582
  InSceneProcessForm,
25374
25583
  {
25375
25584
  onSave: (data) => handleSaveProcessNode(actionHandlerContext, data),
@@ -25396,7 +25605,7 @@ function XViewScene({
25396
25605
  view_google_folder_id: (_n = sceneDataRef.current) == null ? void 0 : _n.view_google_folder_id
25397
25606
  }
25398
25607
  ),
25399
- readingMode.isActive && readingMode.ancestry && /* @__PURE__ */ React36.createElement(
25608
+ readingMode.isActive && readingMode.ancestry && /* @__PURE__ */ React37.createElement(
25400
25609
  "div",
25401
25610
  {
25402
25611
  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 +25618,7 @@ function XViewScene({
25409
25618
  maxWidth: "92vw"
25410
25619
  }
25411
25620
  },
25412
- /* @__PURE__ */ React36.createElement(
25621
+ /* @__PURE__ */ React37.createElement(
25413
25622
  "div",
25414
25623
  {
25415
25624
  onPointerDown: (e) => {
@@ -25420,7 +25629,7 @@ function XViewScene({
25420
25629
  title: "Arraste para redimensionar"
25421
25630
  }
25422
25631
  ),
25423
- /* @__PURE__ */ React36.createElement(
25632
+ /* @__PURE__ */ React37.createElement(
25424
25633
  DescriptionReadModePanel,
25425
25634
  {
25426
25635
  key: readingMode.branchStack.length > 0 ? readingMode.branchStack[readingMode.branchStack.length - 1].branchId : readingMode.ancestry.ancestry_id,
@@ -25455,7 +25664,7 @@ function XViewScene({
25455
25664
  }
25456
25665
  )
25457
25666
  ),
25458
- ancestryMode.isActive && ancestryMode.tree && /* @__PURE__ */ React36.createElement(
25667
+ ancestryMode.isActive && ancestryMode.tree && /* @__PURE__ */ React37.createElement(
25459
25668
  CreateAncestryPanel,
25460
25669
  {
25461
25670
  ancestryMode,
@@ -25491,7 +25700,7 @@ function XViewScene({
25491
25700
  onRenderAbstractionTree: (data, targetId) => handleRenderAbstractionTree(data, targetId)
25492
25701
  }
25493
25702
  ),
25494
- editingAncestryRel.visible && /* @__PURE__ */ React36.createElement(
25703
+ editingAncestryRel.visible && /* @__PURE__ */ React37.createElement(
25495
25704
  AncestryRelationshipPanel,
25496
25705
  {
25497
25706
  data: editingAncestryRel.data,
@@ -25505,8 +25714,8 @@ function XViewScene({
25505
25714
  onUploadFile: upload_file_action
25506
25715
  }
25507
25716
  ),
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(
25717
+ 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...")),
25718
+ detailsNode && detailsNode.is_quest && /* @__PURE__ */ React37.createElement(
25510
25719
  QuestDetailsPanel,
25511
25720
  {
25512
25721
  node: detailsNode,
@@ -25538,7 +25747,7 @@ function XViewScene({
25538
25747
  style: overlayHiddenStyle
25539
25748
  }
25540
25749
  ),
25541
- detailsNode && detailsNode.is_process && /* @__PURE__ */ React36.createElement(
25750
+ detailsNode && detailsNode.is_process && /* @__PURE__ */ React37.createElement(
25542
25751
  ProcessDetailsPanel,
25543
25752
  {
25544
25753
  node: detailsNode,
@@ -25568,7 +25777,7 @@ function XViewScene({
25568
25777
  style: overlayHiddenStyle
25569
25778
  }
25570
25779
  ),
25571
- detailsNode && !detailsNode.is_quest && !detailsNode.is_process && /* @__PURE__ */ React36.createElement(
25780
+ detailsNode && !detailsNode.is_quest && !detailsNode.is_process && /* @__PURE__ */ React37.createElement(
25572
25781
  NodeDetailsPanel,
25573
25782
  {
25574
25783
  node: detailsNode,
@@ -25603,7 +25812,7 @@ function XViewScene({
25603
25812
  style: overlayHiddenStyle
25604
25813
  }
25605
25814
  ),
25606
- detailsLink && /* @__PURE__ */ React36.createElement(
25815
+ detailsLink && /* @__PURE__ */ React37.createElement(
25607
25816
  RelationshipDetailsPanel,
25608
25817
  {
25609
25818
  link: detailsLink,
@@ -25618,7 +25827,7 @@ function XViewScene({
25618
25827
  onHighlight: handleReadModeHighlight
25619
25828
  }
25620
25829
  ),
25621
- ancestryLinkDetails && /* @__PURE__ */ React36.createElement(
25830
+ ancestryLinkDetails && /* @__PURE__ */ React37.createElement(
25622
25831
  AncestryLinkDetailsPanel,
25623
25832
  {
25624
25833
  data: ancestryLinkDetails,
@@ -25630,7 +25839,7 @@ function XViewScene({
25630
25839
  onHighlight: handleReadModeHighlight
25631
25840
  }
25632
25841
  ),
25633
- /* @__PURE__ */ React36.createElement(
25842
+ /* @__PURE__ */ React37.createElement(
25634
25843
  "div",
25635
25844
  {
25636
25845
  ref: tooltipRef,
@@ -25657,7 +25866,7 @@ function XViewScene({
25657
25866
  }
25658
25867
  }
25659
25868
  ),
25660
- /* @__PURE__ */ React36.createElement(
25869
+ /* @__PURE__ */ React37.createElement(
25661
25870
  ContextMenu,
25662
25871
  {
25663
25872
  data: contextMenu,
@@ -25696,7 +25905,7 @@ function XViewScene({
25696
25905
  onInitiateProcess: (data) => userActionHandlers.handleInitiateProcess(actionHandlerContext, data)
25697
25906
  }
25698
25907
  ),
25699
- /* @__PURE__ */ React36.createElement(
25908
+ /* @__PURE__ */ React37.createElement(
25700
25909
  MultiNodeContextMenu,
25701
25910
  {
25702
25911
  data: multiContextMenu,
@@ -25716,7 +25925,7 @@ function XViewScene({
25716
25925
  )
25717
25926
  }
25718
25927
  ),
25719
- /* @__PURE__ */ React36.createElement(
25928
+ /* @__PURE__ */ React37.createElement(
25720
25929
  RelationshipContextMenu,
25721
25930
  {
25722
25931
  data: relationshipMenu,
@@ -25734,14 +25943,14 @@ function XViewScene({
25734
25943
  onDelete: (data) => userActionHandlers.handleDeleteLink(actionHandlerContext, data)
25735
25944
  }
25736
25945
  ),
25737
- /* @__PURE__ */ React36.createElement(
25946
+ /* @__PURE__ */ React37.createElement(
25738
25947
  ImageViewer,
25739
25948
  {
25740
25949
  data: imageViewer,
25741
25950
  onClose: () => setImageViewer({ ...imageViewer, visible: false })
25742
25951
  }
25743
25952
  ),
25744
- /* @__PURE__ */ React36.createElement(
25953
+ /* @__PURE__ */ React37.createElement(
25745
25954
  Boards,
25746
25955
  {
25747
25956
  isOpen: isBoardsOpen,
@@ -25754,7 +25963,7 @@ function XViewScene({
25754
25963
  userRole: userPermissionRole
25755
25964
  }
25756
25965
  ),
25757
- /* @__PURE__ */ React36.createElement(
25966
+ /* @__PURE__ */ React37.createElement(
25758
25967
  MilestoneManager,
25759
25968
  {
25760
25969
  isOpen: isMilestoneManagerOpen,
@@ -25763,7 +25972,7 @@ function XViewScene({
25763
25972
  onUpdateMilestones: handleUpdateMilestones
25764
25973
  }
25765
25974
  ),
25766
- /* @__PURE__ */ React36.createElement(
25975
+ /* @__PURE__ */ React37.createElement(
25767
25976
  ImportParentFileModal,
25768
25977
  {
25769
25978
  isOpen: isImportModalOpen,
@@ -25776,7 +25985,7 @@ function XViewScene({
25776
25985
  currentAncestries: ancestryDataRef.current || []
25777
25986
  }
25778
25987
  ),
25779
- invalidTargetError && /* @__PURE__ */ React36.createElement(
25988
+ invalidTargetError && /* @__PURE__ */ React37.createElement(
25780
25989
  "div",
25781
25990
  {
25782
25991
  className: "ui-overlay",
@@ -25801,13 +26010,13 @@ function XViewScene({
25801
26010
  animation: "fadeInDown 0.5s cubic-bezier(0.16, 1, 0.3, 1)"
25802
26011
  }
25803
26012
  },
25804
- /* @__PURE__ */ React36.createElement("style", null, `
26013
+ /* @__PURE__ */ React37.createElement("style", null, `
25805
26014
  @keyframes fadeInDown {
25806
26015
  from { opacity: 0; transform: translate(-50%, -20px); }
25807
26016
  to { opacity: 1; transform: translate(-50%, 0); }
25808
26017
  }
25809
26018
  `),
25810
- /* @__PURE__ */ React36.createElement(
26019
+ /* @__PURE__ */ React37.createElement(
25811
26020
  "svg",
25812
26021
  {
25813
26022
  width: "20",
@@ -25819,12 +26028,12 @@ function XViewScene({
25819
26028
  strokeLinecap: "round",
25820
26029
  strokeLinejoin: "round"
25821
26030
  },
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" })
26031
+ /* @__PURE__ */ React37.createElement("circle", { cx: "12", cy: "12", r: "10" }),
26032
+ /* @__PURE__ */ React37.createElement("line", { x1: "12", y1: "8", x2: "12", y2: "12" }),
26033
+ /* @__PURE__ */ React37.createElement("line", { x1: "12", y1: "16", x2: "12.01", y2: "16" })
25825
26034
  ),
25826
- /* @__PURE__ */ React36.createElement("span", { style: { fontSize: "14px", fontWeight: 500 } }, invalidTargetError),
25827
- /* @__PURE__ */ React36.createElement(
26035
+ /* @__PURE__ */ React37.createElement("span", { style: { fontSize: "14px", fontWeight: 500 } }, invalidTargetError),
26036
+ /* @__PURE__ */ React37.createElement(
25828
26037
  "button",
25829
26038
  {
25830
26039
  onClick: () => setInvalidTargetError(null),
@@ -25852,7 +26061,7 @@ function XViewScene({
25852
26061
  "Fechar"
25853
26062
  )
25854
26063
  ),
25855
- /* @__PURE__ */ React36.createElement(
26064
+ /* @__PURE__ */ React37.createElement(
25856
26065
  UpgradeModal,
25857
26066
  {
25858
26067
  isOpen: isUpgradeModalOpen,