@lv-x-software-house/x_view 1.3.7 → 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 +430 -279
  2. package/dist/index.mjs +354 -203
  3. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -44,9 +44,9 @@ __export(index_exports, {
44
44
  module.exports = __toCommonJS(index_exports);
45
45
 
46
46
  // src/XViewScene.jsx
47
- var import_react37 = __toESM(require("react"));
47
+ var import_react38 = __toESM(require("react"));
48
48
  var import_navigation = require("next/navigation");
49
- var import_react38 = require("next-auth/react");
49
+ var import_react39 = require("next-auth/react");
50
50
  var import_crypto_js = __toESM(require("crypto-js"));
51
51
  var THREE3 = __toESM(require("three"));
52
52
  var import_OrbitControls = require("three/examples/jsm/controls/OrbitControls.js");
@@ -2208,7 +2208,6 @@ var userActionHandlers = {
2208
2208
  }
2209
2209
  });
2210
2210
  if (updates.length > 0) {
2211
- console.log(`[syncQuestTemplateFlags] Sincronizando ${updates.length} quests...`);
2212
2211
  for (const quest of updates) {
2213
2212
  const idx = sceneDataRef.current.quest_nodes.findIndex((q) => String(q.id) === String(quest.id));
2214
2213
  if (idx !== -1) sceneDataRef.current.quest_nodes[idx] = quest;
@@ -2550,7 +2549,7 @@ var userActionHandlers = {
2550
2549
  if (actions.delete_file && nodeData) {
2551
2550
  const urls = extractFileUrlsFromProperties(nodeData);
2552
2551
  if (urls.length > 0) {
2553
- Promise.all(urls.map((url) => actions.delete_file(url))).then(() => console.log("Arquivos do node deletados.")).catch(
2552
+ Promise.all(urls.map((url) => actions.delete_file(url))).catch(
2554
2553
  (err) => console.error("Erro ao deletar arquivos do node:", err)
2555
2554
  );
2556
2555
  }
@@ -2961,7 +2960,6 @@ var userActionHandlers = {
2961
2960
  }
2962
2961
  if (foundProcess && foundTreeContext) {
2963
2962
  if (foundTreeContext.nodeRef.is_choice) {
2964
- console.log("N\xF3 de escolha detectado. Aguardando sele\xE7\xE3o manual.");
2965
2963
  keepOpen = true;
2966
2964
  if (context.setters.setDetailsNode) {
2967
2965
  context.setters.setDetailsNode({ ...nodeToSave, _scrollToChoice: true });
@@ -5160,8 +5158,8 @@ function ContextMenu({
5160
5158
  const handleClickOutside = (e) => {
5161
5159
  if (menuRef.current && !menuRef.current.contains(e.target)) onClose();
5162
5160
  };
5163
- document.addEventListener("mousedown", handleClickOutside);
5164
- return () => document.removeEventListener("mousedown", handleClickOutside);
5161
+ document.addEventListener("pointerdown", handleClickOutside);
5162
+ return () => document.removeEventListener("pointerdown", handleClickOutside);
5165
5163
  }, [data.visible, onClose]);
5166
5164
  const visibleLinkIds = (0, import_react2.useMemo)(() => {
5167
5165
  var _a2;
@@ -5601,7 +5599,7 @@ function ContextMenu({
5601
5599
  "div",
5602
5600
  {
5603
5601
  ref: menuRef,
5604
- className: "ui-overlay context-menu-class origin-top-left rounded-xl border border-white/10 bg-slate-950/70 backdrop-blur-xl shadow-[0_20px_80px_rgba(0,0,0,0.6)] ring-1 ring-white/10 text-white min-w-[220px] max-w-[min(95vw,420px)] w-max overflow-hidden",
5602
+ className: "ui-overlay context-menu-class origin-top-left rounded-xl border border-white/10 bg-slate-950/70 backdrop-blur-xl shadow-[0_20px_80px_rgba(0,0,0,0.6)] ring-1 ring-white/10 text-white min-w-[220px] max-w-[min(95vw,420px)] max-h-[85vh] overflow-y-auto custom-scrollbar w-max",
5605
5603
  style: { position: "absolute", left: `${menuPos.left}px`, top: `${menuPos.top}px`, zIndex: 1e3 },
5606
5604
  onPointerDown: swallow,
5607
5605
  onPointerMove: swallow,
@@ -8370,7 +8368,6 @@ function DescriptionDisplay({
8370
8368
  mentionCount++;
8371
8369
  }
8372
8370
  });
8373
- console.log("[DescriptionDisplay] flatNavigation computed:", navItems.length, "items", navItems);
8374
8371
  return navItems;
8375
8372
  }, [sections]);
8376
8373
  const [currentStepIndex, setCurrentStepIndex] = (0, import_react7.useState)(0);
@@ -8417,24 +8414,14 @@ function DescriptionDisplay({
8417
8414
  const handleKeyDown = (e) => {
8418
8415
  if (e.target.tagName === "INPUT" || e.target.tagName === "TEXTAREA") return;
8419
8416
  const currentItem = flatNavigation[currentStepIndex];
8420
- if (["ArrowUp", "ArrowDown", "ArrowLeft", "ArrowRight"].includes(e.key)) {
8421
- console.log(`[DescriptionDisplay] Key pressed: ${e.key}`, {
8422
- currentStepIndex,
8423
- flatNavigationLength: flatNavigation.length,
8424
- currentItem,
8425
- currentBranchDirection
8426
- });
8427
- }
8428
8417
  if (e.key === "ArrowRight") {
8429
8418
  e.preventDefault();
8430
8419
  e.stopPropagation();
8431
8420
  if (currentStepIndex === 0 && currentBranchDirection === "left") {
8432
- console.log("[DescriptionDisplay] ArrowRight: Navigating back from left branch");
8433
8421
  if (onBranchNav) onBranchNav(null, "back");
8434
8422
  return;
8435
8423
  }
8436
8424
  if (currentItem && currentItem.type === "mention" && onBranchNav) {
8437
- console.log("[DescriptionDisplay] ArrowRight: Opening right branch for node", currentItem.nodeId);
8438
8425
  onBranchNav(currentItem.nodeId, "open", "right");
8439
8426
  return;
8440
8427
  }
@@ -8443,12 +8430,10 @@ function DescriptionDisplay({
8443
8430
  e.preventDefault();
8444
8431
  e.stopPropagation();
8445
8432
  if (currentStepIndex === 0 && currentBranchDirection === "right") {
8446
- console.log("[DescriptionDisplay] ArrowLeft: Navigating back from right branch");
8447
8433
  if (onBranchNav) onBranchNav(null, "back");
8448
8434
  return;
8449
8435
  }
8450
8436
  if (currentItem && currentItem.type === "mention" && onBranchNav) {
8451
- console.log("[DescriptionDisplay] ArrowLeft: Opening left branch for node", currentItem.nodeId);
8452
8437
  onBranchNav(currentItem.nodeId, "open", "left");
8453
8438
  return;
8454
8439
  }
@@ -8456,29 +8441,16 @@ function DescriptionDisplay({
8456
8441
  if (e.key === "ArrowDown") {
8457
8442
  e.preventDefault();
8458
8443
  if (flatNavigation.length > 1) {
8459
- setCurrentStepIndex((prev) => {
8460
- const next = Math.min(prev + 1, flatNavigation.length - 1);
8461
- console.log(`[DescriptionDisplay] ArrowDown: ${prev} -> ${next}`);
8462
- return next;
8463
- });
8444
+ setCurrentStepIndex((prev) => Math.min(prev + 1, flatNavigation.length - 1));
8464
8445
  }
8465
8446
  }
8466
8447
  if (e.key === "ArrowUp") {
8467
8448
  e.preventDefault();
8468
8449
  if (flatNavigation.length > 1) {
8469
- setCurrentStepIndex((prev) => {
8470
- const next = Math.max(prev - 1, 0);
8471
- console.log(`[DescriptionDisplay] ArrowUp: ${prev} -> ${next}`);
8472
- return next;
8473
- });
8450
+ setCurrentStepIndex((prev) => Math.max(prev - 1, 0));
8474
8451
  }
8475
8452
  }
8476
8453
  };
8477
- console.log("[DescriptionDisplay] Attaching keydown listener", {
8478
- flatNavigationLength: flatNavigation.length,
8479
- currentStepIndex,
8480
- currentBranchDirection
8481
- });
8482
8454
  window.addEventListener("keydown", handleKeyDown);
8483
8455
  return () => {
8484
8456
  window.removeEventListener("keydown", handleKeyDown);
@@ -11846,7 +11818,6 @@ function InSceneCreationForm({
11846
11818
  if (typeInput.trim() === "") {
11847
11819
  result = validExistingTypes.filter((t) => !types.includes(t));
11848
11820
  } else {
11849
- console.log("InSceneCreationForm: Filtrando tipos com input:", typeInput);
11850
11821
  try {
11851
11822
  const lowercasedInput = typeInput.toLowerCase();
11852
11823
  result = validExistingTypes.filter((t) => {
@@ -13776,14 +13747,18 @@ function NodeDetailsPanel({
13776
13747
  });
13777
13748
  const [selectedImageUrl, setSelectedImageUrl] = (0, import_react21.useState)((node == null ? void 0 : node.textureImageUrl) ?? null);
13778
13749
  const [hasUnsavedChanges, setHasUnsavedChanges] = (0, import_react21.useState)(false);
13779
- const maxPanelW = typeof window !== "undefined" ? window.innerWidth * 0.92 : 1200;
13750
+ const isMobile = typeof window !== "undefined" && window.innerWidth < 640;
13751
+ const maxPanelW = typeof window !== "undefined" ? Math.min(window.innerWidth - 32, 1200) : 1200;
13752
+ const defaultWidth = isMobile ? typeof window !== "undefined" ? window.innerWidth - 32 : 360 : isReadMode ? 700 : 440;
13780
13753
  const { width: panelWidth, isResizing, handlePointerDown: handleResize, setWidth } = useResizablePanel({
13781
- initialWidth: isReadMode ? 700 : 440,
13782
- minWidth: 320,
13754
+ initialWidth: defaultWidth,
13755
+ minWidth: typeof window !== "undefined" ? Math.min(280, window.innerWidth - 32) : 280,
13783
13756
  maxWidth: maxPanelW
13784
13757
  });
13785
13758
  (0, import_react21.useEffect)(() => {
13786
- setWidth(isReadMode ? 700 : 440);
13759
+ const isMob = typeof window !== "undefined" && window.innerWidth < 640;
13760
+ const targetW = isMob ? typeof window !== "undefined" ? window.innerWidth - 32 : 360 : isReadMode ? 700 : 440;
13761
+ setWidth(targetW);
13787
13762
  }, [isReadMode, setWidth]);
13788
13763
  const prevNodeIdRef = (0, import_react21.useRef)(null);
13789
13764
  const propsEndRef = (0, import_react21.useRef)(null);
@@ -13829,7 +13804,6 @@ function NodeDetailsPanel({
13829
13804
  if (typeInput.trim() === "") {
13830
13805
  setFilteredTypes(validExistingTypes.filter((t) => !types.includes(t)));
13831
13806
  } else {
13832
- console.log("NodeDetailsPanel: Filtrando tipos com input:", typeInput);
13833
13807
  try {
13834
13808
  const lowercasedInput = typeInput.toLowerCase();
13835
13809
  setFilteredTypes(
@@ -14768,7 +14742,6 @@ function QuestDetailsPanel({
14768
14742
  if (typeInput.trim() === "") {
14769
14743
  setFilteredTypes(validExistingTypes.filter((t) => !types.includes(t)));
14770
14744
  } else {
14771
- console.log("QuestDetailsPanel: Filtrando tipos com input:", typeInput);
14772
14745
  try {
14773
14746
  const lowercasedInput = typeInput.toLowerCase();
14774
14747
  setFilteredTypes(
@@ -17446,8 +17419,8 @@ function MultiNodeContextMenu({
17446
17419
  const handleClickOutside = (e) => {
17447
17420
  if (menuRef.current && !menuRef.current.contains(e.target)) onClose();
17448
17421
  };
17449
- document.addEventListener("mousedown", handleClickOutside);
17450
- return () => document.removeEventListener("mousedown", handleClickOutside);
17422
+ document.addEventListener("pointerdown", handleClickOutside);
17423
+ return () => document.removeEventListener("pointerdown", handleClickOutside);
17451
17424
  }, [data.visible, onClose]);
17452
17425
  if (!data.visible || !data.nodeIds || data.nodeIds.size === 0) return null;
17453
17426
  const swallow = (e) => e.stopPropagation();
@@ -17888,8 +17861,8 @@ function RelationshipContextMenu({
17888
17861
  const handleClickOutside = (e) => {
17889
17862
  if (menuRef.current && !menuRef.current.contains(e.target)) onClose();
17890
17863
  };
17891
- document.addEventListener("mousedown", handleClickOutside);
17892
- return () => document.removeEventListener("mousedown", handleClickOutside);
17864
+ document.addEventListener("pointerdown", handleClickOutside);
17865
+ return () => document.removeEventListener("pointerdown", handleClickOutside);
17893
17866
  }, [data.visible, onClose]);
17894
17867
  if (!data.visible) return null;
17895
17868
  const swallow = (e) => e.stopPropagation();
@@ -19457,63 +19430,201 @@ function MilestoneManager({
19457
19430
  }
19458
19431
 
19459
19432
  // src/components/UpgradeModal.jsx
19433
+ var import_react37 = __toESM(require("react"));
19434
+
19435
+ // src/components/icons/UltraMinimalIcon.jsx
19460
19436
  var import_react36 = __toESM(require("react"));
19461
- var import_lucide_react = require("lucide-react");
19437
+ function UltraMinimalIcon({
19438
+ size = 13,
19439
+ className = "",
19440
+ strokeWidth = 1.5,
19441
+ ...props
19442
+ }) {
19443
+ return /* @__PURE__ */ import_react36.default.createElement(
19444
+ "svg",
19445
+ {
19446
+ width: size,
19447
+ height: size,
19448
+ viewBox: "0 0 24 24",
19449
+ fill: "none",
19450
+ xmlns: "http://www.w3.org/2000/svg",
19451
+ className: `inline-block shrink-0 transition-transform duration-200 ${className}`,
19452
+ ...props
19453
+ },
19454
+ /* @__PURE__ */ import_react36.default.createElement(
19455
+ "path",
19456
+ {
19457
+ d: "M6 3h12l4 6-10 12L2 9l4-6z",
19458
+ stroke: "currentColor",
19459
+ strokeWidth,
19460
+ strokeLinecap: "round",
19461
+ strokeLinejoin: "round"
19462
+ }
19463
+ ),
19464
+ /* @__PURE__ */ import_react36.default.createElement(
19465
+ "path",
19466
+ {
19467
+ d: "M11 3v6",
19468
+ stroke: "currentColor",
19469
+ strokeWidth,
19470
+ strokeLinecap: "round",
19471
+ strokeLinejoin: "round"
19472
+ }
19473
+ ),
19474
+ /* @__PURE__ */ import_react36.default.createElement(
19475
+ "path",
19476
+ {
19477
+ d: "M13 3v6",
19478
+ stroke: "currentColor",
19479
+ strokeWidth,
19480
+ strokeLinecap: "round",
19481
+ strokeLinejoin: "round"
19482
+ }
19483
+ ),
19484
+ /* @__PURE__ */ import_react36.default.createElement(
19485
+ "path",
19486
+ {
19487
+ d: "M2 9h20",
19488
+ stroke: "currentColor",
19489
+ strokeWidth,
19490
+ strokeLinecap: "round",
19491
+ strokeLinejoin: "round"
19492
+ }
19493
+ ),
19494
+ /* @__PURE__ */ import_react36.default.createElement(
19495
+ "path",
19496
+ {
19497
+ d: "M12 21L8 9",
19498
+ stroke: "currentColor",
19499
+ strokeWidth,
19500
+ strokeLinecap: "round",
19501
+ strokeLinejoin: "round"
19502
+ }
19503
+ ),
19504
+ /* @__PURE__ */ import_react36.default.createElement(
19505
+ "path",
19506
+ {
19507
+ d: "M12 21l4-12",
19508
+ stroke: "currentColor",
19509
+ strokeWidth,
19510
+ strokeLinecap: "round",
19511
+ strokeLinejoin: "round"
19512
+ }
19513
+ )
19514
+ );
19515
+ }
19516
+
19517
+ // src/components/UpgradeModal.jsx
19462
19518
  function UpgradeModal({
19463
19519
  isOpen,
19464
19520
  onClose,
19465
- nodeCounter,
19521
+ nodeCounter = 0,
19466
19522
  nodeLimit = 100,
19523
+ plan,
19467
19524
  onUpgrade
19468
19525
  }) {
19526
+ const [isSubmitting, setIsSubmitting] = (0, import_react37.useState)(false);
19469
19527
  if (!isOpen) return null;
19470
- return /* @__PURE__ */ import_react36.default.createElement("div", { className: "fixed inset-0 z-[10000] flex items-center justify-center p-4" }, /* @__PURE__ */ import_react36.default.createElement("style", null, `
19471
- @keyframes modalShow {
19472
- from { opacity: 0; transform: scale(0.95); }
19473
- to { opacity: 1; transform: scale(1); }
19474
- }
19475
- @keyframes backdropShow {
19476
- from { opacity: 0; }
19477
- to { opacity: 1; }
19478
- }
19479
- .animate-modal { animation: modalShow 0.3s ease-out forwards; }
19480
- .animate-backdrop { animation: backdropShow 0.3s ease-out forwards; }
19481
- `), /* @__PURE__ */ import_react36.default.createElement(
19528
+ const currentPlan = plan || (nodeLimit === -1 ? "premium" : "free");
19529
+ const handleUpgradeClick = async () => {
19530
+ if (isSubmitting) return;
19531
+ setIsSubmitting(true);
19532
+ try {
19533
+ if (onUpgrade) {
19534
+ await onUpgrade();
19535
+ } else {
19536
+ alert("Redirecting to checkout...");
19537
+ }
19538
+ } catch (error) {
19539
+ console.error("Error during upgrade:", error);
19540
+ } finally {
19541
+ setIsSubmitting(false);
19542
+ }
19543
+ };
19544
+ const limit = nodeLimit === -1 ? 100 : nodeLimit;
19545
+ const safeNodeCounter = Math.max(0, nodeCounter || 0);
19546
+ const usagePercentage = Math.min(
19547
+ 100,
19548
+ Math.round(safeNodeCounter / limit * 100)
19549
+ );
19550
+ return /* @__PURE__ */ import_react37.default.createElement("div", { className: "fixed inset-0 bg-slate-950/40 backdrop-blur-md z-[10000] flex justify-center items-center p-4 animate-in fade-in duration-300 font-sans select-none" }, /* @__PURE__ */ import_react37.default.createElement("div", { className: "bg-[#0b1224]/80 border border-cyan-600/20 p-7 rounded-3xl shadow-[0_0_50px_-12px_rgba(6,182,212,0.2)] w-full max-w-[380px] relative text-center overflow-hidden animate-in zoom-in-95 duration-300" }, /* @__PURE__ */ import_react37.default.createElement("div", { className: "absolute -top-20 left-1/2 -translate-x-1/2 w-40 h-40 bg-cyan-600/10 rounded-full blur-[60px] pointer-events-none" }), /* @__PURE__ */ import_react37.default.createElement("div", { className: "flex justify-center mb-4 relative" }, /* @__PURE__ */ import_react37.default.createElement("div", { className: "relative w-14 h-14 flex items-center justify-center" }, /* @__PURE__ */ import_react37.default.createElement("div", { className: "absolute inset-0 bg-cyan-500 rounded-full blur-2xl opacity-20 animate-pulse" }), /* @__PURE__ */ import_react37.default.createElement("div", { className: "relative w-12 h-12 rounded-xl bg-slate-900 border border-cyan-400/30 shadow-lg flex items-center justify-center z-10 animate-float" }, /* @__PURE__ */ import_react37.default.createElement(
19551
+ UltraMinimalIcon,
19552
+ {
19553
+ size: 22,
19554
+ className: "text-cyan-400",
19555
+ strokeWidth: 2
19556
+ }
19557
+ )))), /* @__PURE__ */ import_react37.default.createElement("h2", { className: "text-xl font-bold text-white mb-1 tracking-tight font-sans" }, "Upgrade x.plore"), /* @__PURE__ */ import_react37.default.createElement("p", { className: "text-slate-400 text-[11px] mb-6 leading-relaxed px-4 font-medium italic" }, "Unlock unlimited nodes and community features."), /* @__PURE__ */ import_react37.default.createElement("div", { className: "grid grid-cols-2 gap-3 mb-3 text-left" }, /* @__PURE__ */ import_react37.default.createElement("div", { className: "bg-gradient-to-b from-[#0e172a]/90 to-[#070c18]/90 border border-cyan-500/20 hover:border-cyan-400/40 p-3.5 rounded-2xl flex flex-col justify-between shadow-md transition-all duration-300" }, /* @__PURE__ */ import_react37.default.createElement("div", null, /* @__PURE__ */ import_react37.default.createElement("span", { className: "text-xs font-sans font-normal text-cyan-400/80 tracking-normal block mb-1.5" }, "Node Usage"), /* @__PURE__ */ import_react37.default.createElement("div", { className: "flex items-baseline gap-1" }, /* @__PURE__ */ import_react37.default.createElement("span", { className: "text-lg font-bold text-white font-sans tracking-tight" }, nodeCounter), /* @__PURE__ */ import_react37.default.createElement("span", { className: "text-xs font-sans font-medium text-slate-400" }, "/ ", currentPlan === "premium" ? "\u221E" : "100"))), currentPlan !== "premium" && /* @__PURE__ */ import_react37.default.createElement("div", { className: "mt-2.5" }, /* @__PURE__ */ import_react37.default.createElement("div", { className: "w-full h-1.5 bg-slate-900 border border-white/5 rounded-full overflow-hidden p-[1px]" }, /* @__PURE__ */ import_react37.default.createElement(
19482
19558
  "div",
19483
19559
  {
19484
- className: "absolute inset-0 bg-black/60 backdrop-blur-xl animate-backdrop",
19485
- onClick: onClose
19560
+ 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]"}`,
19561
+ style: { width: `${usagePercentage}%` }
19486
19562
  }
19487
- ), /* @__PURE__ */ import_react36.default.createElement("div", { className: "relative w-full max-w-xl overflow-hidden rounded-[2.5rem] border border-white/10 bg-[#0d1117]/80 shadow-[0_0_100px_-20px_rgba(56,189,248,0.3)] animate-modal" }, /* @__PURE__ */ import_react36.default.createElement("div", { className: "absolute inset-0 -z-10 bg-gradient-to-br from-sky-500/10 via-transparent to-purple-500/10" }), /* @__PURE__ */ import_react36.default.createElement("div", { className: "absolute -top-24 -left-24 w-48 h-48 bg-sky-500/20 blur-[100px] rounded-full" }), /* @__PURE__ */ import_react36.default.createElement("div", { className: "absolute -bottom-24 -right-24 w-48 h-48 bg-purple-500/20 blur-[100px] rounded-full" }), /* @__PURE__ */ import_react36.default.createElement(
19563
+ )))), /* @__PURE__ */ import_react37.default.createElement("div", { className: "bg-gradient-to-b from-[#0e172a]/90 to-[#070c18]/90 border border-cyan-500/20 hover:border-cyan-400/40 p-3.5 rounded-2xl flex flex-col justify-between shadow-md transition-all duration-300" }, /* @__PURE__ */ import_react37.default.createElement("div", null, /* @__PURE__ */ import_react37.default.createElement("span", { className: "text-xs font-sans font-normal text-cyan-400/80 tracking-normal block mb-1.5" }, "Current Plan"), /* @__PURE__ */ import_react37.default.createElement("div", { className: "mt-1" }, /* @__PURE__ */ import_react37.default.createElement(
19564
+ "span",
19565
+ {
19566
+ 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"}`
19567
+ },
19568
+ /* @__PURE__ */ import_react37.default.createElement(
19569
+ "span",
19570
+ {
19571
+ 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]"}`
19572
+ }
19573
+ ),
19574
+ currentPlan === "premium" ? "Premium" : "Free"
19575
+ ))))), /* @__PURE__ */ import_react37.default.createElement("div", { className: "bg-gradient-to-b from-[#0e172a]/70 to-[#070c18]/80 border border-cyan-500/15 p-3.5 rounded-2xl space-y-2.5 mb-5 text-left shadow-sm" }, /* @__PURE__ */ import_react37.default.createElement("div", { className: "flex items-center gap-2.5 text-slate-200 text-xs font-medium" }, /* @__PURE__ */ import_react37.default.createElement("span", { className: "w-1.5 h-1.5 rounded-full bg-cyan-400 shadow-[0_0_6px_#22d3ee] shrink-0" }), /* @__PURE__ */ import_react37.default.createElement("span", null, "Unlimited Nodes")), /* @__PURE__ */ import_react37.default.createElement("div", { className: "flex items-center gap-2.5 text-slate-200 text-xs font-medium" }, /* @__PURE__ */ import_react37.default.createElement("span", { className: "w-1.5 h-1.5 rounded-full bg-cyan-400 shadow-[0_0_6px_#22d3ee] shrink-0" }), /* @__PURE__ */ import_react37.default.createElement("span", null, "Community and collaboration features"))), /* @__PURE__ */ import_react37.default.createElement("div", { className: "space-y-2.5" }, currentPlan !== "premium" ? /* @__PURE__ */ import_react37.default.createElement(
19488
19576
  "button",
19489
19577
  {
19490
- onClick: onClose,
19491
- className: "absolute top-6 right-6 p-2 rounded-full hover:bg-white/5 text-white/40 hover:text-white transition-all duration-300"
19578
+ onClick: handleUpgradeClick,
19579
+ disabled: isSubmitting,
19580
+ 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"
19492
19581
  },
19493
- /* @__PURE__ */ import_react36.default.createElement(import_lucide_react.X, { size: 20 })
19494
- ), /* @__PURE__ */ import_react36.default.createElement("div", { className: "p-12 flex flex-col items-center text-center" }, /* @__PURE__ */ import_react36.default.createElement("div", { className: "w-20 h-20 rounded-[2rem] bg-gradient-to-br from-sky-400 to-indigo-600 p-[1px] mb-8 shadow-lg shadow-sky-500/20" }, /* @__PURE__ */ import_react36.default.createElement("div", { className: "w-full h-full rounded-[2rem] bg-[#0d1117] flex items-center justify-center" }, /* @__PURE__ */ import_react36.default.createElement(import_lucide_react.Zap, { className: "text-sky-400 fill-sky-400/20", size: 32 }))), /* @__PURE__ */ import_react36.default.createElement("h2", { className: "text-3xl font-bold text-white mb-4 tracking-tight" }, "Limite de Nodes", " ", /* @__PURE__ */ import_react36.default.createElement("span", { className: "bg-clip-text text-transparent bg-gradient-to-r from-sky-400 to-indigo-400" }, "Atingido")), /* @__PURE__ */ import_react36.default.createElement("p", { className: "text-white/60 text-lg leading-relaxed mb-10 max-w-md" }, "Voc\xEA atingiu o limite de", " ", /* @__PURE__ */ import_react36.default.createElement("span", { className: "text-white font-semibold" }, nodeLimit, " nodes"), " ", "do seu plano Free. Seu universo est\xE1 crescendo r\xE1pido!"), /* @__PURE__ */ import_react36.default.createElement("div", { className: "w-full grid grid-cols-2 gap-4 mb-10" }, /* @__PURE__ */ import_react36.default.createElement("div", { className: "bg-white/5 border border-white/10 rounded-3xl p-6 backdrop-blur-md" }, /* @__PURE__ */ import_react36.default.createElement("p", { className: "text-white/30 text-[10px] font-bold uppercase tracking-widest mb-1" }, "Status Atual"), /* @__PURE__ */ import_react36.default.createElement("p", { className: "text-2xl font-bold text-white" }, nodeCounter, " / ", nodeLimit)), /* @__PURE__ */ import_react36.default.createElement("div", { className: "bg-white/5 border border-white/10 rounded-3xl p-6 backdrop-blur-md" }, /* @__PURE__ */ import_react36.default.createElement("p", { className: "text-white/30 text-[10px] font-bold uppercase tracking-widest mb-1" }, "Pr\xF3ximo Plano"), /* @__PURE__ */ import_react36.default.createElement("p", { className: "text-2xl font-bold text-sky-400" }, "Ilimitado"))), /* @__PURE__ */ import_react36.default.createElement("div", { className: "w-full space-y-4 mb-10 text-left px-4" }, /* @__PURE__ */ import_react36.default.createElement("div", { className: "flex items-center gap-3 text-white/70 text-sm" }, /* @__PURE__ */ import_react36.default.createElement("div", { className: "w-6 h-6 rounded-full bg-sky-500/10 flex items-center justify-center shrink-0" }, /* @__PURE__ */ import_react36.default.createElement(import_lucide_react.Rocket, { size: 14, className: "text-sky-400" })), /* @__PURE__ */ import_react36.default.createElement("span", null, "Cria\xE7\xE3o de Nodes ilimitada")), /* @__PURE__ */ import_react36.default.createElement("div", { className: "flex items-center gap-3 text-white/70 text-sm" }, /* @__PURE__ */ import_react36.default.createElement("div", { className: "w-6 h-6 rounded-full bg-sky-500/10 flex items-center justify-center shrink-0" }, /* @__PURE__ */ import_react36.default.createElement(import_lucide_react.ShieldCheck, { size: 14, className: "text-sky-400" })), /* @__PURE__ */ import_react36.default.createElement("span", null, "Acesso expandido \xE0s funcionalidades colaborativas e de comunidade"))), /* @__PURE__ */ import_react36.default.createElement("div", { className: "w-full flex flex-col gap-4" }, /* @__PURE__ */ import_react36.default.createElement(
19582
+ /* @__PURE__ */ import_react37.default.createElement("div", { className: "absolute inset-0 bg-gradient-to-r from-transparent via-white/40 to-transparent -translate-x-full group-hover:translate-x-full transition-transform duration-700 ease-in-out pointer-events-none" }),
19583
+ isSubmitting ? /* @__PURE__ */ import_react37.default.createElement("div", { className: "relative z-10 flex items-center justify-center gap-2" }, /* @__PURE__ */ import_react37.default.createElement("div", { className: "h-4 w-4 border-2 border-slate-950/30 border-t-slate-950 rounded-full animate-spin" })) : /* @__PURE__ */ import_react37.default.createElement("span", { className: "relative z-10 font-normal" }, "Upgrade Now")
19584
+ ) : /* @__PURE__ */ import_react37.default.createElement("div", { className: "w-full py-3 rounded-xl bg-indigo-500/10 border border-indigo-500/30 text-indigo-300 font-normal text-sm text-center flex items-center justify-center gap-2 font-sans tracking-normal" }, /* @__PURE__ */ import_react37.default.createElement("span", null, "Your Account is Premium")), /* @__PURE__ */ import_react37.default.createElement(
19495
19585
  "button",
19496
19586
  {
19497
- 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",
19498
- onClick: async () => {
19499
- if (onUpgrade) {
19500
- await onUpgrade();
19501
- } else {
19502
- alert("Redirecionando para upgrade... (Em breve)");
19503
- }
19504
- onClose();
19505
- }
19587
+ onClick: onClose,
19588
+ 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"
19506
19589
  },
19507
- "Fazer Upgrade Agora",
19508
- /* @__PURE__ */ import_react36.default.createElement(import_lucide_react.Sparkles, { size: 16 })
19509
- ), /* @__PURE__ */ import_react36.default.createElement(
19590
+ currentPlan === "premium" ? "Close" : "Continue with Free Plan"
19591
+ )), /* @__PURE__ */ import_react37.default.createElement(
19510
19592
  "button",
19511
19593
  {
19512
19594
  onClick: onClose,
19513
- 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"
19595
+ className: "absolute top-6 right-6 text-slate-500 hover:text-cyan-400 transition-all duration-300 p-1 hover:rotate-90 cursor-pointer",
19596
+ "aria-label": "Close modal"
19514
19597
  },
19515
- "Talvez depois"
19516
- )))));
19598
+ /* @__PURE__ */ import_react37.default.createElement(
19599
+ "svg",
19600
+ {
19601
+ xmlns: "http://www.w3.org/2000/svg",
19602
+ width: "18",
19603
+ height: "18",
19604
+ viewBox: "0 0 24 24",
19605
+ fill: "none",
19606
+ stroke: "currentColor",
19607
+ strokeWidth: "2.5",
19608
+ strokeLinecap: "round",
19609
+ strokeLinejoin: "round"
19610
+ },
19611
+ /* @__PURE__ */ import_react37.default.createElement("line", { x1: "18", y1: "6", x2: "6", y2: "18" }),
19612
+ /* @__PURE__ */ import_react37.default.createElement("line", { x1: "6", y1: "6", x2: "18", y2: "18" })
19613
+ )
19614
+ )), /* @__PURE__ */ import_react37.default.createElement("style", null, `
19615
+ @keyframes float {
19616
+ 0%,
19617
+ 100% {
19618
+ transform: translateY(0px);
19619
+ }
19620
+ 50% {
19621
+ transform: translateY(-8px);
19622
+ }
19623
+ }
19624
+ .animate-float {
19625
+ animation: float 4s ease-in-out infinite;
19626
+ }
19627
+ `));
19517
19628
  }
19518
19629
 
19519
19630
  // src/XViewScene.jsx
@@ -19667,12 +19778,12 @@ function XViewScene({
19667
19778
  onUpgrade
19668
19779
  }) {
19669
19780
  var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t;
19670
- const { data: session, status } = (0, import_react38.useSession)();
19781
+ const { data: session, status } = (0, import_react39.useSession)();
19671
19782
  const router = (0, import_navigation.useRouter)();
19672
19783
  const searchParams = (0, import_navigation.useSearchParams)();
19673
19784
  const focusNodeId = searchParams == null ? void 0 : searchParams.get("focus");
19674
19785
  const focusAncestryId = searchParams == null ? void 0 : searchParams.get("ancestry");
19675
- const viewParams = (0, import_react37.useMemo)(() => {
19786
+ const viewParams = (0, import_react38.useMemo)(() => {
19676
19787
  if (encryptedConfig) {
19677
19788
  const data = decryptData(encryptedConfig);
19678
19789
  if (data && data.id && data.owner_id && data.type) {
@@ -19681,12 +19792,12 @@ function XViewScene({
19681
19792
  }
19682
19793
  return null;
19683
19794
  }, [encryptedConfig, session]);
19684
- (0, import_react37.useEffect)(() => {
19795
+ (0, import_react38.useEffect)(() => {
19685
19796
  if (viewParams == null ? void 0 : viewParams.name) {
19686
19797
  document.title = `${viewParams.name} - x.plore`;
19687
19798
  }
19688
19799
  }, [viewParams == null ? void 0 : viewParams.name]);
19689
- (0, import_react37.useEffect)(() => {
19800
+ (0, import_react38.useEffect)(() => {
19690
19801
  async function verifyPermission() {
19691
19802
  if (!viewParams || !session || !check_user_permission) return;
19692
19803
  const { id, type, owner_id } = viewParams;
@@ -19723,68 +19834,70 @@ function XViewScene({
19723
19834
  setIsLoading(false);
19724
19835
  }
19725
19836
  }, [viewParams, session, status, check_user_permission]);
19726
- const sceneConfigId = (0, import_react37.useMemo)(() => (viewParams == null ? void 0 : viewParams.id) || null, [viewParams]);
19727
- const ownerId = (0, import_react37.useMemo)(() => (viewParams == null ? void 0 : viewParams.owner_id) || null, [viewParams]);
19728
- const dbSaveUrl = (0, import_react37.useMemo)(() => {
19837
+ const sceneConfigId = (0, import_react38.useMemo)(() => (viewParams == null ? void 0 : viewParams.id) || null, [viewParams]);
19838
+ const ownerId = (0, import_react38.useMemo)(() => (viewParams == null ? void 0 : viewParams.owner_id) || null, [viewParams]);
19839
+ const dbSaveUrl = (0, import_react38.useMemo)(() => {
19729
19840
  if (ownerId && sceneConfigId) {
19730
19841
  return `x_view_dbs/${ownerId}/${sceneConfigId}`;
19731
19842
  }
19732
19843
  return null;
19733
19844
  }, [ownerId, sceneConfigId]);
19734
- const sceneSaveUrl = (0, import_react37.useMemo)(() => {
19845
+ const sceneSaveUrl = (0, import_react38.useMemo)(() => {
19735
19846
  if (ownerId && sceneConfigId) {
19736
19847
  return `x_view_scenes/${ownerId}/${sceneConfigId}`;
19737
19848
  }
19738
19849
  return null;
19739
19850
  }, [ownerId, sceneConfigId]);
19740
- const ancestry_save_url = (0, import_react37.useMemo)(() => {
19851
+ const ancestry_save_url = (0, import_react38.useMemo)(() => {
19741
19852
  if (ownerId && sceneConfigId) {
19742
19853
  return `x_view_ancestry/${ownerId}/${sceneConfigId}`;
19743
19854
  }
19744
19855
  return null;
19745
19856
  }, [ownerId, sceneConfigId]);
19746
- const sceneDataRef = (0, import_react37.useRef)(null);
19747
- const parentDataRef = (0, import_react37.useRef)(null);
19857
+ const sceneDataRef = (0, import_react38.useRef)(null);
19858
+ const parentDataRef = (0, import_react38.useRef)(null);
19748
19859
  const graphDataRef = parentDataRef;
19749
- const ancestryDataRef = (0, import_react37.useRef)(null);
19750
- const [isLoading, setIsLoading] = (0, import_react37.useState)(true);
19751
- const [isProcessing, setIsProcessing] = (0, import_react37.useState)(false);
19752
- const [permissionStatus, setPermissionStatus] = (0, import_react37.useState)("loading");
19753
- const [userPermissionRole, setUserPermissionRole] = (0, import_react37.useState)(null);
19754
- const [viewMembers, setViewMembers] = (0, import_react37.useState)([]);
19755
- const [isInitialized, setIsInitialized] = (0, import_react37.useState)(false);
19756
- const [sceneVersion, setSceneVersion] = (0, import_react37.useState)(0);
19757
- const [contextMenu, setContextMenu] = (0, import_react37.useState)({
19860
+ const ancestryDataRef = (0, import_react38.useRef)(null);
19861
+ const [isLoading, setIsLoading] = (0, import_react38.useState)(true);
19862
+ const [isProcessing, setIsProcessing] = (0, import_react38.useState)(false);
19863
+ const [permissionStatus, setPermissionStatus] = (0, import_react38.useState)("loading");
19864
+ const [userPermissionRole, setUserPermissionRole] = (0, import_react38.useState)(null);
19865
+ const [viewMembers, setViewMembers] = (0, import_react38.useState)([]);
19866
+ const [isInitialized, setIsInitialized] = (0, import_react38.useState)(false);
19867
+ const [sceneVersion, setSceneVersion] = (0, import_react38.useState)(0);
19868
+ const [contextMenu, setContextMenu] = (0, import_react38.useState)({
19758
19869
  visible: false,
19759
19870
  x: 0,
19760
19871
  y: 0,
19761
19872
  nodeData: null
19762
19873
  });
19763
- const [multiContextMenu, setMultiContextMenu] = (0, import_react37.useState)({
19874
+ const [multiContextMenu, setMultiContextMenu] = (0, import_react38.useState)({
19764
19875
  visible: false,
19765
19876
  x: 0,
19766
19877
  y: 0,
19767
19878
  nodeIds: null
19768
19879
  });
19769
- const [relationshipMenu, setRelationshipMenu] = (0, import_react37.useState)({
19880
+ const [relationshipMenu, setRelationshipMenu] = (0, import_react38.useState)({
19770
19881
  visible: false,
19771
19882
  x: 0,
19772
19883
  y: 0,
19773
19884
  linkObject: null
19774
19885
  });
19775
- const [creationMode, setCreationMode] = (0, import_react37.useState)({
19886
+ const [creationMode, setCreationMode] = (0, import_react38.useState)({
19776
19887
  isActive: false,
19777
19888
  sourceNodeData: null
19778
19889
  });
19779
- const [versionMode, setVersionMode] = (0, import_react37.useState)({
19890
+ const [versionMode, setVersionMode] = (0, import_react38.useState)({
19780
19891
  isActive: false,
19781
19892
  sourceNodeData: null
19782
19893
  });
19783
- const [questMode, setQuestMode] = (0, import_react37.useState)({ isActive: false });
19784
- const [processMode, setProcessMode] = (0, import_react37.useState)({ isActive: false });
19785
- const [hasFocusedInitial, setHasFocusedInitial] = (0, import_react37.useState)(false);
19786
- const [hasOpenedInitialAncestry, setHasOpenedInitialAncestry] = (0, import_react37.useState)(false);
19787
- const [questTreeMode, setQuestTreeMode] = (0, import_react37.useState)({
19894
+ const [questMode, setQuestMode] = (0, import_react38.useState)({ isActive: false });
19895
+ const [processMode, setProcessMode] = (0, import_react38.useState)({ isActive: false });
19896
+ const longPressTimeoutRef = (0, import_react38.useRef)(null);
19897
+ const isLongPressTriggeredRef = (0, import_react38.useRef)(false);
19898
+ const [hasFocusedInitial, setHasFocusedInitial] = (0, import_react38.useState)(false);
19899
+ const [hasOpenedInitialAncestry, setHasOpenedInitialAncestry] = (0, import_react38.useState)(false);
19900
+ const [questTreeMode, setQuestTreeMode] = (0, import_react38.useState)({
19788
19901
  isActive: false,
19789
19902
  questNodeId: null,
19790
19903
  questTempData: null,
@@ -19794,7 +19907,7 @@ function XViewScene({
19794
19907
  isAddingNodes: false,
19795
19908
  isAddingAbstractionNodes: false
19796
19909
  });
19797
- const [processTreeMode, setProcessTreeMode] = (0, import_react37.useState)({
19910
+ const [processTreeMode, setProcessTreeMode] = (0, import_react38.useState)({
19798
19911
  isActive: false,
19799
19912
  processNodeId: null,
19800
19913
  processTempData: null,
@@ -19804,7 +19917,7 @@ function XViewScene({
19804
19917
  isAddingNodes: false,
19805
19918
  isAddingAbstractionNodes: false
19806
19919
  });
19807
- const [ancestryMode, setAncestryMode] = (0, import_react37.useState)({
19920
+ const [ancestryMode, setAncestryMode] = (0, import_react38.useState)({
19808
19921
  isActive: false,
19809
19922
  tree: null,
19810
19923
  selectedParentId: null,
@@ -19815,45 +19928,45 @@ function XViewScene({
19815
19928
  ancestryDescriptionSections: [],
19816
19929
  isAddingNodes: false
19817
19930
  });
19818
- const [readingMode, setReadingMode] = (0, import_react37.useState)({
19931
+ const [readingMode, setReadingMode] = (0, import_react38.useState)({
19819
19932
  isActive: false,
19820
19933
  ancestry: null,
19821
19934
  branchStack: [],
19822
19935
  autoAbstraction: false
19823
19936
  });
19824
- const [formPosition, setFormPosition] = (0, import_react37.useState)({
19937
+ const [formPosition, setFormPosition] = (0, import_react38.useState)({
19825
19938
  left: 16,
19826
19939
  top: 16,
19827
19940
  opacity: 0
19828
19941
  });
19829
- const [detailsNode, setDetailsNode] = (0, import_react37.useState)(null);
19830
- const [detailsLink, setDetailsLink] = (0, import_react37.useState)(null);
19831
- const [ancestryLinkDetails, setAncestryLinkDetails] = (0, import_react37.useState)(null);
19832
- const [imageViewer, setImageViewer] = (0, import_react37.useState)({
19942
+ const [detailsNode, setDetailsNode] = (0, import_react38.useState)(null);
19943
+ const [detailsLink, setDetailsLink] = (0, import_react38.useState)(null);
19944
+ const [ancestryLinkDetails, setAncestryLinkDetails] = (0, import_react38.useState)(null);
19945
+ const [imageViewer, setImageViewer] = (0, import_react38.useState)({
19833
19946
  visible: false,
19834
19947
  images: [],
19835
19948
  startIndex: 0
19836
19949
  });
19837
- const [editingAncestryRel, setEditingAncestryRel] = (0, import_react37.useState)({
19950
+ const [editingAncestryRel, setEditingAncestryRel] = (0, import_react38.useState)({
19838
19951
  visible: false,
19839
19952
  data: null,
19840
19953
  path: null
19841
19954
  });
19842
- const [isImportModalOpen, setIsImportModalOpen] = (0, import_react37.useState)(false);
19843
- const [importSuccessMessage, setImportSuccessMessage] = (0, import_react37.useState)("");
19844
- const [invalidTargetError, setInvalidTargetError] = (0, import_react37.useState)(null);
19845
- const [highlightedNodeId, setHighlightedNodeId] = (0, import_react37.useState)(null);
19846
- const [isBoardsOpen, setIsBoardsOpen] = (0, import_react37.useState)(false);
19847
- const [boardItems, setBoardItems] = (0, import_react37.useState)([]);
19848
- const [isSidebarOpen, setIsSidebarOpen] = (0, import_react37.useState)(false);
19849
- const [isMilestoneManagerOpen, setIsMilestoneManagerOpen] = (0, import_react37.useState)(false);
19850
- const [nodeCounter, setNodeCounter] = (0, import_react37.useState)(0);
19851
- const [isUpgradeModalOpen, setIsUpgradeModalOpen] = (0, import_react37.useState)(false);
19852
- const [nodeLimit, setNodeLimit] = (0, import_react37.useState)(100);
19853
- const mountRef = (0, import_react37.useRef)(null);
19854
- const tooltipRef = (0, import_react37.useRef)(null);
19855
- const formRef = (0, import_react37.useRef)(null);
19856
- const stateRef = (0, import_react37.useRef)({
19955
+ const [isImportModalOpen, setIsImportModalOpen] = (0, import_react38.useState)(false);
19956
+ const [importSuccessMessage, setImportSuccessMessage] = (0, import_react38.useState)("");
19957
+ const [invalidTargetError, setInvalidTargetError] = (0, import_react38.useState)(null);
19958
+ const [highlightedNodeId, setHighlightedNodeId] = (0, import_react38.useState)(null);
19959
+ const [isBoardsOpen, setIsBoardsOpen] = (0, import_react38.useState)(false);
19960
+ const [boardItems, setBoardItems] = (0, import_react38.useState)([]);
19961
+ const [isSidebarOpen, setIsSidebarOpen] = (0, import_react38.useState)(false);
19962
+ const [isMilestoneManagerOpen, setIsMilestoneManagerOpen] = (0, import_react38.useState)(false);
19963
+ const [nodeCounter, setNodeCounter] = (0, import_react38.useState)(0);
19964
+ const [isUpgradeModalOpen, setIsUpgradeModalOpen] = (0, import_react38.useState)(false);
19965
+ const [nodeLimit, setNodeLimit] = (0, import_react38.useState)(100);
19966
+ const mountRef = (0, import_react38.useRef)(null);
19967
+ const tooltipRef = (0, import_react38.useRef)(null);
19968
+ const formRef = (0, import_react38.useRef)(null);
19969
+ const stateRef = (0, import_react38.useRef)({
19857
19970
  readMode: {
19858
19971
  currentMaxIndex: 0,
19859
19972
  progressMap: {}
@@ -19938,16 +20051,16 @@ function XViewScene({
19938
20051
  minWidth: 320,
19939
20052
  maxWidth: maxReadPanelW
19940
20053
  });
19941
- (0, import_react37.useEffect)(() => {
20054
+ (0, import_react38.useEffect)(() => {
19942
20055
  stateRef.current.ancestry = ancestryMode;
19943
20056
  }, [ancestryMode]);
19944
- (0, import_react37.useEffect)(() => {
20057
+ (0, import_react38.useEffect)(() => {
19945
20058
  stateRef.current.questTree = questTreeMode;
19946
20059
  }, [questTreeMode]);
19947
- (0, import_react37.useEffect)(() => {
20060
+ (0, import_react38.useEffect)(() => {
19948
20061
  stateRef.current.processTree = processTreeMode;
19949
20062
  }, [processTreeMode]);
19950
- (0, import_react37.useEffect)(() => {
20063
+ (0, import_react38.useEffect)(() => {
19951
20064
  var _a2, _b2;
19952
20065
  if (!isInitialized) return;
19953
20066
  const map = /* @__PURE__ */ new Map();
@@ -19972,11 +20085,10 @@ function XViewScene({
19972
20085
  }
19973
20086
  stateRef.current.nodeIdToParentFileMap = map;
19974
20087
  }, [isInitialized, sceneVersion]);
19975
- const handleNavigateBack = (0, import_react37.useCallback)(() => {
20088
+ const handleNavigateBack = (0, import_react38.useCallback)(() => {
19976
20089
  const type = viewParams == null ? void 0 : viewParams.type;
19977
20090
  const tab = type === "database" ? "datasets" : "views";
19978
20091
  const targetUrl = `/dashboard/xview?tab=${tab}`;
19979
- console.log("X-View: Navegando para o Dashboard", { type, tab, targetUrl });
19980
20092
  try {
19981
20093
  router.push(targetUrl);
19982
20094
  } catch (e) {
@@ -19984,7 +20096,7 @@ function XViewScene({
19984
20096
  window.location.href = targetUrl;
19985
20097
  }
19986
20098
  }, [router, viewParams]);
19987
- const handleConfirmImport = (0, import_react37.useCallback)(
20099
+ const handleConfirmImport = (0, import_react38.useCallback)(
19988
20100
  async (importPayload) => {
19989
20101
  var _a2, _b2;
19990
20102
  let files = [];
@@ -20109,7 +20221,7 @@ function XViewScene({
20109
20221
  add_new_parent_file_to_scene_at_firebase_action
20110
20222
  ]
20111
20223
  );
20112
- const handleSaveConfig = (0, import_react37.useCallback)(
20224
+ const handleSaveConfig = (0, import_react38.useCallback)(
20113
20225
  async (newConfig) => {
20114
20226
  if (!sceneDataRef.current || !save_view_data || !sceneSaveUrl) return;
20115
20227
  const updatedData = {
@@ -20129,7 +20241,7 @@ function XViewScene({
20129
20241
  const handleOpenImageViewer = (images, startIndex) => {
20130
20242
  setImageViewer({ visible: true, images, startIndex });
20131
20243
  };
20132
- const tweenToTarget = (0, import_react37.useCallback)(
20244
+ const tweenToTarget = (0, import_react38.useCallback)(
20133
20245
  (target, zoomFactor = 1, forcedDirection = null) => {
20134
20246
  const {
20135
20247
  camera: sceneCamera,
@@ -20159,7 +20271,7 @@ function XViewScene({
20159
20271
  if (!t || typeof t.closest !== "function") return false;
20160
20272
  return !!t.closest(".ui-overlay");
20161
20273
  };
20162
- const buildFullAncestryTree = (0, import_react37.useCallback)(
20274
+ const buildFullAncestryTree = (0, import_react38.useCallback)(
20163
20275
  (idTree, nodes, ancestries = []) => {
20164
20276
  if (!idTree) return null;
20165
20277
  const nodeMap = new Map(nodes.map((n) => [String(n.id), n]));
@@ -20246,7 +20358,7 @@ function XViewScene({
20246
20358
  },
20247
20359
  []
20248
20360
  );
20249
- const handleActivateTimeline = (0, import_react37.useCallback)(() => {
20361
+ const handleActivateTimeline = (0, import_react38.useCallback)(() => {
20250
20362
  const { nodeObjects, tweenGroup, timelineIntervalsGroup } = stateRef.current;
20251
20363
  if (!nodeObjects || !tweenGroup || !timelineIntervalsGroup) return;
20252
20364
  while (timelineIntervalsGroup.children.length > 0) {
@@ -20399,7 +20511,7 @@ function XViewScene({
20399
20511
  tweenToTarget(center, zoomFactor);
20400
20512
  }
20401
20513
  }, [tweenToTarget]);
20402
- const handleVersionTimeline = (0, import_react37.useCallback)(
20514
+ const handleVersionTimeline = (0, import_react38.useCallback)(
20403
20515
  (sourceMesh, versionMeshes) => {
20404
20516
  const { tweenGroup, timelineIntervalsGroup } = stateRef.current;
20405
20517
  if (!tweenGroup || !timelineIntervalsGroup || versionMeshes.length === 0)
@@ -20548,7 +20660,7 @@ function XViewScene({
20548
20660
  },
20549
20661
  [tweenToTarget]
20550
20662
  );
20551
- (0, import_react37.useEffect)(() => {
20663
+ (0, import_react38.useEffect)(() => {
20552
20664
  async function fetchAllData(configPath, ownerId2) {
20553
20665
  var _a2, _b2;
20554
20666
  if (!get_scene_view_data) {
@@ -20599,18 +20711,6 @@ function XViewScene({
20599
20711
  };
20600
20712
  parentDataRef.current = sceneResponse.data.parent;
20601
20713
  ancestryDataRef.current = sceneResponse.data.ancestry;
20602
- console.log(
20603
- "Console de sceneResponse.data.scene:",
20604
- sceneDataRef.current
20605
- );
20606
- console.log(
20607
- "Console de sceneResponse.data.parent:",
20608
- parentDataRef.current
20609
- );
20610
- console.log(
20611
- "Console de sceneResponse.data.ancestry:",
20612
- ancestryDataRef.current
20613
- );
20614
20714
  setNodeCounter(sceneResponse.data.node_counter || 0);
20615
20715
  if (sceneResponse.data.node_limit !== void 0) {
20616
20716
  setNodeLimit(sceneResponse.data.node_limit);
@@ -20658,12 +20758,12 @@ function XViewScene({
20658
20758
  focusNodeId,
20659
20759
  focusAncestryId
20660
20760
  ]);
20661
- const isNodeInView = (0, import_react37.useCallback)((id) => {
20761
+ const isNodeInView = (0, import_react38.useCallback)((id) => {
20662
20762
  const key = String(id);
20663
20763
  const objs = stateRef.current.nodeObjects || {};
20664
20764
  return !!objs[key];
20665
20765
  }, []);
20666
- const addOrUpdateNodeMesh = (0, import_react37.useCallback)(
20766
+ const addOrUpdateNodeMesh = (0, import_react38.useCallback)(
20667
20767
  (nodeData, position, suppressVersionUpdate = false, forceShowQuestDate = false, isTemplate = false) => {
20668
20768
  const {
20669
20769
  graphGroup,
@@ -20705,7 +20805,7 @@ function XViewScene({
20705
20805
  },
20706
20806
  []
20707
20807
  );
20708
- const handleActivateReshapeLens = (0, import_react37.useCallback)(
20808
+ const handleActivateReshapeLens = (0, import_react38.useCallback)(
20709
20809
  ({ type, columns, centerNodeId }) => {
20710
20810
  const { nodeObjects, tweenGroup, camera, controls } = stateRef.current;
20711
20811
  if (!nodeObjects || !tweenGroup || !camera || !controls) return;
@@ -20839,7 +20939,7 @@ function XViewScene({
20839
20939
  },
20840
20940
  []
20841
20941
  );
20842
- const handleActivateQuestLens = (0, import_react37.useCallback)(
20942
+ const handleActivateQuestLens = (0, import_react38.useCallback)(
20843
20943
  ({ assigneeId, status: status2, milestoneId }) => {
20844
20944
  var _a2;
20845
20945
  const { nodeObjects, tweenGroup, graphGroup } = stateRef.current;
@@ -21061,7 +21161,7 @@ function XViewScene({
21061
21161
  },
21062
21162
  [addOrUpdateNodeMesh]
21063
21163
  );
21064
- (0, import_react37.useEffect)(() => {
21164
+ (0, import_react38.useEffect)(() => {
21065
21165
  if (!isInitialized || !sceneDataRef.current) return;
21066
21166
  const currentMount = mountRef.current;
21067
21167
  if (!currentMount) return;
@@ -21090,11 +21190,17 @@ function XViewScene({
21090
21190
  renderer.outputColorSpace = THREE3.SRGBColorSpace;
21091
21191
  renderer.toneMapping = THREE3.ACESFilmicToneMapping;
21092
21192
  renderer.toneMappingExposure = 1.2;
21193
+ currentMount.style.touchAction = "none";
21194
+ renderer.domElement.style.touchAction = "none";
21093
21195
  currentMount.appendChild(renderer.domElement);
21094
21196
  stateRef.current.renderer = renderer;
21095
21197
  const controls = new import_OrbitControls.OrbitControls(camera, renderer.domElement);
21096
21198
  controls.enableDamping = true;
21097
21199
  controls.dampingFactor = 0.05;
21200
+ controls.touches = {
21201
+ ONE: THREE3.TOUCH.ROTATE,
21202
+ TWO: THREE3.TOUCH.DOLLY_PAN
21203
+ };
21098
21204
  stateRef.current.controls = controls;
21099
21205
  scene.add(new THREE3.AmbientLight(16777215, 0.1));
21100
21206
  const directionalLight = new THREE3.DirectionalLight(16777215, 0.2);
@@ -21319,21 +21425,58 @@ function XViewScene({
21319
21425
  stateRef.current.dragCandidate = null;
21320
21426
  return;
21321
21427
  }
21322
- if (event.button !== 0) return;
21428
+ if (event.button !== 0 && event.pointerType !== "touch") return;
21323
21429
  if (picked && !stateRef.current.ancestry.isActive) {
21324
21430
  stateRef.current.controls.enabled = false;
21325
21431
  }
21326
21432
  stateRef.current.pointerDown = {
21327
21433
  isDown: true,
21328
21434
  x: event.clientX,
21329
- y: event.clientY
21435
+ y: event.clientY,
21436
+ pointerType: event.pointerType
21330
21437
  };
21331
21438
  stateRef.current.dragCandidate = picked;
21439
+ if (event.pointerType === "touch" || event.pointerType === "pen") {
21440
+ if (longPressTimeoutRef.current) {
21441
+ clearTimeout(longPressTimeoutRef.current);
21442
+ }
21443
+ isLongPressTriggeredRef.current = false;
21444
+ if (picked) {
21445
+ const touchX = event.clientX;
21446
+ const touchY = event.clientY;
21447
+ longPressTimeoutRef.current = setTimeout(() => {
21448
+ isLongPressTriggeredRef.current = true;
21449
+ if (typeof navigator !== "undefined" && navigator.vibrate) {
21450
+ navigator.vibrate(40);
21451
+ }
21452
+ setContextMenu({
21453
+ visible: true,
21454
+ x: touchX,
21455
+ y: touchY,
21456
+ nodeData: picked.userData
21457
+ });
21458
+ setMultiContextMenu((prev) => ({ ...prev, visible: false }));
21459
+ setRelationshipMenu((prev) => ({ ...prev, visible: false }));
21460
+ setDetailsNode(null);
21461
+ }, 450);
21462
+ }
21463
+ }
21332
21464
  }
21333
21465
  function onPointerMove(event) {
21334
21466
  if (stateRef.current.camera) stateRef.current.camera.layers.enableAll();
21335
21467
  if (isFromUiOverlay(event)) return;
21336
21468
  setMouseFromEvent(event);
21469
+ if (stateRef.current.pointerDown.isDown) {
21470
+ const dx = event.clientX - stateRef.current.pointerDown.x;
21471
+ const dy = event.clientY - stateRef.current.pointerDown.y;
21472
+ const dist = Math.hypot(dx, dy);
21473
+ if (dist > (x_view_config.DRAG_THRESHOLD_PX || 5)) {
21474
+ if (longPressTimeoutRef.current) {
21475
+ clearTimeout(longPressTimeoutRef.current);
21476
+ longPressTimeoutRef.current = null;
21477
+ }
21478
+ }
21479
+ }
21337
21480
  if (stateRef.current.isDragging && stateRef.current.draggedNode) {
21338
21481
  const raycaster2 = new THREE3.Raycaster();
21339
21482
  raycaster2.setFromCamera(mouse, camera);
@@ -21376,7 +21519,7 @@ function XViewScene({
21376
21519
  return;
21377
21520
  }
21378
21521
  if (stateRef.current.creation.isActive) return;
21379
- if (stateRef.current.pointerDown.isDown && stateRef.current.dragCandidate) {
21522
+ if (stateRef.current.pointerDown.isDown && stateRef.current.dragCandidate && !isLongPressTriggeredRef.current) {
21380
21523
  const dx = event.clientX - stateRef.current.pointerDown.x;
21381
21524
  const dy = event.clientY - stateRef.current.pointerDown.y;
21382
21525
  if (Math.hypot(dx, dy) > x_view_config.DRAG_THRESHOLD_PX) {
@@ -21408,6 +21551,17 @@ function XViewScene({
21408
21551
  async function onPointerUp(event) {
21409
21552
  var _a2, _b2, _c2;
21410
21553
  if (stateRef.current.camera) stateRef.current.camera.layers.enableAll();
21554
+ if (longPressTimeoutRef.current) {
21555
+ clearTimeout(longPressTimeoutRef.current);
21556
+ longPressTimeoutRef.current = null;
21557
+ }
21558
+ if (isLongPressTriggeredRef.current) {
21559
+ isLongPressTriggeredRef.current = false;
21560
+ stateRef.current.pointerDown.isDown = false;
21561
+ stateRef.current.dragCandidate = null;
21562
+ stateRef.current.controls.enabled = true;
21563
+ return;
21564
+ }
21411
21565
  if (isFromUiOverlay(event)) return;
21412
21566
  const {
21413
21567
  connection,
@@ -21642,7 +21796,7 @@ function XViewScene({
21642
21796
  stateRef.current.dragCandidate = null;
21643
21797
  return;
21644
21798
  }
21645
- if (event.button === 0 && !stateRef.current.creation.isActive && stateRef.current.pointerDown.isDown) {
21799
+ if ((event.button === 0 || event.pointerType === "touch") && !stateRef.current.creation.isActive && stateRef.current.pointerDown.isDown) {
21646
21800
  setMouseFromEvent(event);
21647
21801
  const clickedNode = stateRef.current.dragCandidate || tryPickNode();
21648
21802
  stateRef.current.dragCandidate = null;
@@ -21651,6 +21805,9 @@ function XViewScene({
21651
21805
  stateRef.current.selectedNodes.clear();
21652
21806
  }
21653
21807
  if (clickedNode) {
21808
+ setContextMenu((prev) => prev.visible ? { ...prev, visible: false } : prev);
21809
+ setMultiContextMenu((prev) => prev.visible ? { ...prev, visible: false } : prev);
21810
+ setRelationshipMenu((prev) => prev.visible ? { ...prev, visible: false } : prev);
21654
21811
  setDetailsNode({ ...clickedNode.userData });
21655
21812
  setDetailsLink(null);
21656
21813
  return;
@@ -21686,6 +21843,14 @@ function XViewScene({
21686
21843
  if (stateRef.current.camera) stateRef.current.camera.layers.enableAll();
21687
21844
  if (isFromUiOverlay(event)) return;
21688
21845
  event.preventDefault();
21846
+ if (longPressTimeoutRef.current) {
21847
+ clearTimeout(longPressTimeoutRef.current);
21848
+ longPressTimeoutRef.current = null;
21849
+ }
21850
+ isLongPressTriggeredRef.current = true;
21851
+ stateRef.current.pointerDown.isDown = false;
21852
+ stateRef.current.dragCandidate = null;
21853
+ setDetailsNode(null);
21689
21854
  if (stateRef.current.creation.isActive || stateRef.current.connection.isActive || stateRef.current.relink.isActive)
21690
21855
  return;
21691
21856
  setMouseFromEvent(event);
@@ -21986,7 +22151,7 @@ function XViewScene({
21986
22151
  get_scene_view_data,
21987
22152
  save_view_data
21988
22153
  ]);
21989
- const handleGhostNodeImageChange = (0, import_react37.useCallback)((useImage, imageUrl) => {
22154
+ const handleGhostNodeImageChange = (0, import_react38.useCallback)((useImage, imageUrl) => {
21990
22155
  const {
21991
22156
  node: ghostNode,
21992
22157
  line: ghostLine,
@@ -22034,7 +22199,7 @@ function XViewScene({
22034
22199
  aura: newGhostNode.getObjectByName("aura")
22035
22200
  };
22036
22201
  }, []);
22037
- const handleGhostNodeIntensityChange = (0, import_react37.useCallback)((newIntensity) => {
22202
+ const handleGhostNodeIntensityChange = (0, import_react38.useCallback)((newIntensity) => {
22038
22203
  const { node: ghostNode, aura: ghostAura } = stateRef.current.ghostElements;
22039
22204
  if (!ghostNode) return;
22040
22205
  const adjustedIntensity = newIntensity + MIN_VISIBILITY_INTENSITY;
@@ -22055,7 +22220,7 @@ function XViewScene({
22055
22220
  ghostAura.material.opacity = Math.min(0.8, newIntensity * 0.15);
22056
22221
  }
22057
22222
  }, []);
22058
- const handleDetailNodeIntensityChange = (0, import_react37.useCallback)(
22223
+ const handleDetailNodeIntensityChange = (0, import_react38.useCallback)(
22059
22224
  (nodeId, newIntensity) => {
22060
22225
  const mesh = stateRef.current.nodeObjects[String(nodeId)];
22061
22226
  if (!mesh) return;
@@ -22211,7 +22376,7 @@ function XViewScene({
22211
22376
  mountRef.current.style.cursor = "default";
22212
22377
  }
22213
22378
  };
22214
- const handleAncestryTreeUpdate = (0, import_react37.useCallback)((newTree, extraData = null) => {
22379
+ const handleAncestryTreeUpdate = (0, import_react38.useCallback)((newTree, extraData = null) => {
22215
22380
  setAncestryMode((prev) => {
22216
22381
  const prevTreeStr = JSON.stringify(prev.tree);
22217
22382
  const newTreeStr = JSON.stringify(newTree);
@@ -22234,7 +22399,7 @@ function XViewScene({
22234
22399
  };
22235
22400
  });
22236
22401
  }, []);
22237
- const actionHandlerContext = (0, import_react37.useMemo)(
22402
+ const actionHandlerContext = (0, import_react38.useMemo)(
22238
22403
  () => {
22239
22404
  var _a2;
22240
22405
  return {
@@ -22346,7 +22511,7 @@ function XViewScene({
22346
22511
  const handleStartVersioning = (nodeData) => {
22347
22512
  userActionHandlers.handleStartVersioning(actionHandlerContext, nodeData);
22348
22513
  };
22349
- const handleStartQuestQuick = (0, import_react37.useCallback)(
22514
+ const handleStartQuestQuick = (0, import_react38.useCallback)(
22350
22515
  (questNode) => {
22351
22516
  var _a2, _b2, _c2, _d2, _e2, _f2;
22352
22517
  if (!questNode || !actionHandlerContext) return;
@@ -22428,7 +22593,7 @@ function XViewScene({
22428
22593
  },
22429
22594
  [session, actionHandlerContext]
22430
22595
  );
22431
- const handleFinishQuestQuick = (0, import_react37.useCallback)(
22596
+ const handleFinishQuestQuick = (0, import_react38.useCallback)(
22432
22597
  (questNode) => {
22433
22598
  var _a2, _b2, _c2, _d2, _e2, _f2, _g2;
22434
22599
  if (!questNode || !actionHandlerContext) return;
@@ -22578,7 +22743,7 @@ function XViewScene({
22578
22743
  },
22579
22744
  [session, actionHandlerContext, viewMembers, detailsNode]
22580
22745
  );
22581
- const handleCancelQuest = (0, import_react37.useCallback)(() => {
22746
+ const handleCancelQuest = (0, import_react38.useCallback)(() => {
22582
22747
  const { graphGroup, ghostElements } = stateRef.current;
22583
22748
  if (ghostElements.node && graphGroup) {
22584
22749
  if (ghostElements.node.userData.labelObject) {
@@ -22600,7 +22765,7 @@ function XViewScene({
22600
22765
  stateRef.current.ghostElements = { node: null, line: null, aura: null };
22601
22766
  setQuestMode({ isActive: false });
22602
22767
  }, []);
22603
- const handleCancelProcess = (0, import_react37.useCallback)(() => {
22768
+ const handleCancelProcess = (0, import_react38.useCallback)(() => {
22604
22769
  const { graphGroup, ghostElements } = stateRef.current;
22605
22770
  if (ghostElements.node && graphGroup) {
22606
22771
  if (ghostElements.node.userData.labelObject) {
@@ -22953,7 +23118,7 @@ function XViewScene({
22953
23118
  alert("Ocorreu um erro ao criar o Processo.");
22954
23119
  }
22955
23120
  };
22956
- const handleClearAncestryVisuals = (0, import_react37.useCallback)((ancestryId) => {
23121
+ const handleClearAncestryVisuals = (0, import_react38.useCallback)((ancestryId) => {
22957
23122
  const { renderedAncestries, ancestryGroup } = stateRef.current;
22958
23123
  const renderIndex = renderedAncestries.findIndex(
22959
23124
  (a) => String(a.id) === String(ancestryId)
@@ -22971,7 +23136,7 @@ function XViewScene({
22971
23136
  );
22972
23137
  }
22973
23138
  }, []);
22974
- const handleRenderAncestry = (0, import_react37.useCallback)(
23139
+ const handleRenderAncestry = (0, import_react38.useCallback)(
22975
23140
  async (ancestryObject, allowedSectionIds = null, activeSectionIdForFocus = null, baseRotation = 0, forceReprocess = true) => {
22976
23141
  setContextMenu(
22977
23142
  (prev) => prev.visible ? { ...prev, visible: false } : prev
@@ -22991,11 +23156,6 @@ function XViewScene({
22991
23156
  }
22992
23157
  });
22993
23158
  }
22994
- console.log("[handleRenderAncestry] Start", {
22995
- ancestryId: ancestryObject.ancestry_id,
22996
- allowedSectionIds: allowedSectionIds ? Array.from(allowedSectionIds) : null,
22997
- activeSectionIdForFocus
22998
- });
22999
23159
  const { ancestryGroup, nodeObjects, renderer, renderedAncestries } = stateRef.current;
23000
23160
  const currentRenderLimit = stateRef.current.maxAncestryRenderIndex || 0;
23001
23161
  const isFullRenderRequest = !normalizedAllowedIds;
@@ -23293,11 +23453,6 @@ function XViewScene({
23293
23453
  let currentAnchorPosition = currentAnchorMesh.userData.id ? targetPositionsCache.get(String(currentAnchorMesh.userData.id)) || currentAnchorMesh.position : currentAnchorMesh.position;
23294
23454
  for (const section of sections) {
23295
23455
  const deveRenderizar = checkShouldRender(section);
23296
- console.log("[handleRenderAncestry] Section check:", {
23297
- id: section.id,
23298
- numericId: section.section_numeric_id,
23299
- deveRenderizar
23300
- });
23301
23456
  if (deveRenderizar) {
23302
23457
  const sectionNodes = section.children || [];
23303
23458
  if (sectionNodes.length > 0) {
@@ -23475,7 +23630,7 @@ function XViewScene({
23475
23630
  ancestryMode.isActive
23476
23631
  ]
23477
23632
  );
23478
- const handleRenderAbstractionTree = (0, import_react37.useCallback)(
23633
+ const handleRenderAbstractionTree = (0, import_react38.useCallback)(
23479
23634
  (ancestryObject, targetNodeId = null, focusNodeId2 = null) => {
23480
23635
  setContextMenu(
23481
23636
  (prev) => prev.visible ? { ...prev, visible: false } : prev
@@ -23584,7 +23739,7 @@ function XViewScene({
23584
23739
  handleClearAncestryVisuals
23585
23740
  ]
23586
23741
  );
23587
- const handleReadModeBranchNav = (0, import_react37.useCallback)(
23742
+ const handleReadModeBranchNav = (0, import_react38.useCallback)(
23588
23743
  (nodeId, action, direction = "right") => {
23589
23744
  const { ancestry, branchStack } = readingMode;
23590
23745
  if (!ancestry || !ancestry.tree) return;
@@ -23762,13 +23917,13 @@ function XViewScene({
23762
23917
  },
23763
23918
  [readingMode, handleRenderAncestry, buildFullAncestryTree, tweenToTarget]
23764
23919
  );
23765
- const handleReadModeHighlight = (0, import_react37.useCallback)((nodeId) => {
23920
+ const handleReadModeHighlight = (0, import_react38.useCallback)((nodeId) => {
23766
23921
  if (stateRef.current.highlightedNodeId !== nodeId) {
23767
23922
  stateRef.current.highlightedNodeId = nodeId;
23768
23923
  }
23769
23924
  setHighlightedNodeId(nodeId);
23770
23925
  }, []);
23771
- const activeNodeBranches = (0, import_react37.useMemo)(() => {
23926
+ const activeNodeBranches = (0, import_react38.useMemo)(() => {
23772
23927
  if (!highlightedNodeId || !readingMode.ancestry || !readingMode.ancestry.tree)
23773
23928
  return null;
23774
23929
  const fullTree = buildFullAncestryTree(
@@ -23812,7 +23967,7 @@ function XViewScene({
23812
23967
  readingMode.branchStack,
23813
23968
  ancestryDataRef.current
23814
23969
  ]);
23815
- const backNavigationInfo = (0, import_react37.useMemo)(() => {
23970
+ const backNavigationInfo = (0, import_react38.useMemo)(() => {
23816
23971
  const { branchStack } = readingMode;
23817
23972
  if (!branchStack || branchStack.length === 0) return null;
23818
23973
  const lastStep = branchStack[branchStack.length - 1];
@@ -23823,7 +23978,7 @@ function XViewScene({
23823
23978
  name: "Voltar para anterior"
23824
23979
  };
23825
23980
  }, [readingMode.branchStack]);
23826
- const getReadModeDisplayContext = (0, import_react37.useMemo)(() => {
23981
+ const getReadModeDisplayContext = (0, import_react38.useMemo)(() => {
23827
23982
  const { ancestry, branchStack } = readingMode;
23828
23983
  if (!ancestry) return null;
23829
23984
  if (branchStack.length === 0) {
@@ -23866,7 +24021,7 @@ function XViewScene({
23866
24021
  customProperties: branchProps
23867
24022
  };
23868
24023
  }, [readingMode, buildFullAncestryTree, ancestryDataRef.current]);
23869
- const readModeAbstractionTree = (0, import_react37.useMemo)(() => {
24024
+ const readModeAbstractionTree = (0, import_react38.useMemo)(() => {
23870
24025
  if (!readingMode.isActive || !readingMode.ancestry || !readingMode.ancestry.abstraction_tree) {
23871
24026
  return null;
23872
24027
  }
@@ -23885,7 +24040,7 @@ function XViewScene({
23885
24040
  buildFullAncestryTree,
23886
24041
  sceneVersion
23887
24042
  ]);
23888
- const handleStartReadingAncestry = (0, import_react37.useCallback)(
24043
+ const handleStartReadingAncestry = (0, import_react38.useCallback)(
23889
24044
  async (ancestryObject, renderMode = "full") => {
23890
24045
  setContextMenu(
23891
24046
  (prev) => prev.visible ? { ...prev, visible: false } : prev
@@ -23928,7 +24083,7 @@ function XViewScene({
23928
24083
  },
23929
24084
  [handleRenderAncestry, handleRenderAbstractionTree]
23930
24085
  );
23931
- const handleReadModeSectionChange = (0, import_react37.useCallback)(
24086
+ const handleReadModeSectionChange = (0, import_react38.useCallback)(
23932
24087
  (activeSectionId) => {
23933
24088
  const { ancestry, branchStack } = readingMode;
23934
24089
  if (!ancestry || !readingMode.isActive) return;
@@ -24013,10 +24168,10 @@ function XViewScene({
24013
24168
  ancestryDataRef.current
24014
24169
  ]
24015
24170
  );
24016
- const handleCloseReadMode = (0, import_react37.useCallback)(() => {
24171
+ const handleCloseReadMode = (0, import_react38.useCallback)(() => {
24017
24172
  setReadingMode({ isActive: false, ancestry: null, branchStack: [] });
24018
24173
  }, []);
24019
- const handleAncestrySectionChange = (0, import_react37.useCallback)(
24174
+ const handleAncestrySectionChange = (0, import_react38.useCallback)(
24020
24175
  (activeSectionId, ancestryOverride = null, rotation = 0) => {
24021
24176
  var _a2, _b2;
24022
24177
  const currentMode = stateRef.current.ancestry;
@@ -24078,7 +24233,7 @@ function XViewScene({
24078
24233
  },
24079
24234
  [handleRenderAncestry]
24080
24235
  );
24081
- const handleEditAncestry = (0, import_react37.useCallback)(
24236
+ const handleEditAncestry = (0, import_react38.useCallback)(
24082
24237
  async (ancestryObject) => {
24083
24238
  setContextMenu(
24084
24239
  (prev) => prev.visible ? { ...prev, visible: false } : prev
@@ -24133,7 +24288,7 @@ function XViewScene({
24133
24288
  const handleSelectAncestryParent = (nodeId) => {
24134
24289
  setAncestryMode((prev) => ({ ...prev, selectedParentId: nodeId }));
24135
24290
  };
24136
- const handleRemoveFromAncestry = (0, import_react37.useCallback)((pathToRemove) => {
24291
+ const handleRemoveFromAncestry = (0, import_react38.useCallback)((pathToRemove) => {
24137
24292
  if (!Array.isArray(pathToRemove) || pathToRemove.length === 0) {
24138
24293
  console.warn("Tentativa de remover a raiz ou caminho inv\xE1lido.");
24139
24294
  return;
@@ -24158,17 +24313,11 @@ function XViewScene({
24158
24313
  return { ...prev, tree: newTree };
24159
24314
  });
24160
24315
  }, []);
24161
- const handleSaveAncestry = (0, import_react37.useCallback)(
24316
+ const handleSaveAncestry = (0, import_react38.useCallback)(
24162
24317
  async (ancestryName, ancestryDescription, ancestrySections, keepOpen = false, treeOverride = null, ancestryCustomProps = {}) => {
24163
- var _a2, _b2;
24318
+ var _a2;
24164
24319
  const treeToUse = treeOverride || ancestryMode.tree;
24165
24320
  const { isEditMode, currentAncestryId } = ancestryMode;
24166
- console.log("[handleSaveAncestry] received:", {
24167
- name: ancestryName,
24168
- descLength: ancestryDescription == null ? void 0 : ancestryDescription.length,
24169
- sectionsCount: ancestrySections == null ? void 0 : ancestrySections.length,
24170
- treeRoot: (_a2 = treeToUse.node) == null ? void 0 : _a2.id
24171
- });
24172
24321
  if (!treeToUse || !treeToUse.node) {
24173
24322
  alert(
24174
24323
  "Erro: A estrutura da ancestralidade \xE9 inv\xE1lida (Node raiz ausente)."
@@ -24373,7 +24522,7 @@ function XViewScene({
24373
24522
  currentAncestryId: ancestryObjectToSave.ancestry_id
24374
24523
  }));
24375
24524
  }
24376
- if (readingMode.isActive && ((_b2 = readingMode.ancestry) == null ? void 0 : _b2.ancestry_id) === ancestryObjectToSave.ancestry_id) {
24525
+ if (readingMode.isActive && ((_a2 = readingMode.ancestry) == null ? void 0 : _a2.ancestry_id) === ancestryObjectToSave.ancestry_id) {
24377
24526
  setReadingMode((prev) => ({
24378
24527
  ...prev,
24379
24528
  ancestry: ancestryObjectToSave
@@ -24432,7 +24581,7 @@ function XViewScene({
24432
24581
  });
24433
24582
  setEditingAncestryRel({ visible: false, data: null, path: null });
24434
24583
  };
24435
- const handleDeleteAncestry = (0, import_react37.useCallback)(
24584
+ const handleDeleteAncestry = (0, import_react38.useCallback)(
24436
24585
  async (ancestryIdToDelete) => {
24437
24586
  if (!ancestryIdToDelete) {
24438
24587
  alert("ID da ancestralidade n\xE3o encontrado.");
@@ -24566,19 +24715,19 @@ function XViewScene({
24566
24715
  },
24567
24716
  [save_view_data, delete_file_action]
24568
24717
  );
24569
- const handleOpenBoards = (0, import_react37.useCallback)(() => {
24718
+ const handleOpenBoards = (0, import_react38.useCallback)(() => {
24570
24719
  setIsBoardsOpen(true);
24571
24720
  }, []);
24572
- const allAvailableNodes = (0, import_react37.useMemo)(() => {
24721
+ const allAvailableNodes = (0, import_react38.useMemo)(() => {
24573
24722
  if (!parentDataRef.current) return [];
24574
24723
  return Object.values(parentDataRef.current).flatMap(
24575
24724
  (fileData) => fileData.nodes || []
24576
24725
  );
24577
24726
  }, [sceneVersion, isInitialized]);
24578
- const allAvailableAncestries = (0, import_react37.useMemo)(() => {
24727
+ const allAvailableAncestries = (0, import_react38.useMemo)(() => {
24579
24728
  return ancestryDataRef.current || [];
24580
24729
  }, [sceneVersion, isInitialized]);
24581
- const handleFocusNode = (0, import_react37.useCallback)(
24730
+ const handleFocusNode = (0, import_react38.useCallback)(
24582
24731
  (nodeData) => {
24583
24732
  var _a2;
24584
24733
  if (!nodeData) return;
@@ -24594,7 +24743,7 @@ function XViewScene({
24594
24743
  },
24595
24744
  [tweenToTarget]
24596
24745
  );
24597
- const handleOpenReference = (0, import_react37.useCallback)(
24746
+ const handleOpenReference = (0, import_react38.useCallback)(
24598
24747
  (referenceData) => {
24599
24748
  const { type, id } = referenceData;
24600
24749
  if (type === "node") {
@@ -24630,7 +24779,7 @@ function XViewScene({
24630
24779
  handleFocusNode
24631
24780
  ]
24632
24781
  );
24633
- const handleSelectAncestryFromBoard = (0, import_react37.useCallback)(
24782
+ const handleSelectAncestryFromBoard = (0, import_react38.useCallback)(
24634
24783
  (item) => {
24635
24784
  setIsBoardsOpen(false);
24636
24785
  setIsSidebarOpen(false);
@@ -24642,7 +24791,7 @@ function XViewScene({
24642
24791
  },
24643
24792
  [handleStartReadingAncestry, handleOpenReference]
24644
24793
  );
24645
- const handleSaveBoards = (0, import_react37.useCallback)(
24794
+ const handleSaveBoards = (0, import_react38.useCallback)(
24646
24795
  async (boardItems2) => {
24647
24796
  if (!sceneConfigId || !viewParams || !session) return;
24648
24797
  const sceneType = (viewParams.type || "").toLowerCase().includes("database") ? "database" : "view";
@@ -24656,7 +24805,7 @@ function XViewScene({
24656
24805
  },
24657
24806
  [sceneConfigId, viewParams, session, save_boards_action, ownerId]
24658
24807
  );
24659
- const existingNodeTypes = (0, import_react37.useMemo)(() => {
24808
+ const existingNodeTypes = (0, import_react38.useMemo)(() => {
24660
24809
  if (!parentDataRef.current) {
24661
24810
  return [];
24662
24811
  }
@@ -24668,7 +24817,7 @@ function XViewScene({
24668
24817
  ).filter((t) => Boolean(t) && String(t).toLowerCase() !== "quest");
24669
24818
  return [...new Set(allTypes)];
24670
24819
  }, [parentDataRef.current, sceneVersion]);
24671
- const searchableDbNodes = (0, import_react37.useMemo)(() => {
24820
+ const searchableDbNodes = (0, import_react38.useMemo)(() => {
24672
24821
  if (!parentDataRef.current) {
24673
24822
  return [];
24674
24823
  }
@@ -24683,7 +24832,7 @@ function XViewScene({
24683
24832
  return !((_a2 = node.version_node) == null ? void 0 : _a2.is_version);
24684
24833
  });
24685
24834
  }, [parentDataRef.current, sceneVersion]);
24686
- const handleAddExistingNode = (0, import_react37.useCallback)(
24835
+ const handleAddExistingNode = (0, import_react38.useCallback)(
24687
24836
  (nodeId) => {
24688
24837
  return userActionHandlers.handleAddExistingNodeById(
24689
24838
  actionHandlerContext,
@@ -24692,7 +24841,7 @@ function XViewScene({
24692
24841
  },
24693
24842
  [actionHandlerContext]
24694
24843
  );
24695
- const handleUpdateMilestones = (0, import_react37.useCallback)(
24844
+ const handleUpdateMilestones = (0, import_react38.useCallback)(
24696
24845
  async (newMilestones) => {
24697
24846
  var _a2, _b2, _c2;
24698
24847
  if (!sceneDataRef.current) return;
@@ -24719,7 +24868,7 @@ function XViewScene({
24719
24868
  },
24720
24869
  [sceneConfigId, sceneSaveUrl, save_view_data, viewParams == null ? void 0 : viewParams.type]
24721
24870
  );
24722
- const handleSaveCurrentView = (0, import_react37.useCallback)(async () => {
24871
+ const handleSaveCurrentView = (0, import_react38.useCallback)(async () => {
24723
24872
  var _a2;
24724
24873
  const { nodeObjects, allLinks } = stateRef.current;
24725
24874
  if (!nodeObjects || !allLinks || !sceneSaveUrl || !parentDataRef.current) {
@@ -24758,13 +24907,13 @@ function XViewScene({
24758
24907
  console.error("Erro na chamada de save_view_data:", error);
24759
24908
  }
24760
24909
  }, [sceneSaveUrl, save_view_data, sceneConfigId, viewParams == null ? void 0 : viewParams.type]);
24761
- const handleToggleAncestryAddMode = (0, import_react37.useCallback)(() => {
24910
+ const handleToggleAncestryAddMode = (0, import_react38.useCallback)(() => {
24762
24911
  setAncestryMode((prev) => ({
24763
24912
  ...prev,
24764
24913
  isAddingNodes: !prev.isAddingNodes
24765
24914
  }));
24766
24915
  }, []);
24767
- const availableDatasets = (0, import_react37.useMemo)(() => {
24916
+ const availableDatasets = (0, import_react38.useMemo)(() => {
24768
24917
  if (!sceneDataRef.current || !parentDataRef.current) return [];
24769
24918
  return sceneDataRef.current.parent_dbs.map((db) => {
24770
24919
  var _a2;
@@ -24778,7 +24927,7 @@ function XViewScene({
24778
24927
  String(creationMode.sourceNodeData.id)
24779
24928
  )) == null ? void 0 : _b.parentFileId : null;
24780
24929
  const detailsNodeDatasetInfo = detailsNode ? stateRef.current.nodeIdToParentFileMap.get(String(detailsNode.id)) : null;
24781
- (0, import_react37.useEffect)(() => {
24930
+ (0, import_react38.useEffect)(() => {
24782
24931
  if (!isInitialized || hasFocusedInitial) return;
24783
24932
  const nodeObjects = stateRef.current.nodeObjects || {};
24784
24933
  if (focusNodeId) {
@@ -24825,7 +24974,7 @@ function XViewScene({
24825
24974
  hasFocusedInitial,
24826
24975
  tweenToTarget
24827
24976
  ]);
24828
- (0, import_react37.useEffect)(() => {
24977
+ (0, import_react38.useEffect)(() => {
24829
24978
  if (isInitialized && focusAncestryId && !hasOpenedInitialAncestry) {
24830
24979
  const ancestries = ancestryDataRef.current || [];
24831
24980
  const targetAncestry = ancestries.find(
@@ -24850,7 +24999,7 @@ function XViewScene({
24850
24999
  hasOpenedInitialAncestry,
24851
25000
  handleStartReadingAncestry
24852
25001
  ]);
24853
- (0, import_react37.useEffect)(() => {
25002
+ (0, import_react38.useEffect)(() => {
24854
25003
  function handleKeyDown(event) {
24855
25004
  var _a2, _b2, _c2, _d2, _e2, _f2;
24856
25005
  const context = actionHandlerContext;
@@ -25073,7 +25222,7 @@ function XViewScene({
25073
25222
  // <-- handleCancelQuest adicionado aqui
25074
25223
  ]);
25075
25224
  if (isLoading || status === "loading" || permissionStatus === "loading") {
25076
- return /* @__PURE__ */ import_react37.default.createElement(LoadingScreen, null);
25225
+ return /* @__PURE__ */ import_react38.default.createElement(LoadingScreen, null);
25077
25226
  }
25078
25227
  const overlayHiddenStyle = questTreeMode.isActive || processTreeMode.isActive ? {
25079
25228
  opacity: 0,
@@ -25082,7 +25231,7 @@ function XViewScene({
25082
25231
  transition: "all 300ms ease-in-out"
25083
25232
  } : {};
25084
25233
  if (permissionStatus === "corrupted") {
25085
- return /* @__PURE__ */ import_react37.default.createElement("div", { className: "flex flex-col items-center justify-center min-h-screen w-full bg-slate-950 text-white" }, /* @__PURE__ */ import_react37.default.createElement("div", { className: "bg-slate-900/50 p-8 rounded-2xl border border-slate-800 shadow-2xl text-center max-w-md animate-fade-in" }, /* @__PURE__ */ import_react37.default.createElement("div", { className: "mb-4 text-amber-500" }, /* @__PURE__ */ import_react37.default.createElement(
25234
+ return /* @__PURE__ */ import_react38.default.createElement("div", { className: "flex flex-col items-center justify-center min-h-screen w-full bg-slate-950 text-white" }, /* @__PURE__ */ import_react38.default.createElement("div", { className: "bg-slate-900/50 p-8 rounded-2xl border border-slate-800 shadow-2xl text-center max-w-md animate-fade-in" }, /* @__PURE__ */ import_react38.default.createElement("div", { className: "mb-4 text-amber-500" }, /* @__PURE__ */ import_react38.default.createElement(
25086
25235
  "svg",
25087
25236
  {
25088
25237
  xmlns: "http://www.w3.org/2000/svg",
@@ -25092,7 +25241,7 @@ function XViewScene({
25092
25241
  stroke: "currentColor",
25093
25242
  className: "w-16 h-16 mx-auto"
25094
25243
  },
25095
- /* @__PURE__ */ import_react37.default.createElement(
25244
+ /* @__PURE__ */ import_react38.default.createElement(
25096
25245
  "path",
25097
25246
  {
25098
25247
  strokeLinecap: "round",
@@ -25100,13 +25249,13 @@ function XViewScene({
25100
25249
  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"
25101
25250
  }
25102
25251
  )
25103
- )), /* @__PURE__ */ import_react37.default.createElement("h2", { className: "text-2xl font-bold mb-2" }, "Link Inv\xE1lido"), /* @__PURE__ */ import_react37.default.createElement("p", { className: "text-slate-400 mb-6" }, "O link de acesso a este cen\xE1rio est\xE1 corrompido, incompleto ou foi alterado de forma incorreta. Por favor, verifique a URL ou retorne ao dashboard."), /* @__PURE__ */ import_react37.default.createElement(
25252
+ )), /* @__PURE__ */ import_react38.default.createElement("h2", { className: "text-2xl font-bold mb-2" }, "Link Inv\xE1lido"), /* @__PURE__ */ import_react38.default.createElement("p", { className: "text-slate-400 mb-6" }, "O link de acesso a este cen\xE1rio est\xE1 corrompido, incompleto ou foi alterado de forma incorreta. Por favor, verifique a URL ou retorne ao dashboard."), /* @__PURE__ */ import_react38.default.createElement(
25104
25253
  "button",
25105
25254
  {
25106
25255
  onClick: handleNavigateBack,
25107
25256
  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"
25108
25257
  },
25109
- /* @__PURE__ */ import_react37.default.createElement(
25258
+ /* @__PURE__ */ import_react38.default.createElement(
25110
25259
  "svg",
25111
25260
  {
25112
25261
  xmlns: "http://www.w3.org/2000/svg",
@@ -25116,7 +25265,7 @@ function XViewScene({
25116
25265
  stroke: "currentColor",
25117
25266
  className: "w-5 h-5"
25118
25267
  },
25119
- /* @__PURE__ */ import_react37.default.createElement(
25268
+ /* @__PURE__ */ import_react38.default.createElement(
25120
25269
  "path",
25121
25270
  {
25122
25271
  strokeLinecap: "round",
@@ -25129,7 +25278,7 @@ function XViewScene({
25129
25278
  )));
25130
25279
  }
25131
25280
  if (permissionStatus === "denied") {
25132
- return /* @__PURE__ */ import_react37.default.createElement("div", { className: "flex flex-col items-center justify-center min-h-screen w-full bg-slate-950 text-white" }, /* @__PURE__ */ import_react37.default.createElement("div", { className: "bg-slate-900/50 p-8 rounded-2xl border border-slate-800 shadow-2xl text-center max-w-md" }, /* @__PURE__ */ import_react37.default.createElement("div", { className: "mb-4 text-red-500" }, /* @__PURE__ */ import_react37.default.createElement(
25281
+ return /* @__PURE__ */ import_react38.default.createElement("div", { className: "flex flex-col items-center justify-center min-h-screen w-full bg-slate-950 text-white" }, /* @__PURE__ */ import_react38.default.createElement("div", { className: "bg-slate-900/50 p-8 rounded-2xl border border-slate-800 shadow-2xl text-center max-w-md" }, /* @__PURE__ */ import_react38.default.createElement("div", { className: "mb-4 text-red-500" }, /* @__PURE__ */ import_react38.default.createElement(
25133
25282
  "svg",
25134
25283
  {
25135
25284
  xmlns: "http://www.w3.org/2000/svg",
@@ -25139,7 +25288,7 @@ function XViewScene({
25139
25288
  stroke: "currentColor",
25140
25289
  className: "w-16 h-16 mx-auto"
25141
25290
  },
25142
- /* @__PURE__ */ import_react37.default.createElement(
25291
+ /* @__PURE__ */ import_react38.default.createElement(
25143
25292
  "path",
25144
25293
  {
25145
25294
  strokeLinecap: "round",
@@ -25147,13 +25296,13 @@ function XViewScene({
25147
25296
  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"
25148
25297
  }
25149
25298
  )
25150
- )), /* @__PURE__ */ import_react37.default.createElement("h2", { className: "text-2xl font-bold mb-2" }, "Acesso Negado"), /* @__PURE__ */ import_react37.default.createElement("p", { className: "text-slate-400 mb-6" }, "Voc\xEA n\xE3o tem permiss\xE3o para acessar este conte\xFAdo. Solicite acesso ao propriet\xE1rio ou verifique se est\xE1 na conta correta."), /* @__PURE__ */ import_react37.default.createElement(
25299
+ )), /* @__PURE__ */ import_react38.default.createElement("h2", { className: "text-2xl font-bold mb-2" }, "Acesso Negado"), /* @__PURE__ */ import_react38.default.createElement("p", { className: "text-slate-400 mb-6" }, "Voc\xEA n\xE3o tem permiss\xE3o para acessar este conte\xFAdo. Solicite acesso ao propriet\xE1rio ou verifique se est\xE1 na conta correta."), /* @__PURE__ */ import_react38.default.createElement(
25151
25300
  "button",
25152
25301
  {
25153
25302
  onClick: handleNavigateBack,
25154
25303
  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"
25155
25304
  },
25156
- /* @__PURE__ */ import_react37.default.createElement(
25305
+ /* @__PURE__ */ import_react38.default.createElement(
25157
25306
  "svg",
25158
25307
  {
25159
25308
  xmlns: "http://www.w3.org/2000/svg",
@@ -25163,7 +25312,7 @@ function XViewScene({
25163
25312
  stroke: "currentColor",
25164
25313
  className: "w-5 h-5"
25165
25314
  },
25166
- /* @__PURE__ */ import_react37.default.createElement(
25315
+ /* @__PURE__ */ import_react38.default.createElement(
25167
25316
  "path",
25168
25317
  {
25169
25318
  strokeLinecap: "round",
@@ -25175,7 +25324,7 @@ function XViewScene({
25175
25324
  "Voltar para o X.View"
25176
25325
  )));
25177
25326
  }
25178
- return /* @__PURE__ */ import_react37.default.createElement(
25327
+ return /* @__PURE__ */ import_react38.default.createElement(
25179
25328
  "div",
25180
25329
  {
25181
25330
  ref: mountRef,
@@ -25187,7 +25336,7 @@ function XViewScene({
25187
25336
  cursor: isProcessing ? "progress" : stateRef.current.connection.isActive || stateRef.current.relink.isActive || ancestryMode.isActive ? "crosshair" : creationMode.isActive ? "default" : "grab"
25188
25337
  }
25189
25338
  },
25190
- userPermissionRole !== "link_viewer" && /* @__PURE__ */ import_react37.default.createElement(
25339
+ userPermissionRole !== "link_viewer" && /* @__PURE__ */ import_react38.default.createElement(
25191
25340
  XViewSidebar,
25192
25341
  {
25193
25342
  dbNodes: searchableDbNodes,
@@ -25216,7 +25365,7 @@ function XViewScene({
25216
25365
  viewMembers
25217
25366
  }
25218
25367
  ),
25219
- creationMode.isActive && /* @__PURE__ */ import_react37.default.createElement(
25368
+ creationMode.isActive && /* @__PURE__ */ import_react38.default.createElement(
25220
25369
  InSceneCreationForm,
25221
25370
  {
25222
25371
  onSave: (data) => userActionHandlers.handleSaveNode(actionHandlerContext, data),
@@ -25251,7 +25400,7 @@ function XViewScene({
25251
25400
  view_google_folder_id: (_h = sceneDataRef.current) == null ? void 0 : _h.view_google_folder_id
25252
25401
  }
25253
25402
  ),
25254
- versionMode.isActive && /* @__PURE__ */ import_react37.default.createElement(
25403
+ versionMode.isActive && /* @__PURE__ */ import_react38.default.createElement(
25255
25404
  InSceneVersionForm,
25256
25405
  {
25257
25406
  onSave: (data) => userActionHandlers.handleSaveVersionNode(actionHandlerContext, data),
@@ -25278,7 +25427,7 @@ function XViewScene({
25278
25427
  availableAncestries: allAvailableAncestries
25279
25428
  }
25280
25429
  ),
25281
- questTreeMode.isActive && /* @__PURE__ */ import_react37.default.createElement(
25430
+ questTreeMode.isActive && /* @__PURE__ */ import_react38.default.createElement(
25282
25431
  CreateQuestTreePanel,
25283
25432
  {
25284
25433
  questTreeMode,
@@ -25287,7 +25436,7 @@ function XViewScene({
25287
25436
  onClose: handleCloseQuestTree
25288
25437
  }
25289
25438
  ),
25290
- processTreeMode.isActive && /* @__PURE__ */ import_react37.default.createElement(
25439
+ processTreeMode.isActive && /* @__PURE__ */ import_react38.default.createElement(
25291
25440
  CreateProcessTreePanel,
25292
25441
  {
25293
25442
  processTreeMode,
@@ -25296,7 +25445,7 @@ function XViewScene({
25296
25445
  onClose: handleCloseProcessTree
25297
25446
  }
25298
25447
  ),
25299
- questMode.isActive && /* @__PURE__ */ import_react37.default.createElement(
25448
+ questMode.isActive && /* @__PURE__ */ import_react38.default.createElement(
25300
25449
  InSceneQuestForm,
25301
25450
  {
25302
25451
  onSave: (data) => handleSaveQuestNode(actionHandlerContext, data),
@@ -25327,7 +25476,7 @@ function XViewScene({
25327
25476
  view_google_folder_id: (_m = sceneDataRef.current) == null ? void 0 : _m.view_google_folder_id
25328
25477
  }
25329
25478
  ),
25330
- processMode.isActive && /* @__PURE__ */ import_react37.default.createElement(
25479
+ processMode.isActive && /* @__PURE__ */ import_react38.default.createElement(
25331
25480
  InSceneProcessForm,
25332
25481
  {
25333
25482
  onSave: (data) => handleSaveProcessNode(actionHandlerContext, data),
@@ -25354,7 +25503,7 @@ function XViewScene({
25354
25503
  view_google_folder_id: (_n = sceneDataRef.current) == null ? void 0 : _n.view_google_folder_id
25355
25504
  }
25356
25505
  ),
25357
- readingMode.isActive && readingMode.ancestry && /* @__PURE__ */ import_react37.default.createElement(
25506
+ readingMode.isActive && readingMode.ancestry && /* @__PURE__ */ import_react38.default.createElement(
25358
25507
  "div",
25359
25508
  {
25360
25509
  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"}`,
@@ -25367,7 +25516,7 @@ function XViewScene({
25367
25516
  maxWidth: "92vw"
25368
25517
  }
25369
25518
  },
25370
- /* @__PURE__ */ import_react37.default.createElement(
25519
+ /* @__PURE__ */ import_react38.default.createElement(
25371
25520
  "div",
25372
25521
  {
25373
25522
  onPointerDown: (e) => {
@@ -25378,7 +25527,7 @@ function XViewScene({
25378
25527
  title: "Arraste para redimensionar"
25379
25528
  }
25380
25529
  ),
25381
- /* @__PURE__ */ import_react37.default.createElement(
25530
+ /* @__PURE__ */ import_react38.default.createElement(
25382
25531
  DescriptionReadModePanel,
25383
25532
  {
25384
25533
  key: readingMode.branchStack.length > 0 ? readingMode.branchStack[readingMode.branchStack.length - 1].branchId : readingMode.ancestry.ancestry_id,
@@ -25413,7 +25562,7 @@ function XViewScene({
25413
25562
  }
25414
25563
  )
25415
25564
  ),
25416
- ancestryMode.isActive && ancestryMode.tree && /* @__PURE__ */ import_react37.default.createElement(
25565
+ ancestryMode.isActive && ancestryMode.tree && /* @__PURE__ */ import_react38.default.createElement(
25417
25566
  CreateAncestryPanel,
25418
25567
  {
25419
25568
  ancestryMode,
@@ -25449,7 +25598,7 @@ function XViewScene({
25449
25598
  onRenderAbstractionTree: (data, targetId) => handleRenderAbstractionTree(data, targetId)
25450
25599
  }
25451
25600
  ),
25452
- editingAncestryRel.visible && /* @__PURE__ */ import_react37.default.createElement(
25601
+ editingAncestryRel.visible && /* @__PURE__ */ import_react38.default.createElement(
25453
25602
  AncestryRelationshipPanel,
25454
25603
  {
25455
25604
  data: editingAncestryRel.data,
@@ -25463,8 +25612,8 @@ function XViewScene({
25463
25612
  onUploadFile: upload_file_action
25464
25613
  }
25465
25614
  ),
25466
- isProcessing && /* @__PURE__ */ import_react37.default.createElement("div", { className: "fixed bottom-8 right-8 z-[2000] flex items-center gap-3 px-4 py-2 bg-slate-900/80 backdrop-blur-md border border-white/10 rounded-full shadow-2xl animate-pulse" }, /* @__PURE__ */ import_react37.default.createElement("div", { className: "w-4 h-4 border-2 border-indigo-500 border-t-transparent rounded-full animate-spin" }), /* @__PURE__ */ import_react37.default.createElement("span", { className: "text-xs font-medium text-indigo-200 tracking-wider uppercase" }, "Sincronizando Processo...")),
25467
- detailsNode && detailsNode.is_quest && /* @__PURE__ */ import_react37.default.createElement(
25615
+ isProcessing && /* @__PURE__ */ import_react38.default.createElement("div", { className: "fixed bottom-8 right-8 z-[2000] flex items-center gap-3 px-4 py-2 bg-slate-900/80 backdrop-blur-md border border-white/10 rounded-full shadow-2xl animate-pulse" }, /* @__PURE__ */ import_react38.default.createElement("div", { className: "w-4 h-4 border-2 border-indigo-500 border-t-transparent rounded-full animate-spin" }), /* @__PURE__ */ import_react38.default.createElement("span", { className: "text-xs font-medium text-indigo-200 tracking-wider uppercase" }, "Sincronizando Processo...")),
25616
+ detailsNode && detailsNode.is_quest && /* @__PURE__ */ import_react38.default.createElement(
25468
25617
  QuestDetailsPanel,
25469
25618
  {
25470
25619
  node: detailsNode,
@@ -25496,7 +25645,7 @@ function XViewScene({
25496
25645
  style: overlayHiddenStyle
25497
25646
  }
25498
25647
  ),
25499
- detailsNode && detailsNode.is_process && /* @__PURE__ */ import_react37.default.createElement(
25648
+ detailsNode && detailsNode.is_process && /* @__PURE__ */ import_react38.default.createElement(
25500
25649
  ProcessDetailsPanel,
25501
25650
  {
25502
25651
  node: detailsNode,
@@ -25526,7 +25675,7 @@ function XViewScene({
25526
25675
  style: overlayHiddenStyle
25527
25676
  }
25528
25677
  ),
25529
- detailsNode && !detailsNode.is_quest && !detailsNode.is_process && /* @__PURE__ */ import_react37.default.createElement(
25678
+ detailsNode && !detailsNode.is_quest && !detailsNode.is_process && /* @__PURE__ */ import_react38.default.createElement(
25530
25679
  NodeDetailsPanel,
25531
25680
  {
25532
25681
  node: detailsNode,
@@ -25561,7 +25710,7 @@ function XViewScene({
25561
25710
  style: overlayHiddenStyle
25562
25711
  }
25563
25712
  ),
25564
- detailsLink && /* @__PURE__ */ import_react37.default.createElement(
25713
+ detailsLink && /* @__PURE__ */ import_react38.default.createElement(
25565
25714
  RelationshipDetailsPanel,
25566
25715
  {
25567
25716
  link: detailsLink,
@@ -25576,7 +25725,7 @@ function XViewScene({
25576
25725
  onHighlight: handleReadModeHighlight
25577
25726
  }
25578
25727
  ),
25579
- ancestryLinkDetails && /* @__PURE__ */ import_react37.default.createElement(
25728
+ ancestryLinkDetails && /* @__PURE__ */ import_react38.default.createElement(
25580
25729
  AncestryLinkDetailsPanel,
25581
25730
  {
25582
25731
  data: ancestryLinkDetails,
@@ -25588,7 +25737,7 @@ function XViewScene({
25588
25737
  onHighlight: handleReadModeHighlight
25589
25738
  }
25590
25739
  ),
25591
- /* @__PURE__ */ import_react37.default.createElement(
25740
+ /* @__PURE__ */ import_react38.default.createElement(
25592
25741
  "div",
25593
25742
  {
25594
25743
  ref: tooltipRef,
@@ -25615,7 +25764,7 @@ function XViewScene({
25615
25764
  }
25616
25765
  }
25617
25766
  ),
25618
- /* @__PURE__ */ import_react37.default.createElement(
25767
+ /* @__PURE__ */ import_react38.default.createElement(
25619
25768
  ContextMenu,
25620
25769
  {
25621
25770
  data: contextMenu,
@@ -25654,7 +25803,7 @@ function XViewScene({
25654
25803
  onInitiateProcess: (data) => userActionHandlers.handleInitiateProcess(actionHandlerContext, data)
25655
25804
  }
25656
25805
  ),
25657
- /* @__PURE__ */ import_react37.default.createElement(
25806
+ /* @__PURE__ */ import_react38.default.createElement(
25658
25807
  MultiNodeContextMenu,
25659
25808
  {
25660
25809
  data: multiContextMenu,
@@ -25674,7 +25823,7 @@ function XViewScene({
25674
25823
  )
25675
25824
  }
25676
25825
  ),
25677
- /* @__PURE__ */ import_react37.default.createElement(
25826
+ /* @__PURE__ */ import_react38.default.createElement(
25678
25827
  RelationshipContextMenu,
25679
25828
  {
25680
25829
  data: relationshipMenu,
@@ -25692,14 +25841,14 @@ function XViewScene({
25692
25841
  onDelete: (data) => userActionHandlers.handleDeleteLink(actionHandlerContext, data)
25693
25842
  }
25694
25843
  ),
25695
- /* @__PURE__ */ import_react37.default.createElement(
25844
+ /* @__PURE__ */ import_react38.default.createElement(
25696
25845
  ImageViewer,
25697
25846
  {
25698
25847
  data: imageViewer,
25699
25848
  onClose: () => setImageViewer({ ...imageViewer, visible: false })
25700
25849
  }
25701
25850
  ),
25702
- /* @__PURE__ */ import_react37.default.createElement(
25851
+ /* @__PURE__ */ import_react38.default.createElement(
25703
25852
  Boards,
25704
25853
  {
25705
25854
  isOpen: isBoardsOpen,
@@ -25712,7 +25861,7 @@ function XViewScene({
25712
25861
  userRole: userPermissionRole
25713
25862
  }
25714
25863
  ),
25715
- /* @__PURE__ */ import_react37.default.createElement(
25864
+ /* @__PURE__ */ import_react38.default.createElement(
25716
25865
  MilestoneManager,
25717
25866
  {
25718
25867
  isOpen: isMilestoneManagerOpen,
@@ -25721,7 +25870,7 @@ function XViewScene({
25721
25870
  onUpdateMilestones: handleUpdateMilestones
25722
25871
  }
25723
25872
  ),
25724
- /* @__PURE__ */ import_react37.default.createElement(
25873
+ /* @__PURE__ */ import_react38.default.createElement(
25725
25874
  ImportParentFileModal,
25726
25875
  {
25727
25876
  isOpen: isImportModalOpen,
@@ -25734,7 +25883,7 @@ function XViewScene({
25734
25883
  currentAncestries: ancestryDataRef.current || []
25735
25884
  }
25736
25885
  ),
25737
- invalidTargetError && /* @__PURE__ */ import_react37.default.createElement(
25886
+ invalidTargetError && /* @__PURE__ */ import_react38.default.createElement(
25738
25887
  "div",
25739
25888
  {
25740
25889
  className: "ui-overlay",
@@ -25759,13 +25908,13 @@ function XViewScene({
25759
25908
  animation: "fadeInDown 0.5s cubic-bezier(0.16, 1, 0.3, 1)"
25760
25909
  }
25761
25910
  },
25762
- /* @__PURE__ */ import_react37.default.createElement("style", null, `
25911
+ /* @__PURE__ */ import_react38.default.createElement("style", null, `
25763
25912
  @keyframes fadeInDown {
25764
25913
  from { opacity: 0; transform: translate(-50%, -20px); }
25765
25914
  to { opacity: 1; transform: translate(-50%, 0); }
25766
25915
  }
25767
25916
  `),
25768
- /* @__PURE__ */ import_react37.default.createElement(
25917
+ /* @__PURE__ */ import_react38.default.createElement(
25769
25918
  "svg",
25770
25919
  {
25771
25920
  width: "20",
@@ -25777,12 +25926,12 @@ function XViewScene({
25777
25926
  strokeLinecap: "round",
25778
25927
  strokeLinejoin: "round"
25779
25928
  },
25780
- /* @__PURE__ */ import_react37.default.createElement("circle", { cx: "12", cy: "12", r: "10" }),
25781
- /* @__PURE__ */ import_react37.default.createElement("line", { x1: "12", y1: "8", x2: "12", y2: "12" }),
25782
- /* @__PURE__ */ import_react37.default.createElement("line", { x1: "12", y1: "16", x2: "12.01", y2: "16" })
25929
+ /* @__PURE__ */ import_react38.default.createElement("circle", { cx: "12", cy: "12", r: "10" }),
25930
+ /* @__PURE__ */ import_react38.default.createElement("line", { x1: "12", y1: "8", x2: "12", y2: "12" }),
25931
+ /* @__PURE__ */ import_react38.default.createElement("line", { x1: "12", y1: "16", x2: "12.01", y2: "16" })
25783
25932
  ),
25784
- /* @__PURE__ */ import_react37.default.createElement("span", { style: { fontSize: "14px", fontWeight: 500 } }, invalidTargetError),
25785
- /* @__PURE__ */ import_react37.default.createElement(
25933
+ /* @__PURE__ */ import_react38.default.createElement("span", { style: { fontSize: "14px", fontWeight: 500 } }, invalidTargetError),
25934
+ /* @__PURE__ */ import_react38.default.createElement(
25786
25935
  "button",
25787
25936
  {
25788
25937
  onClick: () => setInvalidTargetError(null),
@@ -25810,7 +25959,7 @@ function XViewScene({
25810
25959
  "Fechar"
25811
25960
  )
25812
25961
  ),
25813
- /* @__PURE__ */ import_react37.default.createElement(
25962
+ /* @__PURE__ */ import_react38.default.createElement(
25814
25963
  UpgradeModal,
25815
25964
  {
25816
25965
  isOpen: isUpgradeModalOpen,
@@ -25822,7 +25971,9 @@ function XViewScene({
25822
25971
  const res = await onUpgrade();
25823
25972
  if (res.success) {
25824
25973
  setNodeLimit(-1);
25825
- alert("Upgrade realizado com sucesso! Sua conta agora \xE9 Premium.");
25974
+ alert(
25975
+ "Upgrade realizado com sucesso! Sua conta agora \xE9 Premium."
25976
+ );
25826
25977
  } else {
25827
25978
  alert("Erro ao realizar upgrade: " + res.error);
25828
25979
  }